Skip to content

Commit 38cbdf8

Browse files
Merge pull request #79400 from venkatesh5789/result-builder-initialization
[Compile Time Constant Extraction] Handle cases where variables with attached result builders are initialized without builder syntax
2 parents 874c625 + 2eaaf51 commit 38cbdf8

File tree

2 files changed

+173
-6
lines changed

2 files changed

+173
-6
lines changed

lib/ConstExtract/ConstExtract.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,6 +1391,7 @@ void writeProperties(llvm::json::OStream &JSON,
13911391
for (const auto &PropertyInfo : TypeInfo.Properties) {
13921392
JSON.object([&] {
13931393
const auto *decl = PropertyInfo.VarDecl;
1394+
std::shared_ptr<CompileTimeValue> value = PropertyInfo.Value;
13941395
JSON.attribute("label", decl->getName().str().str());
13951396
JSON.attribute("type", toFullyQualifiedTypeNameString(
13961397
decl->getInterfaceType()));
@@ -1399,12 +1400,17 @@ void writeProperties(llvm::json::OStream &JSON,
13991400
JSON.attribute("isComputed", !decl->hasStorage() ? "true" : "false");
14001401
writeLocationInformation(JSON, decl->getLoc(),
14011402
decl->getDeclContext()->getASTContext());
1402-
if (auto builderValue =
1403-
extractBuilderValueIfExists(&NomTypeDecl, decl)) {
1404-
writeValue(JSON, builderValue.value());
1405-
} else {
1406-
writeValue(JSON, PropertyInfo.Value);
1403+
1404+
if (value.get()->getKind() == CompileTimeValue::ValueKind::Runtime) {
1405+
// Extract result builder information only if the variable has not
1406+
// used a different kind of initializer
1407+
if (auto builderValue =
1408+
extractBuilderValueIfExists(&NomTypeDecl, decl)) {
1409+
value = builderValue.value();
1410+
}
14071411
}
1412+
1413+
writeValue(JSON, value);
14081414
writePropertyWrapperAttributes(JSON, PropertyInfo.PropertyWrappers,
14091415
decl->getASTContext());
14101416
writeAvailabilityAttributes(JSON, *decl);

test/ConstExtraction/ExtractResultBuilders.swift

Lines changed: 162 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public struct MyFooProviderInferred: FooProvider {
104104
Foo(name: "MyFooProviderInferred.foos.Array.\(i)")
105105
}
106106

107-
if (Bool.random()) {
107+
if Bool.random() {
108108
Foo(name: "MyFooProviderInferred.foos.Optional")
109109
}
110110

@@ -117,6 +117,25 @@ public struct MyFooProviderInferred: FooProvider {
117117
}
118118
}
119119

120+
public struct MyFooProviderInferredWithArrayInitialization: FooProvider {
121+
public static var foos: [Foo] = [
122+
Foo(name: "MyFooProviderInferredWithArrayInitialization.foos.1", baz: {
123+
"Nested.Builder.1"
124+
"Nested.Builder.2"
125+
}),
126+
Foo(name: "MyFooProviderInferredWithArrayInitialization.foos.2"),
127+
]
128+
}
129+
130+
public struct MyFooProviderInferredWithArrayReturn: FooProvider {
131+
public static var foos: [Foo] {
132+
return [
133+
Foo(name: "MyFooProviderInferredWithArrayReturn.foos.1"),
134+
Foo(name: "MyFooProviderInferredWithArrayInitialization.foos.2"),
135+
]
136+
}
137+
}
138+
120139
// CHECK: [
121140
// CHECK-NEXT: {
122141
// CHECK-NEXT: "typeName": "ExtractResultBuilders.MyFooProvider",
@@ -524,5 +543,147 @@ public struct MyFooProviderInferred: FooProvider {
524543
// CHECK-NEXT: }
525544
// CHECK-NEXT: }
526545
// CHECK-NEXT: ]
546+
// CHECK-NEXT: },
547+
// CHECK-NEXT: {
548+
// CHECK-NEXT: "typeName": "ExtractResultBuilders.MyFooProviderInferredWithArrayInitialization",
549+
// CHECK-NEXT: "mangledTypeName": "21ExtractResultBuilders44MyFooProviderInferredWithArrayInitializationV",
550+
// CHECK-NEXT: "kind": "struct",
551+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractResultBuilders.swift",
552+
// CHECK-NEXT: "line": 120,
553+
// CHECK-NEXT: "conformances": [
554+
// CHECK-NEXT: "ExtractResultBuilders.FooProvider"
555+
// CHECK-NEXT: ],
556+
// CHECK-NEXT: "allConformances": [
557+
// CHECK-NEXT: {
558+
// CHECK-NEXT: "protocolName": "ExtractResultBuilders.FooProvider",
559+
// CHECK-NEXT: "conformanceDefiningModule": "ExtractResultBuilders"
560+
// CHECK-NEXT: }
561+
// CHECK-NEXT: ],
562+
// CHECK-NEXT: "associatedTypeAliases": [],
563+
// CHECK-NEXT: "properties": [
564+
// CHECK-NEXT: {
565+
// CHECK-NEXT: "label": "foos",
566+
// CHECK-NEXT: "type": "Swift.Array<ExtractResultBuilders.Foo>",
567+
// CHECK-NEXT: "mangledTypeName": "n/a - deprecated",
568+
// CHECK-NEXT: "isStatic": "true",
569+
// CHECK-NEXT: "isComputed": "false",
570+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractResultBuilders.swift",
571+
// CHECK-NEXT: "line": 121,
572+
// CHECK-NEXT: "valueKind": "Array",
573+
// CHECK-NEXT: "value": [
574+
// CHECK-NEXT: {
575+
// CHECK-NEXT: "valueKind": "InitCall",
576+
// CHECK-NEXT: "value": {
577+
// CHECK-NEXT: "type": "ExtractResultBuilders.Foo",
578+
// CHECK-NEXT: "arguments": [
579+
// CHECK-NEXT: {
580+
// CHECK-NEXT: "label": "name",
581+
// CHECK-NEXT: "type": "Swift.String",
582+
// CHECK-NEXT: "valueKind": "RawLiteral",
583+
// CHECK-NEXT: "value": "MyFooProviderInferredWithArrayInitialization.foos.1"
584+
// CHECK-NEXT: },
585+
// CHECK-NEXT: {
586+
// CHECK-NEXT: "label": "baz",
587+
// CHECK-NEXT: "type": "() -> Swift.String",
588+
// CHECK-NEXT: "valueKind": "Builder",
589+
// CHECK-NEXT: "value": {
590+
// CHECK-NEXT: "type": "",
591+
// CHECK-NEXT: "members": [
592+
// CHECK-NEXT: {
593+
// CHECK-NEXT: "kind": "buildExpression",
594+
// CHECK-NEXT: "element": {
595+
// CHECK-NEXT: "valueKind": "RawLiteral",
596+
// CHECK-NEXT: "value": "Nested.Builder.1"
597+
// CHECK-NEXT: }
598+
// CHECK-NEXT: },
599+
// CHECK-NEXT: {
600+
// CHECK-NEXT: "kind": "buildExpression",
601+
// CHECK-NEXT: "element": {
602+
// CHECK-NEXT: "valueKind": "RawLiteral",
603+
// CHECK-NEXT: "value": "Nested.Builder.2"
604+
// CHECK-NEXT: }
605+
// CHECK-NEXT: }
606+
// CHECK-NEXT: ]
607+
// CHECK-NEXT: }
608+
// CHECK-NEXT: }
609+
// CHECK-NEXT: ]
610+
// CHECK-NEXT: }
611+
// CHECK-NEXT: },
612+
// CHECK-NEXT: {
613+
// CHECK-NEXT: "valueKind": "InitCall",
614+
// CHECK-NEXT: "value": {
615+
// CHECK-NEXT: "type": "ExtractResultBuilders.Foo",
616+
// CHECK-NEXT: "arguments": [
617+
// CHECK-NEXT: {
618+
// CHECK-NEXT: "label": "name",
619+
// CHECK-NEXT: "type": "Swift.String",
620+
// CHECK-NEXT: "valueKind": "RawLiteral",
621+
// CHECK-NEXT: "value": "MyFooProviderInferredWithArrayInitialization.foos.2"
622+
// CHECK-NEXT: }
623+
// CHECK-NEXT: ]
624+
// CHECK-NEXT: }
625+
// CHECK-NEXT: }
626+
// CHECK-NEXT: ]
627+
// CHECK-NEXT: }
628+
// CHECK-NEXT: ]
629+
// CHECK-NEXT: },
630+
// CHECK-NEXT: {
631+
// CHECK-NEXT: "typeName": "ExtractResultBuilders.MyFooProviderInferredWithArrayReturn",
632+
// CHECK-NEXT: "mangledTypeName": "21ExtractResultBuilders36MyFooProviderInferredWithArrayReturnV",
633+
// CHECK-NEXT: "kind": "struct",
634+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractResultBuilders.swift",
635+
// CHECK-NEXT: "line": 130,
636+
// CHECK-NEXT: "conformances": [
637+
// CHECK-NEXT: "ExtractResultBuilders.FooProvider"
638+
// CHECK-NEXT: ],
639+
// CHECK-NEXT: "allConformances": [
640+
// CHECK-NEXT: {
641+
// CHECK-NEXT: "protocolName": "ExtractResultBuilders.FooProvider",
642+
// CHECK-NEXT: "conformanceDefiningModule": "ExtractResultBuilders"
643+
// CHECK-NEXT: }
644+
// CHECK-NEXT: ],
645+
// CHECK-NEXT: "associatedTypeAliases": [],
646+
// CHECK-NEXT: "properties": [
647+
// CHECK-NEXT: {
648+
// CHECK-NEXT: "label": "foos",
649+
// CHECK-NEXT: "type": "Swift.Array<ExtractResultBuilders.Foo>",
650+
// CHECK-NEXT: "mangledTypeName": "n/a - deprecated",
651+
// CHECK-NEXT: "isStatic": "true",
652+
// CHECK-NEXT: "isComputed": "true",
653+
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractResultBuilders.swift",
654+
// CHECK-NEXT: "line": 131,
655+
// CHECK-NEXT: "valueKind": "Array",
656+
// CHECK-NEXT: "value": [
657+
// CHECK-NEXT: {
658+
// CHECK-NEXT: "valueKind": "InitCall",
659+
// CHECK-NEXT: "value": {
660+
// CHECK-NEXT: "type": "ExtractResultBuilders.Foo",
661+
// CHECK-NEXT: "arguments": [
662+
// CHECK-NEXT: {
663+
// CHECK-NEXT: "label": "name",
664+
// CHECK-NEXT: "type": "Swift.String",
665+
// CHECK-NEXT: "valueKind": "RawLiteral",
666+
// CHECK-NEXT: "value": "MyFooProviderInferredWithArrayReturn.foos.1"
667+
// CHECK-NEXT: }
668+
// CHECK-NEXT: ]
669+
// CHECK-NEXT: }
670+
// CHECK-NEXT: },
671+
// CHECK-NEXT: {
672+
// CHECK-NEXT: "valueKind": "InitCall",
673+
// CHECK-NEXT: "value": {
674+
// CHECK-NEXT: "type": "ExtractResultBuilders.Foo",
675+
// CHECK-NEXT: "arguments": [
676+
// CHECK-NEXT: {
677+
// CHECK-NEXT: "label": "name",
678+
// CHECK-NEXT: "type": "Swift.String",
679+
// CHECK-NEXT: "valueKind": "RawLiteral",
680+
// CHECK-NEXT: "value": "MyFooProviderInferredWithArrayInitialization.foos.2"
681+
// CHECK-NEXT: }
682+
// CHECK-NEXT: ]
683+
// CHECK-NEXT: }
684+
// CHECK-NEXT: }
685+
// CHECK-NEXT: ]
686+
// CHECK-NEXT: }
687+
// CHECK-NEXT: ]
527688
// CHECK-NEXT: }
528689
// CHECK-NEXT: ]

0 commit comments

Comments
 (0)