voize-gmbh / reakt-native-toolkit

Combine React Native with Kotlin Multiplatform (KMP)
Apache License 2.0
124 stars 4 forks source link

Using extension functions on interfaces within RNModule methods seems broken #49

Closed iceychris closed 6 months ago

iceychris commented 6 months ago

The following code:

interface CustomInterface {
   fun foo(): String
}

fun CustomInterface.bar(): String {
    return "bar"
}

@ReactNativeModule("Custom")
class CustomRNModule(
    private val custom: CustomInterface
) {

     // working

    @ReactNativeMethod
    fun getFoo(): String {
        return custom.foo()
    }

    // not working

    @ReactNativeMethod
    fun getBar(): String {
        return custom.bar()
    }
}

fails to compile:

e: [ksp] java.lang.IllegalStateException: Interfaces are not supported
        at de.voize.reaktnativetoolkit.ksp.processor.TypescriptGenerator.getTypescriptSerializedTypeName(TypescriptGenerator.kt:851)
        at de.voize.reaktnativetoolkit.ksp.processor.TypescriptGenerator.createTypescriptRNModule(TypescriptGenerator.kt:184)
        at de.voize.reaktnativetoolkit.ksp.processor.TypescriptGenerator.createRNModulesFile(TypescriptGenerator.kt:154)
        at de.voize.reaktnativetoolkit.ksp.processor.TypescriptGenerator.generate(TypescriptGenerator.kt:107)
        at de.voize.reaktnativetoolkit.ksp.processor.ToolkitSymbolProcessor.process(ToolkitSymbolProcessor.kt:247)
        at com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension$doAnalysis$8$1.invoke(KotlinSymbolProcessingExtension.kt:306)
        at com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension$doAnalysis$8$1.invoke(KotlinSymbolProcessingExtension.kt:304)
        at com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension.handleException(KotlinSymbolProcessingExtension.kt:410)
        at com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension.doAnalysis(KotlinSymbolProcessingExtension.kt:304)
        at org.jetbrains.kotlin.analyzer.common.CommonResolverForModuleFactory$Companion.analyzeFiles(CommonResolverForModuleFactory.kt:203)
        at org.jetbrains.kotlin.analyzer.common.CommonResolverForModuleFactory$Companion.analyzeFiles$default(CommonResolverForModuleFactory.kt:143)
        at org.jetbrains.kotlin.cli.metadata.CommonAnalysisKt$runCommonAnalysisIteration$1.invoke(CommonAnalysis.kt:72)
        at org.jetbrains.kotlin.cli.metadata.CommonAnalysisKt$runCommonAnalysisIteration$1.invoke(CommonAnalysis.kt:71)
        at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:115)
        at org.jetbrains.kotlin.cli.metadata.CommonAnalysisKt.runCommonAnalysisIteration(CommonAnalysis.kt:71)
        at org.jetbrains.kotlin.cli.metadata.CommonAnalysisKt.runCommonAnalysisForSerialization(CommonAnalysis.kt:38)
        at org.jetbrains.kotlin.cli.metadata.K2MetadataKlibSerializer.analyze(K2MetadataKlibSerializer.kt:43)
        at org.jetbrains.kotlin.cli.metadata.K2MetadataKlibSerializer.analyze(K2MetadataKlibSerializer.kt:38)
        at org.jetbrains.kotlin.cli.metadata.AbstractMetadataSerializer.analyzeAndSerialize(AbstractMetadataSerializer.kt:34)
        at org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler.doExecute(K2MetadataCompiler.kt:126)
        at org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler.doExecute(K2MetadataCompiler.kt:40)
        at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:104)
        at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:48)
        at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101)
        at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1523)
        at jdk.internal.reflect.GeneratedMethodAccessor89.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360)
        at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
        at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
        at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
        at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587)
        at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828)
        at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
        at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:840)
iceychris commented 6 months ago

Turned out to be an issue on my side:

// wrong (leads to same error as above)

@ReactNativeMethod
fun getSomeFlow(): Flow<Boolean> {
    return flowOf(true)
}

// correct

@ReactNativeFlow
fun getSomeFlow(): Flow<Boolean> {
    return flowOf(true)
}