From 0d3301b6951249278dd3032dff0689eb95a17f08 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Tue, 19 May 2020 22:42:26 -0700 Subject: [PATCH] FIR: resolve local class in anonymous initializer. --- .../org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt | 8 +++++++- .../src/org/jetbrains/kotlin/fir/builder/Context.kt | 3 ++- .../fir/lightTree/converter/DeclarationsConverter.kt | 2 +- .../src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt | 2 +- compiler/testData/codegen/box/classes/kt8011a.kt | 1 - .../codegen/box/localClasses/localClassInInitializer.kt | 1 - .../box/reflection/classes/localClassSimpleName.kt | 1 - compiler/testData/codegen/box/regressions/kt24913.kt | 1 - 8 files changed, 11 insertions(+), 8 deletions(-) diff --git a/compiler/fir/raw-fir/fir-common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/fir-common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index 168fde3d50a..e9004718a15 100644 --- a/compiler/fir/raw-fir/fir-common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/fir-common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -53,12 +53,18 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte abstract val T?.selectorExpression: T? /**** Class name utils ****/ - inline fun withChildClassName(name: Name, l: () -> T): T { + inline fun withChildClassName( + name: Name, + isLocal: Boolean = context.firFunctionTargets.isNotEmpty(), + l: () -> T + ): T { context.className = context.className.child(name) + context.localBits.add(isLocal) return try { l() } finally { context.className = context.className.parent() + context.localBits.removeLast() } } diff --git a/compiler/fir/raw-fir/fir-common/src/org/jetbrains/kotlin/fir/builder/Context.kt b/compiler/fir/raw-fir/fir-common/src/org/jetbrains/kotlin/fir/builder/Context.kt index 7168cd48318..d1cd243ebb7 100644 --- a/compiler/fir/raw-fir/fir-common/src/org/jetbrains/kotlin/fir/builder/Context.kt +++ b/compiler/fir/raw-fir/fir-common/src/org/jetbrains/kotlin/fir/builder/Context.kt @@ -18,7 +18,8 @@ import org.jetbrains.kotlin.name.Name class Context { lateinit var packageFqName: FqName var className: FqName = FqName.ROOT - val currentClassId get() = ClassId(packageFqName, className, firFunctionTargets.isNotEmpty()) + val localBits: MutableList = mutableListOf() + val currentClassId get() = ClassId(packageFqName, className, localBits.lastOrNull() ?: false) val firFunctionTargets = mutableListOf() val calleeNamesForLambda = mutableListOf() diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 2ce98a6752e..2f845e7c063 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -370,7 +370,7 @@ class DeclarationsConverter( val className = identifier.nameAsSafeName(if (modifiers.isCompanion()) "Companion" else "") val isLocal = isClassLocal(classNode) { getParent() } - return withChildClassName(className) { + return withChildClassName(className, isLocal) { withCapturedTypeParameters { val status = FirDeclarationStatusImpl( if (isLocal) Visibilities.LOCAL else modifiers.getVisibility(), diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 33bea388b92..680a7847dcf 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -661,7 +661,7 @@ class RawFirBuilder( } override fun visitClassOrObject(classOrObject: KtClassOrObject, data: Unit): FirElement { - return withChildClassName(classOrObject.nameAsSafeName) { + return withChildClassName(classOrObject.nameAsSafeName, classOrObject.isLocal) { val classKind = when (classOrObject) { is KtObjectDeclaration -> ClassKind.OBJECT diff --git a/compiler/testData/codegen/box/classes/kt8011a.kt b/compiler/testData/codegen/box/classes/kt8011a.kt index 427b2f10a82..9a8fa24c6d9 100644 --- a/compiler/testData/codegen/box/classes/kt8011a.kt +++ b/compiler/testData/codegen/box/classes/kt8011a.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR fun testFun1(str: String): String { val capture = str diff --git a/compiler/testData/codegen/box/localClasses/localClassInInitializer.kt b/compiler/testData/codegen/box/localClasses/localClassInInitializer.kt index 980080bc9ac..0dafae38048 100644 --- a/compiler/testData/codegen/box/localClasses/localClassInInitializer.kt +++ b/compiler/testData/codegen/box/localClasses/localClassInInitializer.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR class A { var a: String = "Fail" diff --git a/compiler/testData/codegen/box/reflection/classes/localClassSimpleName.kt b/compiler/testData/codegen/box/reflection/classes/localClassSimpleName.kt index f31333fd816..63987fd279d 100644 --- a/compiler/testData/codegen/box/reflection/classes/localClassSimpleName.kt +++ b/compiler/testData/codegen/box/reflection/classes/localClassSimpleName.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // IGNORE_BACKEND: NATIVE // WITH_RUNTIME diff --git a/compiler/testData/codegen/box/regressions/kt24913.kt b/compiler/testData/codegen/box/regressions/kt24913.kt index cb978988925..ef2ed878041 100644 --- a/compiler/testData/codegen/box/regressions/kt24913.kt +++ b/compiler/testData/codegen/box/regressions/kt24913.kt @@ -1,5 +1,4 @@ // !DIAGNOSTICS: -UNUSED_VARIABLE -// IGNORE_BACKEND_FIR: JVM_IR class Outer (val v: T) { val prop: Any?