Skip to content

Commit 60457bf

Browse files
committed
Escape member types named "Type"
1 parent b402bf5 commit 60457bf

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

Sources/Java2SwiftLib/JavaTranslator.swift

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,19 +170,28 @@ extension JavaTranslator {
170170
let javaType = try JavaType(javaTypeName: javaClass.getName())
171171
let isSwiftOptional = javaType.isSwiftOptional
172172
return (
173-
try javaType.swiftTypeName(resolver: self.getSwiftTypeNameFromJavaClassName(_:)),
173+
try javaType.swiftTypeName { javaClassName in
174+
try self.getSwiftTypeNameFromJavaClassName(javaClassName)
175+
},
174176
isSwiftOptional
175177
)
176178
}
177179

178180
/// Map a Java class name to its corresponding Swift type.
179-
private func getSwiftTypeNameFromJavaClassName(_ name: String) throws -> String {
181+
private func getSwiftTypeNameFromJavaClassName(
182+
_ name: String,
183+
escapeMemberNames: Bool = true
184+
) throws -> String {
180185
if let translated = translatedClasses[name] {
181186
// Note that we need to import this Swift module.
182187
if let swiftModule = translated.swiftModule, swiftModule != swiftModuleName {
183188
importedSwiftModules.insert(swiftModule)
184189
}
185190

191+
if escapeMemberNames {
192+
return translated.swiftType.escapingSwiftMemberNames
193+
}
194+
186195
return translated.swiftType
187196
}
188197

@@ -197,7 +206,7 @@ extension JavaTranslator {
197206
/// JavaClass to house static methods.
198207
package func translateClass(_ javaClass: JavaClass<JavaObject>) throws -> [DeclSyntax] {
199208
let fullName = javaClass.getName()
200-
let swiftTypeName = try getSwiftTypeNameFromJavaClassName(fullName)
209+
let swiftTypeName = try getSwiftTypeNameFromJavaClassName(fullName, escapeMemberNames: false)
201210
let (swiftParentType, swiftInnermostTypeName) = swiftTypeName.splitSwiftTypeName()
202211

203212
// If the swift parent type has not been translated, don't try to translate this one
@@ -636,3 +645,30 @@ extension JavaTranslator {
636645
}
637646
}
638647
}
648+
649+
extension String {
650+
/// Escape Swift types that involve member name references like '.Type'
651+
fileprivate var escapingSwiftMemberNames: String {
652+
var count = 0
653+
return split(separator: ".").map { component in
654+
defer {
655+
count += 1
656+
}
657+
658+
if count > 0 && component.memberRequiresBackticks {
659+
return "`\(component)`"
660+
}
661+
662+
return String(component)
663+
}.joined(separator: ".")
664+
}
665+
}
666+
667+
extension Substring {
668+
fileprivate var memberRequiresBackticks: Bool {
669+
switch self {
670+
case "Type": return true
671+
default: return false
672+
}
673+
}
674+
}

Tests/Java2SwiftTests/Java2SwiftTests.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,10 @@ class Java2SwiftTests: XCTestCase {
176176
@JavaClass("java.lang.ProcessBuilder$Redirect$Type")
177177
public struct Type {
178178
""",
179+
"""
180+
@JavaMethod
181+
public func type() -> ProcessBuilder.Redirect.`Type`?
182+
""",
179183
]
180184
)
181185
}

0 commit comments

Comments
 (0)