Fix types enhancement for properties' getters overrides in Java
Prior to the 1.1.4, nullability related annotations were stored
in types that became hard to maintain at some moment and
we got rid of it (see 57b7b91444)
But enhancement for properties overrides stopped working
because there were effectively no annotations in the
resulting descriptor
#KT-19409 Fixed
#KT-19409 Fixed
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
// FILE: VcsException.java
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class VcsException extends Exception {
|
||||
@Override
|
||||
@NotNull
|
||||
public String getMessage() {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun foo(e: VcsException) {
|
||||
e.message.contains("")
|
||||
"" in e.message
|
||||
}
|
||||
|
||||
public operator fun CharSequence.contains(other: CharSequence): Boolean = true
|
||||
@@ -0,0 +1,26 @@
|
||||
package
|
||||
|
||||
public fun foo(/*0*/ e: VcsException): kotlin.Unit
|
||||
public operator fun kotlin.CharSequence.contains(/*0*/ other: kotlin.CharSequence): kotlin.Boolean
|
||||
|
||||
public open class VcsException : java.lang.Exception {
|
||||
public constructor VcsException()
|
||||
public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable?
|
||||
public open override /*1*/ val message: kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ fun addSuppressed(/*0*/ exception: kotlin.Throwable!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun fillInStackTrace(): kotlin.Throwable!
|
||||
public open override /*1*/ /*fake_override*/ fun getLocalizedMessage(): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun getStackTrace(): kotlin.Array<(out) java.lang.StackTraceElement!>!
|
||||
public final override /*1*/ /*fake_override*/ fun getSuppressed(): kotlin.Array<(out) kotlin.Throwable!>!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun initCause(/*0*/ cause: kotlin.Throwable!): kotlin.Throwable!
|
||||
public open override /*1*/ /*fake_override*/ fun printStackTrace(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintStream!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintWriter!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun setStackTrace(/*0*/ stackTrace: kotlin.Array<(out) java.lang.StackTraceElement!>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
invisible_fake const final override /*1*/ /*fake_override*/ val serialVersionUID: kotlin.Long = -3387516993124229948.toLong()
|
||||
}
|
||||
@@ -12040,6 +12040,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("exceptionMessage.kt")
|
||||
public void testExceptionMessage() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/j+k/exceptionMessage.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("fieldOverridesField.kt")
|
||||
public void testFieldOverridesField() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/j+k/fieldOverridesField.kt");
|
||||
|
||||
+12
-3
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.descriptors.annotations.composeAnnotations
|
||||
import org.jetbrains.kotlin.load.java.*
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
|
||||
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.computeNewDefaultTypeQualifiers
|
||||
import org.jetbrains.kotlin.load.java.lazy.descriptors.isJavaField
|
||||
@@ -91,11 +92,19 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati
|
||||
if (kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE && original.overriddenDescriptors.size == 1) return this
|
||||
|
||||
val outerScopeQualifiers = c.computeNewDefaultTypeQualifiers(annotations)
|
||||
|
||||
// When loading method as an override for a property, all annotations are stick to its getter
|
||||
val annotationOwnerForMember =
|
||||
if (this is JavaPropertyDescriptor && getter?.isDefault == false)
|
||||
getter!!
|
||||
else
|
||||
this
|
||||
|
||||
val receiverTypeEnhancement =
|
||||
if (extensionReceiverParameter != null)
|
||||
parts(
|
||||
typeContainer =
|
||||
this.safeAs<FunctionDescriptor>()
|
||||
annotationOwnerForMember.safeAs<FunctionDescriptor>()
|
||||
?.getUserData(JavaMethodDescriptor.ORIGINAL_VALUE_PARAMETER_FOR_EXTENSION_RECEIVER),
|
||||
isCovariant = false,
|
||||
defaultTopLevelQualifiers =
|
||||
@@ -117,7 +126,7 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati
|
||||
}
|
||||
}
|
||||
|
||||
val valueParameterEnhancements = valueParameters.map {
|
||||
val valueParameterEnhancements = annotationOwnerForMember.valueParameters.map {
|
||||
p ->
|
||||
parts(
|
||||
typeContainer = p, isCovariant = false,
|
||||
@@ -130,7 +139,7 @@ class SignatureEnhancement(private val annotationTypeQualifierResolver: Annotati
|
||||
|
||||
val returnTypeEnhancement =
|
||||
parts(
|
||||
typeContainer = this, isCovariant = true,
|
||||
typeContainer = annotationOwnerForMember, isCovariant = true,
|
||||
defaultTopLevelQualifiers =
|
||||
outerScopeQualifiers?.get(
|
||||
if (this.safeAs<PropertyDescriptor>()?.isJavaField == true)
|
||||
|
||||
Reference in New Issue
Block a user