Skip to content

Commit b402bf5

Browse files
committed
Java2Swift: Use the parent's Swift type name to form nested type names
1 parent b304f73 commit b402bf5

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

Sources/Java2Swift/JavaToSwift.swift

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,14 @@ struct JavaToSwift: ParsableCommand {
224224
currentClassIndex += 1
225225
}
226226

227+
// The current class we're in.
228+
let currentClass = allClassesToVisit[currentClassIndex]
229+
guard let currentSwiftName = translator.translatedClasses[currentClass.getName()]?.swiftType else {
230+
continue
231+
}
232+
227233
// Find all of the nested classes that weren't explicitly translated
228234
// already.
229-
let currentClass = allClassesToVisit[currentClassIndex]
230235
let nestedClasses: [JavaClass<JavaObject>] = currentClass.getClasses().compactMap { nestedClass in
231236
guard let nestedClass else { return nil }
232237

@@ -242,7 +247,9 @@ struct JavaToSwift: ParsableCommand {
242247
}
243248

244249
// Record this as a translated class.
245-
let swiftName = javaClassName.defaultSwiftNameForJavaClass
250+
let swiftUnqualifiedName = javaClassName.javaClassNameToCanonicalName
251+
.defaultSwiftNameForJavaClass
252+
let swiftName = "\(currentSwiftName).\(swiftUnqualifiedName)"
246253
translator.translatedClasses[javaClassName] = (swiftName, nil, true)
247254
return nestedClass
248255
}

Tests/Java2SwiftTests/Java2SwiftTests.swift

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,52 @@ class Java2SwiftTests: XCTestCase {
169169
public struct Redirect {
170170
""",
171171
"""
172+
public func redirectError() -> ProcessBuilder.Redirect?
173+
""",
174+
"""
172175
extension ProcessBuilder.Redirect {
173176
@JavaClass("java.lang.ProcessBuilder$Redirect$Type")
174177
public struct Type {
178+
""",
179+
]
180+
)
181+
}
182+
183+
func testNestedRenamedSubclasses() throws {
184+
try assertTranslatedClass(
185+
ProcessBuilder.self,
186+
swiftTypeName: "ProcessBuilder",
187+
translatedClasses: [
188+
"java.lang.ProcessBuilder": ("ProcessBuilder", nil, true),
189+
"java.lang.ProcessBuilder$Redirect": ("ProcessBuilder.PBRedirect", nil, true),
190+
"java.lang.ProcessBuilder$Redirect$Type": ("ProcessBuilder.PBRedirect.JavaType", nil, true),
191+
],
192+
nestedClasses: [
193+
"java.lang.ProcessBuilder": [JavaClass<ProcessBuilder.Redirect>().as(JavaClass<JavaObject>.self)!],
194+
"java.lang.ProcessBuilder$Redirect": [JavaClass<ProcessBuilder.Redirect.JavaType>().as(JavaClass<JavaObject>.self)!],
195+
],
196+
expectedChunks: [
197+
"import JavaKit",
198+
"""
199+
@JavaMethod
200+
public func redirectInput() -> ProcessBuilder.PBRedirect?
201+
""",
202+
"""
203+
extension ProcessBuilder {
204+
@JavaClass("java.lang.ProcessBuilder$Redirect")
205+
public struct PBRedirect {
206+
""",
207+
"""
208+
public func redirectError() -> ProcessBuilder.PBRedirect?
209+
""",
210+
"""
211+
extension ProcessBuilder.PBRedirect {
212+
@JavaClass("java.lang.ProcessBuilder$Redirect$Type")
213+
public struct JavaType {
214+
""",
215+
"""
216+
@JavaMethod
217+
public func type() -> ProcessBuilder.PBRedirect.JavaType?
175218
"""
176219
]
177220
)

0 commit comments

Comments
 (0)