Forbid usages of super if in fact it accesses an abstract member

#KT-49017 Fixed
This commit is contained in:
Mikhail Glukhikh
2022-01-10 14:19:19 +03:00
parent d15270b9e5
commit b689bbf5c7
23 changed files with 279 additions and 4 deletions
@@ -392,6 +392,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirErrors.ABSTRACT_SUPER_CALL_WARNING) { firDiagnostic ->
AbstractSuperCallWarningImpl(
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.INSTANCE_ACCESS_BEFORE_SUPER_CALL) { firDiagnostic ->
InstanceAccessBeforeSuperCallImpl(
firDiagnostic.a,
@@ -307,6 +307,10 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = AbstractSuperCall::class
}
abstract class AbstractSuperCallWarning : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = AbstractSuperCallWarning::class
}
abstract class InstanceAccessBeforeSuperCall : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = InstanceAccessBeforeSuperCall::class
abstract val target: String
@@ -356,6 +356,11 @@ internal class AbstractSuperCallImpl(
override val token: ValidityToken,
) : KtFirDiagnostic.AbstractSuperCall(), KtAbstractFirDiagnostic<PsiElement>
internal class AbstractSuperCallWarningImpl(
override val firDiagnostic: KtPsiDiagnostic,
override val token: ValidityToken,
) : KtFirDiagnostic.AbstractSuperCallWarning(), KtAbstractFirDiagnostic<PsiElement>
internal class InstanceAccessBeforeSuperCallImpl(
override val target: String,
override val firDiagnostic: KtPsiDiagnostic,
@@ -18587,6 +18587,18 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
runTest("compiler/testData/diagnostics/tests/java8Overrides/abstractBaseClassMemberNotImplemented_15.kt");
}
@Test
@TestMetadata("abstractFakeOverrideSuperCall.kt")
public void testAbstractFakeOverrideSuperCall() throws Exception {
runTest("compiler/testData/diagnostics/tests/java8Overrides/abstractFakeOverrideSuperCall.kt");
}
@Test
@TestMetadata("abstractFakeOverrideSuperCallForbidden.kt")
public void testAbstractFakeOverrideSuperCallForbidden() throws Exception {
runTest("compiler/testData/diagnostics/tests/java8Overrides/abstractFakeOverrideSuperCallForbidden.kt");
}
@Test
@TestMetadata("abstractVsAbstract.kt")
public void testAbstractVsAbstract() throws Exception {