Skip to content

Commit 70fba3f

Browse files
committed
[CodeCompletion] Don't suggest keywords after decl introducer
If any decl introducers (e.g. 'func', 'let', 'typealias', etc.) are included in parsed keywords, don't emit any keywords in completion.
1 parent 4a43ee8 commit 70fba3f

File tree

2 files changed

+48
-3
lines changed

2 files changed

+48
-3
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4774,10 +4774,33 @@ void CodeCompletionCallbacksImpl::addKeywords(CodeCompletionResultSink &Sink,
47744774
addAnyTypeKeyword(Sink);
47754775
break;
47764776

4777-
case CompletionKind::NominalMemberBeginning:
4778-
addDeclKeywords(Sink);
4779-
addLetVarKeywords(Sink);
4777+
case CompletionKind::NominalMemberBeginning: {
4778+
bool HasDeclIntroducer = llvm::find_if(ParsedKeywords, [](const StringRef kw) {
4779+
return llvm::StringSwitch<bool>(kw)
4780+
.Case("associatedtype", true)
4781+
.Case("class", true)
4782+
.Case("deinit", true)
4783+
.Case("enum", true)
4784+
.Case("extension", true)
4785+
.Case("func", true)
4786+
.Case("import", true)
4787+
.Case("init", true)
4788+
.Case("let", true)
4789+
.Case("operator", true)
4790+
.Case("precedencegroup", true)
4791+
.Case("protocol", true)
4792+
.Case("struct", true)
4793+
.Case("subscript", true)
4794+
.Case("typealias", true)
4795+
.Case("var", true)
4796+
.Default(false);
4797+
}) != ParsedKeywords.end();
4798+
if (!HasDeclIntroducer) {
4799+
addDeclKeywords(Sink);
4800+
addLetVarKeywords(Sink);
4801+
}
47804802
break;
4803+
}
47814804

47824805
case CompletionKind::AfterIfStmtElse:
47834806
addKeyword(Sink, "if", CodeCompletionKeywordKind::kw_if);

test/IDE/complete_declname.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,20 @@
44
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=PROTOCOLNAME | %FileCheck %s --check-prefix=NO_COMPLETIONS
55
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=PRECEDENCEGROUPNAME | %FileCheck %s --check-prefix=NO_COMPLETIONS
66
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OPERATORNAME | %FileCheck %s --check-prefix=NO_COMPLETIONS
7+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=LETNAME | %FileCheck %s --check-prefix=NO_COMPLETIONS
8+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=VARNAME | %FileCheck %s --check-prefix=NO_COMPLETIONS
9+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TYPEALIASNAME | %FileCheck %s --check-prefix=NO_COMPLETIONS
10+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=FUNCNAME | %FileCheck %s --check-prefix=NO_COMPLETIONS
711

812
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-keywords=false -code-completion-token=METHODNAME | %FileCheck %s --check-prefix=NO_COMPLETIONS
13+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-keywords=false -code-completion-token=PROPERTY_LETNAME | %FileCheck %s --check-prefix=NO_COMPLETIONS
14+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-keywords=false -code-completion-token=PROPERTY_VARNAME | %FileCheck %s --check-prefix=NO_COMPLETIONS
15+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-keywords=false -code-completion-token=PROPERTY_TYPEALIASNAME | %FileCheck %s --check-prefix=NO_COMPLETIONS
916
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-keywords=false -code-completion-token=METHODNAME_OVERRIDE | %FileCheck %s --check-prefix=METHODNAME_OVERRIDE
17+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-keywords=false -code-completion-token=ASSOCIATEDTYPENAME | %FileCheck %s --check-prefix=NO_COMPLETIONS
1018
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-keywords=false -code-completion-token=METHODNAME_PROTOCOL | %FileCheck %s --check-prefix=NO_COMPLETIONS
1119
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-keywords=false -code-completion-token=METHODNAME_CONFORMANCE | %FileCheck %s --check-prefix=METHODNAME_CONFORMANCE
20+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-keywords=false -code-completion-token=TYPEALIASNAME_CONFORMANCE | %FileCheck %s --check-prefix=TYPEALIASNAME_CONFORMANCE
1221

1322
// NO_COMPLETIONS-NOT: Begin completions
1423

@@ -18,10 +27,17 @@ enum #^ENUMNAME^#
1827
protocol #^PROTOCOLNAME^# {}
1928
precedencegroup #^PRECEDENCEGROUPNAME^#
2029
infix operator #^OPERATORNAME^#
30+
let #^LETNAME^#
31+
var #^VARNAME^#
32+
typealias #^TYPEALIASNAME^#
33+
func #^FUNCNAME^#
2134

2235
class MyCls {
2336
func foo() {}
2437
func #^METHODNAME^#
38+
let #^PROPERTY_LETNAME^#
39+
var #^PROPERTY_VARNAME^#
40+
typealias #^PROPERTY_TYPEALIASNAME^#
2541
}
2642

2743
class MySub : MyCls {
@@ -32,6 +48,8 @@ class MySub : MyCls {
3248
}
3349

3450
protocol P {
51+
associatedtype #^ASSOCIATEDTYPENAME^#
52+
associatedtype Assoc
3553
func foo() {}
3654
func #^METHODNAME_PROTOCOL^#
3755
}
@@ -41,4 +59,8 @@ struct MyStruct : P {
4159
// METHODNAME_CONFORMANCE: Begin completions, 1 items
4260
// METHODNAME_CONFORMANCE-NEXT: Decl[InstanceMethod]/Super: foo() {|}; name=foo()
4361
// METHODNAME_CONFORMANCE-NEXT: End completions
62+
typealias #^TYPEALIASNAME_CONFORMANCE^#
63+
// TYPEALIASNAME_CONFORMANCE: Begin completions, 1 items
64+
// TYPEALIASNAME_CONFORMANCE-NEXT: Decl[AssociatedType]/Super: Assoc = {#(Type)#}; name=Assoc = Type
65+
// TYPEALIASNAME_CONFORMANCE-NEXT: End completions
4466
}

0 commit comments

Comments
 (0)