diff --git a/compiler/fir/analysis-tests/testData/resolve/NestedSuperType.fir.txt b/compiler/fir/analysis-tests/testData/resolve/NestedSuperType.fir.txt index 3c76d6b8d40..0d5caa3ed76 100644 --- a/compiler/fir/analysis-tests/testData/resolve/NestedSuperType.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/NestedSuperType.fir.txt @@ -1,4 +1,6 @@ FILE: NestedSuperType.kt + package p + public abstract class My : R|kotlin/Any| { public constructor(): R|p/My| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/TwoDeclarationsInSameFile.fir.txt b/compiler/fir/analysis-tests/testData/resolve/TwoDeclarationsInSameFile.fir.txt index d7193def9f8..4560afaec7d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/TwoDeclarationsInSameFile.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/TwoDeclarationsInSameFile.fir.txt @@ -1,4 +1,6 @@ FILE: TwoDeclarationsInSameFile.kt + package p + public open class A : R|kotlin/Any| { public constructor(): R|p/A| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/asImports.fir.txt b/compiler/fir/analysis-tests/testData/resolve/asImports.fir.txt index e4b0a5fa27d..840bf1012a1 100644 --- a/compiler/fir/analysis-tests/testData/resolve/asImports.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/asImports.fir.txt @@ -1,4 +1,6 @@ FILE: A.kt + package foo + public final class A : R|kotlin/Any| { public constructor(): R|foo/A| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/companion.fir.txt b/compiler/fir/analysis-tests/testData/resolve/companion.fir.txt index 99614fe0269..493f67a5ae6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/companion.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/companion.fir.txt @@ -1,4 +1,6 @@ FILE: companion.kt + package test + public abstract class Some : R|kotlin/Any| { public constructor(): R|test/Some| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/defaultJavaImportHiding.fir.txt b/compiler/fir/analysis-tests/testData/resolve/defaultJavaImportHiding.fir.txt index 335695f9393..55ceedf18cd 100644 --- a/compiler/fir/analysis-tests/testData/resolve/defaultJavaImportHiding.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/defaultJavaImportHiding.fir.txt @@ -1,4 +1,6 @@ FILE: LinkedList.kt + package foo + public final class LinkedList : R|java/util/LinkedList| { public constructor(): R|foo/LinkedList| { super|>() @@ -6,6 +8,8 @@ FILE: LinkedList.kt } FILE: HashSet.kt + package util + public final class HashSet : R|java/util/HashSet| { public constructor(): R|util/HashSet| { super|>() @@ -13,6 +17,8 @@ FILE: HashSet.kt } FILE: main.kt + package foo + public final class LinkedHashMap : R|java/util/LinkedHashMap| { public constructor(): R|foo/LinkedHashMap| { super|>() diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/multipleBounds.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/multipleBounds.fir.txt index b52b8c689f3..677f44e8f23 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/multipleBounds.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/multipleBounds.fir.txt @@ -1,4 +1,6 @@ FILE: multipleBounds.kt + package Jet87 + public open class A : R|kotlin/Any| { public constructor(): R|Jet87/A| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/testIllegalAnnotationClass.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/testIllegalAnnotationClass.fir.txt index 2308301aeae..d405188ea0b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/testIllegalAnnotationClass.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/testIllegalAnnotationClass.fir.txt @@ -1,4 +1,6 @@ FILE: KotlinImporterComponent.kt + package simulation + @R|simulation/State|(name = String(AutoImportedSourceRoots)) public final class KotlinImporterComponent : R|kotlin/Any| { public constructor(): R|simulation/KotlinImporterComponent| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeArgumentsNotAllowed.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeArgumentsNotAllowed.fir.txt index 0595a0eec0b..e0f11693af5 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeArgumentsNotAllowed.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeArgumentsNotAllowed.fir.txt @@ -1,4 +1,6 @@ FILE: typeArgumentsNotAllowed.kt + package rest + public abstract class Foo : R|kotlin/Any| { public constructor(): R|rest/Foo| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.fir.txt index 55139a3c5a5..fbbcc0f826a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.fir.txt @@ -1,4 +1,6 @@ FILE: CallBasedInExpressionGenerator.kt + package org.jetbrains.kotlin.codegen.range.inExpression + public abstract interface ExpressionCodegen : R|kotlin/Any| { } public abstract interface KtSimpleNameExpression : R|kotlin/Any| { diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/qualifiedExpressions.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/qualifiedExpressions.fir.txt index c442a47f482..b4130111d98 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/qualifiedExpressions.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/qualifiedExpressions.fir.txt @@ -1,4 +1,6 @@ FILE: qualifiedExpressions.kt + package a.b + public final class C : R|kotlin/Any| { public constructor(): R|a/b/C| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/fromBuilder/complexTypes.fir.txt b/compiler/fir/analysis-tests/testData/resolve/fromBuilder/complexTypes.fir.txt index 56cf7d1c115..5b382e9fe45 100644 --- a/compiler/fir/analysis-tests/testData/resolve/fromBuilder/complexTypes.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/fromBuilder/complexTypes.fir.txt @@ -1,4 +1,6 @@ FILE: complexTypes.kt + package a.b + public final class C : R|kotlin/Any| { public constructor(): R|a/b/C| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/multifile/Annotations.fir.txt b/compiler/fir/analysis-tests/testData/resolve/multifile/Annotations.fir.txt index 4cdb1d6d46b..409cdf21619 100644 --- a/compiler/fir/analysis-tests/testData/resolve/multifile/Annotations.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/multifile/Annotations.fir.txt @@ -1,4 +1,6 @@ FILE: annotations.kt + package annotations + @R|kotlin/annotation/Target|(allowedTargets = vararg(Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.FILE|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.FUNCTION|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.TYPE|, Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.PROPERTY_GETTER|)) public final annotation class Simple : R|kotlin/Annotation| { public constructor(): R|annotations/Simple| { super() @@ -58,6 +60,8 @@ FILE: annotations.kt } FILE: main.kt @FILE:R|annotations/Simple|() + package test + @R|annotations/WithInt|(value = Int(42)) public abstract class First : R|kotlin/Any| { public constructor(): R|test/First| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/multifile/ByteArray.fir.txt b/compiler/fir/analysis-tests/testData/resolve/multifile/ByteArray.fir.txt index 81d92c24037..10c085404de 100644 --- a/compiler/fir/analysis-tests/testData/resolve/multifile/ByteArray.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/multifile/ByteArray.fir.txt @@ -1,10 +1,14 @@ FILE: byteArray.kt + package Test + public abstract interface ByteArray : R|kotlin/Any| { public abstract val array: R|Test/ByteArray| public get(): R|Test/ByteArray| } FILE: main.kt + package use + public abstract interface My : R|kotlin/Any| { public abstract val array: R|kotlin/ByteArray| public get(): R|kotlin/ByteArray| diff --git a/compiler/fir/analysis-tests/testData/resolve/multifile/NestedSuperType.fir.txt b/compiler/fir/analysis-tests/testData/resolve/multifile/NestedSuperType.fir.txt index 2075d3ef696..d34e7cf3c1e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/multifile/NestedSuperType.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/multifile/NestedSuperType.fir.txt @@ -1,4 +1,6 @@ FILE: C.kt + package c + public open class C : R|kotlin/Any| { public constructor(): R|c/C| { super() @@ -13,6 +15,8 @@ FILE: C.kt } FILE: B.kt + package b + public open class B : R|c/C| { public constructor(): R|b/B| { super() @@ -27,6 +31,8 @@ FILE: B.kt } FILE: A.kt + package a + public final class A : R|b/B| { public constructor(): R|a/A| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/multifile/TypeAliasExpansion.fir.txt b/compiler/fir/analysis-tests/testData/resolve/multifile/TypeAliasExpansion.fir.txt index 5011be1a648..105af73a5d2 100644 --- a/compiler/fir/analysis-tests/testData/resolve/multifile/TypeAliasExpansion.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/multifile/TypeAliasExpansion.fir.txt @@ -1,4 +1,6 @@ FILE: B.kt + package b + public final class A : R|kotlin/Any| { public constructor(): R|b/A| { super() @@ -7,6 +9,8 @@ FILE: B.kt } public final typealias TA = R|b/A| FILE: A.kt + package a + public final class MyClass : R|b/TA| { public constructor(): R|a/MyClass| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/multifile/importFromObject.fir.txt b/compiler/fir/analysis-tests/testData/resolve/multifile/importFromObject.fir.txt index 272fa212f1a..5d5542cf752 100644 --- a/compiler/fir/analysis-tests/testData/resolve/multifile/importFromObject.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/multifile/importFromObject.fir.txt @@ -1,4 +1,6 @@ FILE: a.kt + package a + public final object A : R|kotlin/Any| { private constructor(): R|a/A| { super() @@ -9,6 +11,8 @@ FILE: a.kt } FILE: b.kt + package b + public final fun bar(): R|kotlin/Unit| { Q|a/A|.R|a/A.foo|() } diff --git a/compiler/fir/analysis-tests/testData/resolve/multifile/sealedStarImport.fir.txt b/compiler/fir/analysis-tests/testData/resolve/multifile/sealedStarImport.fir.txt index 60523804a15..c3d78ed2175 100644 --- a/compiler/fir/analysis-tests/testData/resolve/multifile/sealedStarImport.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/multifile/sealedStarImport.fir.txt @@ -1,4 +1,6 @@ FILE: test.kt + package test + public sealed class Test : R|kotlin/Any| { protected constructor(): R|test/Test| { super() @@ -23,6 +25,8 @@ FILE: test.kt } FILE: main.kt + package other + public abstract class Factory : R|kotlin/Any| { public constructor(): R|other/Factory| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/multifile/simpleAliasedImport.fir.txt b/compiler/fir/analysis-tests/testData/resolve/multifile/simpleAliasedImport.fir.txt index 3b4d27cad9b..bd5a6c11a47 100644 --- a/compiler/fir/analysis-tests/testData/resolve/multifile/simpleAliasedImport.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/multifile/simpleAliasedImport.fir.txt @@ -1,4 +1,6 @@ FILE: B.kt + package b + public abstract class MyClass : R|kotlin/Any| { public constructor(): R|b/MyClass| { super() @@ -12,6 +14,8 @@ FILE: B.kt public abstract interface I : R|kotlin/Any| { } FILE: A.kt + package a + public final class YourClass : R|b/MyClass| { public constructor(): R|a/YourClass| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/multifile/simpleImport.fir.txt b/compiler/fir/analysis-tests/testData/resolve/multifile/simpleImport.fir.txt index 3b4d27cad9b..bd5a6c11a47 100644 --- a/compiler/fir/analysis-tests/testData/resolve/multifile/simpleImport.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/multifile/simpleImport.fir.txt @@ -1,4 +1,6 @@ FILE: B.kt + package b + public abstract class MyClass : R|kotlin/Any| { public constructor(): R|b/MyClass| { super() @@ -12,6 +14,8 @@ FILE: B.kt public abstract interface I : R|kotlin/Any| { } FILE: A.kt + package a + public final class YourClass : R|b/MyClass| { public constructor(): R|a/YourClass| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/multifile/simpleImportNested.fir.txt b/compiler/fir/analysis-tests/testData/resolve/multifile/simpleImportNested.fir.txt index 849c696ad97..93b9f4ea0ab 100644 --- a/compiler/fir/analysis-tests/testData/resolve/multifile/simpleImportNested.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/multifile/simpleImportNested.fir.txt @@ -1,4 +1,6 @@ FILE: A.kt + package a + public final class MyClass : R|kotlin/Any| { public constructor(): R|a/MyClass| { super() @@ -13,6 +15,8 @@ FILE: A.kt } FILE: B.kt + package b + public final class YourClass : R|a/MyClass.MyNested| { public constructor(): R|b/YourClass| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/multifile/simpleImportOuter.fir.txt b/compiler/fir/analysis-tests/testData/resolve/multifile/simpleImportOuter.fir.txt index 5cfb396ac82..d603afc0b6c 100644 --- a/compiler/fir/analysis-tests/testData/resolve/multifile/simpleImportOuter.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/multifile/simpleImportOuter.fir.txt @@ -1,4 +1,6 @@ FILE: A.kt + package a + public final class Outer : R|kotlin/Any| { public constructor(): R|a/Outer| { super() @@ -13,6 +15,8 @@ FILE: A.kt } FILE: B.kt + package b + public final class My : R|a/Outer.Nested| { public constructor(): R|b/My| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/multifile/simpleStarImport.fir.txt b/compiler/fir/analysis-tests/testData/resolve/multifile/simpleStarImport.fir.txt index e8407a7c501..e7ab8725f22 100644 --- a/compiler/fir/analysis-tests/testData/resolve/multifile/simpleStarImport.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/multifile/simpleStarImport.fir.txt @@ -1,4 +1,6 @@ FILE: B.kt + package b.d + public abstract expect interface Other : R|kotlin/Any| { } public final expect class Another : R|kotlin/Any| { @@ -6,6 +8,8 @@ FILE: B.kt public final fun baz(): R|kotlin/Unit| { } FILE: A.kt + package a.d + public final fun foo(arg: R|b/d/Other|): R|b/d/Another| public final fun bar(): R|kotlin/Unit| { R|b/d/baz|() diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.fir.txt b/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.fir.txt index 6b818655fa7..96cb1ed653f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.fir.txt @@ -1,4 +1,6 @@ FILE: main.kt + package foo + public final fun test(): R|kotlin/Unit| { lval some: R|foo/Some| = R|foo/Some.Some|() lval another: = #() diff --git a/compiler/fir/analysis-tests/testData/resolve/qualifierWithCompanion.fir.txt b/compiler/fir/analysis-tests/testData/resolve/qualifierWithCompanion.fir.txt index c9abb3485b0..801e88d7ca0 100644 --- a/compiler/fir/analysis-tests/testData/resolve/qualifierWithCompanion.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/qualifierWithCompanion.fir.txt @@ -1,4 +1,6 @@ FILE: qualifierWithCompanion.kt + package my + public final class A : R|kotlin/Any| { public constructor(): R|my/A| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/typeParameterVsNested.fir.txt b/compiler/fir/analysis-tests/testData/resolve/typeParameterVsNested.fir.txt index b37eebc8f4b..8906e27d0da 100644 --- a/compiler/fir/analysis-tests/testData/resolve/typeParameterVsNested.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/typeParameterVsNested.fir.txt @@ -1,4 +1,6 @@ FILE: typeParameterVsNested.kt + package test + public abstract interface Some : R|kotlin/Any| { public open fun test(): R|kotlin/Int| { ^test Int(10) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/diagnostics/initializerTypeMismatchChecker/functionType.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/diagnostics/initializerTypeMismatchChecker/functionType.fir.txt index 1e20796d8fa..9db3fae8b10 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/diagnostics/initializerTypeMismatchChecker/functionType.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/diagnostics/initializerTypeMismatchChecker/functionType.fir.txt @@ -1,4 +1,6 @@ FILE: TestCase1.kt + package testsCase1 + public final class Case : R|kotlin/Any| { public constructor(): R|testsCase1/Case| { super() diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/FieldVsSyntheticAccessor.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/FieldVsSyntheticAccessor.fir.txt index 8b0352800b2..3b7072d2ca3 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/FieldVsSyntheticAccessor.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/FieldVsSyntheticAccessor.fir.txt @@ -1,4 +1,6 @@ FILE: User.kt + package test + public final class User : R|BaseClass| { public constructor(): R|test/User| { super() diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/FieldAndGetter.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/FieldAndGetter.fir.txt index b67221d566d..74ebb1266d9 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/FieldAndGetter.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/FieldAndGetter.fir.txt @@ -1,4 +1,6 @@ FILE: test.kt + package some + public final fun test(jc: R|JavaClass|): R|kotlin/Unit| { R|/jc|.R|/JavaClass.field| } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/IntersectionTypesProblem.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/IntersectionTypesProblem.fir.txt index dd0d35c3280..3e7754470bb 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/IntersectionTypesProblem.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/IntersectionTypesProblem.fir.txt @@ -1,4 +1,6 @@ FILE: test.kt + package jvm + public final fun select(x: R|K|, y: R|K|): R|K| { ^select R|/x| } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/JavaVisibility2.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/JavaVisibility2.fir.txt index 79a4de66c35..66e5aea8e21 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/JavaVisibility2.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/JavaVisibility2.fir.txt @@ -1,4 +1,6 @@ FILE: k.kt + package k + public final class A : R|kotlin/Any| { public constructor(): R|k/A| { super() @@ -40,6 +42,8 @@ FILE: k.kt } FILE: j.kt + package j + public final class C : R|kotlin/Any| { public constructor(): R|j/C| { super() diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/multiModule/Basic.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/multiModule/Basic.fir.txt index bd1c6543b33..e3691dd93c9 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/multiModule/Basic.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/multiModule/Basic.fir.txt @@ -1,5 +1,7 @@ Module: m1 FILE: base.kt + package hello + public final class Hello : R|kotlin/Any| { public constructor(msg: R|kotlin/String|): R|hello/Hello| { super() @@ -20,6 +22,8 @@ FILE: base.kt } Module: m2 FILE: user.kt + package test + public final fun foo(hello: R|hello/Hello|): R|kotlin/String| { ^foo R|/hello|.R|hello/Hello.msg| } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index beadd86f716..865bc2adde3 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -42,7 +42,7 @@ fun FirElement.renderWithType(mode: FirRenderer.RenderMode = FirRenderer.RenderM fun FirElement.render(mode: FirRenderer.RenderMode = FirRenderer.RenderMode.Normal): String = buildString { this@render.accept(FirRenderer(this, mode)) } -class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderMode.Normal) : FirVisitorVoid() { +open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode = RenderMode.Normal) : FirVisitorVoid() { companion object { private val visibilitiesToRenderEffectiveSet = setOf( Visibilities.Private, Visibilities.PrivateToThis, Visibilities.Internal, @@ -442,7 +442,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM } - private fun List.renderDeclarations() { + protected fun List.renderDeclarations() { renderInBraces { for (declaration in this) { declaration.accept(this@FirRenderer) @@ -470,6 +470,10 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM regularClass.annotations.renderAnnotations() visitMemberDeclaration(regularClass) renderSupertypes(regularClass) + renderClassDeclarations(regularClass) + } + + protected open fun renderClassDeclarations(regularClass: FirRegularClass) { regularClass.declarations.renderDeclarations() } @@ -1432,7 +1436,10 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM override fun visitPackageDirective(packageDirective: FirPackageDirective) { if (mode.renderPackageDirective) { - println("package ${packageDirective.packageFqName.asString()}") + if (!packageDirective.packageFqName.isRoot) { + println("package ${packageDirective.packageFqName.asString()}") + println() + } } } } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDumpHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDumpHandler.kt index d81cfb833bc..caffadf8b15 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDumpHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDumpHandler.kt @@ -5,7 +5,20 @@ package org.jetbrains.kotlin.test.frontend.fir.handlers -import org.jetbrains.kotlin.fir.render +import org.jetbrains.kotlin.fir.FirRenderer +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.builder.buildPackageDirective +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.builder.buildFile +import org.jetbrains.kotlin.fir.extensions.declarationGenerators +import org.jetbrains.kotlin.fir.extensions.extensionService +import org.jetbrains.kotlin.fir.moduleData +import org.jetbrains.kotlin.fir.resolve.symbolProvider +import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope +import org.jetbrains.kotlin.fir.scopes.processClassifiersByName +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives import org.jetbrains.kotlin.test.directives.model.DirectivesContainer import org.jetbrains.kotlin.test.frontend.fir.FirOutputArtifact @@ -13,6 +26,7 @@ import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.moduleStructure import org.jetbrains.kotlin.test.utils.MultiModuleInfoDumper +import java.lang.StringBuilder class FirDumpHandler( testServices: TestServices @@ -22,11 +36,40 @@ class FirDumpHandler( override val directiveContainers: List get() = listOf(FirDiagnosticsDirectives) + @OptIn(SymbolInternals::class) override fun processModule(module: TestModule, info: FirOutputArtifact) { if (FirDiagnosticsDirectives.FIR_DUMP !in module.directives) return val builderForModule = dumper.builderForModule(module) val firFiles = info.firFiles - firFiles.values.forEach { builderForModule.append(it.render()) } + + val symbolProvider = info.session.symbolProvider + val declarationGenerators = info.session.extensionService.declarationGenerators + val topLevelClasses = declarationGenerators.flatMap { it.getTopLevelClassIds() }.groupBy { it.packageFqName } + val topLevelCallables = declarationGenerators.flatMap { it.getTopLevelCallableIds() }.groupBy { it.packageName } + + val allFiles = buildList { + addAll(firFiles.values) + for (packageFqName in (topLevelClasses.keys + topLevelCallables.keys)) { + this += buildFile { + origin = FirDeclarationOrigin.Synthetic + moduleData = info.session.moduleData + packageDirective = buildPackageDirective { + this.packageFqName = packageFqName + } + name = "### GENERATED DECLARATIONS ###" + declarations += topLevelCallables.getOrDefault(packageFqName, emptyList()) + .flatMap { symbolProvider.getTopLevelCallableSymbols(packageFqName, it.callableName) } + .map { it.fir } + declarations += topLevelClasses.getOrDefault(packageFqName, emptyList()) + .mapNotNull { symbolProvider.getClassLikeSymbolByClassId(it)?.fir } + } + } + } + + val renderer = FirRendererWithGeneratedDeclarations(info.session, builderForModule) + allFiles.forEach { + it.accept(renderer) + } } override fun processAfterAllModules(someAssertionWasFailed: Boolean) { @@ -37,4 +80,44 @@ class FirDumpHandler( val actualText = dumper.generateResultingDump() assertions.assertEqualsToFile(expectedFile, actualText, message = { "Content is not equal" }) } + + private class FirRendererWithGeneratedDeclarations( + val session: FirSession, + builder: StringBuilder, + ) : FirRenderer(builder, modeWithPackageDirective) { + companion object { + val modeWithPackageDirective = RenderMode.Normal.copy(renderPackageDirective = true) + } + + override fun renderClassDeclarations(regularClass: FirRegularClass) { + val allDeclarations = buildList { + addAll(regularClass.declarations) + + @OptIn(SymbolInternals::class) + fun addGeneratedDeclaration(symbol: FirBasedSymbol<*>) { + val declaration = symbol.fir + if (declaration.origin.generated) { + add(declaration) + } + } + + val scope = session.declaredMemberScope(regularClass) + for (callableName in scope.getCallableNames()) { + scope.processFunctionsByName(callableName) { + addGeneratedDeclaration(it) + } + scope.processPropertiesByName(callableName) { + addGeneratedDeclaration(it) + } + } + + for (classifierName in scope.getClassifierNames()) { + scope.processClassifiersByName(classifierName) { + addGeneratedDeclaration(it) + } + } + } + allDeclarations.renderDeclarations() + } + } }