Forbid usages of super if in fact it accesses an abstract member
#KT-49017 Fixed
This commit is contained in:
@@ -933,6 +933,7 @@ public interface Errors {
|
||||
DiagnosticFactory0<KtSuperExpression> SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<KtSuperExpression> AMBIGUOUS_SUPER = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<KtExpression> ABSTRACT_SUPER_CALL = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<KtExpression> ABSTRACT_SUPER_CALL_WARNING = DiagnosticFactory0.create(WARNING);
|
||||
DiagnosticFactory0<KtTypeReference> NOT_A_SUPERTYPE = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<PsiElement> TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER = DiagnosticFactory0.create(WARNING);
|
||||
DiagnosticFactory1<KtTypeReference, KotlinType> QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE = DiagnosticFactory1.create(ERROR);
|
||||
|
||||
+1
@@ -491,6 +491,7 @@ public class DefaultErrorMessages {
|
||||
MAP.put(SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE, "Superclass is not accessible from interface");
|
||||
MAP.put(AMBIGUOUS_SUPER, "Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super<Foo>'");
|
||||
MAP.put(ABSTRACT_SUPER_CALL, "Abstract member cannot be accessed directly");
|
||||
MAP.put(ABSTRACT_SUPER_CALL_WARNING, "Abstract fake override member access is deprecated");
|
||||
MAP.put(NOT_A_SUPERTYPE, "Not an immediate supertype");
|
||||
MAP.put(TYPE_ARGUMENTS_REDUNDANT_IN_SUPER_QUALIFIER, "Type arguments do not need to be specified in a 'super' qualifier");
|
||||
MAP.put(QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE, "Explicitly qualified supertype is extended by another supertype ''{0}''", RENDER_TYPE);
|
||||
|
||||
+7
@@ -77,6 +77,13 @@ class DiagnosticReporterByTrackingStrategy(
|
||||
)
|
||||
InstantiationOfAbstractClass::class.java -> tracingStrategy.instantiationOfAbstractClass(trace)
|
||||
AbstractSuperCall::class.java -> tracingStrategy.abstractSuperCall(trace)
|
||||
AbstractFakeOverrideSuperCall::class.java -> {
|
||||
if (context.languageVersionSettings.supportsFeature(LanguageFeature.ForbidSuperDelegationToAbstractFakeOverride)) {
|
||||
tracingStrategy.abstractSuperCall(trace)
|
||||
} else {
|
||||
tracingStrategy.abstractFakeOverrideSuperCall(trace)
|
||||
}
|
||||
}
|
||||
NonApplicableCallForBuilderInferenceDiagnostic::class.java -> {
|
||||
val reportOn = (diagnostic as NonApplicableCallForBuilderInferenceDiagnostic).kotlinCall
|
||||
trace.reportDiagnosticOnce(NON_APPLICABLE_CALL_FOR_BUILDER_INFERENCE.on(reportOn.psiKotlinCall.psiCall.callElement))
|
||||
|
||||
+5
@@ -142,6 +142,11 @@ public abstract class AbstractTracingStrategy implements TracingStrategy {
|
||||
trace.report(ABSTRACT_SUPER_CALL.on(reference));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void abstractFakeOverrideSuperCall(@NotNull BindingTrace trace) {
|
||||
trace.report(ABSTRACT_SUPER_CALL_WARNING.on(reference));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void nestedClassAccessViaInstanceReference(
|
||||
@NotNull BindingTrace trace,
|
||||
|
||||
@@ -148,6 +148,10 @@ public interface TracingStrategy {
|
||||
|
||||
void abstractSuperCall(@NotNull BindingTrace trace);
|
||||
|
||||
default void abstractFakeOverrideSuperCall(@NotNull BindingTrace trace) {
|
||||
abstractSuperCall(trace);
|
||||
}
|
||||
|
||||
void nestedClassAccessViaInstanceReference(
|
||||
@NotNull BindingTrace trace,
|
||||
@NotNull ClassDescriptor classDescriptor,
|
||||
|
||||
Reference in New Issue
Block a user