Simplify JavaClassEnhancementScope: callback -> TypeInSignature

This commit is contained in:
Mikhail Glukhikh
2019-02-28 14:11:35 +03:00
parent 226cf8e42c
commit 9bb2278fd4
@@ -182,15 +182,12 @@ class JavaClassEnhancementScope(
typeQualifierResolver, typeQualifierResolver,
// TODO: check me // TODO: check me
parameterContainer = ownerFunction, parameterContainer = ownerFunction,
methodContext = memberContext methodContext = memberContext,
) { typeInSignature = TypeInSignature.Receiver
it.receiverTypeRef!! ).enhance(jsr305State)
}.enhance(jsr305State)
return signatureParts.type return signatureParts.type
} }
private val FirTypedDeclaration.valueParameters: List<FirValueParameter> get() = (this as? FirFunction)?.valueParameters.orEmpty()
private fun enhanceValueParameterType( private fun enhanceValueParameterType(
ownerFunction: FirJavaMethod, ownerFunction: FirJavaMethod,
memberContext: FirJavaEnhancementContext, memberContext: FirJavaEnhancementContext,
@@ -201,10 +198,9 @@ class JavaClassEnhancementScope(
val signatureParts = ownerFunction.partsForValueParameter( val signatureParts = ownerFunction.partsForValueParameter(
typeQualifierResolver, typeQualifierResolver,
parameterContainer = ownerParameter, parameterContainer = ownerParameter,
methodContext = memberContext methodContext = memberContext,
) { typeInSignature = TypeInSignature.ValueParameter(index)
it.valueParameters[index].returnTypeRef ).enhance(jsr305State, predefinedEnhancementInfo?.parametersInfo?.getOrNull(index))
}.enhance(jsr305State, predefinedEnhancementInfo?.parametersInfo?.getOrNull(index))
return signatureParts.type return signatureParts.type
} }
@@ -219,27 +215,12 @@ class JavaClassEnhancementScope(
containerContext = memberContext, containerContext = memberContext,
containerApplicabilityType = containerApplicabilityType =
if (owner is FirJavaField) AnnotationTypeQualifierResolver.QualifierApplicabilityType.FIELD if (owner is FirJavaField) AnnotationTypeQualifierResolver.QualifierApplicabilityType.FIELD
else AnnotationTypeQualifierResolver.QualifierApplicabilityType.METHOD_RETURN_TYPE else AnnotationTypeQualifierResolver.QualifierApplicabilityType.METHOD_RETURN_TYPE,
) { it.returnTypeRef }.enhance(jsr305State, predefinedEnhancementInfo?.returnTypeInfo) typeInSignature = TypeInSignature.Return
).enhance(jsr305State, predefinedEnhancementInfo?.returnTypeInfo)
return signatureParts.type return signatureParts.type
} }
private fun FirCallableMember.partsForValueParameter(
typeQualifierResolver: FirAnnotationTypeQualifierResolver,
// TODO: investigate if it's really can be a null (check properties' with extension overrides in Java)
parameterContainer: FirAnnotationContainer?,
methodContext: FirJavaEnhancementContext,
collector: (FirCallableMember) -> FirTypeRef
) = parts(
typeQualifierResolver,
parameterContainer, false,
parameterContainer?.let {
methodContext.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, it.annotations)
} ?: methodContext,
AnnotationTypeQualifierResolver.QualifierApplicabilityType.VALUE_PARAMETER,
collector
)
private val overriddenMemberCache = mutableMapOf<FirCallableMember, List<FirCallableMember>>() private val overriddenMemberCache = mutableMapOf<FirCallableMember, List<FirCallableMember>>()
private fun FirCallableMember.overriddenMembers(): List<FirCallableMember> { private fun FirCallableMember.overriddenMembers(): List<FirCallableMember> {
@@ -262,25 +243,58 @@ class JavaClassEnhancementScope(
} }
} }
private sealed class TypeInSignature {
abstract fun getTypeRef(member: FirCallableMember): FirTypeRef
object Return : TypeInSignature() {
override fun getTypeRef(member: FirCallableMember): FirTypeRef = member.returnTypeRef
}
object Receiver : TypeInSignature() {
override fun getTypeRef(member: FirCallableMember): FirTypeRef = member.receiverTypeRef!!
}
class ValueParameter(val index: Int) : TypeInSignature() {
override fun getTypeRef(member: FirCallableMember): FirTypeRef = (member as FirFunction).valueParameters[index].returnTypeRef
}
}
private fun FirCallableMember.partsForValueParameter(
typeQualifierResolver: FirAnnotationTypeQualifierResolver,
// TODO: investigate if it's really can be a null (check properties' with extension overrides in Java)
parameterContainer: FirAnnotationContainer?,
methodContext: FirJavaEnhancementContext,
typeInSignature: TypeInSignature
) = parts(
typeQualifierResolver,
parameterContainer, false,
parameterContainer?.let {
methodContext.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, it.annotations)
} ?: methodContext,
AnnotationTypeQualifierResolver.QualifierApplicabilityType.VALUE_PARAMETER,
typeInSignature
)
private fun FirCallableMember.parts( private fun FirCallableMember.parts(
typeQualifierResolver: FirAnnotationTypeQualifierResolver, typeQualifierResolver: FirAnnotationTypeQualifierResolver,
typeContainer: FirAnnotationContainer?, typeContainer: FirAnnotationContainer?,
isCovariant: Boolean, isCovariant: Boolean,
containerContext: FirJavaEnhancementContext, containerContext: FirJavaEnhancementContext,
containerApplicabilityType: AnnotationTypeQualifierResolver.QualifierApplicabilityType, containerApplicabilityType: AnnotationTypeQualifierResolver.QualifierApplicabilityType,
collector: (FirCallableMember) -> FirTypeRef typeInSignature: TypeInSignature
): EnhancementSignatureParts { ): EnhancementSignatureParts {
val typeRef = typeInSignature.getTypeRef(this)
return EnhancementSignatureParts( return EnhancementSignatureParts(
typeQualifierResolver, typeQualifierResolver,
typeContainer, typeContainer,
collector(this) as FirJavaTypeRef, typeRef as FirJavaTypeRef,
this.overriddenMembers().map { this.overriddenMembers().map {
collector(it) typeInSignature.getTypeRef(it)
}, },
isCovariant, isCovariant,
// recompute default type qualifiers using type annotations // recompute default type qualifiers using type annotations
containerContext.copyWithNewDefaultTypeQualifiers( containerContext.copyWithNewDefaultTypeQualifiers(
typeQualifierResolver, jsr305State, collector(this).annotations typeQualifierResolver, jsr305State, typeRef.annotations
), ),
containerApplicabilityType containerApplicabilityType
) )