diff --git a/Package.swift b/Package.swift index 4ec487b7..5ccec379 100644 --- a/Package.swift +++ b/Package.swift @@ -318,6 +318,17 @@ let package = Package( ] ), + .testTarget( + name: "JavaKitMacroTests", + dependencies: [ + "JavaKitMacros", + .product(name: "SwiftSyntaxMacrosTestSupport", package: "swift-syntax"), + ], + swiftSettings: [ + .swiftLanguageMode(.v5) + ] + ), + .testTarget( name: "JExtractSwiftTests", dependencies: [ diff --git a/Sources/JavaKitMacros/JavaClassMacro.swift b/Sources/JavaKitMacros/JavaClassMacro.swift index b1da49dd..23d6d4fc 100644 --- a/Sources/JavaKitMacros/JavaClassMacro.swift +++ b/Sources/JavaKitMacros/JavaClassMacro.swift @@ -17,10 +17,10 @@ import SwiftSyntaxBuilder import SwiftSyntaxMacros import Foundation // for e.g. replacingOccurrences -enum JavaClassMacro {} +package enum JavaClassMacro {} extension JavaClassMacro: MemberMacro { - static func expansion( + package static func expansion( of node: AttributeSyntax, providingMembersOf declaration: some DeclGroupSyntax, conformingTo protocols: [TypeSyntax], @@ -99,7 +99,7 @@ extension JavaClassMacro: MemberMacro { } extension JavaClassMacro: ExtensionMacro { - static func expansion( + package static func expansion( of node: AttributeSyntax, attachedTo declaration: some DeclGroupSyntax, providingExtensionsOf type: some TypeSyntaxProtocol, @@ -120,7 +120,7 @@ extension JavaClassMacro: ExtensionMacro { } extension JavaClassMacro: PeerMacro { - static func expansion( + package static func expansion( of node: AttributeSyntax, providingPeersOf declaration: some DeclSyntaxProtocol, in context: some MacroExpansionContext diff --git a/Sources/JavaKitMacros/JavaFieldMacro.swift b/Sources/JavaKitMacros/JavaFieldMacro.swift index 10f06ad3..d9c7929f 100644 --- a/Sources/JavaKitMacros/JavaFieldMacro.swift +++ b/Sources/JavaKitMacros/JavaFieldMacro.swift @@ -16,10 +16,10 @@ import SwiftSyntax import SwiftSyntaxBuilder import SwiftSyntaxMacros -enum JavaFieldMacro {} +package enum JavaFieldMacro {} extension JavaFieldMacro: AccessorMacro { - static func expansion( + package static func expansion( of node: AttributeSyntax, providingAccessorsOf declaration: some DeclSyntaxProtocol, in context: some MacroExpansionContext diff --git a/Sources/JavaKitMacros/JavaMethodMacro.swift b/Sources/JavaKitMacros/JavaMethodMacro.swift index b16d8ab2..dc08374d 100644 --- a/Sources/JavaKitMacros/JavaMethodMacro.swift +++ b/Sources/JavaKitMacros/JavaMethodMacro.swift @@ -17,10 +17,10 @@ import SwiftSyntaxBuilder @_spi(Testing) import SwiftSyntaxMacroExpansion import SwiftSyntaxMacros -enum JavaMethodMacro {} +package enum JavaMethodMacro {} extension JavaMethodMacro: BodyMacro { - static func expansion( + package static func expansion( of node: AttributeSyntax, providingBodyFor declaration: some DeclSyntaxProtocol & WithOptionalCodeBlockSyntax, in context: some MacroExpansionContext diff --git a/Tests/JavaKitMacroTests/JavaClassMacroTests.swift b/Tests/JavaKitMacroTests/JavaClassMacroTests.swift new file mode 100644 index 00000000..72ff432d --- /dev/null +++ b/Tests/JavaKitMacroTests/JavaClassMacroTests.swift @@ -0,0 +1,87 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2024 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 JavaKitMacros +import SwiftSyntax +import SwiftSyntaxBuilder +import SwiftSyntaxMacros +import SwiftSyntaxMacrosTestSupport +import XCTest + +class JavaKitMacroTests: XCTestCase { + static let javaKitMacros: [String: any Macro.Type] = [ + "JavaClass": JavaClassMacro.self, + "JavaMethod": JavaMethodMacro.self, + "JavaField": JavaFieldMacro.self + ] + + func testJavaClass() throws { + assertMacroExpansion(""" + @JavaClass("org.swift.example.HelloWorld") + public struct HelloWorld { + @JavaMethod + public init(_ value: Int32, environment: JNIEnvironment) + + @JavaMethod + public func isBigEnough(_: Int32) -> Bool + + @JavaField + public var myField: Int64 + } + """, + expandedSource: """ + + public struct HelloWorld { + public init(_ value: Int32, environment: JNIEnvironment) { + self = try! Self.dynamicJavaNewObject(in: environment, arguments: value.self) + } + public func isBigEnough(_: Int32) -> Bool { + return try! dynamicJavaMethodCall(methodName: "isBigEnough", resultType: Bool.self) + } + public var myField: Int64 { + get { + self[javaFieldName: "myField", fieldType: Int64.self] + } + nonmutating set { + self[javaFieldName: "myField", fieldType: Int64.self] = newValue + } + } + + /// The full Java class name for this Swift type. + public static var fullJavaClassName: String { + "org.swift.example.HelloWorld" + } + + public typealias JavaSuperclass = JavaObject + + public var javaHolder: JavaObjectHolder + + public var javaThis: jobject { + javaHolder.object! + } + + public var javaEnvironment: JNIEnvironment { + javaHolder.environment + } + + public init(javaHolder: JavaObjectHolder) { + self.javaHolder = javaHolder + } + } + """, + macros: Self.javaKitMacros + ) + } +} +