From 8821f8d1a4e340801477676be5585074f0726803 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Tue, 24 Oct 2023 11:01:17 +0200 Subject: [PATCH] [FIR] Expand type alias when checking for type parameters from outer declaration This fixes a false positive OUTER_CLASS_ARGUMENTS_REQUIRED when referring to an inner class of a supertype that is extended using a typealias. #KT-62099 Fixed --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++ ...sticCompilerFE10TestDataTestGenerated.java | 6 ++++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 ++++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 ++++ .../kotlin/fir/resolve/TypeExpansionUtils.kt | 8 +++++ .../kotlin/fir/resolve/DeclarationUtils.kt | 7 ++-- .../diagnostics/tests/typealias/kt62099.kt | 33 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++ 8 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/typealias/kt62099.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 91ee88a55cc..9e1948783b9 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -35370,6 +35370,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/typealias/kt57065.kt"); } + @Test + @TestMetadata("kt62099.kt") + public void testKt62099() throws Exception { + runTest("compiler/testData/diagnostics/tests/typealias/kt62099.kt"); + } + @Test @TestMetadata("localTypeAlias.kt") public void testLocalTypeAlias() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 7ff01d13fce..98694408a5c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -35370,6 +35370,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/typealias/kt57065.kt"); } + @Test + @TestMetadata("kt62099.kt") + public void testKt62099() throws Exception { + runTest("compiler/testData/diagnostics/tests/typealias/kt62099.kt"); + } + @Test @TestMetadata("localTypeAlias.kt") public void testLocalTypeAlias() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 014e456ebda..06e799e5fdf 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -35256,6 +35256,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/typealias/kt57065.kt"); } + @Test + @TestMetadata("kt62099.kt") + public void testKt62099() throws Exception { + runTest("compiler/testData/diagnostics/tests/typealias/kt62099.kt"); + } + @Test @TestMetadata("localTypeAlias.kt") public void testLocalTypeAlias() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 38a5f1a322f..4d32b41e2df 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -35370,6 +35370,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/typealias/kt57065.kt"); } + @Test + @TestMetadata("kt62099.kt") + public void testKt62099() throws Exception { + runTest("compiler/testData/diagnostics/tests/typealias/kt62099.kt"); + } + @Test @TestMetadata("localTypeAlias.kt") public void testLocalTypeAlias() throws Exception { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/TypeExpansionUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/TypeExpansionUtils.kt index 50f35b69eee..5da606b6698 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/TypeExpansionUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/TypeExpansionUtils.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.resolve import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType @@ -190,3 +191,10 @@ private fun mapTypeAliasArguments( fun FirTypeAlias.fullyExpandedConeType(useSiteSession: FirSession): ConeClassLikeType? { return expandedConeType?.fullyExpandedType(useSiteSession) } + +/** + * @see fullyExpandedType + */ +fun FirTypeAlias.fullyExpandedClass(session: FirSession): FirClassLikeDeclaration? { + return fullyExpandedConeType(session)?.toSymbol(session)?.fir +} \ No newline at end of file diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/DeclarationUtils.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/DeclarationUtils.kt index b240bb72717..80f5c6d90e3 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/DeclarationUtils.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/DeclarationUtils.kt @@ -57,10 +57,9 @@ fun isValidTypeParameterFromOuterDeclaration( return containsTypeParameter(session.symbolProvider.getClassLikeSymbolByClassId(containingClassId)?.fir) } else if (currentDeclaration is FirClass) { for (superTypeRef in currentDeclaration.superTypeRefs) { - val superClassFir = superTypeRef.firClassLike(session) - if (superClassFir == null || superClassFir is FirRegularClass && containsTypeParameter(superClassFir)) { - return true - } + val superClassFir = superTypeRef.firClassLike(session) ?: return true + if (superClassFir is FirRegularClass && containsTypeParameter(superClassFir)) return true + if (superClassFir is FirTypeAlias && containsTypeParameter(superClassFir.fullyExpandedClass(session))) return true } } } diff --git a/compiler/testData/diagnostics/tests/typealias/kt62099.kt b/compiler/testData/diagnostics/tests/typealias/kt62099.kt new file mode 100644 index 00000000000..bd0752d7097 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/kt62099.kt @@ -0,0 +1,33 @@ +// FIR_IDENTICAL +// ISSUE: KT-62099 + +abstract class Foo { + inner class Inner + abstract fun render(context: Inner) +} + +typealias TA = Foo + +class Test : TA() { + override fun render(context: Inner) {} +} + +typealias TA2 = Foo + +class Test2 : TA2() { + override fun render(context: Inner) {} +} + +typealias TA3 = Foo +typealias TA3_2 = TA3 + +class Test3 : TA3_2() { + override fun render(context: Inner) {} +} + +typealias TA4 = Foo +typealias TA4_2 = TA4 + +class Test4 : TA4_2() { + override fun render(context: Inner) {} +} 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 79c8827e71f..a0181f543f4 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 @@ -37304,6 +37304,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/typealias/kt57065.kt"); } + @Test + @TestMetadata("kt62099.kt") + public void testKt62099() throws Exception { + runTest("compiler/testData/diagnostics/tests/typealias/kt62099.kt"); + } + @Test @TestMetadata("localTypeAlias.kt") public void testLocalTypeAlias() throws Exception {