From 3beb447e85c3528f7f4d54076b3508cfc456fce1 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Fri, 12 Nov 2021 12:33:47 +0300 Subject: [PATCH] [FIR] Consider anonymous object declarations in classDeclarationsStack in transformers --- ...sisCompilerTestFE10TestdataTestGenerated.java | 12 +++++++++--- .../FirOldFrontendDiagnosticsTestGenerated.java | 12 +++++++++--- ...endDiagnosticsWithLightTreeTestGenerated.java | 12 +++++++++--- .../transformers/FirSupertypesResolution.kt | 10 ++++++---- .../transformers/FirTypeResolveTransformer.kt | 6 ++++-- .../fir/resolve/transformers/TransformUtils.kt | 6 +++--- .../FirPluginAnnotationsResolveTransformer.kt | 7 ++----- ...jectSupertypeWithTypeParameterFromFunction.kt | 9 +++++++++ ...ectSupertypeWithTypeParameterFromFunction.txt | 16 ++++++++++++++++ ...ClassTypeRefWithTypeParameterFromFunction.kt} | 0 ...lassTypeRefWithTypeParameterFromFunction.txt} | 0 .../test/runners/DiagnosticTestGenerated.java | 12 +++++++++--- 12 files changed, 76 insertions(+), 26 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/generics/anonymousObjectSupertypeWithTypeParameterFromFunction.kt create mode 100644 compiler/testData/diagnostics/tests/generics/anonymousObjectSupertypeWithTypeParameterFromFunction.txt rename compiler/testData/diagnostics/tests/generics/{localClassWithTypeArgumentFromFunction.kt => localClassTypeRefWithTypeParameterFromFunction.kt} (100%) rename compiler/testData/diagnostics/tests/generics/{localClassWithTypeArgumentFromFunction.txt => localClassTypeRefWithTypeParameterFromFunction.txt} (100%) 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 de7d3bf3311..42fd06a4ccb 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 @@ -11243,6 +11243,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/generics"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } + @Test + @TestMetadata("anonymousObjectSupertypeWithTypeParameterFromFunction.kt") + public void testAnonymousObjectSupertypeWithTypeParameterFromFunction() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/anonymousObjectSupertypeWithTypeParameterFromFunction.kt"); + } + @Test @TestMetadata("argumentsForT.kt") public void testArgumentsForT() throws Exception { @@ -11352,9 +11358,9 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag } @Test - @TestMetadata("localClassWithTypeArgumentFromFunction.kt") - public void testLocalClassWithTypeArgumentFromFunction() throws Exception { - runTest("compiler/testData/diagnostics/tests/generics/localClassWithTypeArgumentFromFunction.kt"); + @TestMetadata("localClassTypeRefWithTypeParameterFromFunction.kt") + public void testLocalClassTypeRefWithTypeParameterFromFunction() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/localClassTypeRefWithTypeParameterFromFunction.kt"); } @Test 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 86991e97451..550f6ad757c 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 @@ -11243,6 +11243,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/generics"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } + @Test + @TestMetadata("anonymousObjectSupertypeWithTypeParameterFromFunction.kt") + public void testAnonymousObjectSupertypeWithTypeParameterFromFunction() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/anonymousObjectSupertypeWithTypeParameterFromFunction.kt"); + } + @Test @TestMetadata("argumentsForT.kt") public void testArgumentsForT() throws Exception { @@ -11352,9 +11358,9 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti } @Test - @TestMetadata("localClassWithTypeArgumentFromFunction.kt") - public void testLocalClassWithTypeArgumentFromFunction() throws Exception { - runTest("compiler/testData/diagnostics/tests/generics/localClassWithTypeArgumentFromFunction.kt"); + @TestMetadata("localClassTypeRefWithTypeParameterFromFunction.kt") + public void testLocalClassTypeRefWithTypeParameterFromFunction() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/localClassTypeRefWithTypeParameterFromFunction.kt"); } @Test 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 67c02cc18ae..685e0684edc 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 @@ -11243,6 +11243,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/generics"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } + @Test + @TestMetadata("anonymousObjectSupertypeWithTypeParameterFromFunction.kt") + public void testAnonymousObjectSupertypeWithTypeParameterFromFunction() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/anonymousObjectSupertypeWithTypeParameterFromFunction.kt"); + } + @Test @TestMetadata("argumentsForT.kt") public void testArgumentsForT() throws Exception { @@ -11352,9 +11358,9 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac } @Test - @TestMetadata("localClassWithTypeArgumentFromFunction.kt") - public void testLocalClassWithTypeArgumentFromFunction() throws Exception { - runTest("compiler/testData/diagnostics/tests/generics/localClassWithTypeArgumentFromFunction.kt"); + @TestMetadata("localClassTypeRefWithTypeParameterFromFunction.kt") + public void testLocalClassTypeRefWithTypeParameterFromFunction() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/localClassTypeRefWithTypeParameterFromFunction.kt"); } @Test 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 50a1dbf0a76..633840237e8 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 @@ -215,11 +215,11 @@ open class FirSupertypeResolverVisitor( containingDeclarations: List = emptyList(), ) : FirDefaultVisitor() { private val supertypeGenerationExtensions = session.extensionService.supertypeGenerators - private val classDeclarationsStack = ArrayDeque() + private val classDeclarationsStack = ArrayDeque() init { containingDeclarations.forEach { - if (it is FirRegularClass) { + if (it is FirClass) { classDeclarationsStack.add(it) } } @@ -368,8 +368,10 @@ open class FirSupertypeResolverVisitor( } override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: Any?) { - resolveSpecificClassLikeSupertypes(anonymousObject, anonymousObject.superTypeRefs) - visitDeclarationContent(anonymousObject, null) + withClassDeclarationCleanup(classDeclarationsStack, anonymousObject) { + resolveSpecificClassLikeSupertypes(anonymousObject, anonymousObject.superTypeRefs) + visitDeclarationContent(anonymousObject, null) + } } fun resolveSpecificClassLikeSupertypes( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index e6d2c50d3f7..72bf07ceb99 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt @@ -44,7 +44,7 @@ open class FirTypeResolveTransformer( private val scopeSession: ScopeSession, initialScopes: List = emptyList() ) : FirAbstractTreeTransformer(FirResolvePhase.TYPES) { - private val classDeclarationsStack = ArrayDeque() + private val classDeclarationsStack = ArrayDeque() private val scopes = mutableListOf() private val towerScope = scopes.asReversed() @@ -79,7 +79,9 @@ open class FirTypeResolveTransformer( } override fun transformAnonymousObject(anonymousObject: FirAnonymousObject, data: Any?): FirStatement { - return resolveClassContent(anonymousObject, data) + withClassDeclarationCleanup(classDeclarationsStack, anonymousObject) { + return resolveClassContent(anonymousObject, data) + } } override fun transformConstructor(constructor: FirConstructor, data: Any?): FirConstructor { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt index b1ef9358069..3c88c8328da 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.copyWithNewSourceKind -import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirTypedDeclaration import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.FirExpression @@ -135,8 +135,8 @@ inline fun withScopeCleanup(scopes: MutableList<*>, l: () -> T): T { } inline fun withClassDeclarationCleanup( - classDeclarations: ArrayDeque, - topClassDeclaration: FirRegularClass, + classDeclarations: ArrayDeque, + topClassDeclaration: FirClass, l: () -> T ): T { classDeclarations.addLast(topClassDeclaration) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirPluginAnnotationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirPluginAnnotationsResolveTransformer.kt index e80b34e58f6..fbce830613d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirPluginAnnotationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirPluginAnnotationsResolveTransformer.kt @@ -12,10 +12,7 @@ import kotlinx.collections.immutable.persistentListOf import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirDeclaration -import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.fir.declarations.FirRegularClass -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirStatement @@ -106,7 +103,7 @@ private class FirAnnotationResolveTransformer( ) private var owners: PersistentList = persistentListOf() - private val classDeclarationsStack = ArrayDeque() + private val classDeclarationsStack = ArrayDeque() override fun beforeTransformingChildren(parentDeclaration: FirDeclaration): PersistentList { val current = owners diff --git a/compiler/testData/diagnostics/tests/generics/anonymousObjectSupertypeWithTypeParameterFromFunction.kt b/compiler/testData/diagnostics/tests/generics/anonymousObjectSupertypeWithTypeParameterFromFunction.kt new file mode 100644 index 00000000000..21b989fa3dd --- /dev/null +++ b/compiler/testData/diagnostics/tests/generics/anonymousObjectSupertypeWithTypeParameterFromFunction.kt @@ -0,0 +1,9 @@ +// FIR_IDENTICAL +abstract class Checker + +class ToolchainPanel { + fun addVersionChecker(item: ItemT) { + class MyState(val selectedItem: ItemT?) + object : Checker() {} + } +} diff --git a/compiler/testData/diagnostics/tests/generics/anonymousObjectSupertypeWithTypeParameterFromFunction.txt b/compiler/testData/diagnostics/tests/generics/anonymousObjectSupertypeWithTypeParameterFromFunction.txt new file mode 100644 index 00000000000..dbb8ffcb0d0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/generics/anonymousObjectSupertypeWithTypeParameterFromFunction.txt @@ -0,0 +1,16 @@ +package + +public abstract class Checker { + public constructor Checker() + 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 override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class ToolchainPanel { + public constructor ToolchainPanel() + public final fun addVersionChecker(/*0*/ item: ItemT): kotlin.Unit + 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 override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/generics/localClassWithTypeArgumentFromFunction.kt b/compiler/testData/diagnostics/tests/generics/localClassTypeRefWithTypeParameterFromFunction.kt similarity index 100% rename from compiler/testData/diagnostics/tests/generics/localClassWithTypeArgumentFromFunction.kt rename to compiler/testData/diagnostics/tests/generics/localClassTypeRefWithTypeParameterFromFunction.kt diff --git a/compiler/testData/diagnostics/tests/generics/localClassWithTypeArgumentFromFunction.txt b/compiler/testData/diagnostics/tests/generics/localClassTypeRefWithTypeParameterFromFunction.txt similarity index 100% rename from compiler/testData/diagnostics/tests/generics/localClassWithTypeArgumentFromFunction.txt rename to compiler/testData/diagnostics/tests/generics/localClassTypeRefWithTypeParameterFromFunction.txt 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 0a974a5628d..fec6ee12225 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 @@ -11249,6 +11249,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/generics"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); } + @Test + @TestMetadata("anonymousObjectSupertypeWithTypeParameterFromFunction.kt") + public void testAnonymousObjectSupertypeWithTypeParameterFromFunction() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/anonymousObjectSupertypeWithTypeParameterFromFunction.kt"); + } + @Test @TestMetadata("argumentsForT.kt") public void testArgumentsForT() throws Exception { @@ -11358,9 +11364,9 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { } @Test - @TestMetadata("localClassWithTypeArgumentFromFunction.kt") - public void testLocalClassWithTypeArgumentFromFunction() throws Exception { - runTest("compiler/testData/diagnostics/tests/generics/localClassWithTypeArgumentFromFunction.kt"); + @TestMetadata("localClassTypeRefWithTypeParameterFromFunction.kt") + public void testLocalClassTypeRefWithTypeParameterFromFunction() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/localClassTypeRefWithTypeParameterFromFunction.kt"); } @Test