From 22f55b3dc43853f133a11f842ca8d0152beef3f9 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 4 Oct 2023 17:20:17 +0300 Subject: [PATCH] [Raw FIR] Keep the name of an anonymous object of enum entry in classId of its nested classes It is needed to have an ability to distinguish those two cases in FIR2IR: Without this change the following tests fail: - org.jetbrains.kotlin.test.runners.codegen.FirPsiBlackBoxCodegenTestGenerated.Enum - testEnumEntryReferenceFromInnerClassConstructor1() - testEnumEntryReferenceFromInnerClassConstructor2() - testEnumEntryReferenceFromInnerClassConstructor3() - testInnerClassMethodInEnumEntryClass() - testInnerClassMethodInEnumEntryClass2() - testKt9711_2() - testDeepInnerClassInEnumEntryClass() - testKt7257_boundReference1() - testInnerClassInEnumEntryClass() - testKt44744_innerClass() --- .../converter/LightTreeRawFirDeclarationBuilder.kt | 5 +---- .../org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt | 6 +----- .../declarations/localDeclarationsInEnumEntry.txt | 2 +- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt index dfe6d1a0b2f..8fbf5b7c6c9 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt @@ -419,8 +419,6 @@ class LightTreeRawFirDeclarationBuilder( } } - private val LighterASTNode.isDirectlyInsideEnumEntry get() = getParent()?.getParent()?.elementType == ENUM_ENTRY - /***** DECLARATIONS *****/ /** * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseClassOrObject @@ -460,8 +458,7 @@ class LightTreeRawFirDeclarationBuilder( } val className = identifier.nameAsSafeName(if (modifiers.isCompanion()) "Companion" else "") - val isLocalWithinParent = classNode.isDirectlyInsideEnumEntry - || classNode.getParent()?.elementType != CLASS_BODY && isClassLocal(classNode) { getParent() } + val isLocalWithinParent = classNode.getParent()?.elementType != CLASS_BODY && isClassLocal(classNode) { getParent() } val classIsExpect = modifiers.hasExpect() || context.containerIsExpect return withChildClassName(className, isExpect = classIsExpect, isLocalWithinParent) { diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt index ee80316fbb7..c4ceccb29aa 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt @@ -1376,12 +1376,8 @@ open class PsiRawFirBuilder( } } - private val KtElement.isDirectlyInsideEnumEntry get() = parent?.parent is KtEnumEntry - override fun visitClassOrObject(classOrObject: KtClassOrObject, data: FirElement?): FirElement { - // NB: enum entry nested classes are considered local by FIR design (see discussion in KT-45115) - val isLocalWithinParent = classOrObject.isDirectlyInsideEnumEntry - || classOrObject.parent !is KtClassBody && classOrObject.isLocal + val isLocalWithinParent = classOrObject.parent !is KtClassBody && classOrObject.isLocal val classIsExpect = classOrObject.hasExpectModifier() || context.containerIsExpect val sourceElement = classOrObject.toFirSourceElement() return withChildClassName( diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/localDeclarationsInEnumEntry.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/localDeclarationsInEnumEntry.txt index 253845afcae..493807ec314 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/localDeclarationsInEnumEntry.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/localDeclarationsInEnumEntry.txt @@ -23,7 +23,7 @@ FILE: localDeclarationsInEnumEntry.kt } local final? [ContainingClassKey=] class Nested : R|kotlin/Any| { - public? [ContainingClassKey=Nested] constructor(): R|/Nested| { + public? [ContainingClassKey=Nested] constructor(): R|/.Nested| { super() }