Skip to content

Commit 86d9d7a

Browse files
committed
Fix override completions when a valid introducer is present but the override keyword is not.
1 parent bb9482b commit 86d9d7a

File tree

6 files changed

+67
-39
lines changed

6 files changed

+67
-39
lines changed

include/swift/Parse/CodeCompletionCallbacks.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ class CodeCompletionCallbacks {
174174
/// Complete at the beginning of member of a nominal decl member -- no tokens
175175
/// provided by user.
176176
virtual void completeNominalMemberBeginning(
177-
SmallVectorImpl<StringRef> &Keywords) {};
177+
SmallVectorImpl<StringRef> &Keywords, SourceLoc introducerLoc) {};
178178

179179
/// Complete at the beginning of accessor in a accessor block.
180180
virtual void completeAccessorBeginning() {};

lib/IDE/CodeCompletion.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,6 +1250,7 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks {
12501250
Optional<StmtKind> ParentStmtKind;
12511251

12521252
SmallVector<StringRef, 3> ParsedKeywords;
1253+
SourceLoc introducerLoc;
12531254

12541255
std::vector<std::pair<std::string, bool>> SubModuleNameVisibilityPairs;
12551256

@@ -1348,7 +1349,7 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks {
13481349
void completeDeclAttrParam(DeclAttrKind DK, int Index) override;
13491350
void completeInPrecedenceGroup(SyntaxKind SK) override;
13501351
void completeNominalMemberBeginning(
1351-
SmallVectorImpl<StringRef> &Keywords) override;
1352+
SmallVectorImpl<StringRef> &Keywords, SourceLoc introducerLoc) override;
13521353
void completeAccessorBeginning() override;
13531354

13541355
void completePoundAvailablePlatform() override;
@@ -3856,9 +3857,11 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
38563857

38573858
class CompletionOverrideLookup : public swift::VisibleDeclConsumer {
38583859
CodeCompletionResultSink &Sink;
3860+
ASTContext &Ctx;
38593861
const DeclContext *CurrDeclContext;
38603862
LazyResolver *TypeResolver;
38613863
SmallVectorImpl<StringRef> &ParsedKeywords;
3864+
SourceLoc introducerLoc;
38623865

38633866
bool hasFuncIntroducer = false;
38643867
bool hasVarIntroducer = false;
@@ -3872,9 +3875,10 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer {
38723875
public:
38733876
CompletionOverrideLookup(CodeCompletionResultSink &Sink, ASTContext &Ctx,
38743877
const DeclContext *CurrDeclContext,
3875-
SmallVectorImpl<StringRef> &ParsedKeywords)
3876-
: Sink(Sink),
3877-
CurrDeclContext(CurrDeclContext), ParsedKeywords(ParsedKeywords) {
3878+
SmallVectorImpl<StringRef> &ParsedKeywords,
3879+
SourceLoc introducerLoc)
3880+
: Sink(Sink), Ctx(Ctx), CurrDeclContext(CurrDeclContext),
3881+
ParsedKeywords(ParsedKeywords), introducerLoc(introducerLoc) {
38783882
(void)createTypeChecker(Ctx);
38793883
TypeResolver = Ctx.getLazyResolver();
38803884

@@ -3953,10 +3957,17 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer {
39533957
if (!hasDeclIntroducer && !hasAccessModifier)
39543958
addAccessControl(VD, Builder);
39553959

3956-
// FIXME: if we're missing 'override', but have the decl introducer we
3957-
// should delete it and re-add both in the correct order.
3958-
if (!hasDeclIntroducer && !hasStaticOrClass && missingOverride(Reason))
3959-
Builder.addOverrideKeyword();
3960+
if (missingOverride(Reason)) {
3961+
if (!hasDeclIntroducer)
3962+
Builder.addOverrideKeyword();
3963+
else {
3964+
auto dist = Ctx.SourceMgr.getByteDistance(
3965+
introducerLoc, Ctx.SourceMgr.getCodeCompletionLoc());
3966+
Builder.setNumBytesToErase(dist);
3967+
Builder.addOverrideKeyword();
3968+
Builder.addDeclIntroducer(DeclStr.str().substr(0, NameOffset));
3969+
}
3970+
}
39603971

39613972
if (!hasDeclIntroducer)
39623973
Builder.addDeclIntroducer(DeclStr.str().substr(0, NameOffset));
@@ -4487,8 +4498,9 @@ void CodeCompletionCallbacksImpl::completeGenericParams(TypeLoc TL) {
44874498
}
44884499

44894500
void CodeCompletionCallbacksImpl::completeNominalMemberBeginning(
4490-
SmallVectorImpl<StringRef> &Keywords) {
4501+
SmallVectorImpl<StringRef> &Keywords, SourceLoc introducerLoc) {
44914502
assert(!InEnumElementRawValue);
4503+
this->introducerLoc = introducerLoc;
44924504
ParsedKeywords.clear();
44934505
ParsedKeywords.append(Keywords.begin(), Keywords.end());
44944506
Kind = CompletionKind::NominalMemberBeginning;
@@ -5043,7 +5055,7 @@ void CodeCompletionCallbacksImpl::doneParsing() {
50435055
case CompletionKind::NominalMemberBeginning: {
50445056
CompletionOverrideLookup OverrideLookup(CompletionContext.getResultSink(),
50455057
P.Context, CurDeclContext,
5046-
ParsedKeywords);
5058+
ParsedKeywords, introducerLoc);
50475059
OverrideLookup.getOverrideCompletions(SourceLoc());
50485060
break;
50495061
}

lib/Parse/ParseDecl.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2932,13 +2932,15 @@ Parser::parseDecl(ParseDeclOptions Flags,
29322932
// specified so that we do not duplicate them in code completion
29332933
// strings.
29342934
SmallVector<StringRef, 3> Keywords;
2935+
SourceLoc introducerLoc;
29352936
switch (OrigTok.getKind()) {
29362937
case tok::kw_func:
29372938
case tok::kw_subscript:
29382939
case tok::kw_var:
29392940
case tok::kw_let:
29402941
case tok::kw_typealias:
29412942
Keywords.push_back(OrigTok.getText());
2943+
introducerLoc = OrigTok.getLoc();
29422944
break;
29432945
default:
29442946
// Other tokens are already accounted for.
@@ -2952,7 +2954,8 @@ Parser::parseDecl(ParseDeclOptions Flags,
29522954
for (auto attr : Attributes) {
29532955
Keywords.push_back(attr->getAttrName());
29542956
}
2955-
CodeCompletion->completeNominalMemberBeginning(Keywords);
2957+
CodeCompletion->completeNominalMemberBeginning(Keywords,
2958+
introducerLoc);
29562959
}
29572960

29582961
DeclResult = makeParserCodeCompletionStatus();

test/IDE/complete_declname.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class MyCls {
4343
class MySub : MyCls {
4444
func #^METHODNAME_OVERRIDE^#
4545
// METHODNAME_OVERRIDE: Begin completions, 1 items
46-
// METHODNAME_OVERRIDE-NEXT: Decl[InstanceMethod]/Super: foo() {|}; name=foo()
46+
// METHODNAME_OVERRIDE-NEXT: Decl[InstanceMethod]/Super/Erase[5]: override func foo() {|}; name=foo()
4747
// METHODNAME_OVERRIDE-NEXT: End completions
4848
}
4949

test/IDE/complete_override.swift

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -127,19 +127,19 @@
127127
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER9 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER9
128128
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER10 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER6
129129
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER11 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER9
130-
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER12 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER9
130+
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER12 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER12
131131
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER13 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER13
132-
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER14 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER9
132+
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER14 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER12
133133
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER15 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER15
134134
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER16 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER15
135-
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER17 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER15
136-
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER18 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER15
135+
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER17 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER17
136+
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER18 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER17
137137
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER19 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER13
138138
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER20 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER13
139139
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER21 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER21
140-
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER22 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER21
140+
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER22 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER22
141141
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER23 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER23
142-
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER24 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER23
142+
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=MODIFIER24 -code-completion-keywords=false | %FileCheck %s -check-prefix=MODIFIER24
143143

144144
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=PROTOINIT_NORM -code-completion-keywords=false | %FileCheck %s -check-prefix=PROTOINIT_NORM
145145
// RUN: %target-swift-ide-test -enable-objc-interop -code-completion -source-filename %s -code-completion-token=PROTOINIT_FINAL -code-completion-keywords=false | %FileCheck %s -check-prefix=PROTOINIT_FINAL
@@ -642,7 +642,6 @@ class Override11 : OverrideBase, OverrideP {
642642
}
643643
class Override12 : OverrideBase, OverrideP {
644644
override var #^MODIFIER12^#
645-
// Same as MODIFIER9.
646645
}
647646
class Override13 : OverrideBase, OverrideP {
648647
// No completions.
@@ -652,23 +651,22 @@ class Override14 : OverrideBase, OverrideP {
652651
// Note: This *does* emit variables. It will result invalid decl, but a
653652
// diagnostic will tell the user what to do.
654653
override let #^MODIFIER14^#
655-
// Same as MODIFIER9.
654+
// Same as MODIFIER12.
656655
}
657656
class Override15 : OverrideBase, OverrideP {
658657
required static var #^MODIFIER15^#
659658
}
660659
class Override16 : OverrideBase, OverrideP {
661-
override class var #^MODIFIER16^#
660+
class var #^MODIFIER16^#
662661
// Same as MODIFIER15
663662
}
664663
class Override17 : OverrideBase, OverrideP {
665-
// Note: This *does* emit variables. See MODIFIER14
666-
override static let #^MODIFIER17^#
667-
// Same as MODIFIER15
664+
override class var #^MODIFIER17^#
668665
}
669666
class Override18 : OverrideBase, OverrideP {
670-
class var #^MODIFIER18^#
671-
// Same as MODIFIER15
667+
// Note: This *does* emit variables. See MODIFIER14
668+
override static let #^MODIFIER18^#
669+
// Same as MODIFIER17
672670
}
673671
class Override19 : OverrideBase, OverrideP {
674672
// No completions.
@@ -683,14 +681,12 @@ class Override21 : OverrideBase, OverrideP {
683681
}
684682
class Override22 : OverrideBase, OverrideP {
685683
class func #^MODIFIER22^#
686-
// Same as MODIFIER21
687684
}
688685
class Override23 : OverrideBase, OverrideP {
689686
static #^MODIFIER23^#
690687
}
691688
class Override24 : OverrideBase, OverrideP {
692689
override static #^MODIFIER24^#
693-
// Same as MODIFIER23
694690
}
695691

696692
// MODIFIER1: Begin completions, 9 items
@@ -740,29 +736,46 @@ class Override24 : OverrideBase, OverrideP {
740736
// MODIFIER7: End completions
741737

742738
// MODIFIER8: Begin completions, 2 items
743-
// MODIFIER8-DAG: Decl[InstanceMethod]/Super: defaultMethod() {|}; name=defaultMethod()
744-
// MODIFIER8-DAG: Decl[InstanceMethod]/Super: openMethod() {|}; name=openMethod()
739+
// MODIFIER8-DAG: Decl[InstanceMethod]/Super/Erase[5]: override func defaultMethod() {|}; name=defaultMethod()
740+
// MODIFIER8-DAG: Decl[InstanceMethod]/Super/Erase[5]: override func openMethod() {|}; name=openMethod()
745741
// MODIFIER8: End completions
746742

747743
// MODIFIER9: Begin completions, 1 items
748-
// MODIFIER9-DAG: Decl[InstanceVar]/Super: varDecl: Int; name=varDecl: Int
744+
// MODIFIER9-DAG: Decl[InstanceVar]/Super/Erase[4]: override var varDecl: Int; name=varDecl: Int
749745
// MODIFIER9: End completions
750746

747+
// MODIFIER12: Begin completions, 1 items
748+
// MODIFIER12-DAG: Decl[InstanceVar]/Super: varDecl: Int; name=varDecl: Int
749+
// MODIFIER12: End completions
750+
751751
// MODIFIER13-NOT: Begin completions
752752

753753
// MODIFIER15: Begin completions, 1 items
754-
// MODIFIER15-DAG: Decl[StaticVar]/Super: classGetOnlyVar: Int; name=classGetOnlyVar: Int
754+
// MODIFIER15-DAG: Decl[StaticVar]/Super/Erase[4]: override var classGetOnlyVar: Int; name=classGetOnlyVar: Int
755755
// MODIFIER15: End completions
756756

757+
// MODIFIER17: Begin completions, 1 items
758+
// MODIFIER17-DAG: Decl[StaticVar]/Super: classGetOnlyVar: Int; name=classGetOnlyVar: Int
759+
// MODIFIER17: End completions
760+
757761
// MODIFIER21: Begin completions, 1 items
758-
// MODIFIER21: Decl[StaticMethod]/Super: classMethod() {|}; name=classMethod()
762+
// MODIFIER21: Decl[StaticMethod]/Super: classMethod() {|}; name=classMethod()
759763
// MODIFIER21: End completions
760764

765+
// MODIFIER22: Begin completions, 1 items
766+
// MODIFIER22: Decl[StaticMethod]/Super/Erase[5]: override func classMethod() {|}; name=classMethod()
767+
// MODIFIER22: End completions
768+
761769
// MODIFIER23: Begin completions, 2 items
762-
// MODIFIER23-DAG: Decl[StaticMethod]/Super: func classMethod() {|}; name=classMethod()
763-
// MODIFIER23-DAG: Decl[StaticVar]/Super: var classGetOnlyVar: Int; name=classGetOnlyVar: Int
770+
// MODIFIER23-DAG: Decl[StaticMethod]/Super: override func classMethod() {|}; name=classMethod()
771+
// MODIFIER23-DAG: Decl[StaticVar]/Super: override var classGetOnlyVar: Int; name=classGetOnlyVar: Int
764772
// MODIFIER23: End completions
765773

774+
// MODIFIER24: Begin completions, 2 items
775+
// MODIFIER24-DAG: Decl[StaticMethod]/Super: func classMethod() {|}; name=classMethod()
776+
// MODIFIER24-DAG: Decl[StaticVar]/Super: var classGetOnlyVar: Int; name=classGetOnlyVar: Int
777+
// MODIFIER24: End completions
778+
766779
protocol RequiredP {
767780
init(p: Int)
768781
}

test/IDE/complete_override_objc.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class Sub : FooClassDerived {
3333
var #^PROPERTY^#
3434
}
3535
// PROPERTY: Begin completions
36-
// PROPERTY-DAG: Decl[InstanceVar]/Super: fooProperty1: Int32
37-
// PROPERTY-DAG: Decl[InstanceVar]/Super: fooProperty2: Int32
38-
// PROPERTY-DAG: Decl[InstanceVar]/Super: fooProperty3: Int32
36+
// PROPERTY-DAG: Decl[InstanceVar]/Super/Erase[4]: override var fooProperty1: Int32;
37+
// PROPERTY-DAG: Decl[InstanceVar]/Super/Erase[4]: override var fooProperty2: Int32;
38+
// PROPERTY-DAG: Decl[InstanceVar]/Super/Erase[4]: override var fooProperty3: Int32;
3939
// PROPERTY: End completions

0 commit comments

Comments
 (0)