Skip to content

Commit b033f48

Browse files
committed
[CodeCompletion] Only analyze inner most context
Now that this passes all test cases we currently have. Stop analyzing outer contexts because it may emit invalid context type.
1 parent cf3e40f commit b033f48

File tree

2 files changed

+31
-15
lines changed

2 files changed

+31
-15
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5427,21 +5427,20 @@ class CodeCompletionTypeContextAnalyzer {
54275427
return false;
54285428
DC->walkContext(Finder);
54295429

5430-
for (auto It = Finder.Ancestors.rbegin(); It != Finder.Ancestors.rend();
5431-
++ It) {
5432-
if (auto Parent = It->getAsExpr()) {
5433-
analyzeExpr(Parent);
5434-
} else if (auto Parent = It->getAsStmt()) {
5435-
analyzeStmt(Parent);
5436-
} else if (auto Parent = It->getAsDecl()) {
5437-
analyzeDecl(Parent);
5438-
} else if (auto Parent = It->getAsPattern()) {
5439-
analyzePattern(Parent);
5440-
}
5441-
if (!PossibleTypes.empty() || !PossibleNames.empty())
5442-
return true;
5443-
}
5444-
return false;
5430+
if (Finder.Ancestors.empty())
5431+
return false;
5432+
5433+
auto &P = Finder.Ancestors.back();
5434+
if (auto Parent = P.getAsExpr()) {
5435+
analyzeExpr(Parent);
5436+
} else if (auto Parent = P.getAsStmt()) {
5437+
analyzeStmt(Parent);
5438+
} else if (auto Parent = P.getAsDecl()) {
5439+
analyzeDecl(Parent);
5440+
} else if (auto Parent = P.getAsPattern()) {
5441+
analyzePattern(Parent);
5442+
}
5443+
return (!PossibleTypes.empty() || !PossibleNames.empty());
54455444
}
54465445

54475446
ArrayRef<Type> getPossibleTypes() const { return PossibleTypes; }

test/IDE/complete_call_arg.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@
6767
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=SUBSCRIPT_3 | %FileCheck %s -check-prefix=SUBSCRIPT_3
6868
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=SUBSCRIPT_3_DOT | %FileCheck %s -check-prefix=SUBSCRIPT_3_DOT
6969

70+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ERRORCONTEXT_NESTED_1 | %FileCheck %s -check-prefix=ERRORCONTEXT_NESTED_1
71+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ERRORCONTEXT_NESTED_2 | %FileCheck %s -check-prefix=ERRORCONTEXT_NESTED_1
72+
7073
var i1 = 1
7174
var i2 = 2
7275
var oi1 : Int?
@@ -572,3 +575,17 @@ func testSubscript(obj: HasSubscript, intValue: Int, strValue: String) {
572575
// SUBSCRIPT_3_DOT-DAG: Decl[Constructor]/CurrNominal/TypeRelation[Identical]: init({#(c): Character#})[#String#]; name=init(c: Character)
573576

574577
}
578+
579+
func testNestedContext() {
580+
func foo(_ x: Int) {}
581+
func bar(_ y: TypeInvalid) -> Int {}
582+
583+
let _ = foo(bar(#^ERRORCONTEXT_NESTED_1^#))
584+
// ERRORCONTEXT_NESTED_1: Begin completions
585+
// ERRORCONTEXT_NESTED_1-DAG: Decl[GlobalVar]/CurrModule: i1[#Int#]; name=i1
586+
// ERRORCONTEXT_NESTED_1-DAG: Decl[GlobalVar]/CurrModule: i2[#Int#]; name=i2
587+
// ERRORCONTEXT_NESTED_1-NOT: TypeRelation[Identical]
588+
589+
for _ in [bar(#^ERRORCONTEXT_NESTED_2^#)] {}
590+
// Same as ERRORCONTEXT_NESTED_1.
591+
}

0 commit comments

Comments
 (0)