From 7e43000d9b5b70d39f401c9f20688a72a424a2fb Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 6 Sep 2021 22:59:35 +0200 Subject: [PATCH] JVM: do not lose default parameter values during enhancement The change in signatureEnhancement.kt in 432f581cb2 was incorrect. Contrary to its name, the removed method `hasDefaultValueInAnnotation` checked not only if the enhancement annotation has default value (which is what the removed feature was about), but also if the parameter itself declares default value. This was mistakenly substituted by just `false` on line 234. The correct change is to use the `declaresDefaultValue` flag of the original parameter. It's kind of weird though that in case there's a nullability annotation on the whole package (like in KT-48316) type enhancement is being done on everything, including annotation constructors, whose parameter types can't have any enhancement information. Maybe this should be improved independently. #KT-48316 Fixed --- ...nAnnotationsCompiledJavaTestGenerated.java | 6 ++++ ...dJavaWithPsiClassReadingTestGenerated.java | 6 ++++ ...ignAnnotationsSourceJavaTestGenerated.java | 6 ++++ .../kt48316_multiModuleAnnotationDefault.kt | 34 +++++++++++++++++++ .../kt48316_multiModuleAnnotationDefault.txt | 21 ++++++++++++ ...nAnnotationsCompiledJavaTestGenerated.java | 6 ++++ ...dJavaWithPsiClassReadingTestGenerated.java | 6 ++++ ...ignAnnotationsSourceJavaTestGenerated.java | 6 ++++ .../typeEnhancement/signatureEnhancement.kt | 15 ++++++-- 9 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.kt create mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.txt diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java index 66c7ec44925..dc67c95aa68 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java @@ -92,6 +92,12 @@ public class FirOldFrontendForeignAnnotationsCompiledJavaTestGenerated extends A runTest("compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt47920.kt"); } + @Test + @TestMetadata("kt48316_multiModuleAnnotationDefault.kt") + public void testKt48316_multiModuleAnnotationDefault() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.kt"); + } + @Test @TestMetadata("lombokSimple.kt") public void testLombokSimple() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java index f6ed482471a..b1fa7d7362e 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java @@ -92,6 +92,12 @@ public class FirOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTest runTest("compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt47920.kt"); } + @Test + @TestMetadata("kt48316_multiModuleAnnotationDefault.kt") + public void testKt48316_multiModuleAnnotationDefault() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.kt"); + } + @Test @TestMetadata("lombokSimple.kt") public void testLombokSimple() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsSourceJavaTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsSourceJavaTestGenerated.java index 6ffe1d6f903..23e48f31063 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsSourceJavaTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsSourceJavaTestGenerated.java @@ -92,6 +92,12 @@ public class FirOldFrontendForeignAnnotationsSourceJavaTestGenerated extends Abs runTest("compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt47920.kt"); } + @Test + @TestMetadata("kt48316_multiModuleAnnotationDefault.kt") + public void testKt48316_multiModuleAnnotationDefault() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.kt"); + } + @Test @TestMetadata("lombokSimple.kt") public void testLombokSimple() throws Exception { diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.kt new file mode 100644 index 00000000000..163843e82a5 --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.kt @@ -0,0 +1,34 @@ +// FIR_IDENTICAL +// FILE: lib/NonNullApi.java + +package lib; + +import java.lang.annotation.*; +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; + +@Target(ElementType.PACKAGE) +@Retention(RetentionPolicy.RUNTIME) +@Nonnull +@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER}) +public @interface NonNullApi {} + +// FILE: lib/package-info.java + +@NonNullApi +package lib; + +// FILE: lib/A.java + +package lib; + +public @interface A { + Class value() default String.class; +} + +// FILE: test.kt + +import lib.A + +@A +fun test() {} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.txt b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.txt new file mode 100644 index 00000000000..f502a1e1ac1 --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.txt @@ -0,0 +1,21 @@ +package + +@lib.A public fun test(): kotlin.Unit + +package lib { + + public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ value: kotlin.reflect.KClass<(raw) kotlin.Any> = ...) + public final val value: kotlin.reflect.KClass<(raw) kotlin.Any> + 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 + } + + @kotlin.annotation.Target(allowedTargets = {}) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) @javax.annotation.Nonnull @javax.annotation.meta.TypeQualifierDefault(value = {ElementType.METHOD, ElementType.PARAMETER}) public final annotation class NonNullApi : kotlin.Annotation { + public constructor NonNullApi() + 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-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java index 22ac5e8d5ab..180c59643e5 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java @@ -92,6 +92,12 @@ public class ForeignAnnotationsCompiledJavaTestGenerated extends AbstractForeign runTest("compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt47920.kt"); } + @Test + @TestMetadata("kt48316_multiModuleAnnotationDefault.kt") + public void testKt48316_multiModuleAnnotationDefault() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.kt"); + } + @Test @TestMetadata("lombokSimple.kt") public void testLombokSimple() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java index 4421a892e14..a38af1a3c0c 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java @@ -92,6 +92,12 @@ public class ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated exte runTest("compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt47920.kt"); } + @Test + @TestMetadata("kt48316_multiModuleAnnotationDefault.kt") + public void testKt48316_multiModuleAnnotationDefault() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.kt"); + } + @Test @TestMetadata("lombokSimple.kt") public void testLombokSimple() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java index f2e81315d5a..1d54a1859d0 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java @@ -92,6 +92,12 @@ public class ForeignAnnotationsSourceJavaTestGenerated extends AbstractForeignAn runTest("compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt47920.kt"); } + @Test + @TestMetadata("kt48316_multiModuleAnnotationDefault.kt") + public void testKt48316_multiModuleAnnotationDefault() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/tests/kt48316_multiModuleAnnotationDefault.kt"); + } + @Test @TestMetadata("lombokSimple.kt") public void testLombokSimple() throws Exception { diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt index ef63d586e17..ee58212fc2c 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt @@ -21,7 +21,10 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotated import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.load.java.* +import org.jetbrains.kotlin.load.java.AnnotationQualifierApplicabilityType +import org.jetbrains.kotlin.load.java.AnnotationTypeQualifierResolver +import org.jetbrains.kotlin.load.java.DeprecationCausedByFunctionNInfo +import org.jetbrains.kotlin.load.java.JavaTypeQualifiersByElementType import org.jetbrains.kotlin.load.java.descriptors.* import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext import org.jetbrains.kotlin.load.java.lazy.copyWithNewDefaultTypeQualifiers @@ -36,8 +39,11 @@ import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.deprecation.DEPRECATED_FUNCTION_KEY import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull -import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.RawType +import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext +import org.jetbrains.kotlin.types.getEnhancement import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.TypeParameterMarker import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContext @@ -135,7 +141,10 @@ class SignatureEnhancement(private val typeEnhancement: JavaTypeEnhancement) { return this.enhance( receiverTypeEnhancement ?: extensionReceiverParameter?.type, valueParameterEnhancements.mapIndexed { index, enhanced -> - ValueParameterData(enhanced ?: valueParameters[index].type, false) + ValueParameterData( + enhanced ?: valueParameters[index].type, + annotationOwnerForMember.valueParameters[index].declaresDefaultValue() + ) }, returnTypeEnhancement ?: returnType!!, additionalUserData