Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Sources/SwiftJavaToolLib/JavaClassTranslator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
39 changes: 30 additions & 9 deletions Tests/SwiftJavaToolLibTests/Java2SwiftTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -175,15 +175,15 @@ class Java2SwiftTests: XCTestCase {
""",
"""
extension ProcessBuilder {
@JavaClass("java.lang.ProcessBuilder$Redirect")
@JavaClass("java.lang.ProcessBuilder$Redirect", extends: JavaObject.self)
public struct Redirect {
""",
"""
public func redirectError() -> ProcessBuilder.Redirect!
""",
"""
extension ProcessBuilder.Redirect {
@JavaClass("java.lang.ProcessBuilder$Redirect$Type")
@JavaClass("java.lang.ProcessBuilder$Redirect$Type", extends: JavaObject.self)
public struct Type {
""",
"""
Expand Down Expand Up @@ -220,15 +220,15 @@ class Java2SwiftTests: XCTestCase {
""",
"""
extension ProcessBuilder {
@JavaClass("java.lang.ProcessBuilder$Redirect")
@JavaClass("java.lang.ProcessBuilder$Redirect", extends: JavaObject.self)
public struct PBRedirect {
""",
"""
public func redirectError() -> ProcessBuilder.PBRedirect!
""",
"""
extension ProcessBuilder.PBRedirect {
@JavaClass("java.lang.ProcessBuilder$Redirect$Type")
@JavaClass("java.lang.ProcessBuilder$Redirect$Type", extends: JavaObject.self)
public struct JavaType {
""",
"""
Expand All @@ -245,7 +245,7 @@ class Java2SwiftTests: XCTestCase {
swiftTypeName: "JavaString",
expectedChunks: [
"""
@JavaClass("java.lang.String")
@JavaClass("java.lang.String", extends: JavaObject.self)
public struct JavaString {
"""
]
Expand Down Expand Up @@ -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",
"""
Expand Down Expand Up @@ -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<JavaObject>(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,
Expand Down Expand Up @@ -726,7 +747,7 @@ func assertTranslatedClass<JavaClassType: AnyJavaObject>(
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()
Expand Down
Loading