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, overriding: CallableMemberDescriptor,
overridden: CallableMemberDescriptor overridden: CallableMemberDescriptor
) { ) {
reportDelegationProblemIfRequired( val (diagnosticFactory, relevantDiagnosticFromInheritance) = if (overridden is PropertyDescriptor)
RETURN_TYPE_MISMATCH_BY_DELEGATION, RETURN_TYPE_MISMATCH_ON_INHERITANCE, overriding, overridden 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( 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 { private interface CheckOverrideReportStrategy {
fun overridingFinalMember(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) fun overridingFinalMember(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor)
fun returnTypeMismatchOnOverride(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) fun returnTypeMismatchOnOverride(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor)
fun propertyTypeMismatchOnOverride(overriding: PropertyDescriptor, overridden: PropertyDescriptor)
fun varOverriddenByVal(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) fun varOverriddenByVal(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor)
} }
@@ -313,19 +308,17 @@ class OverrideResolver(
override fun returnTypeMismatchOnOverride(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) { override fun returnTypeMismatchOnOverride(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) {
if (!typeMismatchError) { if (!typeMismatchError) {
typeMismatchError = true typeMismatchError = true
trace.report(RETURN_TYPE_MISMATCH_ON_OVERRIDE.on(
member, declared, DeclarationWithDiagnosticComponents(overridden, platformSpecificDiagnosticComponents)
))
}
}
override fun propertyTypeMismatchOnOverride(overriding: PropertyDescriptor, overridden: PropertyDescriptor) { when {
if (!typeMismatchError) { overridden is PropertyDescriptor && overridden.isVar ->
typeMismatchError = true trace.report(VAR_TYPE_MISMATCH_ON_OVERRIDE.on(member, declared, overridden))
if (overridden.isVar) {
trace.report(VAR_TYPE_MISMATCH_ON_OVERRIDE.on(member, declared, overridden)) overridden is PropertyDescriptor && !overridden.isVar ->
} else { trace.report(PROPERTY_TYPE_MISMATCH_ON_OVERRIDE.on(member, declared, overridden))
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) { override fun varOverriddenByVal(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) {
throw IllegalStateException("Component functions are not properties") throw IllegalStateException("Component functions are not properties")
} }
@@ -839,20 +828,16 @@ class OverrideResolver(
reportError: CheckOverrideReportStrategy, reportError: CheckOverrideReportStrategy,
kotlinTypeRefiner: KotlinTypeRefiner kotlinTypeRefiner: KotlinTypeRefiner
) { ) {
val propertyMemberDescriptor = if (memberDescriptor is PropertyDescriptor) memberDescriptor else null
for (overridden in overriddenDescriptors) { for (overridden in overriddenDescriptors) {
if (overridden.modality == Modality.FINAL) { if (overridden.modality == Modality.FINAL) {
reportError.overridingFinalMember(memberDescriptor, overridden) reportError.overridingFinalMember(memberDescriptor, overridden)
} }
if (!isReturnTypeOkForOverride(overridden, memberDescriptor, kotlinTypeRefiner)) { if (!isReturnTypeOkForOverride(overridden, memberDescriptor, kotlinTypeRefiner)) {
if (memberDescriptor is PropertyDescriptor) { require(memberDescriptor !is PropertyDescriptor || overridden is PropertyDescriptor) {
require(overridden is PropertyDescriptor) { "$overridden is overridden by property $propertyMemberDescriptor" } "$overridden is overridden by property $memberDescriptor"
reportError.propertyTypeMismatchOnOverride(memberDescriptor, overridden)
} else {
reportError.returnTypeMismatchOnOverride(memberDescriptor, overridden)
} }
reportError.returnTypeMismatchOnOverride(memberDescriptor, overridden)
} }
if (checkPropertyKind(overridden, true) && checkPropertyKind(memberDescriptor, false)) { if (checkPropertyKind(overridden, true) && checkPropertyKind(memberDescriptor, false)) {