Skip to content

Commit 9225cfc

Browse files
committed
[CodeCompletion] Type annotation for call argument completions
1 parent f8147f7 commit 9225cfc

File tree

5 files changed

+63
-26
lines changed

5 files changed

+63
-26
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3950,7 +3950,15 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
39503950
Arg->getPlainType(), ContextType,
39513951
Arg->isVariadic(), Arg->isInOut(),
39523952
/*isIUO=*/false, Arg->isAutoClosure());
3953-
Builder.addTypeAnnotation("Argument");
3953+
auto Ty = Arg->getPlainType();
3954+
if (Arg->isInOut()) {
3955+
Ty = InOutType::get(Ty);
3956+
} else if (Arg->isAutoClosure()) {
3957+
// 'Ty' may be ErrorType.
3958+
if (auto funcTy = Ty->getAs<FunctionType>())
3959+
Ty = funcTy->getResult();
3960+
}
3961+
addTypeAnnotation(Builder, Ty);
39543962
Builder.setExpectedTypeRelation(
39553963
CodeCompletionResult::ExpectedTypeRelation::NotApplicable);
39563964
}

test/IDE/complete_call_arg.swift

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@
9696
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TYPECHECKED_OVERLOADED | %FileCheck %s -check-prefix=TYPECHECKED_OVERLOADED
9797
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TYPECHECKED_TYPEEXPR | %FileCheck %s -check-prefix=TYPECHECKED_TYPEEXPR
9898

99+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ARG_PARAMFLAG_INOUT | %FileCheck %s -check-prefix=ARG_PARAMFLAG_INOUT
100+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ARG_PARAMFLAG_AUTOCLOSURE| %FileCheck %s -check-prefix=ARG_PARAMFLAG_AUTOCLOSURE
101+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ARG_PARAMFLAG_IUO | %FileCheck %s -check-prefix=ARG_PARAMFLAG_IUO
102+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ARG_PARAMFLAG_VARIADIC | %FileCheck %s -check-prefix=ARG_PARAMFLAG_VARIADIC
103+
104+
99105
var i1 = 1
100106
var i2 = 2
101107
var oi1 : Int?
@@ -171,18 +177,18 @@ class C1 {
171177
}
172178

173179
// ARG-NAME1: Begin completions, 2 items
174-
// ARG-NAME1-DAG: Pattern/ExprSpecific: {#b1: Int?#}[#Argument#];
175-
// ARG-NAME1-DAG: Pattern/ExprSpecific: {#b2: Int?#}[#Argument#];
180+
// ARG-NAME1-DAG: Pattern/ExprSpecific: {#b1: Int?#}[#Int?#];
181+
// ARG-NAME1-DAG: Pattern/ExprSpecific: {#b2: Int?#}[#Int?#];
176182

177183
// ARG-NAME2: Begin completions, 1 items
178-
// ARG-NAME2-DAG: Pattern/ExprSpecific: {#b: Int#}[#Argument#];
184+
// ARG-NAME2-DAG: Pattern/ExprSpecific: {#b: Int#}[#Int#];
179185

180186
// ARG-NAME3: Begin completions, 1 items
181-
// ARG-NAME3-DAG: Pattern/ExprSpecific: {#b: String?#}[#Argument#];
187+
// ARG-NAME3-DAG: Pattern/ExprSpecific: {#b: String?#}[#String?#];
182188

183189
// ARG-NAME4: Begin completions, 2 items
184-
// ARG-NAME4-DAG: Pattern/ExprSpecific: {#b1: String#}[#Argument#];
185-
// ARG-NAME4-DAG: Pattern/ExprSpecific: {#b2: String#}[#Argument#];
190+
// ARG-NAME4-DAG: Pattern/ExprSpecific: {#b1: String#}[#String#];
191+
// ARG-NAME4-DAG: Pattern/ExprSpecific: {#b2: String#}[#String#];
186192
// ARG-NAME4: End completions
187193

188194
// EXPECT_OINT: Begin completions
@@ -344,7 +350,7 @@ extension C3 {
344350
// HASERROR2: End completions
345351

346352
// HASERROR3: Begin completions
347-
// HASERROR3-DAG: Pattern/ExprSpecific: {#b1: <<error type>>#}[#Argument#];
353+
// HASERROR3-DAG: Pattern/ExprSpecific: {#b1: <<error type>>#}[#<<error type>>#];
348354
// HASERROR3: End completions
349355

350356
// HASERROR4: Begin completions
@@ -472,7 +478,7 @@ func testArg2Name1() {
472478
func testArg2Name3() {
473479
firstArg(#^FIRST_ARG_NAME_3^#,
474480
}
475-
// FIRST_ARG_NAME_3: Pattern/ExprSpecific: {#arg1: Int#}[#Argument#];
481+
// FIRST_ARG_NAME_3: Pattern/ExprSpecific: {#arg1: Int#}[#Int#];
476482
// FIRST_ARG_NAME_4: Decl[FreeFunction]/CurrModule: ['(']{#arg1: Int#}, {#arg2: Int#}[')'][#Void#];
477483

478484
func takeArray<T>(_ x: [T]) {}
@@ -590,7 +596,7 @@ func testSubscript(obj: HasSubscript, intValue: Int, strValue: String) {
590596

591597
let _ = obj[42, #^SUBSCRIPT_2^#
592598
// SUBSCRIPT_2: Begin completions, 1 items
593-
// SUBSCRIPT_2-NEXT: Pattern/ExprSpecific: {#default: String#}[#Argument#];
599+
// SUBSCRIPT_2-NEXT: Pattern/ExprSpecific: {#default: String#}[#String#];
594600

595601
let _ = obj[42, .#^SUBSCRIPT_2_DOT^#
596602
// SUBSCRIPT_2_DOT-NOT: Begin completions
@@ -667,16 +673,16 @@ func testStaticMemberCall() {
667673

668674
let _ = TestStaticMemberCall.create2(1, #^STATIC_METHOD_SECOND^#)
669675
// STATIC_METHOD_SECOND: Begin completions, 3 items
670-
// STATIC_METHOD_SECOND: Pattern/ExprSpecific: {#arg2: Int#}[#Argument#];
671-
// STATIC_METHOD_SECOND: Pattern/ExprSpecific: {#arg3: Int#}[#Argument#];
672-
// STATIC_METHOD_SECOND: Pattern/ExprSpecific: {#arg4: Int#}[#Argument#];
676+
// STATIC_METHOD_SECOND: Pattern/ExprSpecific: {#arg2: Int#}[#Int#];
677+
// STATIC_METHOD_SECOND: Pattern/ExprSpecific: {#arg3: Int#}[#Int#];
678+
// STATIC_METHOD_SECOND: Pattern/ExprSpecific: {#arg4: Int#}[#Int#];
673679
// STATIC_METHOD_SECOND: End completions
674680

675681
let _ = TestStaticMemberCall.create2(1, arg3: 2, #^STATIC_METHOD_SKIPPED^#)
676682
// STATIC_METHOD_SKIPPED: Begin completions, 2 items
677683
// FIXME: 'arg3' shouldn't be suggested.
678-
// STATIC_METHOD_SKIPPED: Pattern/ExprSpecific: {#arg3: Int#}[#Argument#];
679-
// STATIC_METHOD_SKIPPED: Pattern/ExprSpecific: {#arg4: Int#}[#Argument#];
684+
// STATIC_METHOD_SKIPPED: Pattern/ExprSpecific: {#arg3: Int#}[#Int#];
685+
// STATIC_METHOD_SKIPPED: Pattern/ExprSpecific: {#arg4: Int#}[#Int#];
680686
// STATIC_METHOD_SKIPPED: End completions
681687
}
682688
func testImplicitMember() {
@@ -695,16 +701,16 @@ func testImplicitMember() {
695701

696702
let _: TestStaticMemberCall = .create2(1, #^IMPLICIT_MEMBER_SECOND^#)
697703
// IMPLICIT_MEMBER_SECOND: Begin completions, 3 items
698-
// IMPLICIT_MEMBER_SECOND: Pattern/ExprSpecific: {#arg2: Int#}[#Argument#];
699-
// IMPLICIT_MEMBER_SECOND: Pattern/ExprSpecific: {#arg3: Int#}[#Argument#];
700-
// IMPLICIT_MEMBER_SECOND: Pattern/ExprSpecific: {#arg4: Int#}[#Argument#];
704+
// IMPLICIT_MEMBER_SECOND: Pattern/ExprSpecific: {#arg2: Int#}[#Int#];
705+
// IMPLICIT_MEMBER_SECOND: Pattern/ExprSpecific: {#arg3: Int#}[#Int#];
706+
// IMPLICIT_MEMBER_SECOND: Pattern/ExprSpecific: {#arg4: Int#}[#Int#];
701707
// IMPLICIT_MEMBER_SECOND: End completions
702708

703709
let _: TestStaticMemberCall = .create2(1, arg3: 2, #^IMPLICIT_MEMBER_SKIPPED^#)
704710
// IMPLICIT_MEMBER_SKIPPED: Begin completions, 2 items
705711
// FIXME: 'arg3' shouldn't be suggested.
706-
// IMPLICIT_MEMBER_SKIPPED: Pattern/ExprSpecific: {#arg3: Int#}[#Argument#];
707-
// IMPLICIT_MEMBER_SKIPPED: Pattern/ExprSpecific: {#arg4: Int#}[#Argument#];
712+
// IMPLICIT_MEMBER_SKIPPED: Pattern/ExprSpecific: {#arg3: Int#}[#Int#];
713+
// IMPLICIT_MEMBER_SKIPPED: Pattern/ExprSpecific: {#arg4: Int#}[#Int#];
708714
// IMPLICIT_MEMBER_SKIPPED: End completions
709715
}
710716
func testImplicitMemberInArrayLiteral() {
@@ -787,3 +793,26 @@ func testTypecheckedTypeExpr() {
787793
// TYPECHECKED_TYPEEXPR: Decl[Constructor]/CurrNominal: ['(']{#arg1: String#}, {#arg2: _#}[')'][#MyType<_>#]; name=arg1: String, arg2: _
788794
// TYPECHECKED_TYPEEXPR: Decl[Constructor]/CurrNominal: ['(']{#(intVal): Int#}[')'][#MyType<Int>#]; name=intVal: Int
789795
// TYPECHECKED_TYPEEXPR: End completions
796+
797+
func testPamrameterFlags(_: Int, inoutArg: inout Int, autoclosureArg: @autoclosure () -> Int, iuoArg: Int!, variadicArg: Int...) {
798+
var intVal = 1
799+
testPamrameterFlags(intVal, #^ARG_PARAMFLAG_INOUT^#)
800+
// ARG_PARAMFLAG_INOUT: Begin completions, 1 items
801+
// ARG_PARAMFLAG_INOUT-DAG: Pattern/ExprSpecific: {#inoutArg: &Int#}[#inout Int#]; name=inoutArg:
802+
// ARG_PARAMFLAG_INOUT: End completions
803+
804+
testPamrameterFlags(intVal, inoutArg: &intVal, #^ARG_PARAMFLAG_AUTOCLOSURE^#)
805+
// ARG_PARAMFLAG_AUTOCLOSURE: Begin completions, 1 items
806+
// ARG_PARAMFLAG_AUTOCLOSURE-DAG: Pattern/ExprSpecific: {#autoclosureArg: Int#}[#Int#];
807+
// ARG_PARAMFLAG_AUTOCLOSURE: End completions
808+
809+
testPamrameterFlags(intVal, inoutArg: &intVal, autoclosureArg: intVal, #^ARG_PARAMFLAG_IUO^#)
810+
// ARG_PARAMFLAG_IUO: Begin completions, 1 items
811+
// ARG_PARAMFLAG_IUO-DAG: Pattern/ExprSpecific: {#iuoArg: Int?#}[#Int?#];
812+
// ARG_PARAMFLAG_IUO: End completions
813+
814+
testPamrameterFlags(intVal, inoutArg: &intVal, autoclosureArg: intVal, iuoArg: intVal, #^ARG_PARAMFLAG_VARIADIC^#)
815+
// ARG_PARAMFLAG_VARIADIC: Begin completions, 1 items
816+
// ARG_PARAMFLAG_VARIADIC-DAG: Pattern/ExprSpecific: {#variadicArg: Int...#}[#Int#];
817+
// ARG_PARAMFLAG_VARIADIC: End completions
818+
}

test/IDE/complete_call_as_function.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func testCallAsFunction(add: Adder, addTy: Adder.Type) {
3939

4040
let _ = add(x: 12, #^INSTANCE_ARG2^#)
4141
// INSTANCE_ARG2: Begin completions, 1 items
42-
// INSTANCE_ARG2: Pattern/ExprSpecific: {#y: Int#}[#Argument#];
42+
// INSTANCE_ARG2: Pattern/ExprSpecific: {#y: Int#}[#Int#];
4343
// INSTANCE_ARG2: End completions
4444

4545
let _ = addTy#^METATYPE_NO_DOT^#;
@@ -105,8 +105,8 @@ func testCallAsFunctionOverloaded(fn: Functor) {
105105
fn(h: .left, #^OVERLOADED_ARG2_LABEL^#)
106106
// FIXME: Should only suggest 'v:' (rdar://problem/60346573).
107107
//OVERLOADED_ARG2_LABEL: Begin completions, 2 items
108-
//OVERLOADED_ARG2_LABEL-DAG: Pattern/ExprSpecific: {#v: Functor.Vertical#}[#Argument#];
109-
//OVERLOADED_ARG2_LABEL-DAG: Pattern/ExprSpecific: {#h: Functor.Horizontal#}[#Argument#];
108+
//OVERLOADED_ARG2_LABEL-DAG: Pattern/ExprSpecific: {#v: Functor.Vertical#}[#Functor.Vertical#];
109+
//OVERLOADED_ARG2_LABEL-DAG: Pattern/ExprSpecific: {#h: Functor.Horizontal#}[#Functor.Horizontal#];
110110
//OVERLOADED_ARG2_LABEL: End completions
111111

112112
fn(h: .left, v: .#^OVERLOADED_ARG2_VALUE^#)

test/IDE/complete_subscript.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,12 @@ func test2<U>(value: MyStruct<U>) {
9191

9292
let _ = MyStruct<U>[42, #^METATYPE_LABEL^#
9393
// METATYPE_LABEL: Begin completions, 1 items
94-
// METATYPE_LABEL-DAG: Pattern/ExprSpecific: {#static: U#}[#Argument#];
94+
// METATYPE_LABEL-DAG: Pattern/ExprSpecific: {#static: U#}[#U#];
9595
// METATYPE_LABEL: End completions
9696

9797
let _ = value[42, #^INSTANCE_LABEL^#
9898
// INSTANCE_LABEL: Begin completions, 1 items
99-
// INSTANCE_LABEL-DAG: Pattern/ExprSpecific: {#instance: U#}[#Argument#];
99+
// INSTANCE_LABEL-DAG: Pattern/ExprSpecific: {#instance: U#}[#U#];
100100
// INSTANCE_LABEL: End completions
101101
}
102102

test/IDE/complete_value_expr.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ func testInsideFunctionCall4() {
768768
func testInsideFunctionCall5() {
769769
FooStruct().instanceFunc2(42, #^INSIDE_FUNCTION_CALL_5^#
770770
// INSIDE_FUNCTION_CALL_5: Begin completions
771-
// INSIDE_FUNCTION_CALL_5-DAG: Pattern/ExprSpecific: {#b: &Double#}[#Argument#];
771+
// INSIDE_FUNCTION_CALL_5-DAG: Pattern/ExprSpecific: {#b: &Double#}[#inout Double#];
772772
// INSIDE_FUNCTION_CALL_5: End completions
773773
}
774774

0 commit comments

Comments
 (0)