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:
Denis Zharkov
2017-08-10 17:14:37 +07:00
parent 9962fc88ca
commit ce37ab81ba
4 changed files with 63 additions and 3 deletions
@@ -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)