From ec4da854b837083a99427d52ef707815384a2102 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 14 Apr 2017 21:52:59 +0300 Subject: [PATCH] Codegen: fix NPE in NO_ANNOTATION_VISITOR EA-100245 fixed --- .../kotlin/codegen/AnnotationCodegen.java | 12 +++++++- .../InheritingInterfaceDefaultImpls.java | 7 +++++ .../InheritingInterfaceDefaultImpls.kt | 30 +++++++++++++++++++ .../resolve/IdeLightClassTestGenerated.java | 6 ++++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/asJava/lightClasses/ideRegression/InheritingInterfaceDefaultImpls.java create mode 100644 compiler/testData/asJava/lightClasses/ideRegression/InheritingInterfaceDefaultImpls.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java index 9c04353521d..573316bb174 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AnnotationCodegen.java @@ -67,7 +67,17 @@ public abstract class AnnotationCodegen { new JvmFlagAnnotation("kotlin.jvm.Synchronized", Opcodes.ACC_SYNCHRONIZED) ); - private static final AnnotationVisitor NO_ANNOTATION_VISITOR = new AnnotationVisitor(Opcodes.ASM5) {}; + private static final AnnotationVisitor NO_ANNOTATION_VISITOR = new AnnotationVisitor(Opcodes.ASM5) { + @Override + public AnnotationVisitor visitAnnotation(String name, @NotNull String desc) { + return safe(super.visitAnnotation(name, desc)); + } + + @Override + public AnnotationVisitor visitArray(String name) { + return safe(super.visitArray(name)); + } + }; private final InnerClassConsumer innerClassConsumer; private final KotlinTypeMapper typeMapper; diff --git a/compiler/testData/asJava/lightClasses/ideRegression/InheritingInterfaceDefaultImpls.java b/compiler/testData/asJava/lightClasses/ideRegression/InheritingInterfaceDefaultImpls.java new file mode 100644 index 00000000000..4e30aafdcd9 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/ideRegression/InheritingInterfaceDefaultImpls.java @@ -0,0 +1,7 @@ +public final class Inheritor implements p.I, p.I2 { + public final void f() { /* compiled code */ } + + public void g() { /* compiled code */ } + + public Inheritor() { /* compiled code */ } +} \ No newline at end of file diff --git a/compiler/testData/asJava/lightClasses/ideRegression/InheritingInterfaceDefaultImpls.kt b/compiler/testData/asJava/lightClasses/ideRegression/InheritingInterfaceDefaultImpls.kt new file mode 100644 index 00000000000..84502416452 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/ideRegression/InheritingInterfaceDefaultImpls.kt @@ -0,0 +1,30 @@ +// p.Inheritor +package p + +annotation class Anno(vararg val s: String) + +annotation class Bueno(val anno: Anno) + +class Inheritor: I, I2 { + + fun f() { + + } + + override fun g() { + } +} + +interface I : I1 { + fun g() +} + +interface I1 { + @Bueno(Anno("G")) + fun foo() = "foo" +} + +interface I2 { + @Anno("S") + fun bar() = "bar" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java index f91e6fe38c2..3fa499c1f38 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java @@ -212,6 +212,12 @@ public class IdeLightClassTestGenerated extends AbstractIdeLightClassTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses/ideRegression"), Pattern.compile("^([^.]+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("InheritingInterfaceDefaultImpls.kt") + public void testInheritingInterfaceDefaultImpls() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/ideRegression/InheritingInterfaceDefaultImpls.kt"); + doTest(fileName); + } + @TestMetadata("OverridingFinalInternal.kt") public void testOverridingFinalInternal() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/ideRegression/OverridingFinalInternal.kt");