From 6ecc97575d2efe505ed910b17916cf586520c0c8 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 10 Mar 2022 13:49:54 +0300 Subject: [PATCH] FIR: make deeper recursive type alias expansion check (see KT-37000) --- .../DiagnosisCompilerFirTestdataTestGenerated.java | 6 ++++++ ...yIsNotTouchedTilContractsPhaseTestGenerated.java | 5 +++++ .../testData/resolve/recursiveTypeAlias.fir.txt | 4 ++++ .../testData/resolve/recursiveTypeAlias.kt | 2 ++ .../test/runners/FirDiagnosticTestGenerated.java | 6 ++++++ .../FirDiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ .../resolve/transformers/FirSupertypesResolution.kt | 13 ++++++++++--- 7 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 compiler/fir/analysis-tests/testData/resolve/recursiveTypeAlias.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolve/recursiveTypeAlias.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java index 05364a67297..acccff19698 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java @@ -452,6 +452,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis runTest("compiler/fir/analysis-tests/testData/resolve/recursiveCallOnWhenWithSealedClass.kt"); } + @Test + @TestMetadata("recursiveTypeAlias.kt") + public void testRecursiveTypeAlias() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/recursiveTypeAlias.kt"); + } + @Test @TestMetadata("sealedClass.kt") public void testSealedClass() throws Exception { diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java index 49df06132e5..c0385f22929 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java @@ -384,6 +384,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract runTest("compiler/fir/analysis-tests/testData/resolve/recursiveCallOnWhenWithSealedClass.kt"); } + @TestMetadata("recursiveTypeAlias.kt") + public void testRecursiveTypeAlias() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/recursiveTypeAlias.kt"); + } + @TestMetadata("sealedClass.kt") public void testSealedClass() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/sealedClass.kt"); diff --git a/compiler/fir/analysis-tests/testData/resolve/recursiveTypeAlias.fir.txt b/compiler/fir/analysis-tests/testData/resolve/recursiveTypeAlias.fir.txt new file mode 100644 index 00000000000..6aeba530b1e --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/recursiveTypeAlias.fir.txt @@ -0,0 +1,4 @@ +FILE: recursiveTypeAlias.kt + public abstract interface Something Something1|> : R|kotlin/Any| { + } + public final typealias Something1 = /Something> diff --git a/compiler/fir/analysis-tests/testData/resolve/recursiveTypeAlias.kt b/compiler/fir/analysis-tests/testData/resolve/recursiveTypeAlias.kt new file mode 100644 index 00000000000..7dffb272612 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/recursiveTypeAlias.kt @@ -0,0 +1,2 @@ +interface Something Something1> +typealias Something1 = Something Something1> diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index 5624eff54d9..22ead311fbb 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -452,6 +452,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { runTest("compiler/fir/analysis-tests/testData/resolve/recursiveCallOnWhenWithSealedClass.kt"); } + @Test + @TestMetadata("recursiveTypeAlias.kt") + public void testRecursiveTypeAlias() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/recursiveTypeAlias.kt"); + } + @Test @TestMetadata("sealedClass.kt") public void testSealedClass() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index 2347f5449e7..3a27a47ae51 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -452,6 +452,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolve/recursiveCallOnWhenWithSealedClass.kt"); } + @Test + @TestMetadata("recursiveTypeAlias.kt") + public void testRecursiveTypeAlias() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/recursiveTypeAlias.kt"); + } + @Test @TestMetadata("sealedClass.kt") public void testSealedClass() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt index 3d4eee14d19..c66584c4391 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt @@ -590,11 +590,18 @@ class SupertypeComputationSession { checkIsInLoop(supertypeFir) if (isTypeAlias) { - for (typeArgument in supertypeRef.type.typeArguments) { - if (typeArgument is ConeClassLikeType) { - checkIsInLoop(typeArgument.lookupTag.toSymbol(session)?.fir) + fun checkTypeArgumentsRecursively(type: ConeKotlinType, visitedTypes: MutableSet) { + if (type in visitedTypes) return + visitedTypes += type + for (typeArgument in type.typeArguments) { + if (typeArgument is ConeClassLikeType) { + checkIsInLoop(typeArgument.lookupTag.toSymbol(session)?.fir) + checkTypeArgumentsRecursively(typeArgument, visitedTypes) + } } } + + checkTypeArgumentsRecursively(supertypeRef.type, mutableSetOf()) } resultSupertypeRefs.add(