From 8ae3dbdcfc667fb9174259734687d065cc97a19e Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 16 Oct 2017 10:43:10 +0300 Subject: [PATCH] Refine ClassDescriptor::isCommonFinalClass definition Do not treat annotations as final classes as they are not final in Java #KT-20776 Fixed --- .../tests/j+k/annotationsInheritance.kt | 19 +++++++++++++++++++ .../tests/j+k/annotationsInheritance.txt | 19 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 6 ++++++ .../DiagnosticsUsingJavacTestGenerated.java | 6 ++++++ .../types/checker/NewKotlinTypeChecker.kt | 2 +- 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/j+k/annotationsInheritance.kt create mode 100644 compiler/testData/diagnostics/tests/j+k/annotationsInheritance.txt diff --git a/compiler/testData/diagnostics/tests/j+k/annotationsInheritance.kt b/compiler/testData/diagnostics/tests/j+k/annotationsInheritance.kt new file mode 100644 index 00000000000..1764b09b343 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/annotationsInheritance.kt @@ -0,0 +1,19 @@ +// FILE: MyAnnotation.java +public @interface MyAnnotation { +} +// FILE: MyAnnoClass.java +public class MyAnnoClass implements MyAnnotation { +//... +} + +// FILE: main.kt + +val ann: MyAnnotation = MyAnnoClass() + +fun foo(x: MyAnnoClass) { + bar(x) +} + +fun bar(y: MyAnnotation) { + y.hashCode() +} diff --git a/compiler/testData/diagnostics/tests/j+k/annotationsInheritance.txt b/compiler/testData/diagnostics/tests/j+k/annotationsInheritance.txt new file mode 100644 index 00000000000..7ab331de3a1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/annotationsInheritance.txt @@ -0,0 +1,19 @@ +package + +public val ann: MyAnnotation +public fun bar(/*0*/ y: MyAnnotation): kotlin.Unit +public fun foo(/*0*/ x: MyAnnoClass): kotlin.Unit + +public open class MyAnnoClass : MyAnnotation { + public constructor MyAnnoClass() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final annotation class MyAnnotation : kotlin.Annotation { + public constructor MyAnnotation() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 82dc833001f..ace190ab800 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -12256,6 +12256,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("annotationsInheritance.kt") + public void testAnnotationsInheritance() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/j+k/annotationsInheritance.kt"); + doTest(fileName); + } + @TestMetadata("arrayOfStarParametrized.kt") public void testArrayOfStarParametrized() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/j+k/arrayOfStarParametrized.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 29938795d1f..6d23e5b9327 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -12256,6 +12256,12 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing doTest(fileName); } + @TestMetadata("annotationsInheritance.kt") + public void testAnnotationsInheritance() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/j+k/annotationsInheritance.kt"); + doTest(fileName); + } + @TestMetadata("arrayOfStarParametrized.kt") public void testArrayOfStarParametrized() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/j+k/arrayOfStarParametrized.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/NewKotlinTypeChecker.kt b/core/descriptors/src/org/jetbrains/kotlin/types/checker/NewKotlinTypeChecker.kt index 643e44d18a1..6c0053da5cc 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/NewKotlinTypeChecker.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/NewKotlinTypeChecker.kt @@ -320,7 +320,7 @@ object NewKotlinTypeChecker : KotlinTypeChecker { } private val ClassDescriptor.isCommonFinalClass: Boolean - get() = isFinalClass && kind != ClassKind.ENUM_ENTRY + get() = isFinalClass && kind != ClassKind.ENUM_ENTRY && kind != ClassKind.ANNOTATION_CLASS /** * If we have several paths to some interface, we should prefer pure kotlin path.