Skip to content

MissingOverrideAnnotation: NPE in classDecl.getBody().getMarkers() with Kotlin files #234

Description

@vlsi

How are you running OpenRewrite?

See apache/jmeter#6217, ./gradlew :src:jorphan:rewriteRun

What is the smallest, simplest way to reproduce the problem?

No idea

What did you expect to see?

MissingOverrideAnnotation should either skip Kotlin files or it should add override respectively.

What did you see instead?

The issue might be caused by withBody(null) (see https://github.com/openrewrite/rewrite/blob/fb7dbd6c95ef5492301dcb941e7f8eefd223621e/rewrite-java/src/main/java/org/openrewrite/java/internal/template/AnnotationTemplateGenerator.java#L226 ), however, I'm not sure what triggers it.

The problematic class is https://github.com/apache/jmeter/blob/09c3f810dda7efaf1510ac062454d978d90a0741/src/jorphan/src/main/kotlin/org/apache/jorphan/gui/CardLayoutWithSizeOfCurrentVisibleElement.kt#L31

org.openrewrite.internal.RecipeRunException: java.lang.NullPointerException: Cannot invoke "org.openrewrite.java.tree.J$Block.getStatements()" because the return value of "org.openrewrite.java.tree.J$ClassDeclaration.getBody()" is null
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:329)
        at org.openrewrite.kotlin.internal.KotlinPrinter$KotlinJavaPrinter.visit(KotlinPrinter.java:495)
        at org.openrewrite.kotlin.internal.KotlinPrinter.visit(KotlinPrinter.java:56)
        at org.openrewrite.kotlin.internal.KotlinPrinter.visit(KotlinPrinter.java:40)
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:184)
        at org.openrewrite.Tree.print(Tree.java:94)
        at org.openrewrite.Tree.print(Tree.java:90)
        at org.openrewrite.Tree.printTrimmed(Tree.java:109)
        at org.openrewrite.java.internal.template.AnnotationTemplateGenerator.classDeclaration(AnnotationTemplateGenerator.java:227)
        at org.openrewrite.java.internal.template.AnnotationTemplateGenerator.template(AnnotationTemplateGenerator.java:141)
        at org.openrewrite.java.internal.template.AnnotationTemplateGenerator.lambda$template$0(AnnotationTemplateGenerator.java:73)
        at io.micrometer.core.instrument.composite.CompositeTimer.record(CompositeTimer.java:65)
        at org.openrewrite.java.internal.template.AnnotationTemplateGenerator.template(AnnotationTemplateGenerator.java:69)
        at org.openrewrite.java.internal.template.JavaTemplateParser.lambda$parseAnnotations$10(JavaTemplateParser.java:203)
        at org.openrewrite.java.internal.template.JavaTemplateParser.cache(JavaTemplateParser.java:295)
        at org.openrewrite.java.internal.template.JavaTemplateParser.parseAnnotations(JavaTemplateParser.java:202)
        at org.openrewrite.java.internal.template.JavaTemplateJavaExtension$1.visitMethodDeclaration(JavaTemplateJavaExtension.java:281)
        at org.openrewrite.java.internal.template.JavaTemplateJavaExtension$1.visitMethodDeclaration(JavaTemplateJavaExtension.java:56)
        at org.openrewrite.java.tree.J$MethodDeclaration.acceptJava(J.java:3670)
        at org.openrewrite.java.tree.J.accept(J.java:59)
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:278)
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:184)
        at org.openrewrite.java.JavaTemplate.apply(JavaTemplate.java:67)
        at org.openrewrite.java.JavaTemplate.apply(JavaTemplate.java:108)
        at org.openrewrite.staticanalysis.MissingOverrideAnnotation$MissingOverrideAnnotationVisitor.visitMethodDeclaration(MissingOverrideAnnotation.java:86)
        at org.openrewrite.staticanalysis.MissingOverrideAnnotation$MissingOverrideAnnotationVisitor.visitMethodDeclaration(MissingOverrideAnnotation.java:70)
        at org.openrewrite.staticanalysis.MissingOverrideAnnotation_MissingOverrideAnnotationVisitor_KotlinVisitor.visitMethodDeclaration(MissingOverrideAnnotation_MissingOverrideAnnotationVisitor_KotlinVisitor.zig:123)
        at org.openrewrite.java.tree.J$MethodDeclaration.acceptJava(J.java:3670)
        at org.openrewrite.java.tree.J.accept(J.java:59)
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:278)
        at org.openrewrite.TreeVisitor.visitAndCast(TreeVisitor.java:361)
        at org.openrewrite.java.JavaVisitor.visitRightPadded(JavaVisitor.java:1375)
        at org.openrewrite.java.JavaVisitor.lambda$visitBlock$4(JavaVisitor.java:401)
        at org.openrewrite.internal.ListUtils.map(ListUtils.java:176)
        at org.openrewrite.java.JavaVisitor.visitBlock(JavaVisitor.java:400)
        at org.openrewrite.java.tree.J$Block.acceptJava(J.java:838)
        at org.openrewrite.java.tree.J.accept(J.java:59)
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:278)
        at org.openrewrite.TreeVisitor.visitAndCast(TreeVisitor.java:361)
        at org.openrewrite.java.JavaVisitor.visitClassDeclaration(JavaVisitor.java:488)
        at org.openrewrite.java.tree.J$ClassDeclaration.acceptJava(J.java:1290)
        at org.openrewrite.java.tree.J.accept(J.java:59)
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:278)
        at org.openrewrite.TreeVisitor.visitAndCast(TreeVisitor.java:361)
        at org.openrewrite.java.JavaVisitor.visitRightPadded(JavaVisitor.java:1375)
        at org.openrewrite.java.JavaVisitor.lambda$visitBlock$4(JavaVisitor.java:401)
        at org.openrewrite.internal.ListUtils.map(ListUtils.java:176)
        at org.openrewrite.java.JavaVisitor.visitBlock(JavaVisitor.java:400)
        at org.openrewrite.java.tree.J$Block.acceptJava(J.java:838)
        at org.openrewrite.java.tree.J.accept(J.java:59)
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:278)
        at org.openrewrite.TreeVisitor.visitAndCast(TreeVisitor.java:361)
        at org.openrewrite.java.JavaVisitor.visitClassDeclaration(JavaVisitor.java:488)
        at org.openrewrite.java.tree.J$ClassDeclaration.acceptJava(J.java:1290)
        at org.openrewrite.java.tree.J.accept(J.java:59)
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:278)
        at org.openrewrite.TreeVisitor.visitAndCast(TreeVisitor.java:361)
        at org.openrewrite.kotlin.KotlinVisitor.lambda$visitCompilationUnit$2(KotlinVisitor.java:57)
        at org.openrewrite.internal.ListUtils.map(ListUtils.java:176)
        at org.openrewrite.kotlin.KotlinVisitor.visitCompilationUnit(KotlinVisitor.java:56)
        at org.openrewrite.kotlin.tree.K$CompilationUnit.acceptKotlin(K.java:246)
        at org.openrewrite.kotlin.tree.K.accept(K.java:60)
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:278)
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:184)
        at org.openrewrite.scheduling.RecipeRunCycle.lambda$editSources$5(RecipeRunCycle.java:164)
        at io.micrometer.core.instrument.AbstractTimer.recordCallable(AbstractTimer.java:147)
        at org.openrewrite.table.RecipeRunStats.recordEdit(RecipeRunStats.java:68)
        at org.openrewrite.scheduling.RecipeRunCycle.lambda$editSources$6(RecipeRunCycle.java:161)
        at org.openrewrite.scheduling.RecipeStack.reduce(RecipeStack.java:57)
        at org.openrewrite.scheduling.RecipeRunCycle.lambda$editSources$7(RecipeRunCycle.java:134)
        at org.openrewrite.internal.InMemoryLargeSourceSet.lambda$edit$0(InMemoryLargeSourceSet.java:62)
        at org.openrewrite.internal.ListUtils.map(ListUtils.java:176)
        at org.openrewrite.internal.InMemoryLargeSourceSet.edit(InMemoryLargeSourceSet.java:61)
        at org.openrewrite.scheduling.RecipeRunCycle.editSources(RecipeRunCycle.java:133)
        at org.openrewrite.RecipeScheduler.runRecipeCycles(RecipeScheduler.java:86)
        at org.openrewrite.RecipeScheduler.scheduleRun(RecipeScheduler.java:41)
        at org.openrewrite.Recipe.run(Recipe.java:344)
        at org.openrewrite.Recipe.run(Recipe.java:340)
        at org.openrewrite.Recipe.run(Recipe.java:336)
        at org.apache.jmeter.buildtools.openrewrite.OpenRewriteWork.listResults(OpenRewriteWork.kt:291)
        at org.apache.jmeter.buildtools.openrewrite.OpenRewriteWork.execute(OpenRewriteWork.kt:162)
        at app//org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
        at app//org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:54)
        at app//org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:48)
        at app//org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
        at app//org.gradle.workers.internal.AbstractClassLoaderWorker.executeInClassLoader(AbstractClassLoaderWorker.java:48)
        at app//org.gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:49)
        at app//org.gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:30)
        at app//org.gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:96)
        at app//org.gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:65)
        at app//org.gradle.process.internal.worker.request.WorkerAction$1.call(WorkerAction.java:138)
        at app//org.gradle.process.internal.worker.child.WorkerLogEventListener.withWorkerLoggingProtocol(WorkerLogEventListener.java:41)
        at app//org.gradle.process.internal.worker.request.WorkerAction.lambda$run$0(WorkerAction.java:135)
        at app//org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:80)
        at app//org.gradle.process.internal.worker.request.WorkerAction.run(WorkerAction.java:127)
        at java.base@17.0.9/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base@17.0.9/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base@17.0.9/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base@17.0.9/java.lang.reflect.Method.invoke(Method.java:568)
        at app//org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
        at app//org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
        at app//org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
        at app//org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
        at app//org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
        at app//org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at app//org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
        at java.base@17.0.9/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base@17.0.9/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base@17.0.9/java.lang.Thread.run(Thread.java:840)
Caused by: java.lang.NullPointerException: Cannot invoke "org.openrewrite.java.tree.J$Block.getStatements()" because the return value of "org.openrewrite.java.tree.J$ClassDeclaration.getBody()" is null
        at org.openrewrite.kotlin.internal.KotlinPrinter$KotlinJavaPrinter.visitClassDeclaration0(KotlinPrinter.java:675)
        at org.openrewrite.kotlin.internal.KotlinPrinter$KotlinJavaPrinter.visitClassDeclaration(KotlinPrinter.java:646)
        at org.openrewrite.kotlin.internal.KotlinPrinter$KotlinJavaPrinter.visitClassDeclaration(KotlinPrinter.java:482)
        at org.openrewrite.java.tree.J$ClassDeclaration.acceptJava(J.java:1290)
        at org.openrewrite.java.tree.J.accept(J.java:59)
        at org.openrewrite.TreeVisitor.visit(TreeVisitor.java:278)
        ... 108 more

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingkotlin

    Type

    No type

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions