Skip to content

Commit 5ec4143

Browse files
authored
[Compile Time Constant Extraction] Add extraction of arrays (#62491)
1 parent a287924 commit 5ec4143

File tree

3 files changed

+113
-5
lines changed

3 files changed

+113
-5
lines changed

Diff for: include/swift/AST/ConstTypeInfo.h

+26-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,15 @@ class Type;
2727
/// in a type property initializer expression
2828
class CompileTimeValue {
2929
public:
30-
enum ValueKind { RawLiteral, InitCall, Builder, Dictionary, Runtime, Tuple };
30+
enum ValueKind {
31+
RawLiteral,
32+
InitCall,
33+
Builder,
34+
Dictionary,
35+
Array,
36+
Tuple,
37+
Runtime
38+
};
3139

3240
ValueKind getKind() const { return Kind; }
3341

@@ -126,6 +134,23 @@ class TupleValue : public CompileTimeValue {
126134
std::vector<TupleElement> Elements;
127135
};
128136

137+
/// An array literal value representation
138+
class ArrayValue : public CompileTimeValue {
139+
public:
140+
ArrayValue(std::vector<std::shared_ptr<CompileTimeValue>> Elements)
141+
: CompileTimeValue(ValueKind::Array), Elements(Elements) {}
142+
143+
static bool classof(const CompileTimeValue *T) {
144+
return T->getKind() == ValueKind::Array;
145+
}
146+
std::vector<std::shared_ptr<CompileTimeValue>> getElements() const {
147+
return Elements;
148+
}
149+
150+
private:
151+
std::vector<std::shared_ptr<CompileTimeValue>> Elements;
152+
};
153+
129154
/// A representation of an arbitrary value that does not fall under
130155
/// any of the above categories.
131156
class RuntimeValue : public CompileTimeValue {

Diff for: lib/ConstExtract/ConstExtract.cpp

+26-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,6 @@ parseProtocolListFromFile(StringRef protocolListFilePath,
123123
static std::shared_ptr<CompileTimeValue> extractCompileTimeValue(Expr *expr) {
124124
if (expr) {
125125
switch (expr->getKind()) {
126-
case ExprKind::Array:
127126
case ExprKind::Dictionary:
128127

129128
case ExprKind::BooleanLiteral:
@@ -140,6 +139,15 @@ static std::shared_ptr<CompileTimeValue> extractCompileTimeValue(Expr *expr) {
140139
break;
141140
}
142141

142+
case ExprKind::Array: {
143+
auto arrayExpr = cast<ArrayExpr>(expr);
144+
std::vector<std::shared_ptr<CompileTimeValue>> elementValues;
145+
for (const auto elementExpr : arrayExpr->getElements()) {
146+
elementValues.push_back(extractCompileTimeValue(elementExpr));
147+
}
148+
return std::make_shared<ArrayValue>(elementValues);
149+
}
150+
143151
case ExprKind::Tuple: {
144152
auto tupleExpr = cast<TupleExpr>(expr);
145153

@@ -190,6 +198,11 @@ static std::shared_ptr<CompileTimeValue> extractCompileTimeValue(Expr *expr) {
190198
break;
191199
}
192200

201+
case ExprKind::Erasure: {
202+
auto erasureExpr = cast<ErasureExpr>(expr);
203+
return extractCompileTimeValue(erasureExpr->getSubExpr());
204+
}
205+
193206
default: {
194207
break;
195208
}
@@ -373,6 +386,18 @@ void writeValue(llvm::json::OStream &JSON,
373386
break;
374387
}
375388

389+
case CompileTimeValue::ValueKind::Array: {
390+
auto arrayValue = cast<ArrayValue>(value);
391+
392+
JSON.attribute("valueKind", "Array");
393+
JSON.attributeArray("value", [&] {
394+
for (auto CTP : arrayValue->getElements()) {
395+
JSON.object([&] { writeValue(JSON, CTP); });
396+
}
397+
});
398+
break;
399+
}
400+
376401
case CompileTimeValue::ValueKind::Runtime: {
377402
JSON.attribute("valueKind", "Runtime");
378403
break;

Diff for: test/ConstExtraction/ExtractGroups.swift

+61-3
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,61 @@
1414
// CHECK-NEXT: "type": "[Swift.Int]",
1515
// CHECK-NEXT: "isStatic": "false",
1616
// CHECK-NEXT: "isComputed": "false",
17-
// CHECK-NEXT: "valueKind": "RawLiteral",
18-
// CHECK-NEXT: "value": "[1, 2, 3]"
17+
// CHECK-NEXT: "valueKind": "Array",
18+
// CHECK-NEXT: "value": [
19+
// CHECK-NEXT: {
20+
// CHECK-NEXT: "valueKind": "RawLiteral",
21+
// CHECK-NEXT: "value": "1"
22+
// CHECK-NEXT: },
23+
// CHECK-NEXT: {
24+
// CHECK-NEXT: "valueKind": "RawLiteral",
25+
// CHECK-NEXT: "value": "2"
26+
// CHECK-NEXT: },
27+
// CHECK-NEXT: {
28+
// CHECK-NEXT: "valueKind": "RawLiteral",
29+
// CHECK-NEXT: "value": "3"
30+
// CHECK-NEXT: }
31+
// CHECK-NEXT: ]
32+
// CHECK-NEXT: },
33+
// CHECK-NEXT: {
34+
// CHECK-NEXT: "label": "array2",
35+
// CHECK-NEXT: "type": "[ExtractGroups.Foo]",
36+
// CHECK-NEXT: "isStatic": "false",
37+
// CHECK-NEXT: "isComputed": "false",
38+
// CHECK-NEXT: "valueKind": "Array",
39+
// CHECK-NEXT: "value": [
40+
// CHECK-NEXT: {
41+
// CHECK-NEXT: "valueKind": "InitCall",
42+
// CHECK-NEXT: "value": {
43+
// CHECK-NEXT: "type": "ExtractGroups.Bar",
44+
// CHECK-NEXT: "arguments": []
45+
// CHECK-NEXT: }
46+
// CHECK-NEXT: },
47+
// CHECK-NEXT: {
48+
// CHECK-NEXT: "valueKind": "RawLiteral",
49+
// CHECK-NEXT: "value": "1"
50+
// CHECK-NEXT: },
51+
// CHECK-NEXT: {
52+
// CHECK-NEXT: "valueKind": "RawLiteral",
53+
// CHECK-NEXT: "value": "\"hi\""
54+
// CHECK-NEXT: }
55+
// CHECK-NEXT: ]
56+
// CHECK-NEXT: },
57+
// CHECK-NEXT: {
58+
// CHECK-NEXT: "label": "array3",
59+
// CHECK-NEXT: "type": "[ExtractGroups.Bar]",
60+
// CHECK-NEXT: "isStatic": "false",
61+
// CHECK-NEXT: "isComputed": "false",
62+
// CHECK-NEXT: "valueKind": "Array",
63+
// CHECK-NEXT: "value": [
64+
// CHECK-NEXT: {
65+
// CHECK-NEXT: "valueKind": "InitCall",
66+
// CHECK-NEXT: "value": {
67+
// CHECK-NEXT: "type": "ExtractGroups.Bar",
68+
// CHECK-NEXT: "arguments": []
69+
// CHECK-NEXT: }
70+
// CHECK-NEXT: }
71+
// CHECK-NEXT: ]
1972
// CHECK-NEXT: }
2073
// CHECK-NEXT: ]
2174
// CHECK-NEXT: },
@@ -96,6 +149,8 @@ protocol MyProto {}
96149

97150
public struct Arrays : MyProto {
98151
let array1: [Int] = [1, 2, 3]
152+
let array2: [Foo] = [Bar(), 1, "hi"]
153+
let array3: [Bar] = [Bar()]
99154
}
100155

101156
public struct Dictionaries : MyProto {
@@ -108,4 +163,7 @@ public struct Tuples : MyProto {
108163
let tuple3: Void = ()
109164
}
110165

111-
public struct Bar {}
166+
public protocol Foo {}
167+
public struct Bar: Foo {}
168+
extension Int: Foo {}
169+
extension String: Foo {}

0 commit comments

Comments
 (0)