[FIR] Consider anonymous object declarations in classDeclarationsStack in transformers

This commit is contained in:
Ivan Kochurkin
2021-11-12 12:33:47 +03:00
committed by TeamCityServer
parent b83ed7a6ed
commit 3beb447e85
12 changed files with 76 additions and 26 deletions
@@ -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); 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 @Test
@TestMetadata("argumentsForT.kt") @TestMetadata("argumentsForT.kt")
public void testArgumentsForT() throws Exception { public void testArgumentsForT() throws Exception {
@@ -11352,9 +11358,9 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
} }
@Test @Test
@TestMetadata("localClassWithTypeArgumentFromFunction.kt") @TestMetadata("localClassTypeRefWithTypeParameterFromFunction.kt")
public void testLocalClassWithTypeArgumentFromFunction() throws Exception { public void testLocalClassTypeRefWithTypeParameterFromFunction() throws Exception {
runTest("compiler/testData/diagnostics/tests/generics/localClassWithTypeArgumentFromFunction.kt"); runTest("compiler/testData/diagnostics/tests/generics/localClassTypeRefWithTypeParameterFromFunction.kt");
} }
@Test @Test
@@ -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); 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 @Test
@TestMetadata("argumentsForT.kt") @TestMetadata("argumentsForT.kt")
public void testArgumentsForT() throws Exception { public void testArgumentsForT() throws Exception {
@@ -11352,9 +11358,9 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
} }
@Test @Test
@TestMetadata("localClassWithTypeArgumentFromFunction.kt") @TestMetadata("localClassTypeRefWithTypeParameterFromFunction.kt")
public void testLocalClassWithTypeArgumentFromFunction() throws Exception { public void testLocalClassTypeRefWithTypeParameterFromFunction() throws Exception {
runTest("compiler/testData/diagnostics/tests/generics/localClassWithTypeArgumentFromFunction.kt"); runTest("compiler/testData/diagnostics/tests/generics/localClassTypeRefWithTypeParameterFromFunction.kt");
} }
@Test @Test
@@ -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); 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 @Test
@TestMetadata("argumentsForT.kt") @TestMetadata("argumentsForT.kt")
public void testArgumentsForT() throws Exception { public void testArgumentsForT() throws Exception {
@@ -11352,9 +11358,9 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
} }
@Test @Test
@TestMetadata("localClassWithTypeArgumentFromFunction.kt") @TestMetadata("localClassTypeRefWithTypeParameterFromFunction.kt")
public void testLocalClassWithTypeArgumentFromFunction() throws Exception { public void testLocalClassTypeRefWithTypeParameterFromFunction() throws Exception {
runTest("compiler/testData/diagnostics/tests/generics/localClassWithTypeArgumentFromFunction.kt"); runTest("compiler/testData/diagnostics/tests/generics/localClassTypeRefWithTypeParameterFromFunction.kt");
} }
@Test @Test
@@ -215,11 +215,11 @@ open class FirSupertypeResolverVisitor(
containingDeclarations: List<FirDeclaration> = emptyList(), containingDeclarations: List<FirDeclaration> = emptyList(),
) : FirDefaultVisitor<Unit, Any?>() { ) : FirDefaultVisitor<Unit, Any?>() {
private val supertypeGenerationExtensions = session.extensionService.supertypeGenerators private val supertypeGenerationExtensions = session.extensionService.supertypeGenerators
private val classDeclarationsStack = ArrayDeque<FirRegularClass>() private val classDeclarationsStack = ArrayDeque<FirClass>()
init { init {
containingDeclarations.forEach { containingDeclarations.forEach {
if (it is FirRegularClass) { if (it is FirClass) {
classDeclarationsStack.add(it) classDeclarationsStack.add(it)
} }
} }
@@ -368,8 +368,10 @@ open class FirSupertypeResolverVisitor(
} }
override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: Any?) { override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: Any?) {
resolveSpecificClassLikeSupertypes(anonymousObject, anonymousObject.superTypeRefs) withClassDeclarationCleanup(classDeclarationsStack, anonymousObject) {
visitDeclarationContent(anonymousObject, null) resolveSpecificClassLikeSupertypes(anonymousObject, anonymousObject.superTypeRefs)
visitDeclarationContent(anonymousObject, null)
}
} }
fun resolveSpecificClassLikeSupertypes( fun resolveSpecificClassLikeSupertypes(
@@ -44,7 +44,7 @@ open class FirTypeResolveTransformer(
private val scopeSession: ScopeSession, private val scopeSession: ScopeSession,
initialScopes: List<FirScope> = emptyList() initialScopes: List<FirScope> = emptyList()
) : FirAbstractTreeTransformer<Any?>(FirResolvePhase.TYPES) { ) : FirAbstractTreeTransformer<Any?>(FirResolvePhase.TYPES) {
private val classDeclarationsStack = ArrayDeque<FirRegularClass>() private val classDeclarationsStack = ArrayDeque<FirClass>()
private val scopes = mutableListOf<FirScope>() private val scopes = mutableListOf<FirScope>()
private val towerScope = scopes.asReversed() private val towerScope = scopes.asReversed()
@@ -79,7 +79,9 @@ open class FirTypeResolveTransformer(
} }
override fun transformAnonymousObject(anonymousObject: FirAnonymousObject, data: Any?): FirStatement { 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 { override fun transformConstructor(constructor: FirConstructor, data: Any?): FirConstructor {
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.copyWithNewSourceKind 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.FirTypedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -135,8 +135,8 @@ inline fun <T> withScopeCleanup(scopes: MutableList<*>, l: () -> T): T {
} }
inline fun <T> withClassDeclarationCleanup( inline fun <T> withClassDeclarationCleanup(
classDeclarations: ArrayDeque<FirRegularClass>, classDeclarations: ArrayDeque<FirClass>,
topClassDeclaration: FirRegularClass, topClassDeclaration: FirClass,
l: () -> T l: () -> T
): T { ): T {
classDeclarations.addLast(topClassDeclaration) classDeclarations.addLast(topClassDeclaration)
@@ -12,10 +12,7 @@ import kotlinx.collections.immutable.persistentListOf
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.*
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.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
@@ -106,7 +103,7 @@ private class FirAnnotationResolveTransformer(
) )
private var owners: PersistentList<FirDeclaration> = persistentListOf() private var owners: PersistentList<FirDeclaration> = persistentListOf()
private val classDeclarationsStack = ArrayDeque<FirRegularClass>() private val classDeclarationsStack = ArrayDeque<FirClass>()
override fun beforeTransformingChildren(parentDeclaration: FirDeclaration): PersistentList<FirDeclaration> { override fun beforeTransformingChildren(parentDeclaration: FirDeclaration): PersistentList<FirDeclaration> {
val current = owners val current = owners
@@ -0,0 +1,9 @@
// FIR_IDENTICAL
abstract class Checker<StateT>
class ToolchainPanel {
fun <ItemT> addVersionChecker(item: ItemT) {
class MyState(val selectedItem: ItemT?)
object : Checker<MyState>() {}
}
}
@@ -0,0 +1,16 @@
package
public abstract class Checker</*0*/ StateT> {
public constructor Checker</*0*/ StateT>()
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 </*0*/ ItemT> 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
}
@@ -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); 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 @Test
@TestMetadata("argumentsForT.kt") @TestMetadata("argumentsForT.kt")
public void testArgumentsForT() throws Exception { public void testArgumentsForT() throws Exception {
@@ -11358,9 +11364,9 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
} }
@Test @Test
@TestMetadata("localClassWithTypeArgumentFromFunction.kt") @TestMetadata("localClassTypeRefWithTypeParameterFromFunction.kt")
public void testLocalClassWithTypeArgumentFromFunction() throws Exception { public void testLocalClassTypeRefWithTypeParameterFromFunction() throws Exception {
runTest("compiler/testData/diagnostics/tests/generics/localClassWithTypeArgumentFromFunction.kt"); runTest("compiler/testData/diagnostics/tests/generics/localClassTypeRefWithTypeParameterFromFunction.kt");
} }
@Test @Test