From 6e76978530b141713464ae16ad946f0910141da0 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Wed, 9 Nov 2022 21:49:09 +0100 Subject: [PATCH] [FIR] Consider anonymous objects in FirSuperclassNotAccessibleFromInterfaceChecker ^KT-54673 Fixed --- ...sisCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ .../FirOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...endDiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ ...uperclassNotAccessibleFromInterfaceChecker.kt | 4 ++-- ...ctsForSuperclassNotAccessibleFromInterface.kt | 16 ++++++++++++++++ ...tsForSuperclassNotAccessibleFromInterface.txt | 16 ++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ 7 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/thisAndSuper/considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.kt create mode 100644 compiler/testData/diagnostics/tests/thisAndSuper/considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.txt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 8c1f7263e0e..0f4c15a5379 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -32244,6 +32244,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/thisAndSuper/ambigousLabelOnThis.kt"); } + @Test + @TestMetadata("considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.kt") + public void testConsiderAnonymousObjectsForSuperclassNotAccessibleFromInterface() throws Exception { + runTest("compiler/testData/diagnostics/tests/thisAndSuper/considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.kt"); + } + @Test @TestMetadata("genericQualifiedSuperOverridden.kt") public void testGenericQualifiedSuperOverridden() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 2e61a075584..9f45fea4ea6 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -32244,6 +32244,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/thisAndSuper/ambigousLabelOnThis.kt"); } + @Test + @TestMetadata("considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.kt") + public void testConsiderAnonymousObjectsForSuperclassNotAccessibleFromInterface() throws Exception { + runTest("compiler/testData/diagnostics/tests/thisAndSuper/considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.kt"); + } + @Test @TestMetadata("genericQualifiedSuperOverridden.kt") public void testGenericQualifiedSuperOverridden() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 672bc225ba9..18db5eabfc7 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -32244,6 +32244,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/thisAndSuper/ambigousLabelOnThis.kt"); } + @Test + @TestMetadata("considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.kt") + public void testConsiderAnonymousObjectsForSuperclassNotAccessibleFromInterface() throws Exception { + runTest("compiler/testData/diagnostics/tests/thisAndSuper/considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.kt"); + } + @Test @TestMetadata("genericQualifiedSuperOverridden.kt") public void testGenericQualifiedSuperOverridden() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperclassNotAccessibleFromInterfaceChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperclassNotAccessibleFromInterfaceChecker.kt index 8aff25613dd..c2c7be210c6 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperclassNotAccessibleFromInterfaceChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperclassNotAccessibleFromInterfaceChecker.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.findClosest import org.jetbrains.kotlin.fir.analysis.checkers.explicitReceiverIsNotSuperReference import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors -import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.toResolvedCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol @@ -22,7 +22,7 @@ object FirSuperclassNotAccessibleFromInterfaceChecker : FirQualifiedAccessExpres override fun check(expression: FirQualifiedAccessExpression, context: CheckerContext, reporter: DiagnosticReporter) { if (expression.explicitReceiverIsNotSuperReference()) return - val closestClass = context.findClosest() ?: return + val closestClass = context.findClosest() ?: return if (closestClass.classKind == ClassKind.INTERFACE) { val containingClassSymbol = diff --git a/compiler/testData/diagnostics/tests/thisAndSuper/considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.kt b/compiler/testData/diagnostics/tests/thisAndSuper/considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.kt new file mode 100644 index 00000000000..0ab50aa1fdb --- /dev/null +++ b/compiler/testData/diagnostics/tests/thisAndSuper/considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.kt @@ -0,0 +1,16 @@ +// FIR_IDENTICAL +// ISSUE: KT-54673 + +open class KotlinBaseClass { + open fun kotlinFun() {} +} + +interface sealedInterface { + fun someFun() { + object : KotlinBaseClass() { + override fun kotlinFun() { + super.kotlinFun() + } + } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/thisAndSuper/considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.txt b/compiler/testData/diagnostics/tests/thisAndSuper/considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.txt new file mode 100644 index 00000000000..fe7ad14cd02 --- /dev/null +++ b/compiler/testData/diagnostics/tests/thisAndSuper/considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.txt @@ -0,0 +1,16 @@ +package + +public open class KotlinBaseClass { + public constructor KotlinBaseClass() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open fun kotlinFun(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface sealedInterface { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open fun someFun(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index b7048b9990c..a5d742726bb 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -32334,6 +32334,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/thisAndSuper/ambigousLabelOnThis.kt"); } + @Test + @TestMetadata("considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.kt") + public void testConsiderAnonymousObjectsForSuperclassNotAccessibleFromInterface() throws Exception { + runTest("compiler/testData/diagnostics/tests/thisAndSuper/considerAnonymousObjectsForSuperclassNotAccessibleFromInterface.kt"); + } + @Test @TestMetadata("genericQualifiedSuperOverridden.kt") public void testGenericQualifiedSuperOverridden() throws Exception {