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

Commit4fd3f3e

Browse files
vasily-kirichenkoKevinRansom
authored andcommitted
Trigger completion optimistically (#2594)
* port Roslyn's C# completion triggering logic as is* fixed: completion do not trigger at all* fix position* fix a test* do not provide completion on certain places* fix muting completion on Named(Wild) pat in binding* do not provide completion on ctor / lambda parameter names + tests* fix binding traversing in completion* fix tests* fix the last failing test* "trigger completion after a character is typed" setting in a new completion property page* force intellisense property page loading* do not commit completion on space in auto triggering mode* fix completion list ordering
1 parent5f151a2 commit4fd3f3e

File tree

12 files changed

+396
-38
lines changed

12 files changed

+396
-38
lines changed

‎src/fsharp/vs/ServiceParseTreeWalk.fs‎

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -65,21 +65,30 @@ module internal AstTraversal =
6565
/// VisitMatchClause allows overriding clause behavior (note: by default it would defaultTraverse expression)
6666
abstractVisitMatchClause :(SynMatchClause->'Toption)*SynMatchClause->'Toption
6767
defaultthis.VisitMatchClause(defaultTraverse,mc)= defaultTraverse mc
68-
// VisitInheritSynMemberDefn allows overriding inherit behavior (by default do nothing)
68+
/// VisitInheritSynMemberDefn allows overriding inherit behavior (by default do nothing)
6969
abstractVisitInheritSynMemberDefn :SynComponentInfo*SynTypeDefnKind*SynType*SynMemberDefns*range->'Toption
7070
defaultthis.VisitInheritSynMemberDefn(_componentInfo,_typeDefnKind,_synType,_members,_range)= None
71-
// VisitInterfaceSynMemberDefnType allows overriding behavior for visiting interface member in types (by default - do nothing)
71+
/// VisitInterfaceSynMemberDefnType allows overriding behavior for visiting interface member in types (by default - do nothing)
7272
abstractVisitInterfaceSynMemberDefnType :SynType->'Toption
7373
defaultthis.VisitInterfaceSynMemberDefnType(_synType)= None
74-
// VisitRecordField allows overriding behavior when visiting l.h.s. of constructed record instances
74+
/// VisitRecordField allows overriding behavior when visiting l.h.s. of constructed record instances
7575
abstractVisitRecordField :TraversePath*SynExproption*LongIdentWithDotsoption->'Toption
7676
defaultthis.VisitRecordField(_path,_copyOpt,_recordField)= None
77-
// VisitHashDirective allows overriding behavior when visiting hash directives in FSX scripts, like #r, #load and #I.
77+
/// VisitHashDirective allows overriding behavior when visiting hash directives in FSX scripts, like #r, #load and #I.
7878
abstractVisitHashDirective :range->'Toption
7979
defaultthis.VisitHashDirective(_)= None
80-
// VisitModuleOrNamespace allows overriding behavior when visiting module or namespaces
80+
/// VisitModuleOrNamespace allows overriding behavior when visiting module or namespaces
8181
abstractVisitModuleOrNamespace :SynModuleOrNamespace->'Toption
8282
defaultthis.VisitModuleOrNamespace(_)= None
83+
/// VisitComponentInfo allows overriding behavior when visiting type component infos
84+
abstractVisitComponentInfo :SynComponentInfo->'Toption
85+
defaultthis.VisitComponentInfo(_)= None
86+
/// VisitLetOrUse allows overriding behavior when visiting module or local let or use bindings
87+
abstractVisitLetOrUse :SynBindinglist*range->'Toption
88+
defaultthis.VisitLetOrUse(_,_)= None
89+
90+
abstractVisitSimplePats :SynSimplePatlist->'Toption
91+
defaultthis.VisitSimplePats(_)= None
8392

8493
letdive node range project=
8594
range,(fun()-> project node)
@@ -143,7 +152,10 @@ module internal AstTraversal =
143152
match mwith
144153
| SynModuleDecl.ModuleAbbrev(_ident,_longIdent,_range)-> None
145154
| SynModuleDecl.NestedModule(_synComponentInfo,_isRec, synModuleDecls,_,_range)-> synModuleDecls|> List.map(fun x-> dive x x.Range(traverseSynModuleDecl path))|> pick decl
146-
| SynModuleDecl.Let(_, synBindingList,_range)-> synBindingList|> List.map(fun x-> dive x x.RangeOfBindingAndRhs(traverseSynBinding path))|> pick decl
155+
| SynModuleDecl.Let(_, synBindingList, range)->
156+
match visitor.VisitLetOrUse(synBindingList, range)with
157+
| Some x-> Some x
158+
| None-> synBindingList|> List.map(fun x-> dive x x.RangeOfBindingAndRhs(traverseSynBinding path))|> pick decl
147159
| SynModuleDecl.DoExpr(_sequencePointInfoForBinding, synExpr,_range)-> traverseSynExpr path synExpr
148160
| SynModuleDecl.Types(synTypeDefnList,_range)-> synTypeDefnList|> List.map(fun x-> dive x x.Range(traverseSynTypeDefn path))|> pick decl
149161
| SynModuleDecl.Exception(_synExceptionDefn,_range)-> None
@@ -317,7 +329,13 @@ module internal AstTraversal =
317329
if ok.IsSomethen ok
318330
else
319331
traverseSynExpr synExpr
320-
| SynExpr.Lambda(_,_,_synSimplePats, synExpr,_range)-> traverseSynExpr synExpr
332+
| SynExpr.Lambda(_,_, synSimplePats, synExpr,_range)->
333+
match synSimplePatswith
334+
| SynSimplePats.SimplePats(pats,_)->
335+
match visitor.VisitSimplePats(pats)with
336+
| Some x-> Some x
337+
| None-> traverseSynExpr synExpr
338+
|_-> traverseSynExpr synExpr
321339
| SynExpr.MatchLambda(_isExnMatch,_argm,synMatchClauseList,_spBind,_wholem)->
322340
synMatchClauseList
323341
|> List.map(fun x-> dive x x.Range(traverseSynMatchClause path))
@@ -339,10 +357,13 @@ module internal AstTraversal =
339357
dive synExpr2 synExpr2.Range traverseSynExpr]
340358
|> pick expr
341359
| SynExpr.TypeApp(synExpr,_,_synTypeList,_commas,_,_,_range)-> traverseSynExpr synExpr
342-
| SynExpr.LetOrUse(_,_, synBindingList, synExpr,_range)->
343-
[yield! synBindingList|> List.map(fun x-> dive x x.RangeOfBindingAndRhs(traverseSynBinding path))
344-
yield dive synExpr synExpr.Range traverseSynExpr]
345-
|> pick expr
360+
| SynExpr.LetOrUse(_,_, synBindingList, synExpr, range)->
361+
match visitor.VisitLetOrUse(synBindingList, range)with
362+
| Some x-> Some x
363+
| None->
364+
[yield! synBindingList|> List.map(fun x-> dive x x.RangeOfBindingAndRhs(traverseSynBinding path))
365+
yield dive synExpr synExpr.Range traverseSynExpr]
366+
|> pick expr
346367
| SynExpr.TryWith(synExpr,_range, synMatchClauseList,_range2,_range3,_sequencePointInfoForTry,_sequencePointInfoForWith)->
347368
[yield dive synExpr synExpr.Range traverseSynExpr
348369
yield! synMatchClauseList|> List.map(fun x-> dive x x.Range(traverseSynMatchClause path))]
@@ -465,6 +486,10 @@ module internal AstTraversal =
465486

466487
andtraverseSynTypeDefn path(SynTypeDefn.TypeDefn(synComponentInfo,synTypeDefnRepr,synMemberDefns,tRange)as tydef)=
467488
letpath= TraverseStep.TypeDefn tydef:: path
489+
490+
match visitor.VisitComponentInfo synComponentInfowith
491+
| Some x-> Some x
492+
| None->
468493
[
469494
match synTypeDefnReprwith
470495
| SynTypeDefnRepr.Exception_->
@@ -491,7 +516,8 @@ module internal AstTraversal =
491516
match mwith
492517
| SynMemberDefn.Open(_longIdent,_range)-> None
493518
| SynMemberDefn.Member(synBinding,_range)-> traverseSynBinding path synBinding
494-
| SynMemberDefn.ImplicitCtor(_synAccessOption,_synAttributes,_synSimplePatList,_identOption,_range)-> None
519+
| SynMemberDefn.ImplicitCtor(_synAccessOption,_synAttributes, synSimplePatList,_identOption,_range)->
520+
visitor.VisitSimplePats(synSimplePatList)
495521
| SynMemberDefn.ImplicitInherit(synType, synExpr,_identOption, range)->
496522
[
497523
dive() synType.Range(fun()->
@@ -503,7 +529,10 @@ module internal AstTraversal =
503529
)
504530
]|> pick m
505531
| SynMemberDefn.AutoProperty(_attribs,_isStatic,_id,_tyOpt,_propKind,_,_xmlDoc,_access, synExpr,_,_)-> traverseSynExpr path synExpr
506-
| SynMemberDefn.LetBindings(synBindingList,_,_,_range)-> synBindingList|> List.map(fun x-> dive x x.RangeOfBindingAndRhs(traverseSynBinding path))|> pick m
532+
| SynMemberDefn.LetBindings(synBindingList,_,_, range)->
533+
match visitor.VisitLetOrUse(synBindingList, range)with
534+
| Some x-> Some x
535+
| None-> synBindingList|> List.map(fun x-> dive x x.RangeOfBindingAndRhs(traverseSynBinding path))|> pick m
507536
| SynMemberDefn.AbstractSlot(_synValSig,_memberFlags,_range)-> None
508537
| SynMemberDefn.Interface(synType, synMemberDefnsOption,_range)->
509538
match visitor.VisitInterfaceSynMemberDefnType(synType)with
@@ -528,6 +557,7 @@ module internal AstTraversal =
528557
yield synExpr
529558
]|> List.map(fun x-> dive x x.Range(traverseSynExpr path))|> pick all.Range all
530559
visitor.VisitMatchClause(defaultTraverse,mc)
560+
531561
andtraverseSynBinding path b=
532562
letdefaultTraverse b=
533563
letpath= TraverseStep.Binding b:: path

‎src/fsharp/vs/ServiceUntypedParse.fs‎

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -918,6 +918,10 @@ module UntypedParseImpl =
918918
match parsedInputOptwith
919919
| None-> None
920920
| Some pt->
921+
922+
letast= sprintf"%+A" pt
923+
let_x= ast
924+
921925
match GetEntityKind(pos, pt)with
922926
| Some EntityKind.Attribute-> Some CompletionContext.AttributeApplication
923927
|_->
@@ -1170,11 +1174,38 @@ module UntypedParseImpl =
11701174
| None-> Some(CompletionContext.Invalid)// A $ .B -> no completion list
11711175
|_-> None
11721176

1173-
memberthis.VisitBinding(defaultTraverse,synBinding)= defaultTraverse synBinding
1177+
memberthis.VisitBinding(defaultTraverse,(Binding(headPat= headPat)as synBinding))=
1178+
1179+
letvisitParam=function
1180+
| SynPat.Named(range= range)when rangeContainsPos range pos->
1181+
// parameter without type hint, no completion
1182+
Some CompletionContext.Invalid
1183+
| SynPat.Typed(SynPat.Named(SynPat.Wild(range),_,_,_,_),_,_)when rangeContainsPos range pos->
1184+
// parameter with type hint, but we are on its name, no completion
1185+
Some CompletionContext.Invalid
1186+
|_-> defaultTraverse synBinding
1187+
1188+
match headPatwith
1189+
| SynPat.LongIdent(_,_,_,ctorArgs,_,_)->
1190+
match ctorArgswith
1191+
| SynConstructorArgs.Pats(pats)->
1192+
pats|> List.tryPick(fun pat->
1193+
match patwith
1194+
| SynPat.Paren(pat,_)->
1195+
match patwith
1196+
| SynPat.Tuple(pats,_)->
1197+
pats|> List.tryPick visitParam
1198+
|_-> visitParam pat
1199+
| SynPat.Wild(range)when rangeContainsPos range pos->
1200+
// let foo (x|
1201+
Some CompletionContext.Invalid
1202+
|_-> visitParam pat
1203+
)
1204+
|_-> defaultTraverse synBinding
1205+
|_-> defaultTraverse synBinding
11741206

11751207
memberthis.VisitHashDirective(range)=
11761208
if rangeContainsPos range posthen Some CompletionContext.Invalid
1177-
11781209
else None
11791210

11801211
memberthis.VisitModuleOrNamespace(SynModuleOrNamespace(longId= idents))=
@@ -1184,6 +1215,24 @@ module UntypedParseImpl =
11841215
if stringBetweenModuleNameAndPos|> Seq.forall(fun x-> x=' '|| x='.')then
11851216
Some CompletionContext.Invalid
11861217
else None
1187-
|_-> None}
1218+
|_-> None
1219+
1220+
memberthis.VisitComponentInfo(ComponentInfo(range= range))=
1221+
if rangeContainsPos range posthen Some CompletionContext.Invalid
1222+
else None
1223+
1224+
memberthis.VisitLetOrUse(bindings,range)=
1225+
match bindingswith
1226+
|[]when range.StartLine= pos.Line-> Some CompletionContext.Invalid
1227+
|_-> None
1228+
1229+
memberthis.VisitSimplePats(pats)=
1230+
pats|> List.tryPick(fun pat->
1231+
match patwith
1232+
| SynSimplePat.Id(range= range)
1233+
| SynSimplePat.Typed(SynSimplePat.Id(range= range),_,_)when rangeContainsPos range pos->
1234+
Some CompletionContext.Invalid
1235+
|_-> None)
1236+
}
11881237

11891238
AstTraversal.Traverse(pos, pt, walker)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp