[Compile Time Constant Extraction] Handle cases where variables with attached result builders are initialized without builder syntax

This commit is contained in:
Venkatesh Sriram
2025-02-14 10:31:07 -08:00
parent fdea6ba8d0
commit 2eaaf5193a
2 changed files with 173 additions and 6 deletions

View File

@@ -1366,6 +1366,7 @@ void writeProperties(llvm::json::OStream &JSON,
for (const auto &PropertyInfo : TypeInfo.Properties) {
JSON.object([&] {
const auto *decl = PropertyInfo.VarDecl;
std::shared_ptr<CompileTimeValue> value = PropertyInfo.Value;
JSON.attribute("label", decl->getName().str().str());
JSON.attribute("type", toFullyQualifiedTypeNameString(
decl->getInterfaceType()));
@@ -1374,12 +1375,17 @@ void writeProperties(llvm::json::OStream &JSON,
JSON.attribute("isComputed", !decl->hasStorage() ? "true" : "false");
writeLocationInformation(JSON, decl->getLoc(),
decl->getDeclContext()->getASTContext());
if (auto builderValue =
extractBuilderValueIfExists(&NomTypeDecl, decl)) {
writeValue(JSON, builderValue.value());
} else {
writeValue(JSON, PropertyInfo.Value);
if (value.get()->getKind() == CompileTimeValue::ValueKind::Runtime) {
// Extract result builder information only if the variable has not
// used a different kind of initializer
if (auto builderValue =
extractBuilderValueIfExists(&NomTypeDecl, decl)) {
value = builderValue.value();
}
}
writeValue(JSON, value);
writePropertyWrapperAttributes(JSON, PropertyInfo.PropertyWrappers,
decl->getASTContext());
writeAvailabilityAttributes(JSON, *decl);

View File

@@ -104,7 +104,7 @@ public struct MyFooProviderInferred: FooProvider {
Foo(name: "MyFooProviderInferred.foos.Array.\(i)")
}
if (Bool.random()) {
if Bool.random() {
Foo(name: "MyFooProviderInferred.foos.Optional")
}
@@ -117,6 +117,25 @@ public struct MyFooProviderInferred: FooProvider {
}
}
public struct MyFooProviderInferredWithArrayInitialization: FooProvider {
public static var foos: [Foo] = [
Foo(name: "MyFooProviderInferredWithArrayInitialization.foos.1", baz: {
"Nested.Builder.1"
"Nested.Builder.2"
}),
Foo(name: "MyFooProviderInferredWithArrayInitialization.foos.2"),
]
}
public struct MyFooProviderInferredWithArrayReturn: FooProvider {
public static var foos: [Foo] {
return [
Foo(name: "MyFooProviderInferredWithArrayReturn.foos.1"),
Foo(name: "MyFooProviderInferredWithArrayInitialization.foos.2"),
]
}
}
// CHECK: [
// CHECK-NEXT: {
// CHECK-NEXT: "typeName": "ExtractResultBuilders.MyFooProvider",
@@ -524,5 +543,147 @@ public struct MyFooProviderInferred: FooProvider {
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "typeName": "ExtractResultBuilders.MyFooProviderInferredWithArrayInitialization",
// CHECK-NEXT: "mangledTypeName": "21ExtractResultBuilders44MyFooProviderInferredWithArrayInitializationV",
// CHECK-NEXT: "kind": "struct",
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractResultBuilders.swift",
// CHECK-NEXT: "line": 120,
// CHECK-NEXT: "conformances": [
// CHECK-NEXT: "ExtractResultBuilders.FooProvider"
// CHECK-NEXT: ],
// CHECK-NEXT: "allConformances": [
// CHECK-NEXT: {
// CHECK-NEXT: "protocolName": "ExtractResultBuilders.FooProvider",
// CHECK-NEXT: "conformanceDefiningModule": "ExtractResultBuilders"
// CHECK-NEXT: }
// CHECK-NEXT: ],
// CHECK-NEXT: "associatedTypeAliases": [],
// CHECK-NEXT: "properties": [
// CHECK-NEXT: {
// CHECK-NEXT: "label": "foos",
// CHECK-NEXT: "type": "Swift.Array<ExtractResultBuilders.Foo>",
// CHECK-NEXT: "mangledTypeName": "n/a - deprecated",
// CHECK-NEXT: "isStatic": "true",
// CHECK-NEXT: "isComputed": "false",
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractResultBuilders.swift",
// CHECK-NEXT: "line": 121,
// CHECK-NEXT: "valueKind": "Array",
// CHECK-NEXT: "value": [
// CHECK-NEXT: {
// CHECK-NEXT: "valueKind": "InitCall",
// CHECK-NEXT: "value": {
// CHECK-NEXT: "type": "ExtractResultBuilders.Foo",
// CHECK-NEXT: "arguments": [
// CHECK-NEXT: {
// CHECK-NEXT: "label": "name",
// CHECK-NEXT: "type": "Swift.String",
// CHECK-NEXT: "valueKind": "RawLiteral",
// CHECK-NEXT: "value": "MyFooProviderInferredWithArrayInitialization.foos.1"
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "label": "baz",
// CHECK-NEXT: "type": "() -> Swift.String",
// CHECK-NEXT: "valueKind": "Builder",
// CHECK-NEXT: "value": {
// CHECK-NEXT: "type": "",
// CHECK-NEXT: "members": [
// CHECK-NEXT: {
// CHECK-NEXT: "kind": "buildExpression",
// CHECK-NEXT: "element": {
// CHECK-NEXT: "valueKind": "RawLiteral",
// CHECK-NEXT: "value": "Nested.Builder.1"
// CHECK-NEXT: }
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "kind": "buildExpression",
// CHECK-NEXT: "element": {
// CHECK-NEXT: "valueKind": "RawLiteral",
// CHECK-NEXT: "value": "Nested.Builder.2"
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "valueKind": "InitCall",
// CHECK-NEXT: "value": {
// CHECK-NEXT: "type": "ExtractResultBuilders.Foo",
// CHECK-NEXT: "arguments": [
// CHECK-NEXT: {
// CHECK-NEXT: "label": "name",
// CHECK-NEXT: "type": "Swift.String",
// CHECK-NEXT: "valueKind": "RawLiteral",
// CHECK-NEXT: "value": "MyFooProviderInferredWithArrayInitialization.foos.2"
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "typeName": "ExtractResultBuilders.MyFooProviderInferredWithArrayReturn",
// CHECK-NEXT: "mangledTypeName": "21ExtractResultBuilders36MyFooProviderInferredWithArrayReturnV",
// CHECK-NEXT: "kind": "struct",
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractResultBuilders.swift",
// CHECK-NEXT: "line": 130,
// CHECK-NEXT: "conformances": [
// CHECK-NEXT: "ExtractResultBuilders.FooProvider"
// CHECK-NEXT: ],
// CHECK-NEXT: "allConformances": [
// CHECK-NEXT: {
// CHECK-NEXT: "protocolName": "ExtractResultBuilders.FooProvider",
// CHECK-NEXT: "conformanceDefiningModule": "ExtractResultBuilders"
// CHECK-NEXT: }
// CHECK-NEXT: ],
// CHECK-NEXT: "associatedTypeAliases": [],
// CHECK-NEXT: "properties": [
// CHECK-NEXT: {
// CHECK-NEXT: "label": "foos",
// CHECK-NEXT: "type": "Swift.Array<ExtractResultBuilders.Foo>",
// CHECK-NEXT: "mangledTypeName": "n/a - deprecated",
// CHECK-NEXT: "isStatic": "true",
// CHECK-NEXT: "isComputed": "true",
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractResultBuilders.swift",
// CHECK-NEXT: "line": 131,
// CHECK-NEXT: "valueKind": "Array",
// CHECK-NEXT: "value": [
// CHECK-NEXT: {
// CHECK-NEXT: "valueKind": "InitCall",
// CHECK-NEXT: "value": {
// CHECK-NEXT: "type": "ExtractResultBuilders.Foo",
// CHECK-NEXT: "arguments": [
// CHECK-NEXT: {
// CHECK-NEXT: "label": "name",
// CHECK-NEXT: "type": "Swift.String",
// CHECK-NEXT: "valueKind": "RawLiteral",
// CHECK-NEXT: "value": "MyFooProviderInferredWithArrayReturn.foos.1"
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: },
// CHECK-NEXT: {
// CHECK-NEXT: "valueKind": "InitCall",
// CHECK-NEXT: "value": {
// CHECK-NEXT: "type": "ExtractResultBuilders.Foo",
// CHECK-NEXT: "arguments": [
// CHECK-NEXT: {
// CHECK-NEXT: "label": "name",
// CHECK-NEXT: "type": "Swift.String",
// CHECK-NEXT: "valueKind": "RawLiteral",
// CHECK-NEXT: "value": "MyFooProviderInferredWithArrayInitialization.foos.2"
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]