diff --git a/lib/IDE/ExprContextAnalysis.cpp b/lib/IDE/ExprContextAnalysis.cpp index abf03c4f86d7d..ea20f7b92a771 100644 --- a/lib/IDE/ExprContextAnalysis.cpp +++ b/lib/IDE/ExprContextAnalysis.cpp @@ -176,8 +176,8 @@ class ExprFinder : public ASTWalker { Expr *get() const { return FoundExpr; } std::pair walkToExprPre(Expr *E) override { - if (TargetRange == E->getSourceRange() && !isa(E) && - !isa(E) && !isa(E)) { + if (TargetRange == E->getSourceRange() && !E->isImplicit() && + !isa(E)) { assert(!FoundExpr && "non-nullptr for found expr"); FoundExpr = E; return {false, nullptr}; diff --git a/test/IDE/complete_value_expr.swift b/test/IDE/complete_value_expr.swift index 85741691cf166..a8ce4f6d30f92 100644 --- a/test/IDE/complete_value_expr.swift +++ b/test/IDE/complete_value_expr.swift @@ -195,6 +195,11 @@ // RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=CLOSURE_IN_MEMBERDECLINIT_2 | %FileCheck %s -check-prefix=FOO_OBJECT_DOT // RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=CLOSURE_IN_MEMBERDECLINIT_3 | %FileCheck %s -check-prefix=FOO_OBJECT_DOT +// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IN_ARRAY_LITERAL_1 | %FileCheck %s -check-prefix=SIMPLE_OBJECT_DOT +// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IN_ARRAY_LITERAL_2 | %FileCheck %s -check-prefix=SIMPLE_OBJECT_DOT +// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IN_DICTIONARY_LITERAL_1 | %FileCheck %s -check-prefix=SIMPLE_OBJECT_DOT +// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IN_DICTIONARY_LITERAL_2 | %FileCheck %s -check-prefix=SIMPLE_OBJECT_DOT + // Test code completion of expressions that produce a value. struct FooStruct { @@ -2143,3 +2148,25 @@ extension String { obj.#^CLOSURE_IN_MEMBERDECLINIT_3^# } } + +struct SimpleStruct { + func foo() -> SimpleStruct {} +} +// SIMPLE_OBJECT_DOT: Begin completions +// SIMPLE_OBJECT_DOT-DAG: Keyword[self]/CurrNominal: self[#SimpleStruct#]; name=self +// SIMPLE_OBJECT_DOT-DAG: Decl[InstanceMethod]/CurrNominal{{(/TypeRelation\[Identical\])?}}: foo()[#SimpleStruct#]; name=foo() +// SIMPLE_OBJECT_DOT: End completions +func testInCollectionLiteral(value: SimpleStruct) { + let _ = [ + value.#^IN_ARRAY_LITERAL_1^# + ] + let _ = [ + value.#^IN_ARRAY_LITERAL_2^#, + ] + let _: [String: String] = [ + value.#^IN_DICTIONARY_LITERAL_1^# + ] + let _: [String: String] = [ + value.#^IN_DICTIONARY_LITERAL_2^# : "test" + ] +}