Cleanup: OverrideResolver.kt
This commit is contained in:
@@ -253,9 +253,9 @@ class OverrideResolver(
|
|||||||
) {
|
) {
|
||||||
assert(delegate.kind == DELEGATION) { "Delegate expected, got " + delegate + " of kind " + delegate.kind }
|
assert(delegate.kind == DELEGATION) { "Delegate expected, got " + delegate + " of kind " + delegate.kind }
|
||||||
|
|
||||||
if (!onceErrorsReported.contains(diagnosticFactory) && (relevantDiagnosticFromInheritance == null || !onceErrorsReported.contains(
|
if (!onceErrorsReported.contains(diagnosticFactory) &&
|
||||||
relevantDiagnosticFromInheritance
|
(relevantDiagnosticFromInheritance == null || !onceErrorsReported.contains(relevantDiagnosticFromInheritance))
|
||||||
))) {
|
) {
|
||||||
onceErrorsReported.add(diagnosticFactory)
|
onceErrorsReported.add(diagnosticFactory)
|
||||||
trace.report(diagnosticFactory.on(klass, delegate, overridden))
|
trace.report(diagnosticFactory.on(klass, delegate, overridden))
|
||||||
}
|
}
|
||||||
@@ -313,7 +313,7 @@ class OverrideResolver(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val member = DescriptorToSourceUtils.descriptorToDeclaration(declared) as KtNamedDeclaration?
|
val member = DescriptorToSourceUtils.descriptorToDeclaration(declared) as KtNamedDeclaration?
|
||||||
?: throw IllegalStateException("declared descriptor is not resolved to declaration: " + declared)
|
?: throw IllegalStateException("declared descriptor is not resolved to declaration: $declared")
|
||||||
|
|
||||||
val modifierList = member.modifierList
|
val modifierList = member.modifierList
|
||||||
val hasOverrideNode = modifierList != null && modifierList.hasModifier(KtTokens.OVERRIDE_KEYWORD)
|
val hasOverrideNode = modifierList != null && modifierList.hasModifier(KtTokens.OVERRIDE_KEYWORD)
|
||||||
@@ -322,53 +322,57 @@ class OverrideResolver(
|
|||||||
if (hasOverrideNode) {
|
if (hasOverrideNode) {
|
||||||
checkOverridesForMemberMarkedOverride(
|
checkOverridesForMemberMarkedOverride(
|
||||||
declared, kotlinTypeRefiner, object : CheckOverrideReportForDeclaredMemberStrategy {
|
declared, kotlinTypeRefiner, object : CheckOverrideReportForDeclaredMemberStrategy {
|
||||||
private var finalOverriddenError = false
|
private var finalOverriddenError = false
|
||||||
private var typeMismatchError = false
|
private var typeMismatchError = false
|
||||||
private var kindMismatchError = false
|
private var kindMismatchError = false
|
||||||
|
|
||||||
override fun overridingFinalMember(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) {
|
override fun overridingFinalMember(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) {
|
||||||
if (!finalOverriddenError) {
|
if (!finalOverriddenError) {
|
||||||
finalOverriddenError = true
|
finalOverriddenError = true
|
||||||
trace.report(OVERRIDING_FINAL_MEMBER.on(member, overridden, overridden.containingDeclaration))
|
trace.report(OVERRIDING_FINAL_MEMBER.on(member, overridden, overridden.containingDeclaration))
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun returnTypeMismatchOnOverride(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) {
|
|
||||||
if (!typeMismatchError) {
|
|
||||||
typeMismatchError = true
|
|
||||||
|
|
||||||
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)
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
override fun varOverriddenByVal(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) {
|
override fun returnTypeMismatchOnOverride(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) {
|
||||||
if (!kindMismatchError) {
|
if (!typeMismatchError) {
|
||||||
kindMismatchError = true
|
typeMismatchError = true
|
||||||
trace.report(VAR_OVERRIDDEN_BY_VAL.on(member, declared as PropertyDescriptor, overridden as PropertyDescriptor))
|
|
||||||
|
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)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun varOverriddenByVal(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) {
|
||||||
|
if (!kindMismatchError) {
|
||||||
|
kindMismatchError = true
|
||||||
|
trace.report(VAR_OVERRIDDEN_BY_VAL.on(member, declared as PropertyDescriptor, overridden as PropertyDescriptor))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun cannotOverrideInvisibleMember(
|
||||||
|
overriding: CallableMemberDescriptor,
|
||||||
|
invisibleOverridden: CallableMemberDescriptor
|
||||||
|
) {
|
||||||
|
trace.report(CANNOT_OVERRIDE_INVISIBLE_MEMBER.on(member, declared, invisibleOverridden))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun nothingToOverride(overriding: CallableMemberDescriptor) {
|
||||||
|
trace.report(NOTHING_TO_OVERRIDE.on(member, declared))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
)
|
||||||
override fun cannotOverrideInvisibleMember(
|
|
||||||
overriding: CallableMemberDescriptor,
|
|
||||||
invisibleOverridden: CallableMemberDescriptor
|
|
||||||
) {
|
|
||||||
trace.report(CANNOT_OVERRIDE_INVISIBLE_MEMBER.on(member, declared, invisibleOverridden))
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun nothingToOverride(overriding: CallableMemberDescriptor) {
|
|
||||||
trace.report(NOTHING_TO_OVERRIDE.on(member, declared))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else if (!overriddenDescriptors.isEmpty() && !overridesBackwardCompatibilityHelper.overrideCanBeOmitted(declared)) {
|
} else if (!overriddenDescriptors.isEmpty() && !overridesBackwardCompatibilityHelper.overrideCanBeOmitted(declared)) {
|
||||||
val overridden = overriddenDescriptors.first()
|
val overridden = overriddenDescriptors.first()
|
||||||
trace.report(VIRTUAL_MEMBER_HIDDEN.on(member, declared, overridden, overridden.containingDeclaration))
|
trace.report(VIRTUAL_MEMBER_HIDDEN.on(member, declared, overridden, overridden.containingDeclaration))
|
||||||
@@ -458,7 +462,7 @@ class OverrideResolver(
|
|||||||
|
|
||||||
private fun checkNameAndDefaultForDeclaredParameter(descriptor: ValueParameterDescriptor, multipleDefaultsInSuper: Boolean) {
|
private fun checkNameAndDefaultForDeclaredParameter(descriptor: ValueParameterDescriptor, multipleDefaultsInSuper: Boolean) {
|
||||||
val parameter = DescriptorToSourceUtils.descriptorToDeclaration(descriptor) as? KtParameter
|
val parameter = DescriptorToSourceUtils.descriptorToDeclaration(descriptor) as? KtParameter
|
||||||
?: error("Declaration not found for parameter: " + descriptor)
|
?: error("Declaration not found for parameter: $descriptor")
|
||||||
|
|
||||||
if (descriptor.declaresDefaultValue()) {
|
if (descriptor.declaresDefaultValue()) {
|
||||||
trace.report(DEFAULT_VALUE_NOT_ALLOWED_IN_OVERRIDE.on(parameter))
|
trace.report(DEFAULT_VALUE_NOT_ALLOWED_IN_OVERRIDE.on(parameter))
|
||||||
@@ -489,7 +493,7 @@ class OverrideResolver(
|
|||||||
) {
|
) {
|
||||||
val containingClass = containingFunction.containingDeclaration
|
val containingClass = containingFunction.containingDeclaration
|
||||||
val classElement = DescriptorToSourceUtils.descriptorToDeclaration(containingClass) as KtClassOrObject?
|
val classElement = DescriptorToSourceUtils.descriptorToDeclaration(containingClass) as KtClassOrObject?
|
||||||
?: error("Declaration not found for class: " + containingClass)
|
?: error("Declaration not found for class: $containingClass")
|
||||||
|
|
||||||
if (multipleDefaultsInSuper) {
|
if (multipleDefaultsInSuper) {
|
||||||
trace.report(MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE.on(classElement, descriptor))
|
trace.report(MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE.on(classElement, descriptor))
|
||||||
@@ -561,7 +565,7 @@ class OverrideResolver(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun createCannotInferVisibilityReporter(trace: BindingTrace): Function1<CallableMemberDescriptor, Unit> {
|
fun createCannotInferVisibilityReporter(trace: BindingTrace): Function1<CallableMemberDescriptor, Unit> {
|
||||||
return fun(descriptor: CallableMemberDescriptor): Unit {
|
return fun(descriptor: CallableMemberDescriptor) {
|
||||||
val reportOn: DeclarationDescriptor = when {
|
val reportOn: DeclarationDescriptor = when {
|
||||||
descriptor.kind == FAKE_OVERRIDE || descriptor.kind == DELEGATION ->
|
descriptor.kind == FAKE_OVERRIDE || descriptor.kind == DELEGATION ->
|
||||||
DescriptorUtils.getContainingClass(descriptor) ?: throw AssertionError("Class member expected: $descriptor")
|
DescriptorUtils.getContainingClass(descriptor) ?: throw AssertionError("Class member expected: $descriptor")
|
||||||
@@ -575,7 +579,7 @@ class OverrideResolver(
|
|||||||
if (element is KtDeclaration) {
|
if (element is KtDeclaration) {
|
||||||
trace.report(CANNOT_INFER_VISIBILITY.on(element, descriptor))
|
trace.report(CANNOT_INFER_VISIBILITY.on(element, descriptor))
|
||||||
}
|
}
|
||||||
return Unit
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -599,7 +603,9 @@ class OverrideResolver(
|
|||||||
) {
|
) {
|
||||||
for (member in DescriptorUtils.getAllDescriptors(classDescriptor.defaultType.memberScope)) {
|
for (member in DescriptorUtils.getAllDescriptors(classDescriptor.defaultType.memberScope)) {
|
||||||
if (member is CallableMemberDescriptor) {
|
if (member is CallableMemberDescriptor) {
|
||||||
checkInheritedAndDelegatedSignatures(member, inheritedReportStrategy, overrideReportStrategyForDelegates, kotlinTypeRefiner)
|
checkInheritedAndDelegatedSignatures(
|
||||||
|
member, inheritedReportStrategy, overrideReportStrategyForDelegates, kotlinTypeRefiner
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -827,7 +833,7 @@ class OverrideResolver(
|
|||||||
for (descriptor in directOverriddenDescriptors) {
|
for (descriptor in directOverriddenDescriptors) {
|
||||||
val overriddenDeclarations = OverridingUtil.getOverriddenDeclarations(descriptor)
|
val overriddenDeclarations = OverridingUtil.getOverriddenDeclarations(descriptor)
|
||||||
val filteredOverrides = OverridingUtil.filterOutOverridden(overriddenDeclarations)
|
val filteredOverrides = OverridingUtil.filterOutOverridden(overriddenDeclarations)
|
||||||
overriddenDeclarationsByDirectParent.put(descriptor, LinkedHashSet(filteredOverrides))
|
overriddenDeclarationsByDirectParent[descriptor] = LinkedHashSet(filteredOverrides)
|
||||||
}
|
}
|
||||||
return overriddenDeclarationsByDirectParent
|
return overriddenDeclarationsByDirectParent
|
||||||
}
|
}
|
||||||
@@ -947,7 +953,7 @@ class OverrideResolver(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw IllegalStateException("No data modifier is found for data class " + dataClass)
|
throw IllegalStateException("No data modifier is found for data class $dataClass")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun findInvisibleOverriddenDescriptor(
|
private fun findInvisibleOverriddenDescriptor(
|
||||||
|
|||||||
Reference in New Issue
Block a user