Skip to content

Commit c4c1b82

Browse files
authored
[Compile Time Constant Extraction] Extract availability annotations (#63174)
1 parent 5956544 commit c4c1b82

File tree

2 files changed

+198
-0
lines changed

2 files changed

+198
-0
lines changed

Diff for: lib/ConstExtract/ConstExtract.cpp

+39
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,43 @@ void writeResultBuilderInformation(llvm::json::OStream &JSON,
677677
}
678678
}
679679

680+
void writeAttrInformation(llvm::json::OStream &JSON,
681+
const DeclAttributes &Attrs) {
682+
auto availableAttr = Attrs.getAttributes<AvailableAttr>();
683+
if (availableAttr.empty())
684+
return;
685+
686+
JSON.attributeArray("availabilityAttributes", [&] {
687+
for (const AvailableAttr *attr : availableAttr) {
688+
JSON.object([&] {
689+
if (!attr->platformString().empty())
690+
JSON.attribute("platform", attr->platformString());
691+
692+
if (!attr->Message.empty())
693+
JSON.attribute("message", attr->Message);
694+
695+
if (!attr->Rename.empty())
696+
JSON.attribute("rename", attr->Rename);
697+
698+
if (attr->Introduced.hasValue())
699+
JSON.attribute("introducedVersion",
700+
attr->Introduced.value().getAsString());
701+
702+
if (attr->Deprecated.hasValue())
703+
JSON.attribute("deprecatedVersion",
704+
attr->Deprecated.value().getAsString());
705+
706+
if (attr->Obsoleted.hasValue())
707+
JSON.attribute("obsoletedVersion",
708+
attr->Obsoleted.value().getAsString());
709+
710+
JSON.attribute("isUnavailable", attr->isUnconditionallyUnavailable());
711+
JSON.attribute("isDeprecated", attr->isUnconditionallyDeprecated());
712+
});
713+
}
714+
});
715+
}
716+
680717
bool writeAsJSONToFile(const std::vector<ConstValueTypeInfo> &ConstValueInfos,
681718
llvm::raw_fd_ostream &OS) {
682719
llvm::json::OStream JSON(OS, 2);
@@ -705,10 +742,12 @@ bool writeAsJSONToFile(const std::vector<ConstValueTypeInfo> &ConstValueInfos,
705742
writeValue(JSON, PropertyInfo.Value);
706743
writeAttributes(JSON, PropertyInfo.PropertyWrappers);
707744
writeResultBuilderInformation(JSON, TypeDecl, decl);
745+
writeAttrInformation(JSON, decl->getAttrs());
708746
});
709747
}
710748
});
711749
writeEnumCases(JSON, TypeInfo.EnumElements);
750+
writeAttrInformation(JSON, TypeDecl->getAttrs());
712751
});
713752
}
714753
});

Diff for: test/ConstExtraction/ExtractAnnotations.swift

+159
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: echo "[MyProto]" > %t/protocols.json
3+
4+
// RUN: %target-swift-frontend -typecheck -emit-const-values-path %t/ExtractAnnotations.swiftconstvalues -const-gather-protocols-file %t/protocols.json -primary-file %s
5+
// RUN: cat %t/ExtractAnnotations.swiftconstvalues 2>&1 | %FileCheck %s
6+
7+
protocol MyProto {}
8+
9+
public struct Annotations: MyProto {
10+
@available(iOS 10.0, OSX 10.12, *)
11+
var available1: String { "available" }
12+
13+
@available(iOS, deprecated: 10.0)
14+
@available(OSX, deprecated: 10.12)
15+
var deprecated1: String { "deprecated" }
16+
17+
@available(*, unavailable, renamed: "available1", message: "Please use available1")
18+
var renamed1: String { "renamed" }
19+
20+
@available(iOS, introduced: 10.0.0)
21+
var introduced1: String { "introduced" }
22+
}
23+
24+
@available(iOS, deprecated: 10.0, renamed: "Annotations", message: "Please use Annotations")
25+
@available(OSX, deprecated: 10.12, renamed: "Annotations", message: "Please use Annotations")
26+
@available(tvOS, deprecated)
27+
@available(*, unavailable)
28+
public struct DeprecatedAnnotations: MyProto {}
29+
30+
// CHECK: [
31+
// CHECK-NEXT: {
32+
// CHECK-NEXT: "typeName": "ExtractAnnotations.Annotations",
33+
// CHECK-NEXT: "kind": "struct",
34+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractAnnotations.swift",
35+
// CHECK-NEXT: "line": 9,
36+
// CHECK-NEXT: "properties": [
37+
// CHECK-NEXT: {
38+
// CHECK-NEXT: "label": "available1",
39+
// CHECK-NEXT: "type": "Swift.String",
40+
// CHECK-NEXT: "isStatic": "false",
41+
// CHECK-NEXT: "isComputed": "true",
42+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractAnnotations.swift",
43+
// CHECK-NEXT: "line": 11,
44+
// CHECK-NEXT: "valueKind": "RawLiteral",
45+
// CHECK-NEXT: "value": "available",
46+
// CHECK-NEXT: "availabilityAttributes": [
47+
// CHECK-NEXT: {
48+
// CHECK-NEXT: "platform": "macOS",
49+
// CHECK-NEXT: "introducedVersion": "10.12",
50+
// CHECK-NEXT: "isUnavailable": false,
51+
// CHECK-NEXT: "isDeprecated": false
52+
// CHECK-NEXT: },
53+
// CHECK-NEXT: {
54+
// CHECK-NEXT: "platform": "iOS",
55+
// CHECK-NEXT: "introducedVersion": "10.0",
56+
// CHECK-NEXT: "isUnavailable": false,
57+
// CHECK-NEXT: "isDeprecated": false
58+
// CHECK-NEXT: }
59+
// CHECK-NEXT: ]
60+
// CHECK-NEXT: },
61+
// CHECK-NEXT: {
62+
// CHECK-NEXT: "label": "deprecated1",
63+
// CHECK-NEXT: "type": "Swift.String",
64+
// CHECK-NEXT: "isStatic": "false",
65+
// CHECK-NEXT: "isComputed": "true",
66+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractAnnotations.swift",
67+
// CHECK-NEXT: "line": 15,
68+
// CHECK-NEXT: "valueKind": "RawLiteral",
69+
// CHECK-NEXT: "value": "deprecated",
70+
// CHECK-NEXT: "availabilityAttributes": [
71+
// CHECK-NEXT: {
72+
// CHECK-NEXT: "platform": "macOS",
73+
// CHECK-NEXT: "deprecatedVersion": "10.12",
74+
// CHECK-NEXT: "isUnavailable": false,
75+
// CHECK-NEXT: "isDeprecated": false
76+
// CHECK-NEXT: },
77+
// CHECK-NEXT: {
78+
// CHECK-NEXT: "platform": "iOS",
79+
// CHECK-NEXT: "deprecatedVersion": "10.0",
80+
// CHECK-NEXT: "isUnavailable": false,
81+
// CHECK-NEXT: "isDeprecated": false
82+
// CHECK-NEXT: }
83+
// CHECK-NEXT: ]
84+
// CHECK-NEXT: },
85+
// CHECK-NEXT: {
86+
// CHECK-NEXT: "label": "renamed1",
87+
// CHECK-NEXT: "type": "Swift.String",
88+
// CHECK-NEXT: "isStatic": "false",
89+
// CHECK-NEXT: "isComputed": "true",
90+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractAnnotations.swift",
91+
// CHECK-NEXT: "line": 18,
92+
// CHECK-NEXT: "valueKind": "RawLiteral",
93+
// CHECK-NEXT: "value": "renamed",
94+
// CHECK-NEXT: "availabilityAttributes": [
95+
// CHECK-NEXT: {
96+
// CHECK-NEXT: "platform": "*",
97+
// CHECK-NEXT: "message": "Please use available1",
98+
// CHECK-NEXT: "rename": "available1",
99+
// CHECK-NEXT: "isUnavailable": true,
100+
// CHECK-NEXT: "isDeprecated": false
101+
// CHECK-NEXT: }
102+
// CHECK-NEXT: ]
103+
// CHECK-NEXT: },
104+
// CHECK-NEXT: {
105+
// CHECK-NEXT: "label": "introduced1",
106+
// CHECK-NEXT: "type": "Swift.String",
107+
// CHECK-NEXT: "isStatic": "false",
108+
// CHECK-NEXT: "isComputed": "true",
109+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractAnnotations.swift",
110+
// CHECK-NEXT: "line": 21,
111+
// CHECK-NEXT: "valueKind": "RawLiteral",
112+
// CHECK-NEXT: "value": "introduced",
113+
// CHECK-NEXT: "availabilityAttributes": [
114+
// CHECK-NEXT: {
115+
// CHECK-NEXT: "platform": "iOS",
116+
// CHECK-NEXT: "introducedVersion": "10.0.0",
117+
// CHECK-NEXT: "isUnavailable": false,
118+
// CHECK-NEXT: "isDeprecated": false
119+
// CHECK-NEXT: }
120+
// CHECK-NEXT: ]
121+
// CHECK-NEXT: }
122+
// CHECK-NEXT: ]
123+
// CHECK-NEXT: },
124+
// CHECK-NEXT: {
125+
// CHECK-NEXT: "typeName": "ExtractAnnotations.DeprecatedAnnotations",
126+
// CHECK-NEXT: "kind": "struct",
127+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractAnnotations.swift",
128+
// CHECK-NEXT: "line": 28,
129+
// CHECK-NEXT: "properties": [],
130+
// CHECK-NEXT: "availabilityAttributes": [
131+
// CHECK-NEXT: {
132+
// CHECK-NEXT: "platform": "*",
133+
// CHECK-NEXT: "isUnavailable": true,
134+
// CHECK-NEXT: "isDeprecated": false
135+
// CHECK-NEXT: },
136+
// CHECK-NEXT: {
137+
// CHECK-NEXT: "platform": "tvOS",
138+
// CHECK-NEXT: "isUnavailable": false,
139+
// CHECK-NEXT: "isDeprecated": true
140+
// CHECK-NEXT: },
141+
// CHECK-NEXT: {
142+
// CHECK-NEXT: "platform": "macOS",
143+
// CHECK-NEXT: "message": "Please use Annotations",
144+
// CHECK-NEXT: "rename": "Annotations",
145+
// CHECK-NEXT: "deprecatedVersion": "10.12",
146+
// CHECK-NEXT: "isUnavailable": false,
147+
// CHECK-NEXT: "isDeprecated": false
148+
// CHECK-NEXT: },
149+
// CHECK-NEXT: {
150+
// CHECK-NEXT: "platform": "iOS",
151+
// CHECK-NEXT: "message": "Please use Annotations",
152+
// CHECK-NEXT: "rename": "Annotations",
153+
// CHECK-NEXT: "deprecatedVersion": "10.0",
154+
// CHECK-NEXT: "isUnavailable": false,
155+
// CHECK-NEXT: "isDeprecated": false
156+
// CHECK-NEXT: }
157+
// CHECK-NEXT: ]
158+
// CHECK-NEXT: }
159+
// CHECK-NEXT:]

0 commit comments

Comments
 (0)