Prohibit return type mismatch for delegation members
#KT-13952 Fixed #KT-13005 Fixed
This commit is contained in:
@@ -363,6 +363,10 @@ public interface Errors {
|
||||
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
|
||||
DiagnosticFactory2<KtClassOrObject, CallableMemberDescriptor, CallableMemberDescriptor> VAR_OVERRIDDEN_BY_VAL_BY_DELEGATION =
|
||||
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
|
||||
DiagnosticFactory2<KtClassOrObject, CallableMemberDescriptor, CallableMemberDescriptor> RETURN_TYPE_MISMATCH_BY_DELEGATION =
|
||||
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
|
||||
DiagnosticFactory2<KtClassOrObject, CallableMemberDescriptor, CallableMemberDescriptor> PROPERTY_TYPE_MISMATCH_BY_DELEGATION =
|
||||
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
|
||||
|
||||
DiagnosticFactory2<KtClassOrObject, ClassDescriptor, Collection<CallableMemberDescriptor>> CONFLICTING_INHERITED_MEMBERS =
|
||||
DiagnosticFactory2.create(ERROR, DECLARATION_NAME);
|
||||
|
||||
+4
@@ -613,6 +613,10 @@ public class DefaultErrorMessages {
|
||||
SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
|
||||
MAP.put(VAR_OVERRIDDEN_BY_VAL_BY_DELEGATION, "Val-property ''{0}'' implicitly overrides a var-property ''{1}'' by delegation",
|
||||
SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
|
||||
MAP.put(RETURN_TYPE_MISMATCH_BY_DELEGATION, "Type of ''{0}'' is not a subtype of overridden by delegation ''{1}''",
|
||||
SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
|
||||
MAP.put(PROPERTY_TYPE_MISMATCH_BY_DELEGATION, "Type of property ''{0}'' is not a subtype of overridden by delegation ''{1}''",
|
||||
SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES);
|
||||
|
||||
MAP.put(VAR_OVERRIDDEN_BY_VAL, "Var-property {0} cannot be overridden by val-property {1}", FQ_NAMES_IN_TYPES, FQ_NAMES_IN_TYPES);
|
||||
|
||||
|
||||
@@ -240,7 +240,7 @@ public class OverrideResolver {
|
||||
|
||||
@Override
|
||||
public void overridingFinalMember(@NotNull CallableMemberDescriptor overriding, @NotNull CallableMemberDescriptor overridden) {
|
||||
reportDelegationProblemIfRequired(OVERRIDING_FINAL_MEMBER_BY_DELEGATION, overriding, overridden);
|
||||
reportDelegationProblemIfRequired(OVERRIDING_FINAL_MEMBER_BY_DELEGATION, null, overriding, overridden);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -248,7 +248,8 @@ public class OverrideResolver {
|
||||
@NotNull CallableMemberDescriptor overriding,
|
||||
@NotNull CallableMemberDescriptor overridden
|
||||
) {
|
||||
// Always reported as RETURN_TYPE_MISMATCH_ON_INHERITANCE
|
||||
reportDelegationProblemIfRequired(
|
||||
RETURN_TYPE_MISMATCH_BY_DELEGATION, RETURN_TYPE_MISMATCH_ON_INHERITANCE, overriding, overridden);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -256,22 +257,25 @@ public class OverrideResolver {
|
||||
@NotNull PropertyDescriptor overriding,
|
||||
@NotNull PropertyDescriptor overridden
|
||||
) {
|
||||
// Always reported as PROPERTY_TYPE_MISMATCH_ON_INHERITANCE
|
||||
reportDelegationProblemIfRequired(
|
||||
PROPERTY_TYPE_MISMATCH_BY_DELEGATION, PROPERTY_TYPE_MISMATCH_ON_INHERITANCE, overriding, overridden);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void varOverriddenByVal(@NotNull CallableMemberDescriptor overriding, @NotNull CallableMemberDescriptor overridden) {
|
||||
reportDelegationProblemIfRequired(VAR_OVERRIDDEN_BY_VAL_BY_DELEGATION, overriding, overridden);
|
||||
reportDelegationProblemIfRequired(VAR_OVERRIDDEN_BY_VAL_BY_DELEGATION, null, overriding, overridden);
|
||||
}
|
||||
|
||||
private void reportDelegationProblemIfRequired(
|
||||
@NotNull DiagnosticFactory2<KtClassOrObject, CallableMemberDescriptor, CallableMemberDescriptor> diagnosticFactory,
|
||||
@Nullable DiagnosticFactoryWithPsiElement<?, ?> relevantDiagnosticFromInheritance,
|
||||
@NotNull CallableMemberDescriptor delegate,
|
||||
@NotNull CallableMemberDescriptor overridden
|
||||
) {
|
||||
assert delegate.getKind() == DELEGATION : "Delegate expected, got " + delegate + " of kind " + delegate.getKind();
|
||||
|
||||
if (!onceErrorsReported.contains(diagnosticFactory)) {
|
||||
if (!onceErrorsReported.contains(diagnosticFactory) &&
|
||||
(relevantDiagnosticFromInheritance == null || !onceErrorsReported.contains(relevantDiagnosticFromInheritance))) {
|
||||
onceErrorsReported.add(diagnosticFactory);
|
||||
trace.report(diagnosticFactory.on(klass, delegate, overridden));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user