Skip to content

Commit da9c68d

Browse files
committed
[CodeCompletion] Don't complete inits after func/var/override keywords
When completing nominal members (overrides, etc.), don't show inits if the user already added a keyword that can't go before an init.
1 parent 5bbc06b commit da9c68d

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3833,13 +3833,18 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer {
38333833
if (auto *CD = dyn_cast<ConstructorDecl>(D)) {
38343834
if (!isa<ProtocolDecl>(CD->getDeclContext()))
38353835
return;
3836+
if (hasIntroducer || isKeywordSpecified("override"))
3837+
return;
38363838
if (CD->isRequired() || CD->isDesignatedInit())
38373839
addConstructor(CD);
38383840
return;
38393841
}
38403842
}
38413843

38423844
void addDesignatedInitializers(Type CurrTy) {
3845+
if (hasFuncIntroducer || hasVarIntroducer || isKeywordSpecified("override"))
3846+
return;
3847+
38433848
if (!CurrTy)
38443849
return;
38453850
const auto *CD = dyn_cast_or_null<ClassDecl>(CurrTy->getAnyNominal());

test/IDE/complete_override.swift

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -369,46 +369,52 @@ class OmitKW1 : ProtocolA {
369369
}
370370

371371
//OMIT_KEYWORD1: Begin completions
372-
//OMIT_KEYWORD1-DAG: Decl[Constructor]/Super: init(fromProtocolA: Int) {|}; name=init(fromProtocolA: Int){{$}}
372+
// OMIT_KEYWORD1-NOT: Decl[Constructor]
373373
//OMIT_KEYWORD1-DAG: Decl[InstanceMethod]/Super: func protoAFunc() {|}; name=protoAFunc(){{$}}
374374
//OMIT_KEYWORD1-DAG: Decl[InstanceMethod]/Super: func protoAFuncOptional() {|}; name=protoAFuncOptional(){{$}}
375375
//OMIT_KEYWORD1-DAG: Decl[InstanceMethod]/Super: @noreturn func protoAFuncWithAttr() {|}; name=protoAFuncWithAttr(){{$}}
376376
// OMIT_KEYWORD1-DAG: Decl[InstanceVar]/Super: var protoAVarRW: Int{{; name=.+$}}
377+
// OMIT_KEYWORD1-NOT: Decl[Constructor]
377378
// OMIT_KEYWORD1: End completions
378379

379380
class OmitKW2 : ProtocolA {
380381
override func#^OMIT_KEYWORD2^#
381382
}
382383

383-
//OMIT_KEYWORD2: Begin completions
384-
//OMIT_KEYWORD2-DAG: Decl[Constructor]/Super: init(fromProtocolA: Int) {|}; name=init(fromProtocolA: Int){{$}}
385-
//OMIT_KEYWORD2-DAG: Decl[InstanceMethod]/Super: protoAFunc() {|}; name=protoAFunc(){{$}}
386-
//OMIT_KEYWORD2-DAG: Decl[InstanceMethod]/Super: protoAFuncOptional() {|}; name=protoAFuncOptional(){{$}}
387-
//OMIT_KEYWORD2-DAG: Decl[InstanceMethod]/Super: protoAFuncWithAttr() {|}; name=protoAFuncWithAttr(){{$}}
384+
// OMIT_KEYWORD2: Begin completions
388385
// OMIT_KEYWORD2-NOT: Decl[InstanceVar]/Super: var protoAVarRW: Int{{; name=.+$}}
386+
// OMIT_KEYWORD2-NOT: Decl[Constructor]
387+
// OMIT_KEYWORD2-DAG: Decl[InstanceMethod]/Super: protoAFunc() {|}; name=protoAFunc(){{$}}
388+
// OMIT_KEYWORD2-DAG: Decl[InstanceMethod]/Super: protoAFuncOptional() {|}; name=protoAFuncOptional(){{$}}
389+
// OMIT_KEYWORD2-DAG: Decl[InstanceMethod]/Super: protoAFuncWithAttr() {|}; name=protoAFuncWithAttr(){{$}}
390+
// OMIT_KEYWORD2-NOT: Decl[InstanceVar]/Super: var protoAVarRW: Int{{; name=.+$}}
391+
// OMIT_KEYWORD2-NOT: Decl[Constructor]
389392
// OMIT_KEYWORD2: End completions
390393

391394
class OmitKW3 : ProtocolA {
392395
func#^OMIT_KEYWORD3^#
393396
}
394397

395-
// OMIT_KEYWORD3: Begin completions
396-
// FIXME: init() not valid after 'func'
397-
// OMIT_KEYWORD3-DAG: Decl[Constructor]/Super: init(fromProtocolA: Int) {|}; name=init(fromProtocolA: Int){{$}}
398+
// OMIT_KEYWORD3: Begin completions
398399
// FIXME: missing 'override'
399-
// OMIT_KEYWORD3-DAG: Decl[InstanceMethod]/Super: protoAFunc() {|}; name=protoAFunc(){{$}}
400-
// OMIT_KEYWORD3-DAG: Decl[InstanceMethod]/Super: protoAFuncOptional() {|}; name=protoAFuncOptional(){{$}}
401-
// OMIT_KEYWORD3-DAG: Decl[InstanceMethod]/Super: protoAFuncWithAttr() {|}; name=protoAFuncWithAttr(){{$}}
402400
// OMIT_KEYWORD3-NOT: Decl[InstanceVar]/Super: var protoAVarRW: Int{{; name=.+$}}
401+
// OMIT_KEYWORD3-NOT: Decl[Constructor]
402+
// OMIT_KEYWORD3-DAG: Decl[InstanceMethod]/Super: protoAFunc() {|}; name=protoAFunc(){{$}}
403+
// OMIT_KEYWORD3-DAG: Decl[InstanceMethod]/Super: protoAFuncOptional() {|}; name=protoAFuncOptional(){{$}}
404+
// OMIT_KEYWORD3-DAG: Decl[InstanceMethod]/Super: protoAFuncWithAttr() {|}; name=protoAFuncWithAttr(){{$}}
405+
// OMIT_KEYWORD3-NOT: Decl[InstanceVar]/Super: var protoAVarRW: Int{{; name=.+$}}
406+
// OMIT_KEYWORD3-NOT: Decl[Constructor]
403407
// OMIT_KEYWORD3: End completions
404408

405409
class OmitKW4: ProtocolA {
406410
var #^OMIT_KEYWORD4^#
407411
}
408412

413+
// OMIT_KEYWORD4-NOT: Decl[Constructor]
409414
// OMIT_KEYWORD4-NOT: Decl[InstanceMethod]
410415
// OMIT_KEYWORD4: Decl[InstanceVar]/Super: protoAVarRW: Int{{; name=.+$}}
411416
// OMIT_KEYWORD4-NOT: Decl[InstanceMethod]
417+
// OMIT_KEYWORD4-NOT: Decl[Constructor]
412418

413419
class OmitKW5: ProtocolA {
414420
override

0 commit comments

Comments
 (0)