micronaut-projects / micronaut-gradle-plugin

A Gradle Plugin for Micronaut
Apache License 2.0
66 stars 43 forks source link

Build error when trying to generate server classes with io.micronaut.openapi plugin from OpenAPI yaml file #810

Closed opaquot closed 8 months ago

opaquot commented 1 year ago

Expected Behavior

The build fails when I build my Micronaut project in Kotlin with Gradke Kotlin build tool using the following build.gradle.kts:

plugins {
    id("org.jetbrains.kotlin.jvm") version "1.8.22"
    id("org.jetbrains.kotlin.plugin.allopen") version "1.8.22"
    id("com.google.devtools.ksp") version "1.8.22-1.0.11"
    id("com.github.johnrengelman.shadow") version "8.1.1"
    id("io.micronaut.application") version "4.0.2"
    id("io.micronaut.aot") version "4.0.2"
    id("io.micronaut.openapi") version "4.0.2"
}

version = "0.1"
group = "com.example"

val kotlinVersion=project.properties.get("kotlinVersion")
repositories {
    mavenCentral()
}

dependencies {
    ksp("io.micronaut.security:micronaut-security-annotations")
    ksp("io.micronaut.serde:micronaut-serde-processor")
    ksp("io.micronaut.validation:micronaut-validation-processor")
    implementation("io.micronaut.kotlin:micronaut-kotlin-runtime")
    implementation("io.micronaut.security:micronaut-security")
    implementation("io.micronaut.serde:micronaut-serde-jackson")
    implementation("io.micronaut.validation:micronaut-validation")
    implementation("jakarta.validation:jakarta.validation-api")
    implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
    runtimeOnly("ch.qos.logback:logback-classic")
    runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin")
    testImplementation("io.micronaut:micronaut-http-client")
}

application {
    mainClass.set("com.iba.indus.ApplicationKt")
}
java {
    sourceCompatibility = JavaVersion.toVersion("17")
}

tasks {
    compileKotlin {
        compilerOptions {
            jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17)
        }
    }
    compileTestKotlin {
        compilerOptions {
            jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17)
        }
    }
}
graalvmNative.toolchainDetection.set(false)
micronaut {
    runtime("netty")
    testRuntime("junit5")
    processing {
        incremental(true)
        annotations("com.example.*")
    }
    aot {
    // Please review carefully the optimizations enabled below
    // Check https://micronaut-projects.github.io/micronaut-aot/latest/guide/ for more details
        optimizeServiceLoading.set(false)
        convertYamlToJava.set(false)
        precomputeOperations.set(true)
        cacheEnvironment.set(true)
        optimizeClassLoading.set(true)
        deduceEnvironment.set(true)
        optimizeNetty.set(true)
    }

    openapi{
        server(file("src/openapi/api.yml")) {
            apiPackageName="com.example.api"
            modelPackageName="com.example.model"
            useReactive=false
        }
    }
}

The server classes seem to be correctly generated but I would expect my build to pass.

Actual Behaviour

I get the following error during the build:

> Task :kspKotlin FAILED
e: java.lang.AssertionError: Member must have a containing class: PsiMethod:valueOf
        at org.jetbrains.kotlin.load.java.structure.impl.JavaMemberImpl.getContainingClass(JavaMemberImpl.java:63)
        at com.google.devtools.ksp.symbol.impl.UtilsKt.resolveContainingClass(utils.kt:235)
        at com.google.devtools.ksp.processing.impl.ResolverImpl.resolveJavaDeclaration(ResolverImpl.kt:537)
        at com.google.devtools.ksp.processing.impl.ResolverImpl.resolveFunctionDeclaration(ResolverImpl.kt:577)
        at com.google.devtools.ksp.symbol.impl.java.KSFunctionDeclarationJavaImpl.findOverridee(KSFunctionDeclarationJavaImpl.kt:56)
        at io.micronaut.kotlin.processing.annotation.KotlinAnnotationMetadataBuilder.methodsHierarchy(KotlinAnnotationMetadataBuilder.kt:273)
        at io.micronaut.kotlin.processing.annotation.KotlinAnnotationMetadataBuilder.buildHierarchy(KotlinAnnotationMetadataBuilder.kt:235)
        at io.micronaut.kotlin.processing.annotation.KotlinAnnotationMetadataBuilder.buildHierarchy(KotlinAnnotationMetadataBuilder.kt:42)
        at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.buildInternalMulti(AbstractAnnotationMetadataBuilder.java:722)
        at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.buildInternal(AbstractAnnotationMetadataBuilder.java:243)
        at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.lookupOrBuild(AbstractAnnotationMetadataBuilder.java:232)
        at io.micronaut.kotlin.processing.annotation.KotlinElementAnnotationMetadataFactory.lookupForParameter(KotlinElementAnnotationMetadataFactory.kt:144)
        at io.micronaut.inject.ast.annotation.AbstractElementAnnotationMetadataFactory$6.lookup(AbstractElementAnnotationMetadataFactory.java:304)
        at io.micronaut.inject.ast.annotation.AbstractElementAnnotationMetadataFactory$AbstractElementAnnotationMetadata.getCacheEntry(AbstractElementAnnotationMetadataFactory.java:451)
        at io.micronaut.inject.ast.annotation.AbstractElementAnnotationMetadataFactory$AbstractElementAnnotationMetadata.getAnnotationMetadata(AbstractElementAnnotationMetadataFactory.java:461)
        at io.micronaut.core.annotation.AnnotationMetadataDelegate.hasStereotype(AnnotationMetadataDelegate.java:574)
        at io.micronaut.validation.visitor.ValidationVisitor.visitElementValidationAndMarkForValidationIfNeeded(ValidationVisitor.java:156)
        at io.micronaut.validation.visitor.ValidationVisitor.parametersRequireValidation(ValidationVisitor.java:142)
        at io.micronaut.validation.visitor.ValidationVisitor.visitMethod(ValidationVisitor.java:111)
        at io.micronaut.validation.visitor.ValidationVisitor.lambda$visitClass$0(ValidationVisitor.java:79)
        at java.base/java.lang.Iterable.forEach(Iterable.java:75)
        at io.micronaut.validation.visitor.ValidationVisitor.visitClass(ValidationVisitor.java:79)
        at io.micronaut.kotlin.processing.visitor.TypeElementSymbolProcessor$ElementVisitor.visitClassDeclaration(TypeElementSymbolProcessor.kt:269)
        at com.google.devtools.ksp.symbol.impl.java.KSClassDeclarationJavaImpl.accept(KSClassDeclarationJavaImpl.kt:171)
        at io.micronaut.kotlin.processing.visitor.TypeElementSymbolProcessor.process(TypeElementSymbolProcessor.kt:124)
        at com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension$doAnalysis$6$1.invoke(KotlinSymbolProcessingExtension.kt:291)
        at com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension$doAnalysis$6$1.invoke(KotlinSymbolProcessingExtension.kt:289)
        at com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension.handleException(KotlinSymbolProcessingExtension.kt:394)
        at com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension.doAnalysis(KotlinSymbolProcessingExtension.kt:289)
        at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:123)
        at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:99)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:257)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:42)
        at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:115)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:248)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:88)
        at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:47)
        at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:168)
        at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:53)
        at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:100)
        at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:46)
        at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101)
        at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1486)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        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:833)

The server classes seem to be correctly generated but I would expect my build to pass.

Steps To Reproduce

  1. From a blank project generated with the following information:
    applicationType: default
    defaultPackage: com.example
    testFramework: junit
    sourceLanguage: kotlin
    buildTool: gradle_kotlin
    features: [app-name, gradle, http-client-test, junit, kotlin, kotlin-application, ksp, logback, micronaut-aot, micronaut-build, netty-server, properties, readme, security, security-annotations, serialization-jackson, shade, validation]
  2. Adding id("io.micronaut.openapi") version "4.0.2" in the plugins
  3. Adding
    openapi{
        server(file("src/openapi/api.yml")) {
            apiPackageName="com.example.api"
            modelPackageName="com.example.model"
            useReactive=false
        }
    }

    in the micronaut configuration.

  4. When I build the project, it fails with the error presented above.

Environment Information

OS: Linux JDK: temurin-17

Example Application

No response

Version

4.0.2

opaquot commented 1 year ago

It seems to be related to this issue: https://github.com/google/ksp/issues/1482

guillermocalvo commented 1 year ago

It seems to be related to this issue: google/ksp#1482

@opaquot You're right. As @dstepanov noted in a similar micronaut-core issue, Java enums seem to be broken on the KSP side at the moment.

sdelamo commented 8 months ago

is this still an issue @opaquot ?

altro3 commented 8 months ago

@sdelamo @melix You can close it. It's already fixed in KSP