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

Commitb9d2f3f

Browse files
vladimalatkin
authored andcommitted
Intellisense completion for named parameters
closesdotnet#220commit4c59b11Author: Vladimir Matveev <vladima@microsoft.com>Date: Fri Feb 13 15:42:51 2015 -0800 do not drop error arguments entirely, but ignore them then validating consistency of positional\named argumentscommitc3a6531Author: Vladimir Matveev <vladima@microsoft.com>Date: Wed Feb 11 11:24:52 2015 -0800 added unit tests for completion of named arguments\settable propertiescommit27a2b63Author: Vladimir Matveev <vladima@microsoft.com>Date: Wed Feb 11 11:23:57 2015 -0800 do not abort overload resolution if parameter list contains errorscommit2851370Author: Vladimir Matveev <vladima@microsoft.com>Date: Sat Feb 7 01:11:09 2015 -0800 initial version of completion for named parameters
1 parent49b20b0 commitb9d2f3f

File tree

5 files changed

+124
-24
lines changed

5 files changed

+124
-24
lines changed

‎src/fsharp/tc.fs‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3018,11 +3018,16 @@ let GetMethodArgs arg =
30183018
| SynExpr.Const (SynConst.Unit,_) -> []
30193019
| SynExprParen(SynExpr.Tuple (args,_,_),_,_,_) | SynExpr.Tuple (args,_,_) -> args
30203020
| SynExprParen(arg,_,_,_) | arg -> [arg]
3021-
let unnamedCallerArgs,namedCallerArgs = List.takeUntil IsNamedArg args
3021+
let unnamedCallerArgs,namedCallerArgs =
3022+
args |> List.takeUntil IsNamedArg
30223023
let namedCallerArgs =
30233024
namedCallerArgs |> List.choose (fun e ->
3024-
if not (IsNamedArg e) then
3025-
error(Error(FSComp.SR.tcNameArgumentsMustAppearLast(), e.Range))
3025+
if not (IsNamedArg e) then
3026+
// ignore errors to avoid confusing error messages in cases like foo(a = 1,)
3027+
// do not abort overload resolution in case if named arguments are mixed with errors
3028+
match e with
3029+
| SynExpr.ArbitraryAfterError _ -> ()
3030+
| _ -> error(Error(FSComp.SR.tcNameArgumentsMustAppearLast(), e.Range))
30263031
TryGetNamedArg e)
30273032
unnamedCallerArgs, namedCallerArgs
30283033

‎src/fsharp/vs/ServiceUntypedParse.fs‎

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,9 @@ type internal CompletionContext =
7070
// completing records field
7171
| RecordFieldofRecordContext
7272
| RangeOperator
73-
| NewObjectofpos*HashSet<string>
73+
// completing named parameters\setters in parameter list of constructor\method calls
74+
// end of name ast node * list of properties\parameters that were already set
75+
| ParameterListofpos*HashSet<string>
7476

7577
//----------------------------------------------------------------------------
7678
// Untyped scope
@@ -772,7 +774,7 @@ module internal UntypedParseInfoImpl =
772774
| Some m-> m.End
773775
| None-> id.idRange.End
774776

775-
let(|NewObject|_|)e=
777+
let(|NewObjectOrMethodCall|_|)e=
776778
match ewith
777779
|(SynExpr.New(_, SynType.LongIdent typeName, arg,_))->
778780
// new A()
@@ -808,9 +810,9 @@ module internal UntypedParseInfoImpl =
808810

809811
let(|PartOfParameterList|_|)precedingArgument path=
810812
match pathwith
811-
| TS.Expr(SynExpr.Paren_)::TS.Expr(NewObject(args))::_->
813+
| TS.Expr(SynExpr.Paren_)::TS.Expr(NewObjectOrMethodCall(args))::_->
812814
if Option.isSome precedingArgumentthen Noneelse Some args
813-
| TS.Expr(SynExpr.Tuple(elements, commas,_))::TS.Expr(SynExpr.Paren_)::TS.Expr(NewObject(args))::_->
815+
| TS.Expr(SynExpr.Tuple(elements, commas,_))::TS.Expr(SynExpr.Paren_)::TS.Expr(NewObjectOrMethodCall(args))::_->
814816
match precedingArgumentwith
815817
| None-> Some args
816818
| Some e->
@@ -836,20 +838,26 @@ module internal UntypedParseInfoImpl =
836838
// new A($)
837839
| SynExpr.Const(SynConst.Unit, m)when rangeContainsPos m pos->
838840
match pathwith
839-
| TS.Expr(NewObject args)::_-> Some(CompletionContext.NewObject args)
840-
|_-> defaultTraverse expr
841+
| TS.Expr(NewObjectOrMethodCall args)::_->
842+
Some(CompletionContext.ParameterList args)
843+
|_->
844+
defaultTraverse expr
841845
// new (... A$)
842846
| SynExpr.Ident idwhen id.idRange.End= pos->
843847
match pathwith
844-
| PartOfParameterList None args-> Some(CompletionContext.NewObject args)
845-
|_-> defaultTraverse expr
848+
| PartOfParameterList None args->
849+
Some(CompletionContext.ParameterList args)
850+
|_->
851+
defaultTraverse expr
846852
// new (A$ = 1)
847853
// new (A = 1,$)
848854
| Setter idwhen id.idRange.End= pos|| rangeBeforePos expr.Range pos->
849855
letprecedingArgument=if id.idRange.End= posthen Noneelse Some expr
850856
match pathwith
851-
| PartOfParameterList precedingArgument args-> Some(CompletionContext.NewObject args)
852-
|_-> defaultTraverse expr
857+
| PartOfParameterList precedingArgument args->
858+
Some(CompletionContext.ParameterList args)
859+
|_->
860+
defaultTraverse expr
853861
|_-> defaultTraverse expr
854862

855863
memberthis.VisitRecordField(path,copyOpt,field)=

‎src/fsharp/vs/ServiceUntypedParse.fsi‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ type internal CompletionContext =
6767
// completing records field
6868
| RecordFieldofRecordContext
6969
| RangeOperator
70-
// completingpropertysetters in constructor call
71-
// end ofconstructor ast node * list of properties that were already set
72-
|NewObjectofpos*HashSet<string>
70+
// completingnamed parameters\setters inparameter list ofconstructor\method calls
71+
// end ofname ast node * list of properties\parameters that were already set
72+
|ParameterListofpos*HashSet<string>
7373

7474
// implementation details used by other code in the compiler
7575
moduleinternalUntypedParseInfoImpl=

‎src/fsharp/vs/service.fs‎

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -598,13 +598,42 @@ type TypeCheckInfo
598598
letGetPreciseItemsFromNameResolutionVS(line,colAtEndOfNames,membersByResidue,filterCtors,resolveOverloads,hasTextChangedSinceLastTypecheck)=
599599
GetPreciseItemsFromNameResolution(Pos.fromVS line colAtEndOfNames, membersByResidue, filterCtors, resolveOverloads, hasTextChangedSinceLastTypecheck)
600600

601-
letGetSettableFields endOfExprPos hasTextChangedSinceLastTypecheck=
601+
letCollectParameters(methods:MethInfo list)amap m:Item list=
602+
methods
603+
|> List.collect(fun meth->
604+
match meth.GetParamDatas(amap, m, meth.FormalMethodInst)with
605+
| x::_-> x|> List.choose(fun(ParamData(_isParamArray,_isOut,_optArgInfo,name,_,ty))->
606+
match namewith
607+
| Some n-> Some(Item.ArgName(Ident(n, m), ty, Some(ArgumentContainer.Method meth)))
608+
| None-> None
609+
)
610+
|_->[]
611+
)
612+
613+
letGetNamedParametersAndSettableFields endOfExprPos hasTextChangedSinceLastTypecheck=
602614
letcnrs= GetCapturedNameResolutions endOfExprPos ResolveOverloads.No|> ResizeArray.toList|> List.rev
603-
match cnrswith
604-
| CNR(_, Item.CtorGroup(_, ctor::_),_, denv, nenv, ad, m)::_->
605-
letresult= ResolveCompletionsInType ncenv nenv ResolveCompletionTargets.SettablePropertiesAndFields m adfalse ctor.EnclosingType
615+
letresult=
616+
match cnrswith
617+
| CNR(_, Item.CtorGroup(_,((ctor::_)as ctors)),_, denv, nenv, ad, m)::_->
618+
letprops= ResolveCompletionsInType ncenv nenv ResolveCompletionTargets.SettablePropertiesAndFields m adfalse ctor.EnclosingType
619+
letparameters= CollectParameters ctors amap m
620+
Some(denv, m, props@ parameters)
621+
| CNR(_, Item.MethodGroup(_, methods),_, denv, nenv, ad, m)::_->
622+
letprops=
623+
methods
624+
|> List.collect(fun meth->
625+
letretTy= meth.GetFSharpReturnTy(amap, m, meth.FormalMethodInst)
626+
ResolveCompletionsInType ncenv nenv ResolveCompletionTargets.SettablePropertiesAndFields m adfalse retTy
627+
)
628+
letparameters= CollectParameters methods amap m
629+
Some(denv, m, props@ parameters)
630+
|_->
631+
None
632+
match resultwith
633+
| None->
634+
NameResResult.Empty
635+
| Some(denv, m, result)->
606636
ReturnItemsOfType result g denv m TypeNameResolutionFlag.ResolveTypeNamesToTypeRefs hasTextChangedSinceLastTypecheck NameResResult.Members
607-
|_-> NameResResult.Empty
608637

609638
/// finds captured typing for the given position
610639
letGetExprTypingForPosition(endOfExprPos)=
@@ -645,7 +674,6 @@ type TypeCheckInfo
645674
Some(items, denv, m)
646675
|_-> None
647676

648-
649677
/// Looks at the exact expression types at the position to the left of the
650678
/// residue then the source when it was typechecked.
651679
letGetPreciseCompletionListFromExprTypings(untypedParseInfo:UntypedParseInfo,line,colAtEndOfNames,filterCtors,hasTextChangedSinceLastTypecheck:(obj* Range-> bool))=
@@ -946,8 +974,8 @@ type TypeCheckInfo
946974
| Some(CompletionContext.RecordField(RecordContext.Constructor(typeName)))->
947975
FindRecordFieldsInEnv([typeName], None)
948976
|> Some
949-
| Some(NewObject(endPos, fields))->
950-
letresults=GetSettableFields endPos hasTextChangedSinceLastTypecheck
977+
| Some(CompletionContext.ParameterList(endPos, fields))->
978+
letresults=GetNamedParametersAndSettableFields endPos hasTextChangedSinceLastTypecheck
951979

952980
letdeclaredItems= getDeclaredItemsfalse
953981

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

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,65 @@ type AutoCompletionListTests() as this =
557557
AssertCtrlSpaceCompleteContains(typeDef@["open Ext";"A((**))"])"A((**)"["XYZ"][]// positive
558558
AssertCtrlSpaceCompleteContains(typeDef@["A((**))"])"A((**)"[]["XYZ"]// negative
559559

560+
[<Test>]
561+
[<Category("Completion in object initializer")>]
562+
memberpublicthis.``ObjectInitializer.CompletionForNamedParameters``()=
563+
lettypeDef1=
564+
[
565+
"type A ="
566+
" static member Run(xyz: int, zyx: string) = 1"
567+
]
568+
AssertCtrlSpaceCompleteContains(typeDef1@["A.Run()"])".Run("["xyz";"zyx"][]
569+
AssertCtrlSpaceCompleteContains(typeDef1@["A.Run(x = 1)"])".Run(x"["xyz"][]
570+
AssertCtrlSpaceCompleteContains(typeDef1@["A.Run(x = 1,)"])".Run(x = 1,"["xyz";"zyx"][]
571+
572+
lettypeDef2=
573+
[
574+
"type A ="
575+
" static member Run<'T>(xyz: 'T, zyx: string) = 1"
576+
]
577+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run()"])".Run("["xyz";"zyx"][]
578+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run(x = 1)"])".Run(x"["xyz"][]
579+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run(x = 1,)"])".Run(x = 1,"["xyz";"zyx"][]
580+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run<_>()"])".Run<_>("["xyz";"zyx"][]
581+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run<_>(x = 1)"])".Run<_>(x"["xyz"][]
582+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run<_>(x = 1,)"])".Run<_>(x = 1,"["xyz";"zyx"][]
583+
584+
[<Test>]
585+
[<Category("Completion in object initializer")>]
586+
memberpublicthis.``ObjectInitializer.CompletionForSettablePropertiesInReturnValue``()=
587+
lettypeDef1=
588+
[
589+
"type A0() = member val Settable0 = 1 with get,set"
590+
"type A() ="
591+
" member val Settable = 1 with get,set"
592+
" member val NonSettable = 1"
593+
" static member Run(): A0 = Unchecked.defaultof<_>"
594+
" static member Run(a: string): A = Unchecked.defaultof<_>"
595+
]
596+
AssertCtrlSpaceCompleteContains(typeDef1@["A.Run()"])".Run("["Settable";"Settable0"]["NonSettable"]
597+
AssertCtrlSpaceCompleteContains(typeDef1@["A.Run(S = 1)"])".Run(S"["Settable";"Settable0"]["NonSettable"]
598+
AssertCtrlSpaceCompleteContains(typeDef1@["A.Run(S = 1,)"])".Run(S = 1,"["Settable";"Settable0"]["NonSettable"]
599+
AssertCtrlSpaceCompleteContains(typeDef1@["A.Run(Settable = 1,)"])".Run(Settable = 1,"["Settable0"]["NonSettable"]
600+
601+
lettypeDef2=
602+
[
603+
"type A0() = member val Settable0 = 1 with get,set"
604+
"type A() ="
605+
" member val Settable = 1 with get,set"
606+
" member val NonSettable = 1"
607+
" static member Run<'T>(): A0 = Unchecked.defaultof<_>"
608+
" static member Run(a: int): A = Unchecked.defaultof<_>"
609+
]
610+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run()"])".Run("["Settable";"Settable0"]["NonSettable"]
611+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run(S = 1)"])".Run(S"["Settable";"Settable0"]["NonSettable"]
612+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run(S = 1,)"])".Run(S = 1,"["Settable";"Settable0"]["NonSettable"]
613+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run(Settable = 1,)"])".Run(Settable = 1,"["Settable0"]["NonSettable"]
614+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run<_>()"])".Run<_>("["Settable";"Settable0"]["NonSettable"]
615+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run<_>(S = 1)"])".Run<_>(S"["Settable";"Settable0"]["NonSettable"]
616+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run<_>(S = 1,)"])".Run<_>(S = 1,"["Settable";"Settable0"]["NonSettable"]
617+
AssertCtrlSpaceCompleteContains(typeDef2@["A.Run<_>(Settable = 1,)"])".Run<_>(Settable = 1,"["Settable0"]["NonSettable"]
618+
560619

561620
[<Test>]
562621
[<Category("RangeOperator")>]

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp