Skip to content

Commit e947512

Browse files
committed
[CodeCompletion] Prioritize type matching overload for unresovled member
For exmaple: func foo(_: Int, _: IntOption) func foo(_: Float, _: FloatOption) foo(intVal, .<HERE>) Previously code completion suggests static member from 'IntOption' and 'FloatOption' without any prioritization. Prioritize members from 'IntOption' because the user probably wants to input them. In such cases, 'CodeCompletionExpr' at the cursor position is pre-typechecked to 'IntOption'. So mark results with matching type with 'ExprSpecific'. rdar://problem/62121221
1 parent 8408c33 commit e947512

13 files changed

+188
-80
lines changed

lib/IDE/CodeCompletion.cpp

+33-7
Original file line numberDiff line numberDiff line change
@@ -1872,6 +1872,10 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
18721872
expectedTypeContext.possibleTypes.push_back(T);
18731873
}
18741874

1875+
void setIdealExpectedType(Type Ty) {
1876+
expectedTypeContext.idealType = Ty;
1877+
}
1878+
18751879
CodeCompletionContext::TypeContextKind typeContextKind() const {
18761880
if (expectedTypeContext.empty()) {
18771881
return CodeCompletionContext::TypeContextKind::None;
@@ -2011,12 +2015,6 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
20112015
if (ForcedSemanticContext)
20122016
return *ForcedSemanticContext;
20132017

2014-
if (IsUnresolvedMember) {
2015-
if (isa<EnumElementDecl>(D)) {
2016-
return SemanticContextKind::ExpressionSpecific;
2017-
}
2018-
}
2019-
20202018
switch (Reason) {
20212019
case DeclVisibilityKind::LocalVariable:
20222020
case DeclVisibilityKind::FunctionParameter:
@@ -2080,6 +2078,23 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
20802078
llvm_unreachable("unhandled kind");
20812079
}
20822080

2081+
bool isUnresolvedMemberIdealType(Type Ty) {
2082+
assert(Ty);
2083+
if (!IsUnresolvedMember)
2084+
return false;
2085+
Type idealTy = expectedTypeContext.idealType;
2086+
if (!idealTy)
2087+
return false;
2088+
/// Consider optional object type is the ideal.
2089+
/// For exmaple:
2090+
/// enum MyEnum { case foo, bar }
2091+
/// func foo(_: MyEnum?)
2092+
/// fooo(.<HERE>)
2093+
/// Prefer '.foo' and '.bar' over '.some' and '.none'.
2094+
idealTy = idealTy->lookThroughAllOptionalTypes();
2095+
return idealTy->isEqual(Ty);
2096+
}
2097+
20832098
void addValueBaseName(CodeCompletionResultBuilder &Builder,
20842099
DeclBaseName Name) {
20852100
auto NameStr = Name.userFacingName();
@@ -2406,6 +2421,9 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
24062421
DynamicOrOptional);
24072422
else
24082423
addTypeAnnotation(Builder, VarType);
2424+
2425+
if (isUnresolvedMemberIdealType(VarType))
2426+
Builder.setSemanticContext(SemanticContextKind::ExpressionSpecific);
24092427
}
24102428

24112429
static bool hasInterestingDefaultValues(const AbstractFunctionDecl *func) {
@@ -2862,6 +2880,9 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
28622880
}
28632881
}
28642882
Builder.addTypeAnnotation(TypeStr);
2883+
2884+
if (isUnresolvedMemberIdealType(ResultType))
2885+
Builder.setSemanticContext(SemanticContextKind::ExpressionSpecific);
28652886
};
28662887

28672888
if (!AFT || IsImplicitlyCurriedInstanceMethod) {
@@ -3148,6 +3169,9 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
31483169
}
31493170

31503171
addTypeAnnotation(Builder, EnumType);
3172+
3173+
if (isUnresolvedMemberIdealType(EnumType))
3174+
Builder.setSemanticContext(SemanticContextKind::ExpressionSpecific);
31513175
}
31523176

31533177
void addKeyword(StringRef Name, Type TypeAnnotation = Type(),
@@ -4117,7 +4141,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
41174141
auto &SM = CurrDeclContext->getASTContext().SourceMgr;
41184142
if (DotLoc.isValid())
41194143
bytesToErase = SM.getByteDistance(DotLoc, SM.getCodeCompletionLoc());
4120-
addKeyword("nil", T, SemanticContextKind::ExpressionSpecific,
4144+
addKeyword("nil", T, SemanticContextKind::None,
41214145
CodeCompletionKeywordKind::kw_nil, bytesToErase);
41224146
}
41234147
getUnresolvedMemberCompletions(T);
@@ -5755,6 +5779,7 @@ void CodeCompletionCallbacksImpl::doneParsing() {
57555779
ExprContextInfo ContextInfo(CurDeclContext, CodeCompleteTokenExpr);
57565780
Lookup.setExpectedTypes(ContextInfo.getPossibleTypes(),
57575781
ContextInfo.isSingleExpressionBody());
5782+
Lookup.setIdealExpectedType(CodeCompleteTokenExpr->getType());
57585783
Lookup.getUnresolvedMemberCompletions(ContextInfo.getPossibleTypes());
57595784
DoPostfixExprBeginning();
57605785
break;
@@ -5810,6 +5835,7 @@ void CodeCompletionCallbacksImpl::doneParsing() {
58105835
ExprContextInfo ContextInfo(CurDeclContext, CodeCompleteTokenExpr);
58115836
Lookup.setExpectedTypes(ContextInfo.getPossibleTypes(),
58125837
ContextInfo.isSingleExpressionBody());
5838+
Lookup.setIdealExpectedType(CodeCompleteTokenExpr->getType());
58135839
Lookup.getUnresolvedMemberCompletions(ContextInfo.getPossibleTypes());
58145840
break;
58155841
}

lib/IDE/CodeCompletionResultBuilder.h

+7
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ struct ExpectedTypeContext {
4040
/// Possible types of the code completion expression.
4141
llvm::SmallVector<Type, 4> possibleTypes;
4242

43+
/// Pre typechecked type of the expression at the completion position.
44+
Type idealType;
45+
4346
/// Whether the `ExpectedTypes` comes from a single-expression body, e.g.
4447
/// `foo({ here })`.
4548
///
@@ -136,6 +139,10 @@ class CodeCompletionResultBuilder {
136139
NotRecReason = Reason;
137140
}
138141

142+
void setSemanticContext(SemanticContextKind Kind) {
143+
SemanticContext = Kind;
144+
}
145+
139146
void
140147
setExpectedTypeRelation(CodeCompletionResult::ExpectedTypeRelation relation) {
141148
ExpectedTypeRelation = relation;

test/IDE/complete_annotation.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ func testImplicitMember() -> MyStruct {
9797
}
9898
// EXPR_IMPLICITMEMBER: Begin completions, 3 items
9999
// EXPR_IMPLICITMEMBER-DAG: Decl[Constructor]/CurrNominal/TypeRelation[Identical]: <name>init</name>(<callarg><callarg.label>x</callarg.label>: <callarg.type><typeid.sys>Int</typeid.sys></callarg.type></callarg>); name=init(x: Int)
100-
// EXPR_IMPLICITMEMBER-DAG: Decl[StaticVar]/CurrNominal/TypeRelation[Identical]: <name>instance</name>; name=instance
101-
// EXPR_IMPLICITMEMBER-DAG: Decl[StaticMethod]/CurrNominal/TypeRelation[Identical]: <name>create</name>(<callarg><callarg.label>x</callarg.label>: <callarg.type><typeid.sys>Int</typeid.sys></callarg.type></callarg>); name=create(x: Int)
100+
// EXPR_IMPLICITMEMBER-DAG: Decl[StaticVar]/ExprSpecific/TypeRelation[Identical]: <name>instance</name>; name=instance
101+
// EXPR_IMPLICITMEMBER-DAG: Decl[StaticMethod]/ExprSpecific/TypeRelation[Identical]: <name>create</name>(<callarg><callarg.label>x</callarg.label>: <callarg.type><typeid.sys>Int</typeid.sys></callarg.type></callarg>); name=create(x: Int)
102102
// EXPR_IMPLICITMEMBER: End completions
103103

104104
func testArgument() -> MyStruct {

test/IDE/complete_call_arg.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -593,8 +593,8 @@ func testSubscript(obj: HasSubscript, intValue: Int, strValue: String) {
593593
// SUBSCRIPT_1_DOT: Begin completions
594594
// SUBSCRIPT_1_DOT-NOT: i1
595595
// SUBSCRIPT_1_DOT-NOT: s1
596-
// SUBSCRIPT_1_DOT-DAG: Decl[StaticVar]/Super: max[#Int#]; name=max
597-
// SUBSCRIPT_1_DOT-DAG: Decl[StaticVar]/Super: min[#Int#]; name=min
596+
// SUBSCRIPT_1_DOT-DAG: Decl[StaticVar]/ExprSpecific: max[#Int#]; name=max
597+
// SUBSCRIPT_1_DOT-DAG: Decl[StaticVar]/ExprSpecific: min[#Int#]; name=min
598598

599599
let _ = obj[42, #^SUBSCRIPT_2^#
600600
// SUBSCRIPT_2: Begin completions, 1 items

test/IDE/complete_call_as_function.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func testCallAsFunctionOverloaded(fn: Functor) {
114114
//OVERLOADED_ARG2_VALUE: Begin completions, 4 items
115115
//OVERLOADED_ARG2_VALUE-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: up[#Functor.Vertical#];
116116
//OVERLOADED_ARG2_VALUE-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: down[#Functor.Vertical#];
117-
//OVERLOADED_ARG2_VALUE-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: left[#Functor.Horizontal#];
118-
//OVERLOADED_ARG2_VALUE-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: right[#Functor.Horizontal#];
117+
//OVERLOADED_ARG2_VALUE-DAG: Decl[EnumElement]/CurrNominal/TypeRelation[Identical]: left[#Functor.Horizontal#];
118+
//OVERLOADED_ARG2_VALUE-DAG: Decl[EnumElement]/CurrNominal/TypeRelation[Identical]: right[#Functor.Horizontal#];
119119
//OVERLOADED_ARG2_VALUE: End completions
120120
}

test/IDE/complete_constrained.swift

+2-2
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/TypeRelation[Identical]: apple[#Fruit#]; name=apple
122-
// CONDITIONAL_OVERLOAD_ARG-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: broccoli[#Vegetable#]; name=broccoli
121+
// CONDITIONAL_OVERLOAD_ARG-DAG: Decl[EnumElement]/CurrNominal/TypeRelation[Identical]: apple[#Fruit#]; name=apple
122+
// CONDITIONAL_OVERLOAD_ARG-DAG: Decl[EnumElement]/CurrNominal/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

+16-16
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ enum FooEnum: CaseIterable {
9191
// FOO_ENUM_TYPE_CONTEXT: Begin completions
9292
// FOO_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Foo1[#FooEnum#]{{; name=.+$}}
9393
// FOO_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: .Foo2[#FooEnum#]{{; name=.+$}}
94-
// FOO_ENUM_TYPE_CONTEXT-DAG: Decl[StaticVar]/CurrNominal/TypeRelation[Identical]: .alias1[#FooEnum#]; name=alias1
94+
// FOO_ENUM_TYPE_CONTEXT-DAG: Decl[StaticVar]/ExprSpecific/TypeRelation[Identical]: .alias1[#FooEnum#]; name=alias1
9595
// FOO_ENUM_TYPE_CONTEXT: End completions
9696

9797
// FOO_ENUM_NO_DOT: Begin completions
@@ -130,7 +130,7 @@ enum FooEnum: CaseIterable {
130130
// FOO_ENUM_DOT_ELEMENTS: Begin completions, 3 items
131131
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: Foo1[#FooEnum#]{{; name=.+$}}
132132
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: Foo2[#FooEnum#]{{; name=.+$}}
133-
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[StaticVar]/CurrNominal/TypeRelation[Identical]: alias1[#FooEnum#]; name=alias1
133+
// FOO_ENUM_DOT_ELEMENTS-NEXT: Decl[StaticVar]/ExprSpecific/TypeRelation[Identical]: alias1[#FooEnum#]; name=alias1
134134
// FOO_ENUM_DOT_ELEMENTS-NEXT: End completions
135135

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

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

171171
// BAR_ENUM_NO_DOT: Begin completions
@@ -220,8 +220,8 @@ enum BazEnum<T> {
220220
}
221221

222222
// BAZ_ENUM_TYPE_CONTEXT: Begin completions
223-
// BAZ_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Baz1[#BazEnum<Int>#]{{; name=.+$}}
224-
// BAZ_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/ExprSpecific: .Baz2({#Int#})[#BazEnum<Int>#]{{; name=.+$}}
223+
// BAZ_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/CurrNominal: .Baz1[#BazEnum<Int>#]{{; name=.+$}}
224+
// BAZ_ENUM_TYPE_CONTEXT-DAG: Decl[EnumElement]/CurrNominal: .Baz2({#Int#})[#BazEnum<Int>#]{{; name=.+$}}
225225
// BAZ_ENUM_TYPE_CONTEXT: End completions
226226

227227
// BAZ_INT_ENUM_NO_DOT: Begin completions, 8 items

test/IDE/complete_property_delegate_attribute.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ 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/TypeRelation[Identical]: east[#MyEnum#]; name=east
39-
// ARG_MyEnum_DOT-DAG: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: west[#MyEnum#]; name=west
38+
// ARG_MyEnum_DOT-DAG: Decl[EnumElement]/CurrNominal/TypeRelation[Identical]: east[#MyEnum#]; name=east
39+
// ARG_MyEnum_DOT-DAG: Decl[EnumElement]/CurrNominal/TypeRelation[Identical]: west[#MyEnum#]; name=west
4040
// ARG_MyEnum_DOT: End completions
4141

4242
@MyStruct(arg1: MyEnum.#^ARG_MyEnum_NOBINDING^#)

test/IDE/complete_single_expression_return.swift

+10-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TestSingleExprClosureRetUnresolved | %FileCheck %s -check-prefix=TestSingleExprClosureRetUnresolved
44
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TestSingleExprClosure | %FileCheck %s -check-prefix=TestSingleExprClosure
55
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TestSingleExprClosureVoid | %FileCheck %s -check-prefix=TestSingleExprClosureVoid
6-
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TestSingleExprClosureUnresolved | %FileCheck %s -check-prefix=TestSingleExprClosureRetUnresolved
6+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TestSingleExprClosureUnresolved | %FileCheck %s -check-prefix=TestSingleExprClosureUnresolved
77
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TestSingleExprClosureCall | %FileCheck %s -check-prefix=TestSingleExprClosure
88
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TestSingleExprClosureGlobal | %FileCheck %s -check-prefix=TestSingleExprClosureGlobal
99
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TestNonSingleExprClosureGlobal | %FileCheck %s -check-prefix=TestNonSingleExprClosureGlobal
@@ -151,6 +151,11 @@ struct TestSingleExprClosureUnresolved {
151151
}()
152152
}
153153
}
154+
// TestSingleExprClosureUnresolved: Begin completions
155+
// TestSingleExprClosureUnresolved-NOT: notMine
156+
// TestSingleExprClosureUnresolved: Decl[EnumElement]/CurrNominal/TypeRelation[Identical]: myEnum[#MyEnum#];
157+
// TestSingleExprClosureUnresolved-NOT: notMine
158+
// TestSingleExprClosureUnresolved: End completions
154159

155160
struct TestSingleExprClosureCall {
156161
func void() -> Void {}
@@ -263,7 +268,7 @@ struct TestSingleExprFuncUnresolved {
263268

264269
// TestSingleExprFuncUnresolved: Begin completions
265270
// TestSingleExprFuncUnresolved-NOT: notMine
266-
// TestSingleExprFuncUnresolved: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: myEnum[#MyEnum#];
271+
// TestSingleExprFuncUnresolved: Decl[EnumElement]/CurrNominal/TypeRelation[Identical]: myEnum[#MyEnum#];
267272
// TestSingleExprFuncUnresolved-NOT: notMine
268273
// TestSingleExprFuncUnresolved: End completions
269274
}
@@ -373,7 +378,7 @@ struct TestSingleExprAccessorUnresolved {
373378

374379
// TestSingleExprAccessorUnresolved: Begin completions
375380
// TestSingleExprAccessorUnresolved-NOT: notMine
376-
// TestSingleExprAccessorUnresolved: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: myEnum[#MyEnum#];
381+
// TestSingleExprAccessorUnresolved: Decl[EnumElement]/CurrNominal/TypeRelation[Identical]: myEnum[#MyEnum#];
377382
// TestSingleExprAccessorUnresolved-NOT: notMine
378383
// TestSingleExprAccessorUnresolved: End completions
379384
}
@@ -525,7 +530,7 @@ struct TestSingleExprSubscriptUnresolved {
525530

526531
// TestSingleExprSubscriptUnresolved: Begin completions
527532
// TestSingleExprSubscriptUnresolved-NOT: notMine
528-
// TestSingleExprSubscriptUnresolved: Decl[EnumElement]/ExprSpecific/TypeRelation[Identical]: myEnum[#MyEnum#];
533+
// TestSingleExprSubscriptUnresolved: Decl[EnumElement]/CurrNominal/TypeRelation[Identical]: myEnum[#MyEnum#];
529534
// TestSingleExprSubscriptUnresolved-NOT: notMine
530535
// TestSingleExprSubscriptUnresolved: End completions
531536
}
@@ -630,7 +635,7 @@ enum TopLevelEnum {
630635
case foo
631636
}
632637

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

635640
var testAccessorUnresolvedTopLevel: TopLevelEnum {
636641
.#^testAccessorUnresolvedTopLevel^#

test/IDE/complete_stmt_controlling_expr.swift

+1-1
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/TypeRelation[Identical]: bbb[#B#]; name=bbb
522+
// UNRESOLVED_B: Decl[EnumElement]/CurrNominal/TypeRelation[Identical]: bbb[#B#]; name=bbb
523523
// UNRESOLVED_B-NOT: aaa
524524

525525
struct AA {

0 commit comments

Comments
 (0)