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