From b0379d483cb4d0483fd8bd52711f45202f2e7591 Mon Sep 17 00:00:00 2001 From: Iceman Date: Tue, 24 Mar 2026 11:16:13 +0900 Subject: [PATCH] Fix generic parameters in JavaType were not being printed --- Sources/SwiftJavaJNICore/JavaAnnotation.swift | 2 +- .../JavaType+JavaSource.swift | 36 ++++++++------- Sources/SwiftJavaJNICore/JavaType.swift | 2 +- .../SwiftJavaJNICoreTests/JavaTypeTests.swift | 46 +++++++++++++++++++ 4 files changed, 68 insertions(+), 18 deletions(-) create mode 100644 Tests/SwiftJavaJNICoreTests/JavaTypeTests.swift diff --git a/Sources/SwiftJavaJNICore/JavaAnnotation.swift b/Sources/SwiftJavaJNICore/JavaAnnotation.swift index 233af73..c493c18 100644 --- a/Sources/SwiftJavaJNICore/JavaAnnotation.swift +++ b/Sources/SwiftJavaJNICore/JavaAnnotation.swift @@ -13,7 +13,7 @@ //===----------------------------------------------------------------------===// /// Describes a Java annotation (e.g. `@Deprecated` or `@Unsigned`) -public struct JavaAnnotation: Equatable, Hashable { +public struct JavaAnnotation: Equatable, Hashable, Sendable { public let type: JavaType public let arguments: [String] diff --git a/Sources/SwiftJavaJNICore/JavaType+JavaSource.swift b/Sources/SwiftJavaJNICore/JavaType+JavaSource.swift index 96f72be..f03eeb5 100644 --- a/Sources/SwiftJavaJNICore/JavaType+JavaSource.swift +++ b/Sources/SwiftJavaJNICore/JavaType+JavaSource.swift @@ -41,26 +41,30 @@ extension JavaType: CustomStringConvertible { /// Description of the Java type as it would appear in Java source. public var description: String { switch self { - case .boolean: "boolean" - case .byte: "byte" - case .char: "char" - case .short: "short" - case .int: "int" - case .long: "long" - case .float: "float" - case .double: "double" - case .void: "void" - case .array(let elementType): "\(elementType.description)[]" + case .boolean: return "boolean" + case .byte: return "byte" + case .char: return "char" + case .short: return "short" + case .int: return "int" + case .long: return "long" + case .float: return "float" + case .double: return "double" + case .void: return "void" + case .array(let elementType): return "\(elementType.description)[]" case .class(let package, let name, let typeParameters): - if let package { + let packageClause: String = + if let package { + "\(package)." + } else { + "" + } + let genericClause: String = if !typeParameters.isEmpty { - "\(package).\(name)<\(typeParameters.map(\.description).joined(separator: ", "))>" + "<\(typeParameters.map(\.description).joined(separator: ", "))>" } else { - "\(package).\(name)" + "" } - } else { - name - } + return "\(packageClause)\(name)\(genericClause)" } } diff --git a/Sources/SwiftJavaJNICore/JavaType.swift b/Sources/SwiftJavaJNICore/JavaType.swift index 0e80235..ef1912b 100644 --- a/Sources/SwiftJavaJNICore/JavaType.swift +++ b/Sources/SwiftJavaJNICore/JavaType.swift @@ -15,7 +15,7 @@ /// Describes the Java type system. /// /// Some types may need to be annotated when in parameter position, -public enum JavaType: Equatable, Hashable { +public enum JavaType: Equatable, Hashable, Sendable { case boolean case byte(parameterAnnotations: [JavaAnnotation]) case char(parameterAnnotations: [JavaAnnotation]) diff --git a/Tests/SwiftJavaJNICoreTests/JavaTypeTests.swift b/Tests/SwiftJavaJNICoreTests/JavaTypeTests.swift new file mode 100644 index 0000000..7ca8818 --- /dev/null +++ b/Tests/SwiftJavaJNICoreTests/JavaTypeTests.swift @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2026 Apple Inc. and the Swift.org project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of Swift.org project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +import SwiftJavaJNICore +import Testing + +@Suite +struct JavaTypeTests { + @Test( + arguments: [ + (.int, "int"), + (.array(.long), "long[]"), + (.char(parameterAnnotations: [.unsigned]), "char"), + ( + .class( + package: nil, + name: "Tuple", + typeParameters: [.class(package: nil, name: "Integer"), .class(package: nil, name: "String")] + ), + "Tuple" + ), + ( + .class( + package: "java.util", + name: "List", + typeParameters: [.class(package: "java.lang", name: "String")] + ), + "java.util.List" + ), + ] as [(JavaType, String)] + ) + func description(javaType: JavaType, expected: String) throws { + #expect(javaType.description == expected) + } +}