From 1dee922861b127abc34303e12176957837ae4681 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 8 Sep 2015 13:51:02 +0300 Subject: [PATCH] kotlin.annotation.Target / Retention have now more priority than same java classes if import java.lang.annotation.* is available --- .../resolve/jvm/TopDownAnalyzerFacadeForJVM.java | 12 ++++++++---- .../annotations/JavaAnnotationConstructors.kt | 2 ++ .../options/javaKotlinTargetRetention.kt | 9 +++++++++ .../options/javaKotlinTargetRetention.txt | 15 +++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ .../kotlin/codegen/AnnotationGenTest.java | 15 ++++++++------- .../jetbrains/kotlin/builtins/KotlinBuiltIns.java | 5 +++++ 7 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.txt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java index ac829c2b713..751a57602ad 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java @@ -57,6 +57,12 @@ public enum TopDownAnalyzerFacadeForJVM { public static final List DEFAULT_IMPORTS = buildDefaultImports(); + private static void addAllClassifiersToImportPathList(List list, JetScope scope) { + for (DeclarationDescriptor descriptor : scope.getDescriptors(DescriptorKindFilter.CLASSIFIERS, JetScope.ALL_NAME_FILTER)) { + list.add(new ImportPath(DescriptorUtils.getFqNameSafe(descriptor), false)); + } + } + private static List buildDefaultImports() { List list = new ArrayList(); list.add(new ImportPath("java.lang.*")); @@ -65,10 +71,8 @@ public enum TopDownAnalyzerFacadeForJVM { list.add(new ImportPath("kotlin.jvm.*")); list.add(new ImportPath("kotlin.io.*")); - JetScope builtInsScope = KotlinBuiltIns.getInstance().getBuiltInsPackageScope(); - for (DeclarationDescriptor descriptor : builtInsScope.getDescriptors(DescriptorKindFilter.CLASSIFIERS, JetScope.ALL_NAME_FILTER)) { - list.add(new ImportPath(DescriptorUtils.getFqNameSafe(descriptor), false)); - } + addAllClassifiersToImportPathList(list, KotlinBuiltIns.getInstance().getBuiltInsPackageScope()); + addAllClassifiersToImportPathList(list, KotlinBuiltIns.getInstance().getAnnotationPackageScope()); return list; } diff --git a/compiler/testData/diagnostics/tests/annotations/JavaAnnotationConstructors.kt b/compiler/testData/diagnostics/tests/annotations/JavaAnnotationConstructors.kt index 78cee80327c..fa515cb895b 100644 --- a/compiler/testData/diagnostics/tests/annotations/JavaAnnotationConstructors.kt +++ b/compiler/testData/diagnostics/tests/annotations/JavaAnnotationConstructors.kt @@ -1,3 +1,5 @@ +import java.lang.annotation.Retention +import java.lang.annotation.Target import java.lang.annotation.* @java.lang.annotation.Retention(RetentionPolicy.CLASS) diff --git a/compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.kt b/compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.kt new file mode 100644 index 00000000000..eb25fb89bee --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.kt @@ -0,0 +1,9 @@ +import java.lang.annotation.* + +@java.lang.annotation.Target(ElementType.PACKAGE) +@Target(AnnotationTarget.CLASSIFIER) +annotation class my + +@java.lang.annotation.Retention(RetentionPolicy.SOURCE) +@Retention(AnnotationRetention.BINARY) +annotation class your diff --git a/compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.txt b/compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.txt new file mode 100644 index 00000000000..e2922a60111 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.txt @@ -0,0 +1,15 @@ +package + +java.lang.annotation.Target(value = {ElementType.PACKAGE}) kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASSIFIER}) kotlin.annotation.annotation() public final class my : kotlin.Annotation { + public constructor my() + 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 +} + +java.lang.annotation.Retention(value = RetentionPolicy.SOURCE) kotlin.annotation.Retention(value = AnnotationRetention.BINARY) kotlin.annotation.annotation() public final class your : kotlin.Annotation { + public constructor your() + 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/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index b551d5948f7..78e33187ce3 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -1049,6 +1049,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("javaKotlinTargetRetention.kt") + public void testJavaKotlinTargetRetention() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/options/javaKotlinTargetRetention.kt"); + doTest(fileName); + } + @TestMetadata("javaretention.kt") public void testJavaretention() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/options/javaretention.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/AnnotationGenTest.java b/compiler/tests/org/jetbrains/kotlin/codegen/AnnotationGenTest.java index 8d601c2275d..61a649edd9a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/AnnotationGenTest.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/AnnotationGenTest.java @@ -166,7 +166,7 @@ public class AnnotationGenTest extends CodegenTestCase { public void testAnnotationWithParamForParamInFunction() throws Exception { ClassLoader loader = loadFileGetClassLoader("import java.lang.annotation.*\n" + - "Retention(RetentionPolicy.RUNTIME) annotation class A(val a: String)\n" + + "@java.lang.annotation.Retention(RetentionPolicy.RUNTIME) annotation class A(val a: String)\n" + "fun x(A(\"239\") i: Int) {}"); Class packageClass = getPackageSrcClass(loader); Method packageClassMethod = packageClass.getMethod("x", int.class); @@ -246,7 +246,7 @@ public class AnnotationGenTest extends CodegenTestCase { InvocationTargetException { loadText("import java.lang.annotation.*\n" + "" + - "Retention(RetentionPolicy.RUNTIME) annotation class A(val a: String)\n" + + "@java.lang.annotation.Retention(RetentionPolicy.RUNTIME) annotation class A(val a: String)\n" + "" + "A(\"239\") class B()"); Class aClass = generateClass("A"); @@ -280,7 +280,7 @@ public class AnnotationGenTest extends CodegenTestCase { loadText("import java.lang.annotation.*\n" + "" + "annotation class C(val c: String)\n" + - "Retention(RetentionPolicy.RUNTIME) annotation class A(val a: C)\n" + + "@java.lang.annotation.Retention(RetentionPolicy.RUNTIME) annotation class A(val a: C)\n" + "" + "A(C(\"239\")) class B()"); Class aClass = generateClass("A"); @@ -317,7 +317,7 @@ public class AnnotationGenTest extends CodegenTestCase { InvocationTargetException { loadText("import java.lang.annotation.*\n" + "" + - "Retention(RetentionPolicy.RUNTIME) annotation class A(val a: Array)\n" + + "@java.lang.annotation.Retention(RetentionPolicy.RUNTIME) annotation class A(val a: Array)\n" + "" + "A(array(\"239\",\"932\")) class B()"); Class aClass = generateClass("A"); @@ -352,7 +352,7 @@ public class AnnotationGenTest extends CodegenTestCase { InvocationTargetException { loadText("import java.lang.annotation.*\n" + "" + - "Retention(RetentionPolicy.RUNTIME) annotation class A(val a: IntArray)\n" + + "@java.lang.annotation.Retention(RetentionPolicy.RUNTIME) annotation class A(val a: IntArray)\n" + "" + "A(intArray(239,932)) class B()"); Class aClass = generateClass("A"); @@ -387,7 +387,7 @@ public class AnnotationGenTest extends CodegenTestCase { InvocationTargetException { loadText("import java.lang.annotation.*\n" + "" + - "Target(ElementType.TYPE, ElementType.METHOD) annotation class A"); + "@java.lang.annotation.Target(ElementType.TYPE, ElementType.METHOD) annotation class A"); Class aClass = generateClass("A"); Target annotation = (Target)aClass.getAnnotation(Target.class); @@ -407,8 +407,9 @@ public class AnnotationGenTest extends CodegenTestCase { InstantiationException, InvocationTargetException { loadText("import java.lang.annotation.*\n" + + "import java.lang.annotation.Retention\n" + "" + - "Retention(RetentionPolicy.RUNTIME) annotation class A(val a: Array)\n" + + "@Retention(RetentionPolicy.RUNTIME) annotation class A(val a: Array)\n" + "" + "A(array(Retention(RetentionPolicy.RUNTIME),Retention(RetentionPolicy.SOURCE))) class B()"); Class aClass = generateClass("A"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index a9a1f3f43c5..b588a751f56 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -240,6 +240,11 @@ public class KotlinBuiltIns { return builtinsPackageFragment.getMemberScope(); } + @NotNull + public JetScope getAnnotationPackageScope() { + return annotationPackageFragment.getMemberScope(); + } + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // GET CLASS