From bfaa6af57e4ebea8cec399341d96cdfc977aefc0 Mon Sep 17 00:00:00 2001 From: Rintaro Ishizaki Date: Fri, 22 Mar 2019 13:39:49 -0700 Subject: [PATCH] [CodeCompletion] Look through implicit exprs to find the parsed expr The parsed expression may be wrapped with various implicit expressions. For example, if the expression is only element in array literal, it's wrapped with `(arrayLiteral: )`. --- lib/IDE/ExprContextAnalysis.cpp | 4 ++-- test/IDE/complete_value_expr.swift | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) 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" + ] +}