Skip to content

Commit ad4b9df

Browse files
committed
[CodeCompletion] Suggest the property name in its didSet clause
Previously, property names are hidden in the whole range of the declarations. Now, it's only hidden in its own initializer range. rdar://problem/49697202
1 parent b7537cf commit ad4b9df

File tree

6 files changed

+98
-11
lines changed

6 files changed

+98
-11
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2168,6 +2168,14 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
21682168
addValueBaseName(Builder, Name);
21692169
setClangDeclKeywords(VD, Pairs, Builder);
21702170

2171+
// "not recommended" in its own getter.
2172+
if (Kind == LookupKind::ValueInDeclContext) {
2173+
if (auto accessor = dyn_cast<AccessorDecl>(CurrDeclContext)) {
2174+
if (accessor->getStorage() == VD && accessor->isGetter())
2175+
Builder.setNotRecommended(CodeCompletionResult::NoReason);
2176+
}
2177+
}
2178+
21712179
if (!VD->hasInterfaceType())
21722180
return;
21732181

lib/Sema/LookupVisibleDecls.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,11 +1208,11 @@ void swift::lookupVisibleDecls(VisibleDeclConsumer &Consumer,
12081208
bool isUsableValue(ValueDecl *VD, DeclVisibilityKind Reason) {
12091209

12101210
// Check "use within its own initial value" case.
1211-
if (auto *varD = dyn_cast<VarDecl>(VD))
1212-
if (auto *PBD = varD->getParentPatternBinding())
1213-
if (!PBD->isImplicit() &&
1214-
SM.rangeContainsTokenLoc(PBD->getSourceRange(), Loc))
1211+
if (auto *varD = dyn_cast<VarDecl>(VD)) {
1212+
if (auto *initExpr = varD->getParentInitializer())
1213+
if (SM.rangeContainsTokenLoc(initExpr->getSourceRange(), Loc))
12151214
return false;
1215+
}
12161216

12171217
switch (Reason) {
12181218
case DeclVisibilityKind::LocalVariable:

test/IDE/complete_crashes.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ while true {
6767
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GENERIC_PARAM_AND_ASSOC_TYPE | %FileCheck %s -check-prefix=GENERIC_PARAM_AND_ASSOC_TYPE
6868
struct CustomGenericCollection<Key> : ExpressibleByDictionaryLiteral {
6969
// GENERIC_PARAM_AND_ASSOC_TYPE: Begin completions
70-
// GENERIC_PARAM_AND_ASSOC_TYPE-DAG: Decl[InstanceVar]/CurrNominal/TypeRelation[Identical]: count[#Int#]; name=count
70+
// GENERIC_PARAM_AND_ASSOC_TYPE-DAG: Decl[InstanceVar]/CurrNominal/NotRecommended/TypeRelation[Identical]: count[#Int#]; name=count
7171
// GENERIC_PARAM_AND_ASSOC_TYPE-DAG: Decl[GenericTypeParam]/Local: Key[#Key#]; name=Key
7272
// GENERIC_PARAM_AND_ASSOC_TYPE-DAG: Decl[TypeAlias]/CurrNominal: Value[#CustomGenericCollection<Key>.Value#]; name=Value
7373
// GENERIC_PARAM_AND_ASSOC_TYPE: End completions

test/IDE/complete_expr_postfix_begin.swift

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,23 @@
8383
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_INIT_6 | %FileCheck %s -check-prefix=OWN_INIT_6
8484
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_INIT_7 | %FileCheck %s -check-prefix=OWN_INIT_7
8585

86+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_1 | %FileCheck %s -check-prefix=OWN_ACCESSOR_1
87+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_2 | %FileCheck %s -check-prefix=OWN_ACCESSOR_2
88+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_3 | %FileCheck %s -check-prefix=OWN_ACCESSOR_3
89+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_4 | %FileCheck %s -check-prefix=OWN_ACCESSOR_3
90+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_5 | %FileCheck %s -check-prefix=OWN_ACCESSOR_5
91+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_6 | %FileCheck %s -check-prefix=OWN_ACCESSOR_6
92+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_7 | %FileCheck %s -check-prefix=OWN_ACCESSOR_7
93+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_8 | %FileCheck %s -check-prefix=OWN_ACCESSOR_7
94+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_9 | %FileCheck %s -check-prefix=OWN_ACCESSOR_9
95+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_10 | %FileCheck %s -check-prefix=OWN_ACCESSOR_10
96+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_11 | %FileCheck %s -check-prefix=OWN_ACCESSOR_11
97+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_12 | %FileCheck %s -check-prefix=OWN_ACCESSOR_11
98+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_13 | %FileCheck %s -check-prefix=OWN_ACCESSOR_13
99+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_14 | %FileCheck %s -check-prefix=OWN_ACCESSOR_13
100+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_15 | %FileCheck %s -check-prefix=OWN_ACCESSOR_13
101+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=OWN_ACCESSOR_16 | %FileCheck %s -check-prefix=OWN_ACCESSOR_13
102+
86103
//
87104
// Test code completion at the beginning of expr-postfix.
88105
//
@@ -588,3 +605,65 @@ func ownInitTestingShadow(ownInit7: Int) {
588605
// OWN_INIT_7: Begin completions
589606
// OWN_INIT_7: Decl[LocalVar]/Local/TypeRelation[Identical]: ownInit7[#Int#];
590607
}
608+
609+
var inAccessor1: Int {
610+
get { #^OWN_ACCESSOR_1^# }
611+
// OWN_ACCESSOR_1: Begin completions
612+
// OWN_ACCESSOR_1: Decl[GlobalVar]/CurrModule/NotRecommended/TypeRelation[Identical]: inAccessor1[#Int#];
613+
set { #^OWN_ACCESSOR_2^# }
614+
// OWN_ACCESSOR_2: Begin completions
615+
// OWN_ACCESSOR_2: Decl[GlobalVar]/CurrModule: inAccessor1[#Int#];
616+
}
617+
var inAccessor2: Int = 1 {
618+
didSet { #^OWN_ACCESSOR_3^# }
619+
// OWN_ACCESSOR_3: Begin completions
620+
// OWN_ACCESSOR_3: Decl[GlobalVar]/CurrModule: inAccessor2[#Int#];
621+
willSet { #^OWN_ACCESSOR_4^# }
622+
}
623+
class InAccessorTest {
624+
var inAccessor3: Int {
625+
get { #^OWN_ACCESSOR_5^# }
626+
// OWN_ACCESSOR_5: Begin completions
627+
// OWN_ACCESSOR_5: Decl[InstanceVar]/CurrNominal/NotRecommended/TypeRelation[Identical]: inAccessor3[#Int#];
628+
set { #^OWN_ACCESSOR_6^# }
629+
// OWN_ACCESSOR_6: Begin completions
630+
// OWN_ACCESSOR_6: Decl[InstanceVar]/CurrNominal: inAccessor3[#Int#];
631+
}
632+
var inAccessor4: Int = 1 {
633+
didSet { #^OWN_ACCESSOR_7^# }
634+
// OWN_ACCESSOR_7: Begin completions
635+
// OWN_ACCESSOR_7: Decl[InstanceVar]/CurrNominal: inAccessor4[#Int#];
636+
willSet { #^OWN_ACCESSOR_8^# }
637+
}
638+
}
639+
func inAccessorTest() {
640+
var inAccessor5: Int {
641+
get { #^OWN_ACCESSOR_9^# }
642+
// OWN_ACCESSOR_9: Begin completions
643+
// OWN_ACCESSOR_9: Decl[LocalVar]/Local/NotRecommended/TypeRelation[Identical]: inAccessor5[#Int#];
644+
set { #^OWN_ACCESSOR_10^# }
645+
// OWN_ACCESSOR_10: Begin completions
646+
// OWN_ACCESSOR_10: Decl[LocalVar]/Local: inAccessor5[#Int#];
647+
}
648+
var inAccessor6: Int = 1 {
649+
didSet { #^OWN_ACCESSOR_11^# }
650+
// OWN_ACCESSOR_11: Begin completions
651+
// OWN_ACCESSOR_11: Decl[LocalVar]/Local: inAccessor6[#Int#];
652+
willSet { #^OWN_ACCESSOR_12^# }
653+
}
654+
}
655+
class InAccessorTestQualified {
656+
var inAccessorProp: Int {
657+
get {
658+
let _ = self.#^OWN_ACCESSOR_13^#
659+
// OWN_ACCESSOR_13: Begin completions
660+
// OWN_ACCESSOR_13-DAG: Decl[InstanceVar]/CurrNominal: inAccessorProp[#Int#];
661+
// OWN_ACCESSOR_13: End completions
662+
let _ = \InAccessorTestQualified.#^OWN_ACCESSOR_14^#
663+
}
664+
set {
665+
let _ = self.#^OWN_ACCESSOR_15^#
666+
let _ = \InAccessorTestQualified.#^OWN_ACCESSOR_16^#
667+
}
668+
}
669+
}

test/Parse/implicit_getter_incomplete.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ func test1() {
1212

1313
// Would trigger assertion when AST verifier checks source ranges ("child source range not contained within its parent")
1414
func test2() { // expected-note {{match}}
15-
var a : Int { // expected-note {{match}}
16-
switch i { // expected-error {{unresolved identifier}} expected-error{{'switch' statement body must have at least one 'case'}}
15+
var a : Int { // expected-note {{match}} expected-note {{'a' declared here}}
16+
switch i { // expected-error {{use of unresolved identifier 'i'; did you mean 'a'}} expected-error{{'switch' statement body must have at least one 'case'}}
1717
}
1818
// expected-error@+1 2 {{expected '}'}}

test/decl/var/static_var.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ struct InMemberFunc {
9292
}
9393
}
9494

95-
struct S { // expected-note 3{{extended type declared here}} expected-note{{did you mean 'S'?}}
95+
struct S { // expected-note 3{{extended type declared here}}
9696
static var v1: Int = 0
9797
class var v2: Int = 0 // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}} {{3-8=static}}
9898

@@ -116,7 +116,7 @@ extension S {
116116
class let el2: Int = 0 // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}} {{3-8=static}}
117117
}
118118

119-
enum E { // expected-note 3{{extended type declared here}} expected-note{{did you mean 'E'?}}
119+
enum E { // expected-note 3{{extended type declared here}}
120120
static var v1: Int = 0
121121
class var v2: Int = 0 // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}} {{3-8=static}}
122122

@@ -141,7 +141,7 @@ extension E {
141141
class let el2: Int = 0 // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}} {{3-8=static}}
142142
}
143143

144-
class C { // expected-note{{did you mean 'C'?}}
144+
class C {
145145
static var v1: Int = 0
146146
class final var v3: Int = 0 // expected-error {{class stored properties not supported}}
147147
class var v4: Int = 0 // expected-error {{class stored properties not supported}}
@@ -171,7 +171,7 @@ extension C {
171171
static final let el4: Int = 0 // expected-error {{static declarations are already final}} {{10-16=}}
172172
}
173173

174-
protocol P { // expected-note{{did you mean 'P'?}} expected-note{{extended type declared here}}
174+
protocol P { // expected-note{{extended type declared here}}
175175
// Both `static` and `class` property requirements are equivalent in protocols rdar://problem/17198298
176176
static var v1: Int { get }
177177
class var v2: Int { get } // expected-error {{class properties are only allowed within classes; use 'static' to declare a requirement fulfilled by either a static or class property}} {{3-8=static}}

0 commit comments

Comments
 (0)