Skip to content

Commit 71e541f

Browse files
authored
fix: Name collision with Swift Metatypes (#309)
1 parent 4cb4a8f commit 71e541f

File tree

6 files changed

+250
-120
lines changed

6 files changed

+250
-120
lines changed

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/EnumGenerator.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import software.amazon.smithy.model.shapes.ServiceShape
1111
import software.amazon.smithy.model.shapes.StringShape
1212
import software.amazon.smithy.model.traits.EnumDefinition
1313
import software.amazon.smithy.model.traits.EnumTrait
14-
import software.amazon.smithy.swift.codegen.SwiftSettings.Companion.reservedKeywords
1514
import software.amazon.smithy.swift.codegen.customtraits.NestedTrait
15+
import software.amazon.smithy.swift.codegen.lang.reservedWords
1616
import software.amazon.smithy.swift.codegen.model.expectShape
1717
import software.amazon.smithy.swift.codegen.model.hasTrait
1818
import software.amazon.smithy.swift.codegen.model.nestedNamespaceType
@@ -236,7 +236,7 @@ class EnumGenerator(
236236
enumCaseName = "_$enumCaseName"
237237
}
238238

239-
if (shouldBeEscaped && reservedKeywords.contains(enumCaseName)) {
239+
if (shouldBeEscaped && reservedWords.contains(enumCaseName)) {
240240
enumCaseName = SymbolVisitor.escapeReservedWords(enumCaseName)
241241
}
242242

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/SwiftSettings.kt

Lines changed: 13 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ class SwiftSettings(
4242
companion object {
4343

4444
private val LOGGER: Logger = Logger.getLogger(SwiftSettings::class.java.name)
45-
val reservedKeywords: List<String> = getSwiftReservedKeywords()
4645

4746
/**
4847
* Create settings from a configuration object node.
@@ -53,7 +52,19 @@ class SwiftSettings(
5352
* @return Returns the extracted settings
5453
*/
5554
fun from(model: Model, config: ObjectNode): SwiftSettings {
56-
config.warnIfAdditionalProperties(listOf(SERVICE, MODULE_NAME, MODULE_DESCRIPTION, MODULE_VERSION, AUTHOR, SDK_ID, HOMEPAGE, GIT_REPO, SWIFT_VERSION))
55+
config.warnIfAdditionalProperties(
56+
listOf(
57+
SERVICE,
58+
MODULE_NAME,
59+
MODULE_DESCRIPTION,
60+
MODULE_VERSION,
61+
AUTHOR,
62+
SDK_ID,
63+
HOMEPAGE,
64+
GIT_REPO,
65+
SWIFT_VERSION
66+
)
67+
)
5768

5869
val serviceId = config.getStringMember(SERVICE)
5970
.map(StringNode::expectShapeId)
@@ -102,109 +113,6 @@ class SwiftSettings(
102113
}
103114
}
104115
}
105-
106-
/**
107-
* Get Reserved Keywords in Swift as a list
108-
*/
109-
private fun getSwiftReservedKeywords(): List<String> {
110-
val reservedWords = listOf<String>(
111-
"Any",
112-
"#available",
113-
"associatedtype",
114-
"associativity",
115-
"as",
116-
"break",
117-
"case",
118-
"catch",
119-
"class",
120-
"#colorLiteral",
121-
"#column",
122-
"continue",
123-
"convenience",
124-
"deinit",
125-
"default",
126-
"defer",
127-
"didSet",
128-
"do",
129-
"dynamic",
130-
"enum",
131-
"extension",
132-
"else",
133-
"#else",
134-
"#elseif",
135-
"#endif",
136-
"#error",
137-
"fallthrough",
138-
"false",
139-
"#file",
140-
"#fileLiteral",
141-
"fileprivate",
142-
"final",
143-
"for",
144-
"func",
145-
"#function",
146-
"get",
147-
"guard",
148-
"indirect",
149-
"infix",
150-
"if",
151-
"#if",
152-
"#imageLiteral",
153-
"in",
154-
"is",
155-
"import",
156-
"init",
157-
"inout",
158-
"internal",
159-
"lazy",
160-
"left",
161-
"let",
162-
"#line",
163-
"mutating",
164-
"none",
165-
"nonmutating",
166-
"nil",
167-
"open",
168-
"operator",
169-
"optional",
170-
"override",
171-
"postfix",
172-
"private",
173-
"protocol",
174-
"Protocol",
175-
"public",
176-
"repeat",
177-
"rethrows",
178-
"return",
179-
"required",
180-
"right",
181-
"#selector",
182-
"self",
183-
"Self",
184-
"set",
185-
"#sourceLocation",
186-
"super",
187-
"static",
188-
"struct",
189-
"subscript",
190-
"switch",
191-
"this",
192-
"throw",
193-
"throws",
194-
"true",
195-
"try",
196-
"Type",
197-
"typealias",
198-
"unowned",
199-
"var",
200-
"#warning",
201-
"weak",
202-
"willSet",
203-
"where",
204-
"while"
205-
)
206-
return reservedWords
207-
}
208116
}
209117

210118
/**

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/SymbolVisitor.kt

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package software.amazon.smithy.swift.codegen
88
import software.amazon.smithy.codegen.core.CodegenException
99
import software.amazon.smithy.codegen.core.ReservedWordSymbolProvider
1010
import software.amazon.smithy.codegen.core.ReservedWordSymbolProvider.Escaper
11-
import software.amazon.smithy.codegen.core.ReservedWordsBuilder
1211
import software.amazon.smithy.codegen.core.Symbol
1312
import software.amazon.smithy.codegen.core.SymbolProvider
1413
import software.amazon.smithy.codegen.core.SymbolReference
@@ -44,8 +43,8 @@ import software.amazon.smithy.model.traits.EnumTrait
4443
import software.amazon.smithy.model.traits.ErrorTrait
4544
import software.amazon.smithy.model.traits.SparseTrait
4645
import software.amazon.smithy.model.traits.StreamingTrait
47-
import software.amazon.smithy.swift.codegen.SwiftSettings.Companion.reservedKeywords
4846
import software.amazon.smithy.swift.codegen.customtraits.NestedTrait
47+
import software.amazon.smithy.swift.codegen.lang.swiftReservedWords
4948
import software.amazon.smithy.swift.codegen.model.SymbolProperty
5049
import software.amazon.smithy.swift.codegen.model.boxed
5150
import software.amazon.smithy.swift.codegen.model.defaultName
@@ -69,15 +68,9 @@ class SymbolVisitor(private val model: Model, swiftSettings: SwiftSettings) :
6968
private var depth = 0
7069

7170
init {
72-
// Load reserved words from a new-line delimited file.
73-
// val resource = SwiftCodegenPlugin::class.java.classLoader.getResource("software.amazon.smithy.swift.codegen/reserved-words.txt")
74-
// TODO:: fix java.io.UncheckedIOException: java.util.zip.ZipException: ZipFile invalid LOC header (bad signature)
75-
76-
val reservedWords = ReservedWordsBuilder().apply {
77-
reservedKeywords.forEach { put(it, escapeReservedWords(it)) }
78-
}.build()
79-
80-
escaper = ReservedWordSymbolProvider.builder()
71+
val reservedWords = swiftReservedWords
72+
escaper = ReservedWordSymbolProvider
73+
.builder()
8174
.nameReservedWords(reservedWords) // Only escape words when the symbol has a definition file to
8275
.memberReservedWords(reservedWords)
8376
// prevent escaping intentional references to built-in types.
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package software.amazon.smithy.swift.codegen.lang
2+
3+
import software.amazon.smithy.codegen.core.ReservedWords
4+
import software.amazon.smithy.codegen.core.ReservedWordsBuilder
5+
6+
val swiftReservedWords: ReservedWords by lazy {
7+
ReservedWordsBuilder()
8+
.apply {
9+
reservedWords.forEach {
10+
if (metaTypes.contains(it)) {
11+
put(it, "Model$it")
12+
} else {
13+
put(it, "`$it`")
14+
}
15+
}
16+
}.build()
17+
}
18+
19+
val reservedWords = listOf(
20+
"Any",
21+
"#available",
22+
"associatedtype",
23+
"associativity",
24+
"as",
25+
"break",
26+
"case",
27+
"catch",
28+
"class",
29+
"#colorLiteral",
30+
"#column",
31+
"continue",
32+
"convenience",
33+
"deinit",
34+
"default",
35+
"defer",
36+
"didSet",
37+
"do",
38+
"dynamic",
39+
"enum",
40+
"extension",
41+
"else",
42+
"#else",
43+
"#elseif",
44+
"#endif",
45+
"#error",
46+
"fallthrough",
47+
"false",
48+
"#file",
49+
"#fileLiteral",
50+
"fileprivate",
51+
"final",
52+
"for",
53+
"func",
54+
"#function",
55+
"get",
56+
"guard",
57+
"indirect",
58+
"infix",
59+
"if",
60+
"#if",
61+
"#imageLiteral",
62+
"in",
63+
"is",
64+
"import",
65+
"init",
66+
"inout",
67+
"internal",
68+
"lazy",
69+
"left",
70+
"let",
71+
"#line",
72+
"mutating",
73+
"none",
74+
"nonmutating",
75+
"nil",
76+
"open",
77+
"operator",
78+
"optional",
79+
"override",
80+
"postfix",
81+
"private",
82+
"protocol",
83+
"Protocol",
84+
"public",
85+
"repeat",
86+
"rethrows",
87+
"return",
88+
"required",
89+
"right",
90+
"#selector",
91+
"self",
92+
"Self",
93+
"set",
94+
"#sourceLocation",
95+
"super",
96+
"static",
97+
"struct",
98+
"subscript",
99+
"switch",
100+
"this",
101+
"throw",
102+
"throws",
103+
"true",
104+
"try",
105+
"Type",
106+
"typealias",
107+
"unowned",
108+
"var",
109+
"#warning",
110+
"weak",
111+
"willSet",
112+
"where",
113+
"while"
114+
)
115+
116+
val metaTypes = listOf(
117+
"Protocol",
118+
"Type"
119+
)

0 commit comments

Comments
 (0)