Minor: unify error reporting for fun/properties overriding

This commit is contained in:
Dmitry Savvinov
2020-09-27 21:35:26 +03:00
parent ac63d8b3bf
commit f8b9011667
@@ -203,17 +203,13 @@ class OverrideResolver(
overriding: CallableMemberDescriptor,
overridden: CallableMemberDescriptor
) {
reportDelegationProblemIfRequired(
RETURN_TYPE_MISMATCH_BY_DELEGATION, RETURN_TYPE_MISMATCH_ON_INHERITANCE, overriding, overridden
)
}
val (diagnosticFactory, relevantDiagnosticFromInheritance) = if (overridden is PropertyDescriptor)
PROPERTY_TYPE_MISMATCH_BY_DELEGATION to PROPERTY_TYPE_MISMATCH_ON_INHERITANCE
else
RETURN_TYPE_MISMATCH_BY_DELEGATION to RETURN_TYPE_MISMATCH_ON_INHERITANCE
override fun propertyTypeMismatchOnOverride(
overriding: PropertyDescriptor,
overridden: PropertyDescriptor
) {
reportDelegationProblemIfRequired(
PROPERTY_TYPE_MISMATCH_BY_DELEGATION, PROPERTY_TYPE_MISMATCH_ON_INHERITANCE, overriding, overridden
diagnosticFactory, relevantDiagnosticFromInheritance, overriding, overridden
)
}
@@ -266,7 +262,6 @@ class OverrideResolver(
private interface CheckOverrideReportStrategy {
fun overridingFinalMember(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor)
fun returnTypeMismatchOnOverride(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor)
fun propertyTypeMismatchOnOverride(overriding: PropertyDescriptor, overridden: PropertyDescriptor)
fun varOverriddenByVal(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor)
}
@@ -313,19 +308,17 @@ class OverrideResolver(
override fun returnTypeMismatchOnOverride(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) {
if (!typeMismatchError) {
typeMismatchError = true
trace.report(RETURN_TYPE_MISMATCH_ON_OVERRIDE.on(
member, declared, DeclarationWithDiagnosticComponents(overridden, platformSpecificDiagnosticComponents)
))
}
}
override fun propertyTypeMismatchOnOverride(overriding: PropertyDescriptor, overridden: PropertyDescriptor) {
if (!typeMismatchError) {
typeMismatchError = true
if (overridden.isVar) {
trace.report(VAR_TYPE_MISMATCH_ON_OVERRIDE.on(member, declared, overridden))
} else {
trace.report(PROPERTY_TYPE_MISMATCH_ON_OVERRIDE.on(member, declared, overridden))
when {
overridden is PropertyDescriptor && overridden.isVar ->
trace.report(VAR_TYPE_MISMATCH_ON_OVERRIDE.on(member, declared, overridden))
overridden is PropertyDescriptor && !overridden.isVar ->
trace.report(PROPERTY_TYPE_MISMATCH_ON_OVERRIDE.on(member, declared, overridden))
else -> trace.report(RETURN_TYPE_MISMATCH_ON_OVERRIDE.on(
member, declared, DeclarationWithDiagnosticComponents(overridden, platformSpecificDiagnosticComponents)
))
}
}
}
@@ -374,10 +367,6 @@ class OverrideResolver(
}
}
override fun propertyTypeMismatchOnOverride(overriding: PropertyDescriptor, overridden: PropertyDescriptor) {
throw IllegalStateException("Component functions are not properties")
}
override fun varOverriddenByVal(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) {
throw IllegalStateException("Component functions are not properties")
}
@@ -839,20 +828,16 @@ class OverrideResolver(
reportError: CheckOverrideReportStrategy,
kotlinTypeRefiner: KotlinTypeRefiner
) {
val propertyMemberDescriptor = if (memberDescriptor is PropertyDescriptor) memberDescriptor else null
for (overridden in overriddenDescriptors) {
if (overridden.modality == Modality.FINAL) {
reportError.overridingFinalMember(memberDescriptor, overridden)
}
if (!isReturnTypeOkForOverride(overridden, memberDescriptor, kotlinTypeRefiner)) {
if (memberDescriptor is PropertyDescriptor) {
require(overridden is PropertyDescriptor) { "$overridden is overridden by property $propertyMemberDescriptor" }
reportError.propertyTypeMismatchOnOverride(memberDescriptor, overridden)
} else {
reportError.returnTypeMismatchOnOverride(memberDescriptor, overridden)
require(memberDescriptor !is PropertyDescriptor || overridden is PropertyDescriptor) {
"$overridden is overridden by property $memberDescriptor"
}
reportError.returnTypeMismatchOnOverride(memberDescriptor, overridden)
}
if (checkPropertyKind(overridden, true) && checkPropertyKind(memberDescriptor, false)) {