micronaut-projects / micronaut-core

Micronaut Application Framework
http://micronaut.io
Apache License 2.0
6.06k stars 1.06k forks source link

KSP: kspKotlin failed while processing empty array value for annotation #10425

Closed temofey1989 closed 8 months ago

temofey1989 commented 8 months ago

Expected Behavior

KSP should be able to handle an empty array for annotation.

Actual Behaviour

I'm using the OpenAPI code generator for my project. In case the code generator creates an empty array of values then the task kspKotlin fails.

Steps To Reproduce

  1. Create a controller similar to the example below:

    @Controller
    @Validated
    @Generated
    class TasksController {
    
    @Get(
        "/tasks",
        produces = ["application/json"],
        consumes = []                                                     // < -- Reason of failure!
    )
    suspend fun fetchTasks(): TaskPage {
        ...
    }
    }
  2. Run /gradlew kspKotlin
  3. See exception:
    [ksp] java.lang.IllegalArgumentException: The member named [value] with type [[Ljava.lang.Object;] is not a valid member type
    at io.micronaut.core.annotation.AnnotationValueBuilder.members(AnnotationValueBuilder.java:798)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.processAnnotationAlias(AbstractAnnotationMetadataBuilder.java:727)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.handleAnnotationAlias(AbstractAnnotationMetadataBuilder.java:960)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.processAliases(AbstractAnnotationMetadataBuilder.java:1243)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.processAliases(AbstractAnnotationMetadataBuilder.java:1073)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.processAnnotation(AbstractAnnotationMetadataBuilder.java:1057)

Environment Information

Example Application

No response

Version

4.2.3

altro3 commented 8 months ago

Which generator do you use? This one? https://github.com/micronaut-projects/micronaut-openapi

If yes, then create a issue in the micronaut-openapi project with an example, please.

If not, then use this generator

altro3 commented 8 months ago

@dstepanov Hi! Yes, the bug is really with KSP. Try to run the build with the attached example. The build will be successful if you use KAPT. If you use KSP, you will get this error:

e: [ksp] D:/Work/micronaut/micronaut3-bug/src/main/kotlin/com/micronaut/bug/controller/MyEntityController.kt:18: Error processing type visitor [io.micronaut.openapi.visitor.OpenApiControllerVisitor@52551c29]: The member named [value] with type [[Ljava.lang.Object;] is not a valid member type
e: java.lang.IllegalArgumentException: The member named [value] with type [[Ljava.lang.Object;] is not a valid member type
    at io.micronaut.core.annotation.AnnotationValueBuilder.members(AnnotationValueBuilder.java:798)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.processAnnotationAlias(AbstractAnnotationMetadataBuilder.java:728)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.handleAnnotationAlias(AbstractAnnotationMetadataBuilder.java:961)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.processAliases(AbstractAnnotationMetadataBuilder.java:1254)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.processAliases(AbstractAnnotationMetadataBuilder.java:1084)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.processAnnotation(AbstractAnnotationMetadataBuilder.java:1068)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.lambda$addAnnotations$8(AbstractAnnotationMetadataBuilder.java:979)
    at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
    at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575)
    at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
    at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616)
    at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622)
    at java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.addAnnotations(AbstractAnnotationMetadataBuilder.java:981)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.addAnnotations(AbstractAnnotationMetadataBuilder.java:824)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.buildInternalMulti(AbstractAnnotationMetadataBuilder.java:794)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.buildInternal(AbstractAnnotationMetadataBuilder.java:246)
    at io.micronaut.inject.annotation.AbstractAnnotationMetadataBuilder.lookupOrBuild(AbstractAnnotationMetadataBuilder.java:235)
    at io.micronaut.kotlin.processing.annotation.KotlinElementAnnotationMetadataFactory.lookupForMethod(KotlinElementAnnotationMetadataFactory.kt:177)
    at io.micronaut.inject.ast.annotation.AbstractElementAnnotationMetadataFactory$8.lookup(AbstractElementAnnotationMetadataFactory.java:337)
    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.inject.annotation.AnnotationMetadataHierarchy.hasStereotype(AnnotationMetadataHierarchy.java:582)
    at io.micronaut.core.annotation.AnnotationMetadataDelegate.hasStereotype(AnnotationMetadataDelegate.java:574)
    at io.micronaut.core.annotation.AnnotationMetadataDelegate.hasStereotype(AnnotationMetadataDelegate.java:574)
    at io.micronaut.kotlin.processing.visitor.LoadedVisitor.matches(LoadedVisitor.kt:131)
    at io.micronaut.kotlin.processing.visitor.TypeElementSymbolProcessor$ElementVisitor.visitMethod(TypeElementSymbolProcessor.kt:322)
    at io.micronaut.kotlin.processing.visitor.TypeElementSymbolProcessor$ElementVisitor.visitMembers(TypeElementSymbolProcessor.kt:313)
    at io.micronaut.kotlin.processing.visitor.TypeElementSymbolProcessor$ElementVisitor.visitClassDeclaration(TypeElementSymbolProcessor.kt:272)
    at com.google.devtools.ksp.symbol.impl.kotlin.KSClassDeclarationImpl.accept(KSClassDeclarationImpl.kt:135)
    at io.micronaut.kotlin.processing.visitor.TypeElementSymbolProcessor.process(TypeElementSymbolProcessor.kt:125)
    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.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:112)
    at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:77)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:256)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:247)
    at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:115)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:247)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:87)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:43)
    at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:165)
    at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:50)
    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 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:840)