From 47bfc3ec98fb81d261f7def6637c977756886e91 Mon Sep 17 00:00:00 2001 From: Tien Nguyen Date: Tue, 16 Jun 2026 06:47:27 -0400 Subject: [PATCH] fail eagerly when missing JavaObject mapping --- .../JavaClassTranslator.swift | 4 ++ .../Java2SwiftTests.swift | 39 ++++++++++++++----- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Sources/SwiftJavaToolLib/JavaClassTranslator.swift b/Sources/SwiftJavaToolLib/JavaClassTranslator.swift index 37e631a91..ded0f80e8 100644 --- a/Sources/SwiftJavaToolLib/JavaClassTranslator.swift +++ b/Sources/SwiftJavaToolLib/JavaClassTranslator.swift @@ -137,6 +137,10 @@ struct JavaClassTranslator { // Superclass, incl parameter types (if any) if !javaClass.isInterface() { var javaSuperclass = javaClass.getSuperclass() + if javaSuperclass != nil, translator.translatedClasses[JavaObject.fullJavaClassName] == nil { + throw TranslationError.untranslatedJavaClass(JavaObject.fullJavaClassName) + } + var javaGenericSuperclass: Type? = javaClass.getGenericSuperclass() var swiftSuperclassName: String? = nil var swiftSuperclassTypeArgs: [String]? = nil diff --git a/Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift b/Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift index b9a279022..374d2b332 100644 --- a/Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift +++ b/Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift @@ -175,7 +175,7 @@ class Java2SwiftTests: XCTestCase { """, """ extension ProcessBuilder { - @JavaClass("java.lang.ProcessBuilder$Redirect") + @JavaClass("java.lang.ProcessBuilder$Redirect", extends: JavaObject.self) public struct Redirect { """, """ @@ -183,7 +183,7 @@ class Java2SwiftTests: XCTestCase { """, """ extension ProcessBuilder.Redirect { - @JavaClass("java.lang.ProcessBuilder$Redirect$Type") + @JavaClass("java.lang.ProcessBuilder$Redirect$Type", extends: JavaObject.self) public struct Type { """, """ @@ -220,7 +220,7 @@ class Java2SwiftTests: XCTestCase { """, """ extension ProcessBuilder { - @JavaClass("java.lang.ProcessBuilder$Redirect") + @JavaClass("java.lang.ProcessBuilder$Redirect", extends: JavaObject.self) public struct PBRedirect { """, """ @@ -228,7 +228,7 @@ class Java2SwiftTests: XCTestCase { """, """ extension ProcessBuilder.PBRedirect { - @JavaClass("java.lang.ProcessBuilder$Redirect$Type") + @JavaClass("java.lang.ProcessBuilder$Redirect$Type", extends: JavaObject.self) public struct JavaType { """, """ @@ -245,7 +245,7 @@ class Java2SwiftTests: XCTestCase { swiftTypeName: "JavaString", expectedChunks: [ """ - @JavaClass("java.lang.String") + @JavaClass("java.lang.String", extends: JavaObject.self) public struct JavaString { """ ] @@ -313,9 +313,6 @@ class Java2SwiftTests: XCTestCase { JavaString.self, swiftTypeName: "JavaString", asClass: true, - translatedClasses: [ - "java.lang.Object": SwiftTypeName(module: "SwiftJava", name: "JavaObject") - ], expectedChunks: [ "import SwiftJava", """ @@ -346,6 +343,30 @@ class Java2SwiftTests: XCTestCase { ) } + func testMissingJavaObjectMappingFailsEagerly() throws { + let environment = try jvm.environment() + let translator = JavaTranslator( + config: Configuration(), + swiftModuleName: "SwiftModule", + environment: environment, + translateAsClass: true + ) + translator.translatedClasses = [:] + translator.translatedClasses[JavaString.fullJavaClassName] = SwiftTypeName(module: nil, name: "JavaString") + translator.startNewFile() + + try JavaString.withJNIClass(in: environment) { javaClass in + XCTAssertThrowsError( + try translator.translateClass(JavaClass(javaThis: javaClass, environment: environment)) + ) { error in + XCTAssertEqual( + String(describing: error), + "Java class 'java.lang.Object' has not been translated into Swift" + ) + } + } + } + func testEnumAsClass() throws { try assertTranslatedClass( JavaMonth.self, @@ -726,7 +747,7 @@ func assertTranslatedClass( translateAsClass: asClass ) - translator.translatedClasses = translatedClasses + translator.translatedClasses.merge(translatedClasses) { _, new in new } translator.translatedClasses[javaType.fullJavaClassName] = SwiftTypeName(module: nil, name: swiftTypeName) translator.nestedClasses = nestedClasses translator.startNewFile()