Skip to content

Commit c722b1a

Browse files
authored
Merge pull request swiftlang#29624 from rintaro/sourcekit-typerelation-rdar59066560
[SourceKit] Expose 'ExpectedTypeRelation' for the completion results
2 parents 960b5a2 + 7d498b1 commit c722b1a

29 files changed

+378
-65
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -886,6 +886,11 @@ calculateTypeRelationForDecl(const Decl *D, Type ExpectedType,
886886
return relation;
887887
}
888888
}
889+
if (auto EED = dyn_cast<EnumElementDecl>(VD)) {
890+
return calculateTypeRelation(
891+
EED->getParentEnum()->TypeDecl::getDeclaredInterfaceType(),
892+
ExpectedType, DC);
893+
}
889894
if (auto NTD = dyn_cast<NominalTypeDecl>(VD)) {
890895
return std::max(
891896
calculateTypeRelation(NTD->getInterfaceType(), ExpectedType, DC),

test/IDE/complete_assignment.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,16 +128,16 @@ func f2() {
128128
}
129129

130130
// ASSIGN_5: Begin completions, 2 items
131-
// ASSIGN_5-DAG: Decl[EnumElement]/ExprSpecific: case2[#D1#]; name=case2
132-
// ASSIGN_5-DAG: Decl[EnumElement]/ExprSpecific: case1[#D1#]; name=case1
131+
// ASSIGN_5-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: case2[#D1#]; name=case2
132+
// ASSIGN_5-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: case1[#D1#]; name=case1
133133

134134
func f6() {
135135
var d : D2
136136
d = .#^ASSIGN_6^#
137137
}
138138
// ASSIGN_6: Begin completions, 2 items
139-
// ASSIGN_6-DAG: Decl[EnumElement]/ExprSpecific: case3[#D2#]; name=case3
140-
// ASSIGN_6-DAG:Decl[EnumElement]/ExprSpecific: case4[#D2#]; name=case4
139+
// ASSIGN_6-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: case3[#D2#]; name=case3
140+
// ASSIGN_6-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: case4[#D2#]; name=case4
141141

142142
func f7 (C : C2) {
143143
var i : Int

test/IDE/complete_call_arg.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -555,9 +555,9 @@ func testTupleShuffle() {
555555
// SHUFFLE_2-DAG: Decl[GlobalVar]/CurrModule/TypeRelation[Identical]: s2[#String#]; name=s2
556556

557557
// SHUFFLE_3: Begin completions, 3 items
558-
// SHUFFLE_3-DAG: Decl[EnumElement]/ExprSpecific: foo[#SimpleEnum#]; name=foo
559-
// SHUFFLE_3-DAG: Decl[EnumElement]/ExprSpecific: bar[#SimpleEnum#]; name=bar
560-
// SHUFFLE_3-DAG: Decl[EnumElement]/ExprSpecific: baz[#SimpleEnum#]; name=baz
558+
// SHUFFLE_3-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: foo[#SimpleEnum#]; name=foo
559+
// SHUFFLE_3-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: bar[#SimpleEnum#]; name=bar
560+
// SHUFFLE_3-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: baz[#SimpleEnum#]; name=baz
561561

562562
class HasSubscript {
563563
subscript(idx: Int) -> String {}

test/IDE/complete_constrained.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ struct Vegetarian: EatsFruit, EatsVegetables { }
118118
func testVegetarian(chef: Chef<Vegetarian>) {
119119
chef.cook(.#^CONDITIONAL_OVERLOAD_ARG^#)
120120
// CONDITIONAL_OVERLOAD_ARG: Begin completions, 2 items
121-
// CONDITIONAL_OVERLOAD_ARG-DAG: Decl[EnumElement]/ExprSpecific: apple[#Fruit#]; name=apple
122-
// CONDITIONAL_OVERLOAD_ARG-DAG: Decl[EnumElement]/ExprSpecific: broccoli[#Vegetable#]; name=broccoli
121+
// CONDITIONAL_OVERLOAD_ARG-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: apple[#Fruit#]; name=apple
122+
// CONDITIONAL_OVERLOAD_ARG-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: broccoli[#Vegetable#]; name=broccoli
123123
// CONDITIONAL_OVERLOAD_ARG: End completions
124124

125125
var chefMeta: Chef<Vegetarian>.Type = Chef<Vegetarian>.self

test/IDE/complete_enum_elements.swift

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ enum FooEnum: CaseIterable {
8989
}
9090

9191
// FOO_ENUM_TYPE_CONTEXT: Begin completions
92-
// FOO_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Foo1[#FooEnum#]{{; name=.+$}}
93-
// FOO_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Foo2[#FooEnum#]{{; name=.+$}}
92+
// FOO_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Foo1[#FooEnum#]{{; name=.+$}}
93+
// FOO_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Foo2[#FooEnum#]{{; name=.+$}}
9494
// FOO_ENUM_TYPE_CONTEXT-DAG: Decl[StaticVar]/CurrNominal/TypeRelation[Identical]: .alias1[#FooEnum#]; name=alias1
9595
// FOO_ENUM_TYPE_CONTEXT: End completions
9696

@@ -128,8 +128,8 @@ enum FooEnum: CaseIterable {
128128
// FOO_ENUM_DOT_INVALID-NEXT: End completions
129129

130130
// FOO_ENUM_DOT_ELEMENTS: Begin completions, 3 items
131-
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[EnumElement]/ExprSpecific: Foo1[#FooEnum#]{{; name=.+$}}
132-
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[EnumElement]/ExprSpecific: Foo2[#FooEnum#]{{; name=.+$}}
131+
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: Foo1[#FooEnum#]{{; name=.+$}}
132+
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: Foo2[#FooEnum#]{{; name=.+$}}
133133
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[StaticVar]/CurrNominal/TypeRelation[Identical]: alias1[#FooEnum#]; name=alias1
134134
// FOO_ENUM_DOT_ELEMENTS-NEXT: End completions
135135

@@ -154,18 +154,18 @@ enum BarEnum {
154154
}
155155

156156
// BAR_ENUM_TYPE_CONTEXT: Begin completions
157-
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Bar1[#BarEnum#]{{; name=.+$}}
158-
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Bar2()[#BarEnum#]{{; name=.+$}}
159-
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Bar3({#Int#})[#BarEnum#]{{; name=.+$}}
160-
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Bar4({#a: Int#}, {#b: Float#})[#BarEnum#]{{; name=.+$}}
161-
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Bar5({#a: Int#}, {#(Float)#})[#BarEnum#]{{; name=.+$}}
162-
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Bar6({#a: Int#}, {#b: (Float)#})[#BarEnum#]{{; name=.+$}}
163-
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Bar7({#a: Int#}, {#(b: Float, c: Double)#})[#BarEnum#]{{; name=.+$}}
164-
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Bar8({#a: Int#}, {#b: (c: Float, d: Double)#})[#BarEnum#]{{; name=.+$}}
165-
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Bar9({#Int#})[#BarEnum#]{{; name=.+$}}
166-
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Bar10({#Int#}, {#Float#})[#BarEnum#]{{; name=.+$}}
167-
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Bar11({#Int#}, {#(Float)#})[#BarEnum#]{{; name=.+$}}
168-
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Bar12({#Int#}, {#(Float, Double)#})[#BarEnum#]{{; name=.+$}}
157+
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Bar1[#BarEnum#]{{; name=.+$}}
158+
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Bar2()[#BarEnum#]{{; name=.+$}}
159+
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Bar3({#Int#})[#BarEnum#]{{; name=.+$}}
160+
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Bar4({#a: Int#}, {#b: Float#})[#BarEnum#]{{; name=.+$}}
161+
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Bar5({#a: Int#}, {#(Float)#})[#BarEnum#]{{; name=.+$}}
162+
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Bar6({#a: Int#}, {#b: (Float)#})[#BarEnum#]{{; name=.+$}}
163+
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Bar7({#a: Int#}, {#(b: Float, c: Double)#})[#BarEnum#]{{; name=.+$}}
164+
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Bar8({#a: Int#}, {#b: (c: Float, d: Double)#})[#BarEnum#]{{; name=.+$}}
165+
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Bar9({#Int#})[#BarEnum#]{{; name=.+$}}
166+
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Bar10({#Int#}, {#Float#})[#BarEnum#]{{; name=.+$}}
167+
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Bar11({#Int#}, {#(Float)#})[#BarEnum#]{{; name=.+$}}
168+
// BAR_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Bar12({#Int#}, {#(Float, Double)#})[#BarEnum#]{{; name=.+$}}
169169
// BAR_ENUM_TYPE_CONTEXT: End completions
170170

171171
// BAR_ENUM_NO_DOT: Begin completions
@@ -274,8 +274,8 @@ enum QuxEnum : Int {
274274
}
275275

276276
// QUX_ENUM_TYPE_CONTEXT: Begin completions
277-
// QUX_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Qux1[#QuxEnum#]{{; name=.+$}}
278-
// QUX_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Qux2[#QuxEnum#]{{; name=.+$}}
277+
// QUX_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Qux1[#QuxEnum#]{{; name=.+$}}
278+
// QUX_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Qux2[#QuxEnum#]{{; name=.+$}}
279279
// QUX_ENUM_TYPE_CONTEXT: End completions
280280

281281
// QUX_ENUM_NO_DOT: Begin completions, 7 items
@@ -436,16 +436,16 @@ func testWithInvalid1() {
436436
// UNRESOLVED_1: Begin completions
437437
// UNRESOLVED_1-NOT: Baz
438438
// UNRESOLVED_1-NOT: Bar
439-
// UNRESOLVED_1-DAG: Decl[EnumElement]/ExprSpecific: Qux1[#QuxEnum#]; name=Qux1
440-
// UNRESOLVED_1-DAG: Decl[EnumElement]/ExprSpecific: Qux2[#QuxEnum#]; name=Qux2
439+
// UNRESOLVED_1-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: Qux1[#QuxEnum#]; name=Qux1
440+
// UNRESOLVED_1-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: Qux2[#QuxEnum#]; name=Qux2
441441
// UNRESOLVED_1-NOT: Okay
442442
}
443443

444444
func testUnqualified1(x: QuxEnum) {
445445
_ = x == .Qux1 || x == .#^UNRESOLVED_2^#Qux2
446446
// UNRESOLVED_2: Begin completions, 2 items
447-
// UNRESOLVED_2-DAG: Decl[EnumElement]/ExprSpecific: Qux1[#QuxEnum#]; name=Qux1
448-
// UNRESOLVED_2-DAG: Decl[EnumElement]/ExprSpecific: Qux2[#QuxEnum#]; name=Qux2
447+
// UNRESOLVED_2-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: Qux1[#QuxEnum#]; name=Qux1
448+
// UNRESOLVED_2-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: Qux2[#QuxEnum#]; name=Qux2
449449
// UNRESOLVED_2: End completions
450450

451451
_ = (x == .Qux1#^UNRESOLVED_3^#)

test/IDE/complete_in_closures.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,8 +372,8 @@ func testIIFE() {
372372
}()
373373
}
374374
// IN_IIFE_1: Begin completions
375-
// IN_IIFE_1-DAG: Decl[EnumElement]/ExprSpecific: north[#SomeEnum#]
376-
// IN_IIFE_1-DAG: Decl[EnumElement]/ExprSpecific: south[#SomeEnum#]
375+
// IN_IIFE_1-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: north[#SomeEnum#]
376+
// IN_IIFE_1-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: south[#SomeEnum#]
377377

378378
extension Error {
379379
var myErrorNumber: Int { return 0 }

test/IDE/complete_property_delegate_attribute.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ struct TestStruct {
3535
@MyStruct(arg1: .#^ARG_MyEnum_DOT^#
3636
var test3
3737
// ARG_MyEnum_DOT: Begin completions, 2 items
38-
// ARG_MyEnum_DOT-DAG: Decl[EnumElement]/ExprSpecific: east[#MyEnum#]; name=east
39-
// ARG_MyEnum_DOT-DAG: Decl[EnumElement]/ExprSpecific: west[#MyEnum#]; name=west
38+
// ARG_MyEnum_DOT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: east[#MyEnum#]; name=east
39+
// ARG_MyEnum_DOT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: west[#MyEnum#]; name=west
4040
// ARG_MyEnum_DOT: End completions
4141

42-
@MyStruct(arg1: MyEnum.#^ARG_MyEnum_NOBINDING^#)
42+
@MyStruct(arg1: MyEnum.#^ARG_MyEnum_NOBINDING^#)
4343
// ARG_MyEnum_NOBINDING: Begin completions
4444
// ARG_MyEnum_NOBINDING-DAG: Decl[EnumElement]/CurrNominal: east[#MyEnum#];
4545
// ARG_MyEnum_NOBINDING-DAG: Decl[EnumElement]/CurrNominal: west[#MyEnum#];

test/IDE/complete_single_expression_return.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ struct TestSingleExprClosureRetUnresolved {
9898

9999
// TestSingleExprClosureRetUnresolved: Begin completions
100100
// TestSingleExprClosureRetUnresolved-NOT: notMine
101-
// TestSingleExprClosureRetUnresolved: Decl[EnumElement]/ExprSpecific: myEnum[#MyEnum#];
101+
// TestSingleExprClosureRetUnresolved: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: myEnum[#MyEnum#];
102102
// TestSingleExprClosureRetUnresolved-NOT: notMine
103103
// TestSingleExprClosureRetUnresolved: End completions
104104
}
@@ -263,7 +263,7 @@ struct TestSingleExprFuncUnresolved {
263263

264264
// TestSingleExprFuncUnresolved: Begin completions
265265
// TestSingleExprFuncUnresolved-NOT: notMine
266-
// TestSingleExprFuncUnresolved: Decl[EnumElement]/ExprSpecific: myEnum[#MyEnum#];
266+
// TestSingleExprFuncUnresolved: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: myEnum[#MyEnum#];
267267
// TestSingleExprFuncUnresolved-NOT: notMine
268268
// TestSingleExprFuncUnresolved: End completions
269269
}
@@ -373,7 +373,7 @@ struct TestSingleExprAccessorUnresolved {
373373

374374
// TestSingleExprAccessorUnresolved: Begin completions
375375
// TestSingleExprAccessorUnresolved-NOT: notMine
376-
// TestSingleExprAccessorUnresolved: Decl[EnumElement]/ExprSpecific: myEnum[#MyEnum#];
376+
// TestSingleExprAccessorUnresolved: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: myEnum[#MyEnum#];
377377
// TestSingleExprAccessorUnresolved-NOT: notMine
378378
// TestSingleExprAccessorUnresolved: End completions
379379
}
@@ -525,7 +525,7 @@ struct TestSingleExprSubscriptUnresolved {
525525

526526
// TestSingleExprSubscriptUnresolved: Begin completions
527527
// TestSingleExprSubscriptUnresolved-NOT: notMine
528-
// TestSingleExprSubscriptUnresolved: Decl[EnumElement]/ExprSpecific: myEnum[#MyEnum#];
528+
// TestSingleExprSubscriptUnresolved: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: myEnum[#MyEnum#];
529529
// TestSingleExprSubscriptUnresolved-NOT: notMine
530530
// TestSingleExprSubscriptUnresolved: End completions
531531
}
@@ -630,7 +630,7 @@ enum TopLevelEnum {
630630
case foo
631631
}
632632

633-
// TopLevelEnum: Decl[EnumElement]/ExprSpecific: foo[#TopLevelEnum#];
633+
// TopLevelEnum: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: foo[#TopLevelEnum#];
634634

635635
var testAccessorUnresolvedTopLevel: TopLevelEnum {
636636
.#^testAccessorUnresolvedTopLevel^#

test/IDE/complete_stmt_controlling_expr.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ func testSwitchCaseWhereExprIJ1(_ fooObject: FooStruct) {
519519
enum A { case aaa }
520520
enum B { case bbb }
521521
// UNRESOLVED_B-NOT: aaa
522-
// UNRESOLVED_B: Decl[EnumElement]/ExprSpecific: bbb[#B#]; name=bbb
522+
// UNRESOLVED_B: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: bbb[#B#]; name=bbb
523523
// UNRESOLVED_B-NOT: aaa
524524

525525
struct AA {

0 commit comments

Comments
 (0)