Skip to content

Commit 61e8882

Browse files
committed
[IDE] Compute type relations for attributes for generic property wrapper types
The existing logic to check whether a type is a valid property wrapper only worked for nominal types, not generic types. Also consider generic types.
1 parent ab42032 commit 61e8882

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

lib/IDE/CodeCompletionResultType.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ using TypeRelation = CodeCompletionResultTypeRelation;
2727
/// Returns the kind of attributes \c Ty can be used as.
2828
static OptionSet<CustomAttributeKind> getCustomAttributeKinds(Type Ty) {
2929
OptionSet<CustomAttributeKind> Result;
30-
if (auto NominalTy = Ty->getAs<NominalType>()) {
30+
if (auto NominalTy = Ty->getAs<NominalOrBoundGenericNominalType>()) {
3131
auto NominalDecl = NominalTy->getDecl();
3232
if (NominalDecl->getAttrs().hasAttribute<PropertyWrapperAttr>()) {
3333
Result |= CustomAttributeKind::PropertyWrapper;

test/IDE/complete_decl_attribute.swift

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,37 @@ struct MyPropertyWrapper {
2626
var wrappedValue: String
2727
}
2828

29+
@propertyWrapper
30+
struct MyGenericPropertyWrapper<T> {
31+
var wrappedValue: T
32+
}
33+
34+
2935
@resultBuilder
3036
struct MyResultBuilder {
31-
static func buildBlock(_ components: Int) -> Int {
32-
return components.first!
37+
static func buildBlock(_ component: Int) -> Int {
38+
return component
39+
}
40+
}
41+
42+
@resultBuilder
43+
struct MyGenericResultBuilder<T> {
44+
static func buildBlock(_ components: Int) -> T {
45+
fatalError()
3346
}
3447
}
3548

49+
3650
@globalActor
3751
actor MyGlobalActor {
3852
static let shared = MyGlobalActor()
3953
}
4054

55+
@globalActor
56+
actor MyGenericGlobalActor<T> {
57+
static let shared = MyGenricGlobalActor<T>()
58+
}
59+
4160

4261
@available(#^AVAILABILITY1^#)
4362

@@ -176,8 +195,11 @@ actor MyGlobalActor {
176195
// ON_GLOBALVAR-NOT: Keyword
177196
// ON_GLOBALVAR-DAG: Decl[Struct]/CurrModule: MyStruct[#MyStruct#]; name=MyStruct
178197
// ON_GLOBALVAR-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyPropertyWrapper[#MyPropertyWrapper#]; name=MyPropertyWrapper
198+
// ON_GLOBALVAR-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyGenericPropertyWrapper[#MyGenericPropertyWrapper#]; name=MyGenericPropertyWrapper
179199
// ON_GLOBALVAR-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyResultBuilder[#MyResultBuilder#]; name=MyResultBuilder
200+
// ON_GLOBALVAR-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyGenericResultBuilder[#MyGenericResultBuilder#]; name=MyGenericResultBuilder
180201
// ON_GLOBALVAR-DAG: Decl[Actor]/CurrModule/TypeRelation[Convertible]: MyGlobalActor[#MyGlobalActor#]; name=MyGlobalActor
202+
// ON_GLOBALVAR-DAG: Decl[Actor]/CurrModule/TypeRelation[Convertible]: MyGenericGlobalActor[#MyGenericGlobalActor#]; name=MyGenericGlobalActor
181203
// ON_GLOBALVAR: End completions
182204

183205
struct _S {
@@ -214,8 +236,11 @@ struct _S {
214236
// ON_PROPERTY-NOT: Keyword
215237
// ON_PROPERTY-DAG: Decl[Struct]/CurrModule: MyStruct[#MyStruct#]; name=MyStruct
216238
// ON_PROPERTY-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyPropertyWrapper[#MyPropertyWrapper#]; name=MyPropertyWrapper
239+
// ON_PROPERTY-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyGenericPropertyWrapper[#MyGenericPropertyWrapper#]; name=MyGenericPropertyWrapper
217240
// ON_PROPERTY-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyResultBuilder[#MyResultBuilder#]; name=MyResultBuilder
241+
// ON_PROPERTY-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyGenericResultBuilder[#MyGenericResultBuilder#]; name=MyGenericResultBuilder
218242
// ON_PROPERTY-DAG: Decl[Actor]/CurrModule/TypeRelation[Convertible]: MyGlobalActor[#MyGlobalActor#]; name=MyGlobalActor
243+
// ON_PROPERTY-DAG: Decl[Actor]/CurrModule/TypeRelation[Convertible]: MyGenericGlobalActor[#MyGenericGlobalActor#]; name=MyGenericGlobalActor
219244
// ON_PROPERTY-NOT: Decl[PrecedenceGroup]
220245
// ON_PROPERTY: End completions
221246

@@ -243,8 +268,11 @@ struct _S {
243268
// ON_METHOD-NOT: Keyword
244269
// ON_METHOD-DAG: Decl[Struct]/CurrModule: MyStruct[#MyStruct#]; name=MyStruct
245270
// ON_METHOD-DAG: Decl[Struct]/CurrModule: MyPropertyWrapper[#MyPropertyWrapper#]; name=MyPropertyWrapper
271+
// ON_METHOD-DAG: Decl[Struct]/CurrModule: MyGenericPropertyWrapper[#MyGenericPropertyWrapper#]; name=MyGenericPropertyWrapper
246272
// ON_METHOD-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyResultBuilder[#MyResultBuilder#]; name=MyResultBuilder
273+
// ON_METHOD-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyGenericResultBuilder[#MyGenericResultBuilder#]; name=MyGenericResultBuilder
247274
// ON_METHOD-DAG: Decl[Actor]/CurrModule/TypeRelation[Convertible]: MyGlobalActor[#MyGlobalActor#]; name=MyGlobalActor
275+
// ON_METHOD-DAG: Decl[Actor]/CurrModule/TypeRelation[Convertible]: MyGenericGlobalActor[#MyGenericGlobalActor#]; name=MyGenericGlobalActor
248276

249277

250278
// ON_METHOD: End completions
@@ -316,8 +344,11 @@ struct _S {
316344
// ON_MEMBER_LAST-NOT: Keyword
317345
// ON_MEMBER_LAST-DAG: Decl[Struct]/CurrModule: MyStruct[#MyStruct#]; name=MyStruct
318346
// ON_MEMBER_LAST-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyPropertyWrapper[#MyPropertyWrapper#]; name=MyPropertyWrapper
347+
// ON_MEMBER_LAST-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyGenericPropertyWrapper[#MyGenericPropertyWrapper#]; name=MyGenericPropertyWrapper
319348
// ON_MEMBER_LAST-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyResultBuilder[#MyResultBuilder#]; name=MyResultBuilder
349+
// ON_MEMBER_LAST-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyGenericResultBuilder[#MyGenericResultBuilder#]; name=MyGenericResultBuilder
320350
// ON_MEMBER_LAST-DAG: Decl[Actor]/CurrModule/TypeRelation[Convertible]: MyGlobalActor[#MyGlobalActor#]; name=MyGlobalActor
351+
// ON_MEMBER_LAST-DAG: Decl[Actor]/CurrModule/TypeRelation[Convertible]: MyGenericGlobalActor[#MyGenericGlobalActor#]; name=MyGenericGlobalActor
321352
// ON_MEMBER_LAST-NOT: Decl[PrecedenceGroup]
322353
// ON_MEMBER_LAST: End completions
323354
}
@@ -386,7 +417,10 @@ func dummy2() {}
386417
// KEYWORD_LAST-DAG: Keyword/None: attached[#Declaration Attribute#]; name=attached
387418
// KEYWORD_LAST-NOT: Keyword
388419
// KEYWORD_LAST-DAG: Decl[Struct]/CurrModule: MyStruct[#MyStruct#]; name=MyStruct
420+
// KEYWORD_LAST-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyGenericPropertyWrapper[#MyGenericPropertyWrapper#]; name=MyGenericPropertyWrapper
389421
// KEYWORD_LAST-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyPropertyWrapper[#MyPropertyWrapper#]; name=MyPropertyWrapper
422+
// KEYWORD_LAST-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyGenericResultBuilder[#MyGenericResultBuilder#]; name=MyGenericResultBuilder
390423
// KEYWORD_LAST-DAG: Decl[Struct]/CurrModule/TypeRelation[Convertible]: MyResultBuilder[#MyResultBuilder#]; name=MyResultBuilder
424+
// KEYWORD_LAST-DAG: Decl[Actor]/CurrModule/TypeRelation[Convertible]: MyGenericGlobalActor[#MyGenericGlobalActor#]; name=MyGenericGlobalActor
391425
// KEYWORD_LAST-DAG: Decl[Actor]/CurrModule/TypeRelation[Convertible]: MyGlobalActor[#MyGlobalActor#]; name=MyGlobalActor
392426
// KEYWORD_LAST: End completions

0 commit comments

Comments
 (0)