Skip to content

Commit 959216c

Browse files
authored
Merge pull request #63175 from artemcm/DeSugarArraysAndDictionariesWhenPrinting
[Compile Time Constant Extraction] Print desugared array, dictionary, optional types
2 parents b53eba0 + 544dae4 commit 959216c

File tree

7 files changed

+79
-33
lines changed

7 files changed

+79
-33
lines changed

include/swift/AST/PrintOptions.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,16 @@ struct PrintOptions {
533533
/// parameter.
534534
bool PrintSpecializeAttributeWithAvailability = true;
535535

536+
/// Whether to always desugar array types from `[base_type]` to `Array<base_type>`
537+
bool AlwaysDesugarArraySliceTypes = false;
538+
539+
/// Whether to always desugar dictionary types
540+
/// from `[key_type:value_type]` to `Dictionary<key_type,value_type>`
541+
bool AlwaysDesugarDictionaryTypes = false;
542+
543+
/// Whether to always desugar optional types from `base_type?` to `Optional<base_type>`
544+
bool AlwaysDesugarOptionalTypes = false;
545+
536546
/// \see ShouldQualifyNestedDeclarations
537547
enum class QualifyNestedDeclarations {
538548
Never,

lib/AST/ASTPrinter.cpp

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6451,34 +6451,45 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
64516451
}
64526452

64536453
void visitArraySliceType(ArraySliceType *T) {
6454-
Printer << "[";
6455-
visit(T->getBaseType());
6456-
Printer << "]";
6454+
if (Options.AlwaysDesugarArraySliceTypes) {
6455+
visit(T->getDesugaredType());
6456+
} else {
6457+
Printer << "[";
6458+
visit(T->getBaseType());
6459+
Printer << "]";
6460+
}
64576461
}
64586462

64596463
void visitDictionaryType(DictionaryType *T) {
6460-
Printer << "[";
6461-
visit(T->getKeyType());
6462-
Printer << " : ";
6463-
visit(T->getValueType());
6464-
Printer << "]";
6464+
if (Options.AlwaysDesugarDictionaryTypes) {
6465+
visit(T->getDesugaredType());
6466+
} else {
6467+
Printer << "[";
6468+
visit(T->getKeyType());
6469+
Printer << " : ";
6470+
visit(T->getValueType());
6471+
Printer << "]";
6472+
}
64656473
}
64666474

64676475
void visitOptionalType(OptionalType *T) {
64686476
auto printAsIUO = Options.PrintOptionalAsImplicitlyUnwrapped;
6469-
6470-
// Printing optionals with a trailing '!' applies only to
6471-
// top-level optionals, not to any nested within.
6472-
const_cast<PrintOptions &>(Options).PrintOptionalAsImplicitlyUnwrapped =
6473-
false;
6474-
printWithParensIfNotSimple(T->getBaseType());
6475-
const_cast<PrintOptions &>(Options).PrintOptionalAsImplicitlyUnwrapped =
6476-
printAsIUO;
6477-
6478-
if (printAsIUO)
6479-
Printer << "!";
6480-
else
6481-
Printer << "?";
6477+
if (Options.AlwaysDesugarOptionalTypes) {
6478+
visit(T->getDesugaredType());
6479+
return;
6480+
} else {
6481+
// Printing optionals with a trailing '!' applies only to
6482+
// top-level optionals, not to any nested within.
6483+
const_cast<PrintOptions &>(Options).PrintOptionalAsImplicitlyUnwrapped =
6484+
false;
6485+
printWithParensIfNotSimple(T->getBaseType());
6486+
const_cast<PrintOptions &>(Options).PrintOptionalAsImplicitlyUnwrapped =
6487+
printAsIUO;
6488+
if (printAsIUO)
6489+
Printer << "!";
6490+
else
6491+
Printer << "?";
6492+
}
64826493
}
64836494

64846495
void visitVariadicSequenceType(VariadicSequenceType *T) {

lib/ConstExtract/ConstExtract.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ std::string toFullyQualifiedTypeNameString(const swift::Type &Type) {
6363
swift::PrintOptions Options;
6464
Options.FullyQualifiedTypes = true;
6565
Options.PreferTypeRepr = true;
66+
Options.AlwaysDesugarArraySliceTypes = true;
67+
Options.AlwaysDesugarDictionaryTypes = true;
68+
Options.AlwaysDesugarOptionalTypes = true;
6669
Type.print(OutputStream, Options);
6770
OutputStream.flush();
6871
return TypeNameOutput;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: echo "[MyProto]" > %t/protocols.json
3+
4+
// RUN: %target-swift-frontend -typecheck -emit-const-values-path %t/ExtractLiterals.swiftconstvalues -const-gather-protocols-file %t/protocols.json -primary-file %s
5+
// RUN: cat %t/ExtractLiterals.swiftconstvalues 2>&1 | %FileCheck %s
6+
7+
protocol MyProto {}
8+
9+
public struct CommonSugars : MyProto {
10+
let cane: [String] = ["foo", "bar"]
11+
let corn: [String: Int] = ["foo" : 1, "bar": 2]
12+
let demerara: Bool? = nil
13+
}
14+
15+
// CHECK: "label": "cane",
16+
// CHECK-NEXT: "type": "Swift.Array<Swift.String>",
17+
18+
// CHECK: "label": "corn",
19+
// CHECK-NEXT: "type": "Swift.Dictionary<Swift.String, Swift.Int>",
20+
21+
// CHECK: "label": "demerara",
22+
// CHECK-NEXT: "type": "Swift.Optional<Swift.Bool>",

test/ConstExtraction/ExtractGroups.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ extension String: Foo {}
4444
// CHECK-NEXT: "properties": [
4545
// CHECK-NEXT: {
4646
// CHECK-NEXT: "label": "array1",
47-
// CHECK-NEXT: "type": "[Swift.Int]",
47+
// CHECK-NEXT: "type": "Swift.Array<Swift.Int>",
4848
// CHECK-NEXT: "isStatic": "false",
4949
// CHECK-NEXT: "isComputed": "false",
5050
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractGroups.swift",
@@ -67,7 +67,7 @@ extension String: Foo {}
6767
// CHECK-NEXT: },
6868
// CHECK-NEXT: {
6969
// CHECK-NEXT: "label": "array2",
70-
// CHECK-NEXT: "type": "[ExtractGroups.Foo]",
70+
// CHECK-NEXT: "type": "Swift.Array<ExtractGroups.Foo>",
7171
// CHECK-NEXT: "isStatic": "false",
7272
// CHECK-NEXT: "isComputed": "false",
7373
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractGroups.swift",
@@ -93,7 +93,7 @@ extension String: Foo {}
9393
// CHECK-NEXT: },
9494
// CHECK-NEXT: {
9595
// CHECK-NEXT: "label": "array3",
96-
// CHECK-NEXT: "type": "[ExtractGroups.Bar]",
96+
// CHECK-NEXT: "type": "Swift.Array<ExtractGroups.Bar>",
9797
// CHECK-NEXT: "isStatic": "false",
9898
// CHECK-NEXT: "isComputed": "false",
9999
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractGroups.swift",
@@ -119,7 +119,7 @@ extension String: Foo {}
119119
// CHECK-NEXT: "properties": [
120120
// CHECK-NEXT: {
121121
// CHECK-NEXT: "label": "dict1",
122-
// CHECK-NEXT: "type": "[Swift.String : Swift.Int]",
122+
// CHECK-NEXT: "type": "Swift.Dictionary<Swift.String, Swift.Int>",
123123
// CHECK-NEXT: "isStatic": "false",
124124
// CHECK-NEXT: "isComputed": "false",
125125
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractGroups.swift",
@@ -160,7 +160,7 @@ extension String: Foo {}
160160
// CHECK-NEXT: },
161161
// CHECK-NEXT: {
162162
// CHECK-NEXT: "label": "dict2",
163-
// CHECK-NEXT: "type": "[Swift.Int : [Swift.String]]",
163+
// CHECK-NEXT: "type": "Swift.Dictionary<Swift.Int, Swift.Array<Swift.String>>",
164164
// CHECK-NEXT: "isStatic": "false",
165165
// CHECK-NEXT: "isComputed": "false",
166166
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractGroups.swift",
@@ -209,7 +209,7 @@ extension String: Foo {}
209209
// CHECK-NEXT: },
210210
// CHECK-NEXT: {
211211
// CHECK-NEXT: "label": "dict3",
212-
// CHECK-NEXT: "type": "[Swift.String : ExtractGroups.Foo]",
212+
// CHECK-NEXT: "type": "Swift.Dictionary<Swift.String, ExtractGroups.Foo>",
213213
// CHECK-NEXT: "isStatic": "false",
214214
// CHECK-NEXT: "isComputed": "false",
215215
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractGroups.swift",

test/ConstExtraction/ExtractLiterals.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public struct PropertyWrappers : MyProto {
110110
// CHECK-NEXT: },
111111
// CHECK-NEXT: {
112112
// CHECK-NEXT: "label": "bool2",
113-
// CHECK-NEXT: "type": "Swift.Bool?",
113+
// CHECK-NEXT: "type": "Swift.Optional<Swift.Bool>",
114114
// CHECK-NEXT: "isStatic": "false",
115115
// CHECK-NEXT: "isComputed": "false",
116116
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractLiterals.swift",
@@ -361,7 +361,7 @@ public struct PropertyWrappers : MyProto {
361361
// CHECK-NEXT: },
362362
// CHECK-NEXT: {
363363
// CHECK-NEXT: "label": "$propertyWrapper1",
364-
// CHECK-NEXT: "type": "(Swift.String, Swift.String?)",
364+
// CHECK-NEXT: "type": "(Swift.String, Swift.Optional<Swift.String>)",
365365
// CHECK-NEXT: "isStatic": "false",
366366
// CHECK-NEXT: "isComputed": "true",
367367
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractLiterals.swift",
@@ -486,7 +486,7 @@ public struct PropertyWrappers : MyProto {
486486
// CHECK-NEXT: },
487487
// CHECK-NEXT: {
488488
// CHECK-NEXT: "label": "$propertyWrapper3",
489-
// CHECK-NEXT: "type": "(ExtractLiterals.Clamping<Swift.Int>, ExtractLiterals.Clamping<Swift.Int>?)",
489+
// CHECK-NEXT: "type": "(ExtractLiterals.Clamping<Swift.Int>, Swift.Optional<ExtractLiterals.Clamping<Swift.Int>>)",
490490
// CHECK-NEXT: "isStatic": "false",
491491
// CHECK-NEXT: "isComputed": "true",
492492
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractLiterals.swift",

test/ConstExtraction/ExtractResultBuilders.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public struct MyFooProviderInferred: FooProvider {
5555
// CHECK-NEXT: "properties": [
5656
// CHECK-NEXT: {
5757
// CHECK-NEXT: "label": "foos",
58-
// CHECK-NEXT: "type": "[ExtractResultBuilders.Foo]",
58+
// CHECK-NEXT: "type": "Swift.Array<ExtractResultBuilders.Foo>",
5959
// CHECK-NEXT: "isStatic": "true",
6060
// CHECK-NEXT: "isComputed": "true",
6161
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractResultBuilders.swift",
@@ -67,7 +67,7 @@ public struct MyFooProviderInferred: FooProvider {
6767
// CHECK-NEXT: },
6868
// CHECK-NEXT: {
6969
// CHECK-NEXT: "label": "fooTwo",
70-
// CHECK-NEXT: "type": "[ExtractResultBuilders.Foo]",
70+
// CHECK-NEXT: "type": "Swift.Array<ExtractResultBuilders.Foo>",
7171
// CHECK-NEXT: "isStatic": "true",
7272
// CHECK-NEXT: "isComputed": "true",
7373
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractResultBuilders.swift",
@@ -87,7 +87,7 @@ public struct MyFooProviderInferred: FooProvider {
8787
// CHECK-NEXT: "properties": [
8888
// CHECK-NEXT: {
8989
// CHECK-NEXT: "label": "foos",
90-
// CHECK-NEXT: "type": "[ExtractResultBuilders.Foo]",
90+
// CHECK-NEXT: "type": "Swift.Array<ExtractResultBuilders.Foo>",
9191
// CHECK-NEXT: "isStatic": "true",
9292
// CHECK-NEXT: "isComputed": "true",
9393
// CHECK-NEXT: "file": "{{.*}}test{{/|\\\\}}ConstExtraction{{/|\\\\}}ExtractResultBuilders.swift",

0 commit comments

Comments
 (0)