Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit39d8459

Browse files
vasily-kirichenkoKevinRansom
authored andcommitted
Better completion (#3940)
* suggests types and modules only at pattern type position (x: ...)* handle all places where type can be used* fix* union cases should not appear in completion at type hint position
1 parentc03b9c1 commit39d8459

File tree

5 files changed

+81
-6
lines changed

5 files changed

+81
-6
lines changed

‎src/fsharp/vs/ServiceParseTreeWalk.fs‎

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,15 @@ module internal AstTraversal =
9090
/// VisitLetOrUse allows overriding behavior when visiting module or local let or use bindings
9191
abstractVisitLetOrUse :SynBindinglist*range->'Toption
9292
defaultthis.VisitLetOrUse(_,_)= None
93-
93+
/// VisitType allows overriding behavior when visiting simple pats
9494
abstractVisitSimplePats :SynSimplePatlist->'Toption
9595
defaultthis.VisitSimplePats(_)= None
96+
/// VisitPat allows overriding behavior when visiting patterns
97+
abstractVisitPat :(SynPat->'Toption)*SynPat->'Toption
98+
defaultthis.VisitPat(defaultTraverse,pat)= defaultTraverse pat
99+
/// VisitType allows overriding behavior when visiting type hints (x: ..., etc.)
100+
abstractVisitType :(SynType->'Toption)*SynType->'Toption
101+
defaultthis.VisitType(defaultTraverse,ty)= defaultTraverse ty
96102

97103
letdive node range project=
98104
range,(fun()-> project node)
@@ -189,12 +195,12 @@ module internal AstTraversal =
189195
dive synExpr2 synExpr2.Range traverseSynExpr]
190196
|> pick expr
191197
| SynExpr.Const(_synConst,_range)-> None
192-
| SynExpr.Typed(synExpr,_synType,_range)-> traverseSynExpr synExpr
198+
| SynExpr.Typed(synExpr,synType,_range)->[traverseSynExpr synExpr; traverseSynType synType]|> List.tryPick id
193199
| SynExpr.Tuple(synExprList,_,_range)
194200
| SynExpr.StructTuple(synExprList,_,_range)-> synExprList|> List.map(fun x-> dive x x.Range traverseSynExpr)|> pick expr
195201
| SynExpr.ArrayOrList(_, synExprList,_range)-> synExprList|> List.map(fun x-> dive x x.Range traverseSynExpr)|> pick expr
196202
| SynExpr.Record(inheritOpt,copyOpt,fields,_range)->
197-
[
203+
[
198204
letdiveIntoSeparator offsideColumn scPosOpt copyOpt=
199205
match scPosOptwith
200206
| Some scPos->
@@ -448,6 +454,50 @@ module internal AstTraversal =
448454

449455
visitor.VisitExpr(path, traverseSynExpr path, defaultTraverse, expr)
450456

457+
andtraversePat(pat:SynPat)=
458+
letdefaultTraverse p=
459+
match pwith
460+
| SynPat.Paren(p,_)-> traversePat p
461+
| SynPat.Or(p1, p2,_)->[ p1; p2]|> List.tryPick traversePat
462+
| SynPat.Ands(ps,_)
463+
| SynPat.Tuple(ps,_)
464+
| SynPat.StructTuple(ps,_)
465+
| SynPat.ArrayOrList(_, ps,_)-> ps|> List.tryPick traversePat
466+
| SynPat.Attrib(p,_,_)-> traversePat p
467+
| SynPat.LongIdent(_,_,_, args,_,_)->
468+
match argswith
469+
| SynConstructorArgs.Pats ps-> ps|> List.tryPick traversePat
470+
| SynConstructorArgs.NamePatPairs(ps,_)->
471+
ps|> List.map snd|> List.tryPick traversePat
472+
| SynPat.Typed(p, ty,_)->
473+
[ traversePat p; traverseSynType ty]|> List.tryPick id
474+
|_-> None
475+
476+
visitor.VisitPat(defaultTraverse, pat)
477+
478+
andtraverseSynType(ty:SynType)=
479+
letdefaultTraverse ty=
480+
match tywith
481+
| SynType.App(typeName,_, typeArgs,_,_,_,_)
482+
| SynType.LongIdentApp(typeName,_,_, typeArgs,_,_,_)->
483+
[yield typeName
484+
yield! typeArgs]
485+
|> List.tryPick traverseSynType
486+
| SynType.Fun(ty1, ty2,_)->[ty1; ty2]|> List.tryPick traverseSynType
487+
| SynType.MeasurePower(ty,_,_)
488+
| SynType.HashConstraint(ty,_)
489+
| SynType.WithGlobalConstraints(ty,_,_)
490+
| SynType.Array(_, ty,_)-> traverseSynType ty
491+
| SynType.StaticConstantNamed(ty1, ty2,_)
492+
| SynType.MeasureDivide(ty1, ty2,_)->[ty1; ty2]|> List.tryPick traverseSynType
493+
| SynType.Tuple(tys,_)
494+
| SynType.StructTuple(tys,_)-> tys|> List.map snd|> List.tryPick traverseSynType
495+
| SynType.StaticConstantExpr(expr,_)-> traverseSynExpr[] expr
496+
| SynType.Anon_-> None
497+
|_-> None
498+
499+
visitor.VisitType(defaultTraverse, ty)
500+
451501
andnormalizeMembersToDealWithPeculiaritiesOfGettersAndSetters path traverseInherit(synMemberDefns:SynMemberDefns)=
452502
synMemberDefns
453503
// property getters are setters are two members that can have the same range, so do some somersaults to deal with this
@@ -566,8 +616,10 @@ module internal AstTraversal =
566616
letdefaultTraverse b=
567617
letpath= TraverseStep.Binding b:: path
568618
match bwith
569-
|(SynBinding.Binding(_synAccessOption,_synBindingKind,_,_,_synAttributes,_preXmlDoc,_synValData,_synPat,_synBindingReturnInfoOption, synExpr,_range,_sequencePointInfoForBinding))->
570-
traverseSynExpr path synExpr
619+
|(SynBinding.Binding(_synAccessOption,_synBindingKind,_,_,_synAttributes,_preXmlDoc,_synValData, synPat,_synBindingReturnInfoOption, synExpr,_range,_sequencePointInfoForBinding))->
620+
[ traversePat synPat
621+
traverseSynExpr path synExpr]
622+
|> List.tryPick id
571623
visitor.VisitBinding(defaultTraverse,b)
572624

573625
match parseTreewith

‎src/fsharp/vs/ServiceUntypedParse.fs‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ type CompletionContext =
7979
| ParameterListofpos*HashSet<string>
8080
| AttributeApplication
8181
| OpenDeclaration
82+
/// completing pattern type (e.g. foo (x: |))
83+
| PatternType
8284

8385
//----------------------------------------------------------------------------
8486
// FSharpParseFileResults
@@ -1272,6 +1274,12 @@ module UntypedParseImpl =
12721274
else
12731275
None
12741276
|_-> defaultTraverse decl
1277+
1278+
member__.VisitType(defaultTraverse,ty)=
1279+
match tywith
1280+
| SynType.LongIdent_when rangeContainsPos ty.Range pos->
1281+
Some CompletionContext.PatternType
1282+
|_-> defaultTraverse ty
12751283
}
12761284

12771285
AstTraversal.Traverse(pos, pt, walker)

‎src/fsharp/vs/ServiceUntypedParse.fsi‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ type internal CompletionContext =
104104
| ParameterListofpos*HashSet<string>
105105
| AttributeApplication
106106
| OpenDeclaration
107+
/// completing pattern type (e.g. foo (x: |))
108+
| PatternType
107109

108110
#if COMPILER_PUBLIC_API
109111
typeModuleKind={ IsAutoOpen:bool; HasModuleSuffix:bool}

‎src/fsharp/vs/service.fs‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,19 @@ type TypeCheckInfo
870870
|> Option.map(fun(items,denv,m)->
871871
items|> List.filter(fun x->match x.Itemwith Item.ModuleOrNamespaces_->true|_->false), denv, m)
872872

873+
// Completion at '(x: ...)"
874+
| Some(CompletionContext.PatternType)->
875+
GetDeclaredItems(parseResultsOpt, lineStr, origLongIdentOpt, colAtEndOfNamesAndResidue, residueOpt, lastDotPos, line, loc, filterCtors, resolveOverloads, hasTextChangedSinceLastTypecheck,false, getAllSymbols)
876+
|> Option.map(fun(items,denv,m)->
877+
items
878+
|> List.filter(fun cItem->
879+
match cItem.Itemwith
880+
| Item.ModuleOrNamespaces_
881+
| Item.Types_
882+
| Item.UnqualifiedType_
883+
| Item.ExnCase_->true
884+
|_->false), denv, m)
885+
873886
// Other completions
874887
| cc->
875888
match residueOpt|> Option.bind Seq.tryHeadwith

‎vsintegration/tests/unittests/Tests.LanguageService.Completion.fs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6063,7 +6063,7 @@ let rec f l =
60636063
let f (x:MyNamespace1.MyModule(*Maftervariable4*)) = 10
60646064
let y = int System.IO(*Maftervariable5*)""",
60656065
marker="(*Maftervariable4*)",
6066-
list=["DuType";"Tag"])
6066+
list=["DuType"])
60676067

60686068
[<Test>]
60696069
memberthis.``VariableIdentifier.SystemNamespace``()=

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp