From 3e8f7b8ee4bfbd7db805f20085783e9287bcccc9 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Wed, 23 Nov 2022 18:55:21 +0000 Subject: [PATCH] [FIR] Make enum entry initializer lazy in RawFirBuilder Third step for KT-52615 Merge-request: KT-MR-7769 Merged-by: Egor Kulikov --- .../lazy/resolve/FirLazyBodiesCalculator.kt | 23 +++++ .../RawFirNonLocalDeclarationBuilder.kt | 23 ++++- .../FirLazyBodiesCalculatorTestGenerated.java | 6 ++ ...ghtTree2FirConverterTestCaseGenerated.java | 5 + .../kotlin/fir/builder/RawFirBuilder.kt | 92 ++++++++++--------- .../declarations/annotation.lazyBodies.txt | 16 +--- .../constructorInObject.lazyBodies.txt | 12 +-- .../declarations/enums.lazyBodies.txt | 92 ++----------------- .../declarations/enums2.lazyBodies.txt | 24 +---- .../rawBuilder/declarations/enums3.kt | 29 ++++++ .../declarations/enums3.lazyBodies.txt | 80 ++++++++++++++++ .../rawBuilder/declarations/enums3.txt | 80 ++++++++++++++++ ...FirBuilderLazyBodiesTestCaseGenerated.java | 5 + .../RawFirBuilderTestCaseGenerated.java | 5 + .../FirVisualizerForRawFirDataGenerated.java | 6 ++ .../PsiVisualizerForRawFirDataGenerated.java | 6 ++ 16 files changed, 328 insertions(+), 176 deletions(-) create mode 100644 compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.kt create mode 100644 compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.lazyBodies.txt create mode 100644 compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.txt diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyBodiesCalculator.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyBodiesCalculator.kt index ca24b2f5519..ee5c7437324 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyBodiesCalculator.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyBodiesCalculator.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.scopes.kotlinScopeProvider import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.transformSingle +import org.jetbrains.kotlin.psi.KtEnumEntry import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtSecondaryConstructor @@ -118,6 +119,20 @@ internal object FirLazyBodiesCalculator { } } + fun calculateLazyInitializerForEnumEntry(designation: FirDeclarationDesignation) { + val enumEntry = designation.declaration as FirEnumEntry + require(enumEntry.initializer is FirLazyExpression) + val newEntry = RawFirNonLocalDeclarationBuilder.buildWithFunctionSymbolRebind( + session = enumEntry.moduleData.session, + scopeProvider = enumEntry.moduleData.session.kotlinScopeProvider, + designation = designation, + rootNonLocalDeclaration = enumEntry.psi as KtEnumEntry, + ) as FirEnumEntry + enumEntry.apply { + replaceInitializer(newEntry.initializer) + } + } + fun needCalculatingLazyBodyForProperty(firProperty: FirProperty): Boolean = firProperty.getter?.body is FirLazyBlock || firProperty.setter?.body is FirLazyBlock @@ -179,4 +194,12 @@ private object FirLazyBodiesCalculatorTransformer : FirTransformer): FirStatement { return propertyAccessor.also { transformProperty(it.propertySymbol.fir, data) } } + + override fun transformEnumEntry(enumEntry: FirEnumEntry, data: PersistentList): FirStatement { + if (enumEntry.initializer is FirLazyExpression) { + val designation = FirDeclarationDesignation(data, enumEntry) + FirLazyBodiesCalculator.calculateLazyInitializerForEnumEntry(designation) + } + return enumEntry + } } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt index 5a4588987f6..732e83d8c22 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve import com.intellij.psi.PsiElement import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDeclarationDesignation +import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment +import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.builder.BodyBuildingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder @@ -31,7 +33,6 @@ internal class RawFirNonLocalDeclarationBuilder private constructor( private val functionsToRebind: Set? = null, private val replacementApplier: RawFirReplacement.Applier? = null ) : RawFirBuilder(session, baseScopeProvider, bodyBuildingMode = BodyBuildingMode.NORMAL) { - companion object { fun buildWithReplacement( session: FirSession, @@ -95,7 +96,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor( } } - private inner class VisitorWithReplacement : Visitor() { + private inner class VisitorWithReplacement(private val containingClass: FirRegularClass?) : Visitor() { override fun convertElement(element: KtElement): FirElement? = super.convertElement(replacementApplier?.tryReplace(element) ?: element) @@ -130,11 +131,27 @@ internal class RawFirNonLocalDeclarationBuilder private constructor( additionalAnnotations = additionalAnnotations ) } + + override fun visitEnumEntry(enumEntry: KtEnumEntry, data: Unit?): FirElement { + val owner = containingClass ?: buildErrorWithAttachment("Enum entry outside of class") { + withPsiEntry("enumEntry", enumEntry) + } + val classOrObject = owner.psi as KtClassOrObject + val primaryConstructor = classOrObject.primaryConstructor + val ownerClassHasDefaultConstructor = + primaryConstructor?.valueParameters?.isEmpty() ?: classOrObject.secondaryConstructors.let { constructors -> + constructors.isEmpty() || constructors.any { it.valueParameters.isEmpty() } + } + val typeParameters = mutableListOf() + context.appendOuterTypeParameters(ignoreLastLevel = false, typeParameters) + val selfType = classOrObject.toDelegatedSelfType(typeParameters, owner.symbol) + return enumEntry.toFirEnumEntry(selfType, ownerClassHasDefaultConstructor) + } } private fun moveNext(iterator: Iterator, containingClass: FirRegularClass?): FirDeclaration { if (!iterator.hasNext()) { - val visitor = VisitorWithReplacement() + val visitor = VisitorWithReplacement(containingClass) return when (declarationToBuild) { is KtProperty -> { val ownerSymbol = containingClass?.symbol diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyBodiesCalculatorTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyBodiesCalculatorTestGenerated.java index 35d5bc8ea27..bc306a060ab 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyBodiesCalculatorTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyBodiesCalculatorTestGenerated.java @@ -105,6 +105,12 @@ public class FirLazyBodiesCalculatorTestGenerated extends AbstractFirLazyBodiesC runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.kt"); } + @Test + @TestMetadata("enums3.kt") + public void testEnums3() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.kt"); + } + @Test @TestMetadata("expectActual.kt") public void testExpectActual() throws Exception { diff --git a/compiler/fir/raw-fir/light-tree2fir/tests-gen/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTestCaseGenerated.java b/compiler/fir/raw-fir/light-tree2fir/tests-gen/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTestCaseGenerated.java index 0474c8d0210..f69cb9ab9e6 100644 --- a/compiler/fir/raw-fir/light-tree2fir/tests-gen/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTestCaseGenerated.java +++ b/compiler/fir/raw-fir/light-tree2fir/tests-gen/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTestCaseGenerated.java @@ -101,6 +101,11 @@ public class LightTree2FirConverterTestCaseGenerated extends AbstractLightTree2F runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.kt"); } + @TestMetadata("enums3.kt") + public void testEnums3() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.kt"); + } + @TestMetadata("expectActual.kt") public void testExpectActual() throws Exception { runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectActual.kt"); 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 22789e18e31..f1d761ed521 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 @@ -306,9 +306,7 @@ open class RawFirBuilder( primaryConstructor?.valueParameters?.isEmpty() ?: owner.secondaryConstructors.let { constructors -> constructors.isEmpty() || constructors.any { it.valueParameters.isEmpty() } } - disabledLazyMode { - toFirEnumEntry(delegatedSelfType, ownerClassHasDefaultConstructor) - } + toFirEnumEntry(delegatedSelfType, ownerClassHasDefaultConstructor) } is KtProperty -> { convertProperty( @@ -1003,7 +1001,7 @@ open class RawFirBuilder( } } - private fun KtEnumEntry.toFirEnumEntry( + protected fun KtEnumEntry.toFirEnumEntry( delegatedEnumSelfTypeRef: FirResolvedTypeRef, ownerClassHasDefaultConstructor: Boolean ): FirDeclaration { @@ -1026,49 +1024,55 @@ open class RawFirBuilder( return@buildEnumEntry } extractAnnotationsTo(this) - initializer = withChildClassName(nameAsSafeName, isExpect = false) { - buildAnonymousObjectExpression { - val enumEntrySource = toFirSourceElement(KtFakeSourceElementKind.EnumInitializer) - source = enumEntrySource - anonymousObject = buildAnonymousObject { + initializer = buildOrLazyExpression(toFirSourceElement(KtFakeSourceElementKind.EnumInitializer)) { + withChildClassName(nameAsSafeName, isExpect = false) { + buildAnonymousObjectExpression { + val enumEntrySource = toFirSourceElement(KtFakeSourceElementKind.EnumInitializer) source = enumEntrySource - moduleData = baseModuleData - origin = FirDeclarationOrigin.Source - classKind = ClassKind.ENUM_ENTRY - scopeProvider = this@RawFirBuilder.baseScopeProvider - symbol = FirAnonymousObjectSymbol() - status = FirDeclarationStatusImpl(Visibilities.Local, Modality.FINAL) + anonymousObject = buildAnonymousObject { + source = enumEntrySource + moduleData = baseModuleData + origin = FirDeclarationOrigin.Source + classKind = ClassKind.ENUM_ENTRY + scopeProvider = this@RawFirBuilder.baseScopeProvider + symbol = FirAnonymousObjectSymbol() + status = FirDeclarationStatusImpl(Visibilities.Local, Modality.FINAL) - val delegatedEntrySelfType = buildResolvedTypeRef { - type = - ConeClassLikeTypeImpl(this@buildAnonymousObject.symbol.toLookupTag(), emptyArray(), isNullable = false) - } - registerSelfType(delegatedEntrySelfType) + val delegatedEntrySelfType = buildResolvedTypeRef { + type = + ConeClassLikeTypeImpl( + this@buildAnonymousObject.symbol.toLookupTag(), + emptyArray(), + isNullable = false + ) + } + registerSelfType(delegatedEntrySelfType) - superTypeRefs += delegatedEnumSelfTypeRef - val superTypeCallEntry = superTypeListEntries.firstIsInstanceOrNull() - val correctedEnumSelfTypeRef = buildResolvedTypeRef { - source = superTypeCallEntry?.calleeExpression?.typeReference?.toFirSourceElement() - type = delegatedEnumSelfTypeRef.type - } - declarations += primaryConstructor.toFirConstructor( - superTypeCallEntry, - correctedEnumSelfTypeRef, - delegatedEntrySelfType, - owner = ktEnumEntry, - typeParameters, - containingClassIsExpectClass - ) - // Use ANONYMOUS_OBJECT_NAME for the owner class id for enum entry declarations (see KT-42351) - withChildClassName(SpecialNames.ANONYMOUS, forceLocalContext = true, isExpect = false) { - for (declaration in ktEnumEntry.declarations) { - declarations += declaration.toFirDeclaration( - correctedEnumSelfTypeRef, - delegatedSelfType = delegatedEntrySelfType, - ktEnumEntry, - ownerClassBuilder = this, - ownerTypeParameters = emptyList() - ) + superTypeRefs += delegatedEnumSelfTypeRef + val superTypeCallEntry = superTypeListEntries.firstIsInstanceOrNull() + val correctedEnumSelfTypeRef = buildResolvedTypeRef { + source = superTypeCallEntry?.calleeExpression?.typeReference?.toFirSourceElement() + type = delegatedEnumSelfTypeRef.type + } + declarations += primaryConstructor.toFirConstructor( + superTypeCallEntry, + correctedEnumSelfTypeRef, + delegatedEntrySelfType, + owner = ktEnumEntry, + typeParameters, + containingClassIsExpectClass + ) + // Use ANONYMOUS_OBJECT_NAME for the owner class id for enum entry declarations (see KT-42351) + withChildClassName(SpecialNames.ANONYMOUS, forceLocalContext = true, isExpect = false) { + for (declaration in ktEnumEntry.declarations) { + declarations += declaration.toFirDeclaration( + correctedEnumSelfTypeRef, + delegatedSelfType = delegatedEntrySelfType, + ktEnumEntry, + ownerClassBuilder = this, + ownerTypeParameters = emptyList() + ) + } } } } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.lazyBodies.txt index 490dbc6a351..d4597cc2897 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.lazyBodies.txt @@ -29,20 +29,8 @@ FILE: annotation.kt super|>() } - @base() public final static enum entry FIRST: R|My| = object : R|My| { - private constructor(): R|| { - super() - } - - } - - @base() public final static enum entry SECOND: R|My| = object : R|My| { - private constructor(): R|| { - super() - } - - } - + @base() public final static enum entry FIRST: R|My| = LAZY_EXPRESSION + @base() public final static enum entry SECOND: R|My| = LAZY_EXPRESSION public final static fun values(): R|kotlin/Array| { } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/constructorInObject.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/constructorInObject.lazyBodies.txt index bb010bfaa3c..9f9547201e0 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/constructorInObject.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/constructorInObject.lazyBodies.txt @@ -13,17 +13,7 @@ FILE: constructorInObject.kt super|>() } - public final static enum entry X: R|B| = object : R|B| { - private constructor(): R|| { - super() - } - - public? constructor(): R|| { - super() - } - - } - + public final static enum entry X: R|B| = LAZY_EXPRESSION public final static fun values(): R|kotlin/Array| { } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.lazyBodies.txt index 8ee85bc4ad6..b88962957a9 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.lazyBodies.txt @@ -28,39 +28,9 @@ FILE: enums.kt internal final? val r: Double = R|/r| internal get(): Double - public final static enum entry MERCURY: R|Planet| = object : R|Planet| { - private constructor(): R|| { - super(Double(1.0), Double(2.0)) - } - - public? open? override fun sayHello(): R|kotlin/Unit| { - println#(String(Hello!!!)) - } - - } - - public final static enum entry VENERA: R|Planet| = object : R|Planet| { - private constructor(): R|| { - super(Double(3.0), Double(4.0)) - } - - public? open? override fun sayHello(): R|kotlin/Unit| { - println#(String(Ola!!!)) - } - - } - - public final static enum entry EARTH: R|Planet| = object : R|Planet| { - private constructor(): R|| { - super(Double(5.0), Double(6.0)) - } - - public? open? override fun sayHello(): R|kotlin/Unit| { - println#(String(Privet!!!)) - } - - } - + public final static enum entry MERCURY: R|Planet| = LAZY_EXPRESSION + public final static enum entry VENERA: R|Planet| = LAZY_EXPRESSION + public final static enum entry EARTH: R|Planet| = LAZY_EXPRESSION public? final? val g: Double = LAZY_EXPRESSION public? get(): Double @@ -94,55 +64,13 @@ FILE: enums.kt public? final? val signature: String = R|/signature| public? get(): String - public final static enum entry FIX_STACK_BEFORE_JUMP: R|PseudoInsn| = object : R|PseudoInsn| { - private constructor(): R|| { - super() - } - - } - - public final static enum entry FAKE_ALWAYS_TRUE_IFEQ: R|PseudoInsn| = object : R|PseudoInsn| { - private constructor(): R|| { - super(String(()I)) - } - - } - - public final static enum entry FAKE_ALWAYS_FALSE_IFEQ: R|PseudoInsn| = object : R|PseudoInsn| { - private constructor(): R|| { - super(String(()I)) - } - - } - - public final static enum entry SAVE_STACK_BEFORE_TRY: R|PseudoInsn| = object : R|PseudoInsn| { - private constructor(): R|| { - super() - } - - } - - public final static enum entry RESTORE_STACK_IN_TRY_CATCH: R|PseudoInsn| = object : R|PseudoInsn| { - private constructor(): R|| { - super() - } - - } - - public final static enum entry STORE_NOT_NULL: R|PseudoInsn| = object : R|PseudoInsn| { - private constructor(): R|| { - super() - } - - } - - public final static enum entry AS_NOT_NULL: R|PseudoInsn| = object : R|PseudoInsn| { - private constructor(): R|| { - super(String((Ljava/lang/Object;)Ljava/lang/Object;)) - } - - } - + public final static enum entry FIX_STACK_BEFORE_JUMP: R|PseudoInsn| = LAZY_EXPRESSION + public final static enum entry FAKE_ALWAYS_TRUE_IFEQ: R|PseudoInsn| = LAZY_EXPRESSION + public final static enum entry FAKE_ALWAYS_FALSE_IFEQ: R|PseudoInsn| = LAZY_EXPRESSION + public final static enum entry SAVE_STACK_BEFORE_TRY: R|PseudoInsn| = LAZY_EXPRESSION + public final static enum entry RESTORE_STACK_IN_TRY_CATCH: R|PseudoInsn| = LAZY_EXPRESSION + public final static enum entry STORE_NOT_NULL: R|PseudoInsn| = LAZY_EXPRESSION + public final static enum entry AS_NOT_NULL: R|PseudoInsn| = LAZY_EXPRESSION public? final? fun emit(): R|kotlin/Unit| { LAZY_BLOCK } public final static fun values(): R|kotlin/Array| { diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.lazyBodies.txt index 798ef4c2dd9..0b03bcfbe89 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.lazyBodies.txt @@ -21,28 +21,8 @@ FILE: enums2.kt public? final? val x: Some = R|/x| public? get(): Some - public final static enum entry FIRST: R|SomeEnum| = object : R|SomeEnum| { - private constructor(): R|| { - super(O1#) - } - - public? open? override fun check(y: Some): Boolean { - ^check Boolean(true) - } - - } - - public final static enum entry SECOND: R|SomeEnum| = object : R|SomeEnum| { - private constructor(): R|| { - super(O2#) - } - - public? open? override fun check(y: Some): Boolean { - ^check ==(y#, O2#) - } - - } - + public final static enum entry FIRST: R|SomeEnum| = LAZY_EXPRESSION + public final static enum entry SECOND: R|SomeEnum| = LAZY_EXPRESSION public? abstract fun check(y: Some): Boolean public final static fun values(): R|kotlin/Array| { diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.kt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.kt new file mode 100644 index 00000000000..4b874bf54ea --- /dev/null +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.kt @@ -0,0 +1,29 @@ +class C { + init { + enum class Planet(val m: Double, internal val r: Double) { + MERCURY(1.0, 2.0) { + override fun sayHello() { + println("Hello!!!") + } + }, + VENERA(3.0, 4.0) { + override fun sayHello() { + println("Ola!!!") + } + }, + EARTH(5.0, 6.0) { + override fun sayHello() { + println("Privet!!!") + } + }; + + val g: Double = G * m / (r * r) + + abstract fun sayHello() + + companion object { + const val G = 6.67e-11 + } + } + } +} diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.lazyBodies.txt new file mode 100644 index 00000000000..e9de670402f --- /dev/null +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.lazyBodies.txt @@ -0,0 +1,80 @@ +FILE: enums3.kt + public? final? class C : R|kotlin/Any| { + public? constructor(): R|C| { + super() + } + + init { + local final? enum class Planet : R|kotlin/Enum| { + private constructor(m: Double, r: Double): R|C.Planet| { + super|>() + } + + public? final? val m: Double = R|/m| + public? get(): Double + + internal final? val r: Double = R|/r| + internal get(): Double + + public final static enum entry MERCURY: R|C.Planet| = object : R|C.Planet| { + private constructor(): R|| { + super(Double(1.0), Double(2.0)) + } + + public? open? override fun sayHello(): R|kotlin/Unit| { + println#(String(Hello!!!)) + } + + } + + public final static enum entry VENERA: R|C.Planet| = object : R|C.Planet| { + private constructor(): R|| { + super(Double(3.0), Double(4.0)) + } + + public? open? override fun sayHello(): R|kotlin/Unit| { + println#(String(Ola!!!)) + } + + } + + public final static enum entry EARTH: R|C.Planet| = object : R|C.Planet| { + private constructor(): R|| { + super(Double(5.0), Double(6.0)) + } + + public? open? override fun sayHello(): R|kotlin/Unit| { + println#(String(Privet!!!)) + } + + } + + public? final? val g: Double = G#.times#(m#).div#(r#.times#(r#)) + public? get(): Double + + public? abstract fun sayHello(): R|kotlin/Unit| + + local final? companion object Companion : R|kotlin/Any| { + private constructor(): R|C.Planet.Companion| { + super() + } + + public? final? const val G: = Double(6.67E-11) + public? get(): + + } + + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|C.Planet| { + } + + public final static val entries: R|kotlin/enums/EnumEntries| + public get(): R|kotlin/enums/EnumEntries| + + } + + } + + } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.txt new file mode 100644 index 00000000000..6bc46321277 --- /dev/null +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.txt @@ -0,0 +1,80 @@ +FILE: enums3.kt + public? final? class C : R|kotlin/Any| { + public? [ContainingClassKey=C] constructor(): R|C| { + super() + } + + init { + local final? [ContainingClassKey=C] enum class Planet : R|kotlin/Enum| { + private [ContainingClassKey=Planet] constructor([CorrespondingProperty=/m] m: Double, [CorrespondingProperty=/r] r: Double): R|C.Planet| { + super|>() + } + + public? final? [IsFromPrimaryConstructor=true] val m: Double = R|/m| + public? [ContainingClassKey=Planet] get(): Double + + internal final? [IsFromPrimaryConstructor=true] val r: Double = R|/r| + internal [ContainingClassKey=Planet] get(): Double + + public final static [ContainingClassKey=Planet] enum entry MERCURY: R|C.Planet| = object : R|C.Planet| { + private [ContainingClassKey=] constructor(): R|| { + super(Double(1.0), Double(2.0)) + } + + public? open? override fun sayHello(): R|kotlin/Unit| { + println#(String(Hello!!!)) + } + + } + + public final static [ContainingClassKey=Planet] enum entry VENERA: R|C.Planet| = object : R|C.Planet| { + private [ContainingClassKey=] constructor(): R|| { + super(Double(3.0), Double(4.0)) + } + + public? open? override fun sayHello(): R|kotlin/Unit| { + println#(String(Ola!!!)) + } + + } + + public final static [ContainingClassKey=Planet] enum entry EARTH: R|C.Planet| = object : R|C.Planet| { + private [ContainingClassKey=] constructor(): R|| { + super(Double(5.0), Double(6.0)) + } + + public? open? override fun sayHello(): R|kotlin/Unit| { + println#(String(Privet!!!)) + } + + } + + public? final? val g: Double = G#.times#(m#).div#(r#.times#(r#)) + public? [ContainingClassKey=Planet] get(): Double + + public? abstract fun sayHello(): R|kotlin/Unit| + + local final? companion [ContainingClassKey=Planet] object Companion : R|kotlin/Any| { + private [ContainingClassKey=Companion] constructor(): R|C.Planet.Companion| { + super() + } + + public? final? const val G: = Double(6.67E-11) + public? [ContainingClassKey=Companion] get(): + + } + + public final static [ContainingClassKey=Planet] fun values(): R|kotlin/Array| { + } + + public final static [ContainingClassKey=Planet] fun valueOf(value: R|kotlin/String|): R|C.Planet| { + } + + public final static [ContainingClassKey=Planet] val entries: R|kotlin/enums/EnumEntries| + public get(): R|kotlin/enums/EnumEntries| + + } + + } + + } diff --git a/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderLazyBodiesTestCaseGenerated.java b/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderLazyBodiesTestCaseGenerated.java index 02d451b8ff1..a8c12dbdf32 100644 --- a/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderLazyBodiesTestCaseGenerated.java +++ b/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderLazyBodiesTestCaseGenerated.java @@ -101,6 +101,11 @@ public class RawFirBuilderLazyBodiesTestCaseGenerated extends AbstractRawFirBuil runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.kt"); } + @TestMetadata("enums3.kt") + public void testEnums3() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.kt"); + } + @TestMetadata("expectActual.kt") public void testExpectActual() throws Exception { runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectActual.kt"); diff --git a/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java b/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java index e935dbe94fc..6de3f44d522 100644 --- a/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java +++ b/compiler/fir/raw-fir/psi2fir/tests-gen/org/jetbrains/kotlin/fir/builder/RawFirBuilderTestCaseGenerated.java @@ -101,6 +101,11 @@ public class RawFirBuilderTestCaseGenerated extends AbstractRawFirBuilderTestCas runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.kt"); } + @TestMetadata("enums3.kt") + public void testEnums3() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.kt"); + } + @TestMetadata("expectActual.kt") public void testExpectActual() throws Exception { runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectActual.kt"); diff --git a/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java b/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java index 480782f7574..60e29ece537 100644 --- a/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java +++ b/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/fir/FirVisualizerForRawFirDataGenerated.java @@ -105,6 +105,12 @@ public class FirVisualizerForRawFirDataGenerated extends AbstractFirVisualizerTe runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.kt"); } + @Test + @TestMetadata("enums3.kt") + public void testEnums3() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.kt"); + } + @Test @TestMetadata("expectActual.kt") public void testExpectActual() throws Exception { diff --git a/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java b/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java index 7b41f478b96..cb1ed44fd66 100644 --- a/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java +++ b/compiler/visualizer/tests-gen/org/jetbrains/kotlin/visualizer/psi/PsiVisualizerForRawFirDataGenerated.java @@ -105,6 +105,12 @@ public class PsiVisualizerForRawFirDataGenerated extends AbstractPsiVisualizerTe runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.kt"); } + @Test + @TestMetadata("enums3.kt") + public void testEnums3() throws Exception { + runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.kt"); + } + @Test @TestMetadata("expectActual.kt") public void testExpectActual() throws Exception {