diff --git a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt index 53f13f0eb6d..903343ae2b0 100644 --- a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt +++ b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.kt @@ -89,8 +89,7 @@ fun main(a: A, b: B) { b.foobar(null) a.foo(null) - // TODO: defaults on parameters do not work properly - a.bar(null) + a.bar(null) a.baz(null) a.foobar(null) } diff --git a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.txt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.txt index 5cc22b1c072..063ab835574 100644 --- a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.txt +++ b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/forceFlexibleOverOverrides.txt @@ -4,7 +4,7 @@ public fun main(/*0*/ a: A, /*1*/ b: B): kotlin.Unit @spr.NonNullApi public open class A : B { public constructor A() - public open override /*1*/ fun bar(/*0*/ @spr.ForceFlexibility x: kotlin.String): kotlin.Unit + public open override /*1*/ fun bar(/*0*/ @spr.ForceFlexibility x: kotlin.String!): kotlin.Unit public open override /*1*/ fun baz(/*0*/ @spr.UnknownNullability x: kotlin.String!): kotlin.Unit public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean @spr.ForceFlexibility public open override /*1*/ fun foo(/*0*/ x: kotlin.String!): kotlin.Unit diff --git a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt index bc428b45795..b5d805b0721 100644 --- a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt +++ b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.kt @@ -66,7 +66,7 @@ public class A { } @NullableApi - public String foobar(String x, @Nonnull CharSequence y) { + public String foobar(String x, @NonNullApi CharSequence y) { return ""; } @@ -88,7 +88,7 @@ public class A { } @NonNullApi - public String foobar(String x, @Nullable CharSequence y) { + public String foobar(String x, @NullableApi CharSequence y) { return ""; } diff --git a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.txt b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.txt index e6626057009..ec030f0c25f 100644 --- a/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.txt +++ b/compiler/testData/foreignAnnotations/tests/jsr305/typeQualifierDefault/overridingDefaultQualifier.txt @@ -9,7 +9,7 @@ public fun main(/*0*/ a: A, /*1*/ b: A.B, /*2*/ c: A.C): kotlin.Unit @javax.annotation.Nullable public open fun baz(): kotlin.collections.(Mutable)List? public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open fun foo(/*0*/ x: kotlin.String, /*1*/ @javax.annotation.CheckForNull y: kotlin.CharSequence?): kotlin.String - @NullableApi public open fun foobar(/*0*/ x: kotlin.String?, /*1*/ @javax.annotation.Nonnull y: kotlin.CharSequence): kotlin.String? + @NullableApi public open fun foobar(/*0*/ x: kotlin.String?, /*1*/ @NonNullApi y: kotlin.CharSequence): kotlin.String? public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String @@ -20,7 +20,7 @@ public fun main(/*0*/ a: A, /*1*/ b: A.B, /*2*/ c: A.C): kotlin.Unit @javax.annotation.Nullable public open fun baz(): kotlin.collections.(Mutable)List? public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open fun foo(/*0*/ x: kotlin.String?, /*1*/ @javax.annotation.Nonnull y: kotlin.CharSequence): kotlin.String? - @NonNullApi public open fun foobar(/*0*/ x: kotlin.String, /*1*/ @javax.annotation.Nullable y: kotlin.CharSequence?): kotlin.String + @NonNullApi public open fun foobar(/*0*/ x: kotlin.String, /*1*/ @NullableApi y: kotlin.CharSequence?): kotlin.String public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt index d7a99849b56..84c15b7b4fd 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt @@ -16,10 +16,7 @@ package org.jetbrains.kotlin.load.java.typeEnhancement -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.PropertyDescriptor +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 @@ -120,13 +117,11 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati val receiverTypeEnhancement = if (extensionReceiverParameter != null) - parts( - typeContainer = + partsForValueParameter( + parameterDescriptor = annotationOwnerForMember.safeAs() ?.getUserData(JavaMethodDescriptor.ORIGINAL_VALUE_PARAMETER_FOR_EXTENSION_RECEIVER), - isCovariant = false, - containerContext = memberContext, - containerApplicabilityType = AnnotationTypeQualifierResolver.QualifierApplicabilityType.VALUE_PARAMETER + methodContext = memberContext ) { it.extensionReceiverParameter!!.type }.enhance() else null @@ -145,12 +140,8 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati val valueParameterEnhancements = annotationOwnerForMember.valueParameters.map { p -> - parts( - typeContainer = p, isCovariant = false, - containerContext = memberContext, - containerApplicabilityType = AnnotationTypeQualifierResolver.QualifierApplicabilityType.VALUE_PARAMETER - ) { it.valueParameters[p.index].type } - .enhance(predefinedEnhancementInfo?.parametersInfo?.getOrNull(p.index)) + partsForValueParameter(p, memberContext) { it.valueParameters[p.index].type } + .enhance(predefinedEnhancementInfo?.parametersInfo?.getOrNull(p.index)) } val returnTypeEnhancement = @@ -369,7 +360,19 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati private data class PartEnhancementResult(val type: KotlinType, val wereChanges: Boolean) - private fun D.parts( + private fun CallableMemberDescriptor.partsForValueParameter( + // TODO: investigate if it's really can be a null (check properties' with extension overrides in Java) + parameterDescriptor: ValueParameterDescriptor?, + methodContext: LazyJavaResolverContext, + collector: (CallableMemberDescriptor) -> KotlinType + ) = parts( + parameterDescriptor, false, + parameterDescriptor?.let { methodContext.copyWithNewDefaultTypeQualifiers(it.annotations) } ?: methodContext, + AnnotationTypeQualifierResolver.QualifierApplicabilityType.VALUE_PARAMETER, + collector + ) + + private fun CallableMemberDescriptor.parts( typeContainer: Annotated?, isCovariant: Boolean, containerContext: LazyJavaResolverContext,