From 24bad39e76f34f987e4ab0d63117c985adf3a462 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 13 Apr 2015 14:48:54 +0300 Subject: [PATCH] Don't use external annotations in compiler External annotations will be re-enabled in the IDE later. This fixes LazyJavaAnnotations which was breaking the contract of Annotations: findAnnotation(FqName) was looking for external annotations, while iterator() did not. This resulted in some inconsistencies in the compiler and IDE tests. The other way, i.e. making iterator() look up external annotations, would have been too costly for the compiler and with no clear benefit at the moment. --- .../delegation/ExternalAnnotations.java | 6 -- .../delegation/ExternalAnnotations.kt | 3 - .../jdk-annotations/sql/DriverManager.kt | 15 ++-- .../tests/jdk-annotations/sql/Statement.kt | 6 +- .../asJava/KotlinLightClassTestGenerated.java | 6 -- .../kotlin/load/java/lazy/annotationUtils.kt | 29 ++----- .../lazy/descriptors/LazyJavaMemberScope.kt | 76 +++++++++---------- .../java/lazy/types/LazyJavaTypeResolver.kt | 5 +- 8 files changed, 56 insertions(+), 90 deletions(-) delete mode 100644 compiler/testData/asJava/lightClasses/delegation/ExternalAnnotations.java delete mode 100644 compiler/testData/asJava/lightClasses/delegation/ExternalAnnotations.kt diff --git a/compiler/testData/asJava/lightClasses/delegation/ExternalAnnotations.java b/compiler/testData/asJava/lightClasses/delegation/ExternalAnnotations.java deleted file mode 100644 index a196350495a..00000000000 --- a/compiler/testData/asJava/lightClasses/delegation/ExternalAnnotations.java +++ /dev/null @@ -1,6 +0,0 @@ -public final class WithPlatformTypes implements java.lang.Iterable { - public WithPlatformTypes(@org.jetbrains.annotations.NotNull java.lang.Iterable i) { /* compiled code */ } - - @org.jetbrains.annotations.NotNull - public java.util.Iterator iterator() { /* compiled code */ } -} diff --git a/compiler/testData/asJava/lightClasses/delegation/ExternalAnnotations.kt b/compiler/testData/asJava/lightClasses/delegation/ExternalAnnotations.kt deleted file mode 100644 index fab2aa9581b..00000000000 --- a/compiler/testData/asJava/lightClasses/delegation/ExternalAnnotations.kt +++ /dev/null @@ -1,3 +0,0 @@ -// WithPlatformTypes - -class WithPlatformTypes(i: java.lang.Iterable) : java.lang.Iterable by i \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/jdk-annotations/sql/DriverManager.kt b/compiler/testData/diagnostics/tests/jdk-annotations/sql/DriverManager.kt index 616d7f32d44..32b0ae40ca6 100644 --- a/compiler/testData/diagnostics/tests/jdk-annotations/sql/DriverManager.kt +++ b/compiler/testData/diagnostics/tests/jdk-annotations/sql/DriverManager.kt @@ -1,33 +1,32 @@ import java.sql.DriverManager fun getConnection(url: String?) { - DriverManager.getConnection(url) + DriverManager.getConnection(url) DriverManager.getConnection(url!!) : java.sql.Connection } fun getConnection(url: String?, props: java.util.Properties?) { - DriverManager.getConnection(url, props) + DriverManager.getConnection(url, props) DriverManager.getConnection(url!!, props) : java.sql.Connection } fun getConnection(url: String?, user: String?, password: String?) { - DriverManager.getConnection(url, user!!, password!!) + DriverManager.getConnection(url, user!!, password!!) DriverManager.getConnection(url!!, user, password!!) DriverManager.getConnection(url!!, user!!, password) DriverManager.getConnection(url!!, user!!, password!!) : java.sql.Connection } fun getDriver(url: String?) { - DriverManager.getDriver(url) + DriverManager.getDriver(url) DriverManager.getDriver(url!!) : java.sql.Driver } fun registerDriver(driver: java.sql.Driver?) { - DriverManager.registerDriver(driver) + DriverManager.registerDriver(driver) DriverManager.registerDriver(driver!!) } fun getDrivers() { - // todo fix to java.util.Enumeration bug in compiler fixed - DriverManager.getDrivers() : java.util.Enumeration<*> -} \ No newline at end of file + DriverManager.getDrivers() : java.util.Enumeration +} diff --git a/compiler/testData/diagnostics/tests/jdk-annotations/sql/Statement.kt b/compiler/testData/diagnostics/tests/jdk-annotations/sql/Statement.kt index 29796b31720..addd0b73cc6 100644 --- a/compiler/testData/diagnostics/tests/jdk-annotations/sql/Statement.kt +++ b/compiler/testData/diagnostics/tests/jdk-annotations/sql/Statement.kt @@ -1,5 +1,5 @@ fun executeQuery(statement: java.sql.Statement, cmd: String?) { - statement.executeQuery(cmd) + statement.executeQuery(cmd) statement.executeQuery(cmd!!) : java.sql.ResultSet } @@ -8,6 +8,6 @@ fun executeQuery(statement: java.sql.PreparedStatement) { } fun executeUpdate(statement: java.sql.Statement, cmd: String?) { - statement.executeUpdate(cmd) + statement.executeUpdate(cmd) statement.executeUpdate(cmd!!) -} \ No newline at end of file +} diff --git a/compiler/tests/org/jetbrains/kotlin/asJava/KotlinLightClassTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/asJava/KotlinLightClassTestGenerated.java index ea7210c8ddd..15bd3924d0a 100644 --- a/compiler/tests/org/jetbrains/kotlin/asJava/KotlinLightClassTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/asJava/KotlinLightClassTestGenerated.java @@ -43,12 +43,6 @@ public class KotlinLightClassTestGenerated extends AbstractKotlinLightClassTest JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses/delegation"), Pattern.compile("^(.+)\\.kt$"), true); } - @TestMetadata("ExternalAnnotations.kt") - public void testExternalAnnotations() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/delegation/ExternalAnnotations.kt"); - doTest(fileName); - } - @TestMetadata("Function.kt") public void testFunction() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/delegation/Function.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/annotationUtils.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/annotationUtils.kt index 130105d10f0..65952cc154c 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/annotationUtils.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/annotationUtils.kt @@ -16,42 +16,27 @@ package org.jetbrains.kotlin.load.java.lazy +import org.jetbrains.kotlin.descriptors.annotations.Annotations +import org.jetbrains.kotlin.load.java.lazy.descriptors.resolveAnnotation import org.jetbrains.kotlin.load.java.structure.JavaAnnotation import org.jetbrains.kotlin.load.java.structure.JavaAnnotationOwner import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor -import org.jetbrains.kotlin.load.java.JvmAnnotationNames -import org.jetbrains.kotlin.load.java.lazy.descriptors.resolveAnnotation class LazyJavaAnnotations( - c: LazyJavaResolverContext, - val annotationOwner: JavaAnnotationOwner, - private val extraLookup: (FqName) -> JavaAnnotation? = { null } + private val c: LazyJavaResolverContext, + val annotationOwner: JavaAnnotationOwner ) : Annotations { private val annotationDescriptors = c.storageManager.createMemoizedFunctionWithNullableValues { annotation: JavaAnnotation -> c.resolveAnnotation(annotation) } - override fun findAnnotation(fqName: FqName): AnnotationDescriptor? { - val jAnnotation = annotationOwner.findAnnotation(fqName) ?: extraLookup(fqName) - if (jAnnotation == null) return null + override fun findAnnotation(fqName: FqName) = annotationOwner.findAnnotation(fqName)?.let(annotationDescriptors) - return annotationDescriptors(jAnnotation) - } - - override fun iterator() = annotationOwner.getAnnotations().stream().map { annotationDescriptors(it) }.filterNotNull().iterator() + override fun iterator() = annotationOwner.getAnnotations().sequence().map(annotationDescriptors).filterNotNull().iterator() override fun isEmpty() = !iterator().hasNext() } fun LazyJavaResolverContext.resolveAnnotations(annotationsOwner: JavaAnnotationOwner): Annotations - = LazyJavaAnnotations(this, annotationsOwner) { fqName -> externalAnnotationResolver.findExternalAnnotation(annotationsOwner, fqName) } - -private fun GlobalJavaResolverContext.hasAnnotation(owner: JavaAnnotationOwner, annotationFqName: FqName): Boolean - = owner.findAnnotation(annotationFqName) != null || externalAnnotationResolver.findExternalAnnotation(owner, annotationFqName) != null - -fun GlobalJavaResolverContext.hasMutableAnnotation(owner: JavaAnnotationOwner): Boolean = hasAnnotation(owner, JvmAnnotationNames.JETBRAINS_MUTABLE_ANNOTATION) -fun GlobalJavaResolverContext.hasReadOnlyAnnotation(owner: JavaAnnotationOwner): Boolean = hasAnnotation(owner, JvmAnnotationNames.JETBRAINS_READONLY_ANNOTATION) -fun GlobalJavaResolverContext.hasNotNullAnnotation(owner: JavaAnnotationOwner): Boolean = hasAnnotation(owner, JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION) + = LazyJavaAnnotations(this, annotationsOwner) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaMemberScope.kt index 30e9575d4fa..01271ae8705 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaMemberScope.kt @@ -16,36 +16,37 @@ package org.jetbrains.kotlin.load.java.lazy.descriptors -import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.storage.NotNullLazyValue -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.scopes.JetScope -import org.jetbrains.kotlin.load.java.structure.JavaMethod -import org.jetbrains.kotlin.load.java.structure.JavaField -import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext -import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor -import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.load.java.lazy.child -import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl -import org.jetbrains.kotlin.load.java.lazy.resolveAnnotations -import org.jetbrains.kotlin.load.java.structure.JavaArrayType -import org.jetbrains.kotlin.load.java.components.TypeUsage -import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.load.java.lazy.hasNotNullAnnotation +import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.annotations.Annotations +import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl +import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl +import org.jetbrains.kotlin.load.java.components.ExternalSignatureResolver +import org.jetbrains.kotlin.load.java.components.TypeUsage +import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor +import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor +import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext +import org.jetbrains.kotlin.load.java.lazy.child +import org.jetbrains.kotlin.load.java.lazy.resolveAnnotations import org.jetbrains.kotlin.load.java.lazy.types.LazyJavaTypeAttributes +import org.jetbrains.kotlin.load.java.structure.JavaArrayType +import org.jetbrains.kotlin.load.java.structure.JavaField +import org.jetbrains.kotlin.load.java.structure.JavaMethod import org.jetbrains.kotlin.load.java.structure.JavaValueParameter +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.jvm.PLATFORM_TYPES +import org.jetbrains.kotlin.resolve.scopes.DescriptorKindExclude.NonExtensions +import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter +import org.jetbrains.kotlin.resolve.scopes.JetScope +import org.jetbrains.kotlin.storage.NotNullLazyValue +import org.jetbrains.kotlin.types.JetType +import org.jetbrains.kotlin.types.TypeUtils +import org.jetbrains.kotlin.utils.Printer +import org.jetbrains.kotlin.utils.addIfNotNull +import org.jetbrains.kotlin.utils.toReadOnlyList import java.util.ArrayList import java.util.LinkedHashSet -import org.jetbrains.kotlin.types.JetType -import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor -import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl -import org.jetbrains.kotlin.load.java.components.ExternalSignatureResolver -import org.jetbrains.kotlin.utils.* -import org.jetbrains.kotlin.resolve.jvm.PLATFORM_TYPES -import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.resolve.scopes.DescriptorKindExclude.NonExtensions public abstract class LazyJavaMemberScope( protected val c: LazyJavaResolverContext, @@ -167,26 +168,21 @@ public abstract class LazyJavaMemberScope( jValueParameters: List ): ResolvedValueParameters { var synthesizedNames = false - val descriptors = jValueParameters.withIndices().map { pair -> + val descriptors = jValueParameters.withIndex().map { pair -> val (index, javaParameter) = pair val annotations = c.resolveAnnotations(javaParameter) val typeUsage = LazyJavaTypeAttributes(c, javaParameter, TypeUsage.MEMBER_SIGNATURE_CONTRAVARIANT, annotations) val (outType, varargElementType) = - if (javaParameter.isVararg()) { - val paramType = javaParameter.getType() - assert (paramType is JavaArrayType) { "Vararg parameter should be an array: $paramType" } - val arrayType = c.typeResolver.transformArrayType(paramType as JavaArrayType, typeUsage, true) - val outType = if (PLATFORM_TYPES) arrayType else TypeUtils.makeNotNullable(arrayType) - outType to KotlinBuiltIns.getInstance().getArrayElementType(outType) - } - else { - val jetType = c.typeResolver.transformJavaType(javaParameter.getType(), typeUsage) - if (!PLATFORM_TYPES && jetType.isMarkedNullable() && c.hasNotNullAnnotation(javaParameter)) - TypeUtils.makeNotNullable(jetType) to null - else - jetType to null - } + if (javaParameter.isVararg()) { + val paramType = javaParameter.getType() as? JavaArrayType + ?: throw AssertionError("Vararg parameter should be an array: $javaParameter") + val outType = c.typeResolver.transformArrayType(paramType, typeUsage, true) + outType to KotlinBuiltIns.getInstance().getArrayElementType(outType) + } + else { + c.typeResolver.transformJavaType(javaParameter.getType(), typeUsage) to null + } val name = if (function.getName().asString() == "equals" && jValueParameters.size() == 1 && diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt index 0c060907872..7e4973dd794 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt @@ -25,7 +25,6 @@ import org.jetbrains.kotlin.load.java.components.TypeUsage import org.jetbrains.kotlin.load.java.components.TypeUsage.* import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext import org.jetbrains.kotlin.load.java.lazy.TypeParameterResolver -import org.jetbrains.kotlin.load.java.lazy.hasNotNullAnnotation import org.jetbrains.kotlin.load.java.lazy.types.JavaTypeFlexibility.FLEXIBLE_LOWER_BOUND import org.jetbrains.kotlin.load.java.lazy.types.JavaTypeFlexibility.FLEXIBLE_UPPER_BOUND import org.jetbrains.kotlin.load.java.lazy.types.JavaTypeFlexibility.INFLEXIBLE @@ -379,7 +378,9 @@ class LazyJavaTypeAttributes( TypeUsage.MEMBER_SIGNATURE_COVARIANT } - override val isMarkedNotNull: Boolean by c.storageManager.createLazyValue { c.hasNotNullAnnotation(annotationOwner) } + override val isMarkedNotNull: Boolean by c.storageManager.createLazyValue { + annotationOwner.findAnnotation(JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION) != null + } } private fun Annotations.isMarkedReadOnly() = findAnnotation(JvmAnnotationNames.JETBRAINS_READONLY_ANNOTATION) != null