FIR: resolve local class in anonymous initializer.
This commit is contained in:
committed by
Mikhail Glukhikh
parent
2ff5b253ae
commit
0d3301b695
+7
-1
@@ -53,12 +53,18 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
|||||||
abstract val T?.selectorExpression: T?
|
abstract val T?.selectorExpression: T?
|
||||||
|
|
||||||
/**** Class name utils ****/
|
/**** Class name utils ****/
|
||||||
inline fun <T> withChildClassName(name: Name, l: () -> T): T {
|
inline fun <T> withChildClassName(
|
||||||
|
name: Name,
|
||||||
|
isLocal: Boolean = context.firFunctionTargets.isNotEmpty(),
|
||||||
|
l: () -> T
|
||||||
|
): T {
|
||||||
context.className = context.className.child(name)
|
context.className = context.className.child(name)
|
||||||
|
context.localBits.add(isLocal)
|
||||||
return try {
|
return try {
|
||||||
l()
|
l()
|
||||||
} finally {
|
} finally {
|
||||||
context.className = context.className.parent()
|
context.className = context.className.parent()
|
||||||
|
context.localBits.removeLast()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ import org.jetbrains.kotlin.name.Name
|
|||||||
class Context<T> {
|
class Context<T> {
|
||||||
lateinit var packageFqName: FqName
|
lateinit var packageFqName: FqName
|
||||||
var className: FqName = FqName.ROOT
|
var className: FqName = FqName.ROOT
|
||||||
val currentClassId get() = ClassId(packageFqName, className, firFunctionTargets.isNotEmpty())
|
val localBits: MutableList<Boolean> = mutableListOf()
|
||||||
|
val currentClassId get() = ClassId(packageFqName, className, localBits.lastOrNull() ?: false)
|
||||||
|
|
||||||
val firFunctionTargets = mutableListOf<FirFunctionTarget>()
|
val firFunctionTargets = mutableListOf<FirFunctionTarget>()
|
||||||
val calleeNamesForLambda = mutableListOf<Name>()
|
val calleeNamesForLambda = mutableListOf<Name>()
|
||||||
|
|||||||
+1
-1
@@ -370,7 +370,7 @@ class DeclarationsConverter(
|
|||||||
val className = identifier.nameAsSafeName(if (modifiers.isCompanion()) "Companion" else "")
|
val className = identifier.nameAsSafeName(if (modifiers.isCompanion()) "Companion" else "")
|
||||||
val isLocal = isClassLocal(classNode) { getParent() }
|
val isLocal = isClassLocal(classNode) { getParent() }
|
||||||
|
|
||||||
return withChildClassName(className) {
|
return withChildClassName(className, isLocal) {
|
||||||
withCapturedTypeParameters {
|
withCapturedTypeParameters {
|
||||||
val status = FirDeclarationStatusImpl(
|
val status = FirDeclarationStatusImpl(
|
||||||
if (isLocal) Visibilities.LOCAL else modifiers.getVisibility(),
|
if (isLocal) Visibilities.LOCAL else modifiers.getVisibility(),
|
||||||
|
|||||||
@@ -661,7 +661,7 @@ class RawFirBuilder(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitClassOrObject(classOrObject: KtClassOrObject, data: Unit): FirElement {
|
override fun visitClassOrObject(classOrObject: KtClassOrObject, data: Unit): FirElement {
|
||||||
return withChildClassName(classOrObject.nameAsSafeName) {
|
return withChildClassName(classOrObject.nameAsSafeName, classOrObject.isLocal) {
|
||||||
|
|
||||||
val classKind = when (classOrObject) {
|
val classKind = when (classOrObject) {
|
||||||
is KtObjectDeclaration -> ClassKind.OBJECT
|
is KtObjectDeclaration -> ClassKind.OBJECT
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun testFun1(str: String): String {
|
fun testFun1(str: String): String {
|
||||||
val capture = str
|
val capture = str
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
class A {
|
class A {
|
||||||
var a: String = "Fail"
|
var a: String = "Fail"
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// IGNORE_BACKEND: NATIVE
|
// IGNORE_BACKEND: NATIVE
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
|
|
||||||
class Outer<T> (val v: T) {
|
class Outer<T> (val v: T) {
|
||||||
val prop: Any?
|
val prop: Any?
|
||||||
|
|||||||
Reference in New Issue
Block a user