diff --git a/Sources/JavaKit/Macros.swift b/Sources/JavaKit/Macros.swift index 51d62739..347a3ebf 100644 --- a/Sources/JavaKit/Macros.swift +++ b/Sources/JavaKit/Macros.swift @@ -37,7 +37,8 @@ named(javaThis), named(javaEnvironment), named(init(javaHolder:)), - named(JavaSuperclass) + named(JavaSuperclass), + named(`as`) ) @attached(extension, conformances: AnyJavaObject) @attached(peer) @@ -73,7 +74,8 @@ public macro JavaClass( named(javaThis), named(javaEnvironment), named(init(javaHolder:)), - named(JavaSuperclass) + named(JavaSuperclass), + named(`as`) ) @attached(extension, conformances: AnyJavaObject) public macro JavaInterface(_ fullClassName: String, extends: (any AnyJavaObject.Type)?...) = diff --git a/Sources/JavaKitMacros/JavaClassMacro.swift b/Sources/JavaKitMacros/JavaClassMacro.swift index 23d6d4fc..3cee441d 100644 --- a/Sources/JavaKitMacros/JavaClassMacro.swift +++ b/Sources/JavaKitMacros/JavaClassMacro.swift @@ -87,6 +87,13 @@ extension JavaClassMacro: MemberMacro { } """ + let nonOptionalAs: DeclSyntax = """ + /// Casting to ``\(raw: superclass)`` will never be nil because ``\(raw: className.split(separator: ".").last!)`` extends it. + public func `as`(_: \(raw: superclass).Type) -> \(raw: superclass) { + return \(raw: superclass)(javaHolder: javaHolder) + } + """ + return [ fullJavaClassNameMember, superclassTypealias, @@ -94,6 +101,7 @@ extension JavaClassMacro: MemberMacro { javaThisMember, javaEnvironmentMember, initMember, + nonOptionalAs, ] } } diff --git a/Tests/JavaKitMacroTests/JavaClassMacroTests.swift b/Tests/JavaKitMacroTests/JavaClassMacroTests.swift index 72ff432d..cc0ad31b 100644 --- a/Tests/JavaKitMacroTests/JavaClassMacroTests.swift +++ b/Tests/JavaKitMacroTests/JavaClassMacroTests.swift @@ -78,6 +78,11 @@ class JavaKitMacroTests: XCTestCase { public init(javaHolder: JavaObjectHolder) { self.javaHolder = javaHolder } + + /// Casting to ``JavaObject`` will never be nil because ``HelloWorld`` extends it. + public func `as`(_: JavaObject.Type) -> JavaObject { + return JavaObject(javaHolder: javaHolder) + } } """, macros: Self.javaKitMacros