Skip to content

Commit 50147c4

Browse files
authored
Merge pull request #26940 from nkcsgexi/populate-attribute
ABI/API checker: populate several lazily computed attributes to nodes
2 parents e49401b + 1e173d8 commit 50147c4

File tree

9 files changed

+107
-39
lines changed

9 files changed

+107
-39
lines changed

test/api-digester/Inputs/stdlib-stable-abi.json

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21902,6 +21902,41 @@
2190221902
],
2190321903
"funcSelfKind": "NonMutating"
2190421904
},
21905+
{
21906+
"kind": "Function",
21907+
"name": "_isConcrete",
21908+
"printedName": "_isConcrete(_:)",
21909+
"children": [
21910+
{
21911+
"kind": "TypeNominal",
21912+
"name": "Bool",
21913+
"printedName": "Swift.Bool",
21914+
"usr": "s:Sb"
21915+
},
21916+
{
21917+
"kind": "TypeNominal",
21918+
"name": "Metatype",
21919+
"printedName": "τ_0_0.Type",
21920+
"children": [
21921+
{
21922+
"kind": "TypeNominal",
21923+
"name": "GenericTypeParam",
21924+
"printedName": "τ_0_0"
21925+
}
21926+
]
21927+
}
21928+
],
21929+
"declKind": "Func",
21930+
"usr": "s:s11_isConcreteySbxmlF",
21931+
"moduleName": "Swift",
21932+
"genericSig": "<τ_0_0>",
21933+
"sugared_genericSig": "<T>",
21934+
"declAttributes": [
21935+
"Transparent",
21936+
"AlwaysEmitIntoClient"
21937+
],
21938+
"funcSelfKind": "NonMutating"
21939+
},
2190521940
{
2190621941
"kind": "Function",
2190721942
"name": "_isBitwiseTakable",
@@ -35458,7 +35493,8 @@
3545835493
"Final",
3545935494
"ObjCNonLazyRealization",
3546035495
"UsableFromInline",
35461-
"FixedLayout"
35496+
"FixedLayout",
35497+
"ObjC"
3546235498
],
3546335499
"superclassUsr": "c:@M@Swift@objc(cs)__ContiguousArrayStorageBase",
3546435500
"superclassNames": [
@@ -49970,7 +50006,8 @@
4997050006
"declAttributes": [
4997150007
"ObjCNonLazyRealization",
4997250008
"UsableFromInline",
49973-
"FixedLayout"
50009+
"FixedLayout",
50010+
"ObjC"
4997450011
],
4997550012
"superclassUsr": "c:@M@Swift@objc(cs)__SwiftNativeNSDictionary",
4997650013
"superclassNames": [
@@ -49986,7 +50023,8 @@
4998650023
"moduleName": "Swift",
4998750024
"declAttributes": [
4998850025
"UsableFromInline",
49989-
"FixedLayout"
50026+
"FixedLayout",
50027+
"ObjC"
4999050028
],
4999150029
"superclassUsr": "c:@M@Swift@objc(cs)__RawDictionaryStorage",
4999250030
"superclassNames": [
@@ -115758,7 +115796,8 @@
115758115796
"declAttributes": [
115759115797
"ObjCNonLazyRealization",
115760115798
"UsableFromInline",
115761-
"FixedLayout"
115799+
"FixedLayout",
115800+
"ObjC"
115762115801
],
115763115802
"superclassUsr": "c:@M@Swift@objc(cs)__SwiftNativeNSSet",
115764115803
"superclassNames": [
@@ -115774,7 +115813,8 @@
115774115813
"moduleName": "Swift",
115775115814
"declAttributes": [
115776115815
"UsableFromInline",
115777-
"FixedLayout"
115816+
"FixedLayout",
115817+
"ObjC"
115778115818
],
115779115819
"superclassUsr": "c:@M@Swift@objc(cs)__RawSetStorage",
115780115820
"superclassNames": [
@@ -147323,7 +147363,8 @@
147323147363
"moduleName": "Swift",
147324147364
"declAttributes": [
147325147365
"UsableFromInline",
147326-
"FixedLayout"
147366+
"FixedLayout",
147367+
"ObjC"
147327147368
],
147328147369
"superclassUsr": "c:@M@Swift@objc(cs)__SwiftNativeNSArray",
147329147370
"superclassNames": [
@@ -147711,7 +147752,8 @@
147711147752
"moduleName": "Swift",
147712147753
"declAttributes": [
147713147754
"FixedLayout",
147714-
"UsableFromInline"
147755+
"UsableFromInline",
147756+
"ObjC"
147715147757
],
147716147758
"superclassUsr": "c:@M@Swift@objc(cs)__SwiftNativeNSArrayWithContiguousStorage",
147717147759
"superclassNames": [
@@ -299699,7 +299741,7 @@
299699299741
"funcSelfKind": "NonMutating"
299700299742
}
299701299743
],
299702-
"json_format_version": 4,
299744+
"json_format_version": 5,
299703299745
"tool_arguments": [
299704299746
"-dump-sdk",
299705299747
"-module",
Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,11 @@
1-
// We shouldn't see this. rdar://54797231
2-
cake: Class C4 is now with @objc
1+
cake: Func FrozenKind.__derived_enum_equals(_:_:) has been removed
2+
cake: Accessor GlobalLetChangedToVar.Get() is a new API without @available attribute
3+
cake: Accessor GlobalVarChangedToLet.Get() is a new API without @available attribute
4+
cake: Accessor GlobalVarChangedToLet.Modify() is a new API without @available attribute
5+
cake: Accessor GlobalVarChangedToLet.Set() is a new API without @available attribute
6+
cake: Enum FrozenKind is now with @frozen
7+
cake: Enum IceKind is now with @frozen
8+
cake: Func FrozenKind.==(_:_:) is a new API without @available attribute
9+
cake: Var C1.CIIns1 is no longer a stored property
10+
cake: Var C1.CIIns2 is no longer a stored property
11+
cake: Var RemoveSetters.Value is no longer a stored property

test/api-digester/Outputs/cake-abi.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1823,5 +1823,5 @@
18231823
]
18241824
}
18251825
],
1826-
"json_format_version": 4
1826+
"json_format_version": 5
18271827
}

test/api-digester/Outputs/cake.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1674,5 +1674,5 @@
16741674
]
16751675
}
16761676
],
1677-
"json_format_version": 4
1677+
"json_format_version": 5
16781678
}

test/api-digester/Outputs/clang-module-dump.txt

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
"protocolReq": true,
3434
"objc_name": "anotherFunctionFromProt",
3535
"declAttributes": [
36-
"ObjC"
36+
"ObjC",
37+
"Dynamic"
3738
],
3839
"reqNewWitnessTableEntry": true,
3940
"funcSelfKind": "NonMutating"
@@ -44,7 +45,8 @@
4445
"moduleName": "Foo",
4546
"objc_name": "AnotherObjcProt",
4647
"declAttributes": [
47-
"ObjC"
48+
"ObjC",
49+
"Dynamic"
4850
]
4951
},
5052
{
@@ -76,7 +78,8 @@
7678
"isOpen": true,
7779
"objc_name": "someFunction",
7880
"declAttributes": [
79-
"ObjC"
81+
"ObjC",
82+
"Dynamic"
8083
],
8184
"funcSelfKind": "NonMutating"
8285
},
@@ -100,7 +103,8 @@
100103
"objc_name": "init",
101104
"declAttributes": [
102105
"Override",
103-
"ObjC"
106+
"ObjC",
107+
"Dynamic"
104108
]
105109
}
106110
],
@@ -110,7 +114,8 @@
110114
"isOpen": true,
111115
"objc_name": "ClangInterface",
112116
"declAttributes": [
113-
"ObjC"
117+
"ObjC",
118+
"Dynamic"
114119
],
115120
"superclassUsr": "c:objc(cs)NSObject",
116121
"superclassNames": [
@@ -161,7 +166,8 @@
161166
"protocolReq": true,
162167
"objc_name": "someFunctionFromProt",
163168
"declAttributes": [
164-
"ObjC"
169+
"ObjC",
170+
"Dynamic"
165171
],
166172
"reqNewWitnessTableEntry": true,
167173
"funcSelfKind": "NonMutating"
@@ -172,9 +178,10 @@
172178
"moduleName": "Foo",
173179
"objc_name": "ObjcProt",
174180
"declAttributes": [
175-
"ObjC"
181+
"ObjC",
182+
"Dynamic"
176183
]
177184
}
178185
],
179-
"json_format_version": 4
186+
"json_format_version": 5
180187
}

test/api-digester/Outputs/empty-baseline.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"kind": "Root",
33
"name": "TopLevel",
44
"printedName": "TopLevel",
5-
"json_format_version": 4
5+
"json_format_version": 5
66
}

test/api-digester/compare-dump-binary-vs-interface.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
// RUN: %empty-directory(%t.sdk)
44
// RUN: %empty-directory(%t.module-cache)
55

6+
// The goal of this test to make sure flag -use-interface-for-module works.
7+
// We first build .swiftinterface with -enable-library-evolution
8+
// Secondly, we We first build .swiftmodule without -enable-library-evolution
9+
// Using swift-api-digester to load via .swiftinterface and .swiftmodule should
10+
// always give us some difference.
11+
612
// Generate .swiftinterface file for module cake
713
// RUN: %target-swift-frontend -typecheck -emit-parseable-module-interface-path %t.mod1/cake.swiftinterface %S/Inputs/cake_baseline/cake.swift -I %S/Inputs/APINotesLeft %clang-importer-sdk-nosource -parse-as-library -enable-library-evolution -disable-objc-attr-requires-foundation-module -module-cache-path %t.module-cache
814

915
// Generate .swiftmodule file for module cake
10-
// RUN: %target-swift-frontend -emit-module -o %t.mod1/cake.swiftmodule %S/Inputs/cake_baseline/cake.swift -I %S/Inputs/APINotesLeft %clang-importer-sdk-nosource -parse-as-library -disable-objc-attr-requires-foundation-module -module-cache-path %t.module-cache -enable-library-evolution
16+
// RUN: %target-swift-frontend -emit-module -o %t.mod1/cake.swiftmodule %S/Inputs/cake_baseline/cake.swift -I %S/Inputs/APINotesLeft %clang-importer-sdk-nosource -parse-as-library -disable-objc-attr-requires-foundation-module -module-cache-path %t.module-cache
1117

1218
// Dump Json file for cake ABI via .swiftmodule file
1319
// RUN: %api-digester -dump-sdk -module cake -o - -module-cache-path %t.module-cache %clang-importer-sdk-nosource -I %t.mod1 -I %S/Inputs/APINotesLeft -abi > %t.dump1.json

tools/swift-api-digester/ModuleAnalyzerNodes.cpp

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,6 +1278,24 @@ SDKNodeInitInfo::SDKNodeInitInfo(SDKContext &Ctx, Type Ty, TypeInitInfo Info) :
12781278
}
12791279
}
12801280

1281+
static std::vector<DeclAttrKind> collectDeclAttributes(Decl *D) {
1282+
std::vector<DeclAttrKind> Results;
1283+
for (auto *Attr: D->getAttrs())
1284+
Results.push_back(Attr->getKind());
1285+
if (auto *VD = dyn_cast<ValueDecl>(D)) {
1286+
#define HANDLE(COND, KIND_NAME) \
1287+
if (VD->COND && !llvm::is_contained(Results, DeclAttrKind::KIND_NAME)) \
1288+
Results.emplace_back(DeclAttrKind::KIND_NAME);
1289+
// These attributes may be semantically applicable to the current decl but absent from
1290+
// the actual AST. Populting them to the nodes ensure we don't have false positives.
1291+
HANDLE(isObjC(), DAK_ObjC)
1292+
HANDLE(isFinal(), DAK_Final)
1293+
HANDLE(isDynamic(), DAK_Dynamic)
1294+
#undef HANDLE
1295+
}
1296+
return Results;
1297+
}
1298+
12811299
SDKNodeInitInfo::SDKNodeInitInfo(SDKContext &Ctx, Decl *D):
12821300
Ctx(Ctx), DKind(D->getKind()),
12831301
Location(calculateLocation(Ctx, D)),
@@ -1294,22 +1312,8 @@ SDKNodeInitInfo::SDKNodeInitInfo(SDKContext &Ctx, Decl *D):
12941312
ObjCName(Ctx.getObjcName(D)),
12951313
IsImplicit(D->isImplicit()),
12961314
IsDeprecated(D->getAttrs().getDeprecated(D->getASTContext())),
1297-
IsABIPlaceholder(isABIPlaceholderRecursive(D)) {
1298-
1299-
// Force some attributes that are lazily computed.
1300-
// FIXME: we should use these AST predicates directly instead of looking at
1301-
// the attributes rdar://50217247.
1302-
if (auto *VD = dyn_cast<ValueDecl>(D)) {
1303-
(void) VD->isObjC();
1304-
(void) VD->isFinal();
1305-
(void) VD->isDynamic();
1306-
}
1307-
1308-
// Capture all attributes.
1309-
auto AllAttrs = D->getAttrs();
1310-
std::transform(AllAttrs.begin(), AllAttrs.end(), std::back_inserter(DeclAttrs),
1311-
[](DeclAttribute *attr) { return attr->getKind(); });
1312-
}
1315+
IsABIPlaceholder(isABIPlaceholderRecursive(D)),
1316+
DeclAttrs(collectDeclAttributes(D)) {}
13131317

13141318
SDKNodeInitInfo::SDKNodeInitInfo(SDKContext &Ctx, OperatorDecl *OD):
13151319
SDKNodeInitInfo(Ctx, cast<Decl>(OD)) {

tools/swift-api-digester/ModuleAnalyzerNodes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ namespace api {
6262
///
6363
/// When the json format changes in a way that requires version-specific handling, this number should be incremented.
6464
/// This ensures we could have backward compatibility so that version changes in the format won't stop the checker from working.
65-
const uint8_t DIGESTER_JSON_VERSION = 4; // Add objc_name field
65+
const uint8_t DIGESTER_JSON_VERSION = 5; // Populate ObjC, Dynamic and Final to attribute list
6666
const uint8_t DIGESTER_JSON_DEFAULT_VERSION = 0; // Use this version number for files before we have a version number in json.
6767

6868
class SDKNode;

0 commit comments

Comments
 (0)