Skip to content

Commit aa49808

Browse files
Merge pull request #78462 from venkatesh5789/partial-keypath-extraction
[Compile Time Constant Extraction] Extract Partial Keypath Expressions
2 parents 5ccb26b + 14a5207 commit aa49808

File tree

2 files changed

+120
-7
lines changed

2 files changed

+120
-7
lines changed

lib/ConstExtract/ConstExtract.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,11 @@ static std::shared_ptr<CompileTimeValue> extractCompileTimeValue(Expr *expr) {
487487
}
488488
break;
489489
}
490+
491+
case ExprKind::DerivedToBase: {
492+
auto derivedExpr = cast<DerivedToBaseExpr>(expr);
493+
return extractCompileTimeValue(derivedExpr->getSubExpr());
494+
}
490495
default: {
491496
break;
492497
}

test/ConstExtraction/ExtractKeyPaths.swift

Lines changed: 115 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,18 @@ public struct MyType {
2222
}
2323
}
2424

25+
struct Item {
26+
var foo: String
27+
let bar: String
28+
}
29+
2530
public struct KeyPaths: MyProto {
26-
static let nestedVariable = \MyType.nested.foo.bar.baz
31+
static let keyPath1: PartialKeyPath<Item> = \Item.foo
32+
static var keyPath2: KeyPath<Item, String> = \Item.foo
33+
static var keyPath3: WritableKeyPath<Item, String> = \Item.foo
34+
static var keyPath4: PartialKeyPath<Item> = \Item.bar
35+
static var keyPath5: KeyPath<Item, String> = \Item.bar
36+
static let nestedKeyPath = \MyType.nested.foo.bar.baz
2737
}
2838

2939
// CHECK: [
@@ -32,8 +42,7 @@ public struct KeyPaths: MyProto {
3242
// CHECK-NEXT: "mangledTypeName": "15ExtractKeyPaths0bC0V",
3343
// CHECK-NEXT: "kind": "struct",
3444
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractKeyPaths.swift",
35-
// CHECK-NEXT: "line": 25,
36-
// CHECK-NEXT: "conformances": [
45+
// CHECK: "conformances": [
3746
// CHECK-NEXT: "ExtractKeyPaths.MyProto"
3847
// CHECK-NEXT: ],
3948
// CHECK-NEXT: "allConformances": [
@@ -42,16 +51,115 @@ public struct KeyPaths: MyProto {
4251
// CHECK-NEXT: "conformanceDefiningModule": "ExtractKeyPaths"
4352
// CHECK-NEXT: }
4453
// CHECK-NEXT: ],
45-
// CHECK-NEXT: "associatedTypeAliases": [],
46-
// CHECK-NEXT: "properties": [
54+
// CHECK: "properties": [
55+
// CHECK-NEXT: {
56+
// CHECK-NEXT: "label": "keyPath1",
57+
// CHECK-NEXT: "type": "Swift.PartialKeyPath<ExtractKeyPaths.Item>",
58+
// CHECK-NEXT: "mangledTypeName": "n/a - deprecated",
59+
// CHECK-NEXT: "isStatic": "true",
60+
// CHECK-NEXT: "isComputed": "false",
61+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractKeyPaths.swift",
62+
// CHECK-NEXT: "line": 31,
63+
// CHECK-NEXT: "valueKind": "KeyPath",
64+
// CHECK-NEXT: "value": {
65+
// CHECK-NEXT: "path": "foo",
66+
// CHECK-NEXT: "rootType": "ExtractKeyPaths.Item",
67+
// CHECK-NEXT: "components": [
68+
// CHECK-NEXT: {
69+
// CHECK-NEXT: "label": "foo",
70+
// CHECK-NEXT: "type": "Swift.String"
71+
// CHECK-NEXT: }
72+
// CHECK-NEXT: ]
73+
// CHECK-NEXT: }
74+
// CHECK-NEXT: },
75+
// CHECK-NEXT: {
76+
// CHECK-NEXT: "label": "keyPath2",
77+
// CHECK-NEXT: "type": "Swift.KeyPath<ExtractKeyPaths.Item, Swift.String>",
78+
// CHECK-NEXT: "mangledTypeName": "n/a - deprecated",
79+
// CHECK-NEXT: "isStatic": "true",
80+
// CHECK-NEXT: "isComputed": "false",
81+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractKeyPaths.swift",
82+
// CHECK-NEXT: "line": 32,
83+
// CHECK-NEXT: "valueKind": "KeyPath",
84+
// CHECK-NEXT: "value": {
85+
// CHECK-NEXT: "path": "foo",
86+
// CHECK-NEXT: "rootType": "ExtractKeyPaths.Item",
87+
// CHECK-NEXT: "components": [
88+
// CHECK-NEXT: {
89+
// CHECK-NEXT: "label": "foo",
90+
// CHECK-NEXT: "type": "Swift.String"
91+
// CHECK-NEXT: }
92+
// CHECK-NEXT: ]
93+
// CHECK-NEXT: }
94+
// CHECK-NEXT: },
95+
// CHECK-NEXT: {
96+
// CHECK-NEXT: "label": "keyPath3",
97+
// CHECK-NEXT: "type": "Swift.WritableKeyPath<ExtractKeyPaths.Item, Swift.String>",
98+
// CHECK-NEXT: "mangledTypeName": "n/a - deprecated",
99+
// CHECK-NEXT: "isStatic": "true",
100+
// CHECK-NEXT: "isComputed": "false",
101+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractKeyPaths.swift",
102+
// CHECK-NEXT: "line": 33,
103+
// CHECK-NEXT: "valueKind": "KeyPath",
104+
// CHECK-NEXT: "value": {
105+
// CHECK-NEXT: "path": "foo",
106+
// CHECK-NEXT: "rootType": "ExtractKeyPaths.Item",
107+
// CHECK-NEXT: "components": [
108+
// CHECK-NEXT: {
109+
// CHECK-NEXT: "label": "foo",
110+
// CHECK-NEXT: "type": "Swift.String"
111+
// CHECK-NEXT: }
112+
// CHECK-NEXT: ]
113+
// CHECK-NEXT: }
114+
// CHECK-NEXT: },
115+
// CHECK-NEXT: {
116+
// CHECK-NEXT: "label": "keyPath4",
117+
// CHECK-NEXT: "type": "Swift.PartialKeyPath<ExtractKeyPaths.Item>",
118+
// CHECK-NEXT: "mangledTypeName": "n/a - deprecated",
119+
// CHECK-NEXT: "isStatic": "true",
120+
// CHECK-NEXT: "isComputed": "false",
121+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractKeyPaths.swift",
122+
// CHECK-NEXT: "line": 34,
123+
// CHECK-NEXT: "valueKind": "KeyPath",
124+
// CHECK-NEXT: "value": {
125+
// CHECK-NEXT: "path": "bar",
126+
// CHECK-NEXT: "rootType": "ExtractKeyPaths.Item",
127+
// CHECK-NEXT: "components": [
128+
// CHECK-NEXT: {
129+
// CHECK-NEXT: "label": "bar",
130+
// CHECK-NEXT: "type": "Swift.String"
131+
// CHECK-NEXT: }
132+
// CHECK-NEXT: ]
133+
// CHECK-NEXT: }
134+
// CHECK-NEXT: },
135+
// CHECK-NEXT: {
136+
// CHECK-NEXT: "label": "keyPath5",
137+
// CHECK-NEXT: "type": "Swift.KeyPath<ExtractKeyPaths.Item, Swift.String>",
138+
// CHECK-NEXT: "mangledTypeName": "n/a - deprecated",
139+
// CHECK-NEXT: "isStatic": "true",
140+
// CHECK-NEXT: "isComputed": "false",
141+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractKeyPaths.swift",
142+
// CHECK-NEXT: "line": 35,
143+
// CHECK-NEXT: "valueKind": "KeyPath",
144+
// CHECK-NEXT: "value": {
145+
// CHECK-NEXT: "path": "bar",
146+
// CHECK-NEXT: "rootType": "ExtractKeyPaths.Item",
147+
// CHECK-NEXT: "components": [
148+
// CHECK-NEXT: {
149+
// CHECK-NEXT: "label": "bar",
150+
// CHECK-NEXT: "type": "Swift.String"
151+
// CHECK-NEXT: }
152+
// CHECK-NEXT: ]
153+
// CHECK-NEXT: }
154+
// CHECK-NEXT: },
47155
// CHECK-NEXT: {
48-
// CHECK-NEXT: "label": "nestedVariable",
156+
// CHECK-NEXT: "label": "nestedKeyPath",
49157
// CHECK-NEXT: "type": "Swift.WritableKeyPath<ExtractKeyPaths.MyType, Swift.String>",
50158
// CHECK-NEXT: "mangledTypeName": "n/a - deprecated",
51159
// CHECK-NEXT: "isStatic": "true",
52160
// CHECK-NEXT: "isComputed": "false",
53161
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractKeyPaths.swift",
54-
// CHECK-NEXT: "line": 26,
162+
// CHECK-NEXT: "line": 36,
55163
// CHECK-NEXT: "valueKind": "KeyPath",
56164
// CHECK-NEXT: "value": {
57165
// CHECK-NEXT: "path": "nested.foo.bar.baz",

0 commit comments

Comments
 (0)