FIR: add declaration attributes checking to rawFirBuilder/lightTree tests

This commit is contained in:
Ilya Kirillov
2021-03-09 19:43:12 +01:00
parent 3bcc2fe476
commit dcf64779a9
43 changed files with 227 additions and 187 deletions
@@ -70,6 +70,10 @@ abstract class TypeRegistry<K : Any, V : Any> {
return idPerType.computeIfAbsent(kClass) { idCounter.getAndIncrement() }
}
fun allValuesThreadUnsafeForRendering(): Map<KClass<out K>, Int> {
return idPerType
}
protected val indices: Collection<Int>
get() = idPerType.values
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.lightTree
import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase
import org.jetbrains.kotlin.fir.builder.StubFirScopeProvider
import org.jetbrains.kotlin.fir.render
@@ -22,7 +23,7 @@ abstract class AbstractLightTree2FirConverterTestCase : AbstractRawFirBuilderTes
scopeProvider = StubFirScopeProvider,
stubMode = false
).buildFirFile(Paths.get(filePath))
val firDump = firFile.render()
val firDump = firFile.render(mode = FirRenderer.RenderMode.WithDeclarationAttributes)
val expectedFile = File(filePath.replace(".kt", ".txt"))
KotlinTestUtils.assertEqualsToFile(expectedFile, firDump)
@@ -1,12 +1,12 @@
FILE: F.kt
public? open class A : R|kotlin/Any| {
public? constructor(): R|A| {
public? [ContainingClassKey=A] constructor(): R|A| {
super<R|kotlin/Any|>()
}
}
public? final? class B : A {
public? constructor(): R|B| {
public? [ContainingClassKey=B] constructor(): R|B| {
super<<implicit>>()
}
@@ -1,11 +1,11 @@
FILE: NestedOfAliasedType.kt
public? abstract class A : R|kotlin/Any| {
public? constructor(): R|A| {
public? [ContainingClassKey=A] constructor(): R|A| {
super<R|kotlin/Any|>()
}
public? abstract class Nested : R|kotlin/Any| {
public? constructor(): R|A.Nested| {
public? [ContainingClassKey=Nested] constructor(): R|A.Nested| {
super<R|kotlin/Any|>()
}
@@ -14,12 +14,12 @@ FILE: NestedOfAliasedType.kt
}
public? final typealias TA = A
public? final? class B : TA {
public? constructor(): R|B| {
public? [ContainingClassKey=B] constructor(): R|B| {
super<TA>()
}
public? final? class NestedInB : Nested {
public? constructor(): R|B.NestedInB| {
public? [ContainingClassKey=NestedInB] constructor(): R|B.NestedInB| {
super<Nested>()
}
@@ -1,16 +1,16 @@
FILE: NestedSuperType.kt
public? abstract class My : R|kotlin/Any| {
public? constructor(): R|p/My| {
public? [ContainingClassKey=My] constructor(): R|p/My| {
super<R|kotlin/Any|>()
}
public? abstract class NestedOne : My {
public? constructor(): R|p/My.NestedOne| {
public? [ContainingClassKey=NestedOne] constructor(): R|p/My.NestedOne| {
super<My>()
}
public? abstract class NestedTwo : NestedOne {
public? constructor(): R|p/My.NestedOne.NestedTwo| {
public? [ContainingClassKey=NestedTwo] constructor(): R|p/My.NestedOne.NestedTwo| {
super<NestedOne>()
}
@@ -20,12 +20,12 @@ FILE: NestedSuperType.kt
}
public? final? class Your : My {
public? constructor(): R|p/Your| {
public? [ContainingClassKey=Your] constructor(): R|p/Your| {
super<My>()
}
public? final? class NestedThree : NestedOne {
public? constructor(): R|p/Your.NestedThree| {
public? [ContainingClassKey=NestedThree] constructor(): R|p/Your.NestedThree| {
super<NestedOne>()
}
@@ -1,52 +1,52 @@
FILE: annotation.kt
@Target(AnnotationTarget#.CLASS#, AnnotationTarget#.PROPERTY#, AnnotationTarget#.LOCAL_VARIABLE#, AnnotationTarget#.VALUE_PARAMETER#, AnnotationTarget#.CONSTRUCTOR#, AnnotationTarget#.FUNCTION#, AnnotationTarget#.TYPE#) public? final? annotation class base : R|kotlin/Annotation| {
public? constructor(): R|base| {
public? [ContainingClassKey=base] constructor(): R|base| {
super<R|kotlin/Any|>()
}
}
@base() public? final? annotation class derived : R|kotlin/Annotation| {
public? constructor(): R|derived| {
public? [ContainingClassKey=derived] constructor(): R|derived| {
super<R|kotlin/Any|>()
}
}
@base() public? final? class correct : R|kotlin/Any| {
public? constructor(@base() x: Int): R|correct| {
public? [ContainingClassKey=correct] constructor(@base() x: Int): R|correct| {
super<R|kotlin/Any|>()
}
@base() public? final? val x: Int = R|<local>/x|
@base() public? final? [IsFromVarargKey=false] val x: Int = R|<local>/x|
public? get(): Int
@base() public? constructor(): R|correct| {
@base() public? [ContainingClassKey=correct] constructor(): R|correct| {
this<R|correct|>(IntegerLiteral(0))
}
}
@base() public? final? enum class My : R|kotlin/Enum<My>| {
private constructor(): R|My| {
private [ContainingClassKey=My] constructor(): R|My| {
super<R|kotlin/Enum<My>|>()
}
@base() public final static enum entry FIRST: R|My| = @base() object : R|My| {
private constructor(): R|<anonymous>| {
@base() public final static [ContainingClassKey=My] enum entry FIRST: R|My| = @base() object : R|My| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|My|>()
}
}
@base() public final static enum entry SECOND: R|My| = @base() object : R|My| {
private constructor(): R|<anonymous>| {
@base() public final static [ContainingClassKey=My] enum entry SECOND: R|My| = @base() object : R|My| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|My|>()
}
}
public final static fun values(): R|kotlin/Array<My>| {
public final static [ContainingClassKey=My] fun values(): R|kotlin/Array<My>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|My| {
public final static [ContainingClassKey=My] fun valueOf(value: R|kotlin/String|): R|My| {
}
}
@@ -1,11 +1,11 @@
FILE: complexTypes.kt
public? final? class C<T, out S> : R|kotlin/Any| {
public? constructor<T, out S>(): R|a/b/C<T, S>| {
public? [ContainingClassKey=C] constructor<T, out S>(): R|a/b/C<T, S>| {
super<R|kotlin/Any|>()
}
public? final? inner class D<R, in P, T, out S> : R|kotlin/Any| {
public? constructor<R, in P>(): R|a/b/C.D<R, P, T, S>| {
public? [ContainingClassKey=D] constructor<R, in P>(): R|a/b/C.D<R, P, T, S>| {
super<R|kotlin/Any|>()
}
@@ -14,6 +14,6 @@ FILE: complexTypes.kt
}
public? final? interface Test : R|kotlin/Any| {
public? final? val x: a.b.C<out CharSequence, *>.D<in List<*>, *>
public? get(): a.b.C<out CharSequence, *>.D<in List<*>, *>
[ContainingClassKey=Test] public? get(): a.b.C<out CharSequence, *>.D<in List<*>, *>
}
@@ -1,6 +1,6 @@
FILE: constructorInObject.kt
public? final? object A : R|kotlin/Any| {
public? constructor(): R|A| {
public? [ContainingClassKey=A] constructor(): R|A| {
super<R|kotlin/Any|>()
}
@@ -9,35 +9,35 @@ FILE: constructorInObject.kt
}
public? final? enum class B : R|kotlin/Enum<B>| {
private constructor(): R|B| {
private [ContainingClassKey=B] constructor(): R|B| {
super<R|kotlin/Enum<B>|>()
}
public final static enum entry X: R|B| = object : R|B| {
private constructor(): R|<anonymous>| {
public final static [ContainingClassKey=B] enum entry X: R|B| = object : R|B| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|B|>()
}
public? constructor(): R|<anonymous>| {
public? [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|B|>()
}
}
public final static fun values(): R|kotlin/Array<B>| {
public final static [ContainingClassKey=B] fun values(): R|kotlin/Array<B>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|B| {
public final static [ContainingClassKey=B] fun valueOf(value: R|kotlin/String|): R|B| {
}
}
public? final? class C : R|kotlin/Any| {
public? constructor(): R|C| {
public? [ContainingClassKey=C] constructor(): R|C| {
super<R|kotlin/Any|>()
}
public? final? companion object Companion : R|kotlin/Any| {
public? constructor(): R|C.Companion| {
public? [ContainingClassKey=Companion] constructor(): R|C.Companion| {
super<R|kotlin/Any|>()
}
@@ -45,7 +45,7 @@ FILE: constructorInObject.kt
}
public? final? val anonObject: <implicit> = object : R|kotlin/Any| {
public? constructor(): R|<anonymous>| {
public? [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|kotlin/Any|>()
}
@@ -1,7 +1,7 @@
FILE: constructorOfAnonymousObject.kt
private final? fun resolveAccessorCall(suspendPropertyDescriptor: PropertyDescriptor, context: TranslationContext): ResolvedCall<PropertyDescriptor> {
^resolveAccessorCall object : ResolvedCall<PropertyDescriptor> {
private constructor(): R|<anonymous>| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<<implicit>>()
}
@@ -1,36 +1,36 @@
FILE: propertyAccessorsContractDescription.kt
public? final? class MyClass : R|kotlin/Any| {
public? constructor(): R|MyClass| {
public? [ContainingClassKey=MyClass] constructor(): R|MyClass| {
super<R|kotlin/Any|>()
}
public? final? var myInt: Int = IntegerLiteral(0)
public? get(): Int
[ContainingClassKey=MyClass] public? get(): Int
[Contract description] <
returnsNotNull#()
>
{
^ IntegerLiteral(1)
}
public? set(value: Int): R|kotlin/Unit| {
[ContainingClassKey=MyClass] public? set(value: Int): R|kotlin/Unit| {
field# = value#.times#(IntegerLiteral(10))
}
}
public? final? class AnotherClass : R|kotlin/Any| {
public? constructor(multiplier: Int): R|AnotherClass| {
public? [ContainingClassKey=AnotherClass] constructor(multiplier: Int): R|AnotherClass| {
super<R|kotlin/Any|>()
}
public? final? var anotherInt: Int = IntegerLiteral(0)
public? get(): Int
[ContainingClassKey=AnotherClass] public? get(): Int
[Contract description] <
returnsNotNull#()
>
{
^ IntegerLiteral(1)
}
public? set(value: Int): R|kotlin/Unit|
[ContainingClassKey=AnotherClass] public? set(value: Int): R|kotlin/Unit|
[Contract description] <
returns#()
>
@@ -40,19 +40,19 @@ FILE: propertyAccessorsContractDescription.kt
}
public? final? class SomeClass : R|kotlin/Any| {
public? constructor(multiplier: Int?): R|SomeClass| {
public? [ContainingClassKey=SomeClass] constructor(multiplier: Int?): R|SomeClass| {
super<R|kotlin/Any|>()
}
public? final? var someInt: Int = IntegerLiteral(0)
public? get(): Int
[ContainingClassKey=SomeClass] public? get(): Int
[Contract description] <
returnsNotNull#()
>
{
^ IntegerLiteral(1)
}
public? set(value: Int): R|kotlin/Unit|
[ContainingClassKey=SomeClass] public? set(value: Int): R|kotlin/Unit|
[Contract description] <
returns#().implies#(!=(value#, Null(null)))
>
@@ -7,7 +7,7 @@ FILE: delegates.kt
^ D|/x|.getValue#(Null(null), ::R|/x|)
}
public? final? val delegate: <implicit> = object : ReadWriteProperty<Any?, Int> {
private constructor(): R|<anonymous>| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<<implicit>>()
}
@@ -1,15 +1,15 @@
FILE: derivedClass.kt
public? open class Base<T> : R|kotlin/Any| {
public? constructor<T>(x: T): R|Base<T>| {
public? [ContainingClassKey=Base] constructor<T>(x: T): R|Base<T>| {
super<R|kotlin/Any|>()
}
public? final? val x: T = R|<local>/x|
public? final? [IsFromVarargKey=false] val x: T = R|<local>/x|
public? get(): T
}
public? final? class Derived<T : Any> : Base<T> {
public? constructor<T : Any>(x: T): R|Derived<T>| {
public? [ContainingClassKey=Derived] constructor<T : Any>(x: T): R|Derived<T>| {
super<Base<T>>(x#)
}
@@ -1,7 +1,7 @@
FILE: emptyAnonymousObject.kt
public? final? fun test(): R|kotlin/Unit| {
lval x: <implicit> = object : R|kotlin/Any| {
private constructor(): R|<anonymous>| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|kotlin/Any|>()
}
@@ -1,32 +1,32 @@
FILE: enums.kt
public? final? enum class Order : R|kotlin/Enum<Order>| {
private constructor(): R|Order| {
private [ContainingClassKey=Order] constructor(): R|Order| {
super<R|kotlin/Enum<Order>|>()
}
public final static enum entry FIRST: R|Order|
public final static enum entry SECOND: R|Order|
public final static enum entry THIRD: R|Order|
public final static fun values(): R|kotlin/Array<Order>| {
public final static [ContainingClassKey=Order] enum entry FIRST: R|Order|
public final static [ContainingClassKey=Order] enum entry SECOND: R|Order|
public final static [ContainingClassKey=Order] enum entry THIRD: R|Order|
public final static [ContainingClassKey=Order] fun values(): R|kotlin/Array<Order>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|Order| {
public final static [ContainingClassKey=Order] fun valueOf(value: R|kotlin/String|): R|Order| {
}
}
public? final? enum class Planet : R|kotlin/Enum<Planet>| {
private constructor(m: Double, r: Double): R|Planet| {
private [ContainingClassKey=Planet] constructor(m: Double, r: Double): R|Planet| {
super<R|kotlin/Enum<Planet>|>()
}
public? final? val m: Double = R|<local>/m|
public? final? [IsFromVarargKey=false] val m: Double = R|<local>/m|
public? get(): Double
internal final? val r: Double = R|<local>/r|
internal final? [IsFromVarargKey=false] val r: Double = R|<local>/r|
internal get(): Double
public final static enum entry MERCURY: R|Planet| = object : R|Planet| {
private constructor(): R|<anonymous>| {
public final static [ContainingClassKey=Planet] enum entry MERCURY: R|Planet| = object : R|Planet| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|Planet|>(Double(1.0), Double(2.0))
}
@@ -36,8 +36,8 @@ FILE: enums.kt
}
public final static enum entry VENERA: R|Planet| = object : R|Planet| {
private constructor(): R|<anonymous>| {
public final static [ContainingClassKey=Planet] enum entry VENERA: R|Planet| = object : R|Planet| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|Planet|>(Double(3.0), Double(4.0))
}
@@ -47,8 +47,8 @@ FILE: enums.kt
}
public final static enum entry EARTH: R|Planet| = object : R|Planet| {
private constructor(): R|<anonymous>| {
public final static [ContainingClassKey=Planet] enum entry EARTH: R|Planet| = object : R|Planet| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|Planet|>(Double(5.0), Double(6.0))
}
@@ -59,79 +59,79 @@ FILE: enums.kt
}
public? final? val g: Double = G#.times#(m#).div#(r#.times#(r#))
public? get(): Double
[ContainingClassKey=Planet] public? get(): Double
public? abstract fun sayHello(): R|kotlin/Unit|
public? final? companion object Companion : R|kotlin/Any| {
private constructor(): R|Planet.Companion| {
private [ContainingClassKey=Companion] constructor(): R|Planet.Companion| {
super<R|kotlin/Any|>()
}
public? final? const val G: <implicit> = Double(6.67E-11)
public? get(): <implicit>
[ContainingClassKey=Companion] public? get(): <implicit>
}
public final static fun values(): R|kotlin/Array<Planet>| {
public final static [ContainingClassKey=Planet] fun values(): R|kotlin/Array<Planet>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|Planet| {
public final static [ContainingClassKey=Planet] fun valueOf(value: R|kotlin/String|): R|Planet| {
}
}
public? final? enum class PseudoInsn : R|kotlin/Enum<PseudoInsn>| {
private constructor(signature: String = String(()V)): R|PseudoInsn| {
private [ContainingClassKey=PseudoInsn] constructor(signature: String = String(()V)): R|PseudoInsn| {
super<R|kotlin/Enum<PseudoInsn>|>()
}
public? final? val signature: String = R|<local>/signature|
public? final? [IsFromVarargKey=false] val signature: String = R|<local>/signature|
public? get(): String
public final static enum entry FIX_STACK_BEFORE_JUMP: R|PseudoInsn| = object : R|PseudoInsn| {
private constructor(): R|<anonymous>| {
public final static [ContainingClassKey=PseudoInsn] enum entry FIX_STACK_BEFORE_JUMP: R|PseudoInsn| = object : R|PseudoInsn| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|PseudoInsn|>()
}
}
public final static enum entry FAKE_ALWAYS_TRUE_IFEQ: R|PseudoInsn| = object : R|PseudoInsn| {
private constructor(): R|<anonymous>| {
public final static [ContainingClassKey=PseudoInsn] enum entry FAKE_ALWAYS_TRUE_IFEQ: R|PseudoInsn| = object : R|PseudoInsn| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|PseudoInsn|>(String(()I))
}
}
public final static enum entry FAKE_ALWAYS_FALSE_IFEQ: R|PseudoInsn| = object : R|PseudoInsn| {
private constructor(): R|<anonymous>| {
public final static [ContainingClassKey=PseudoInsn] enum entry FAKE_ALWAYS_FALSE_IFEQ: R|PseudoInsn| = object : R|PseudoInsn| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|PseudoInsn|>(String(()I))
}
}
public final static enum entry SAVE_STACK_BEFORE_TRY: R|PseudoInsn| = object : R|PseudoInsn| {
private constructor(): R|<anonymous>| {
public final static [ContainingClassKey=PseudoInsn] enum entry SAVE_STACK_BEFORE_TRY: R|PseudoInsn| = object : R|PseudoInsn| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|PseudoInsn|>()
}
}
public final static enum entry RESTORE_STACK_IN_TRY_CATCH: R|PseudoInsn| = object : R|PseudoInsn| {
private constructor(): R|<anonymous>| {
public final static [ContainingClassKey=PseudoInsn] enum entry RESTORE_STACK_IN_TRY_CATCH: R|PseudoInsn| = object : R|PseudoInsn| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|PseudoInsn|>()
}
}
public final static enum entry STORE_NOT_NULL: R|PseudoInsn| = object : R|PseudoInsn| {
private constructor(): R|<anonymous>| {
public final static [ContainingClassKey=PseudoInsn] enum entry STORE_NOT_NULL: R|PseudoInsn| = object : R|PseudoInsn| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|PseudoInsn|>()
}
}
public final static enum entry AS_NOT_NULL: R|PseudoInsn| = object : R|PseudoInsn| {
private constructor(): R|<anonymous>| {
public final static [ContainingClassKey=PseudoInsn] enum entry AS_NOT_NULL: R|PseudoInsn| = object : R|PseudoInsn| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|PseudoInsn|>(String((Ljava/lang/Object;)Ljava/lang/Object;))
}
@@ -140,10 +140,10 @@ FILE: enums.kt
public? final? fun emit(): R|kotlin/Unit| {
}
public final static fun values(): R|kotlin/Array<PseudoInsn>| {
public final static [ContainingClassKey=PseudoInsn] fun values(): R|kotlin/Array<PseudoInsn>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|PseudoInsn| {
public final static [ContainingClassKey=PseudoInsn] fun valueOf(value: R|kotlin/String|): R|PseudoInsn| {
}
}
@@ -2,27 +2,27 @@ FILE: enums2.kt
public? final? interface Some : R|kotlin/Any| {
}
public? final? object O1 : Some {
private constructor(): R|O1| {
private [ContainingClassKey=O1] constructor(): R|O1| {
super<<implicit>>()
}
}
public? final? object O2 : Some {
private constructor(): R|O2| {
private [ContainingClassKey=O2] constructor(): R|O2| {
super<<implicit>>()
}
}
public? final? enum class SomeEnum : R|kotlin/Enum<SomeEnum>| {
private constructor(x: Some): R|SomeEnum| {
private [ContainingClassKey=SomeEnum] constructor(x: Some): R|SomeEnum| {
super<R|kotlin/Enum<SomeEnum>|>()
}
public? final? val x: Some = R|<local>/x|
public? final? [IsFromVarargKey=false] val x: Some = R|<local>/x|
public? get(): Some
public final static enum entry FIRST: R|SomeEnum| = object : R|SomeEnum| {
private constructor(): R|<anonymous>| {
public final static [ContainingClassKey=SomeEnum] enum entry FIRST: R|SomeEnum| = object : R|SomeEnum| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|SomeEnum|>(O1#)
}
@@ -32,8 +32,8 @@ FILE: enums2.kt
}
public final static enum entry SECOND: R|SomeEnum| = object : R|SomeEnum| {
private constructor(): R|<anonymous>| {
public final static [ContainingClassKey=SomeEnum] enum entry SECOND: R|SomeEnum| = object : R|SomeEnum| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<R|SomeEnum|>(O2#)
}
@@ -45,10 +45,10 @@ FILE: enums2.kt
public? abstract fun check(y: Some): Boolean
public final static fun values(): R|kotlin/Array<SomeEnum>| {
public final static [ContainingClassKey=SomeEnum] fun values(): R|kotlin/Array<SomeEnum>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|SomeEnum| {
public final static [ContainingClassKey=SomeEnum] fun valueOf(value: R|kotlin/String|): R|SomeEnum| {
}
}
@@ -1,6 +1,6 @@
FILE: expectActual.kt
public? final? expect class MyClass : R|kotlin/Any| {
public? expect constructor(): R|MyClass| {
public? expect [ContainingClassKey=MyClass] constructor(): R|MyClass| {
super<R|kotlin/Any|>()
}
@@ -9,7 +9,7 @@ FILE: expectActual.kt
public? final? expect val x: Int
public? get(): Int
public? final? actual class MyClass : R|kotlin/Any| {
public? constructor(): R|MyClass| {
public? [ContainingClassKey=MyClass] constructor(): R|MyClass| {
super<R|kotlin/Any|>()
}
@@ -1,6 +1,6 @@
FILE: external.kt
public? final? external class External : R|kotlin/Any| {
public? constructor(): R|External| {
public? [ContainingClassKey=External] constructor(): R|External| {
super<R|kotlin/Any|>()
}
@@ -9,15 +9,15 @@ FILE: external.kt
public? final? external val x: Int
public? external get(): Int
public? final? class NotExternal : R|kotlin/Any| {
public? constructor(): R|NotExternal| {
public? [ContainingClassKey=NotExternal] constructor(): R|NotExternal| {
super<R|kotlin/Any|>()
}
public? final? external fun bar(): String
public? final? var y: Int
public? external get(): Int
public? set(value: Int): R|kotlin/Unit| {
[ContainingClassKey=NotExternal] public? external get(): Int
[ContainingClassKey=NotExternal] public? set(value: Int): R|kotlin/Unit| {
}
}
@@ -5,7 +5,7 @@ FILE: genericFunctions.kt
^safeAs (this# as? T)
}
public? abstract class Summator : R|kotlin/Any| {
public? constructor(): R|Summator| {
public? [ContainingClassKey=Summator] constructor(): R|Summator| {
super<R|kotlin/Any|>()
}
@@ -1,12 +1,12 @@
FILE: initBlockWithDeclarations.kt
public? final? class X : R|kotlin/Any| {
public? constructor(): R|X| {
public? [ContainingClassKey=X] constructor(): R|X| {
super<R|kotlin/Any|>()
}
init {
local final? class classInInit : R|kotlin/Any| {
public? constructor(): R|X.classInInit| {
public? [ContainingClassKey=classInInit] constructor(): R|X.classInInit| {
super<R|kotlin/Any|>()
}
@@ -22,13 +22,13 @@ FILE: initBlockWithDeclarations.kt
}
public? final? object <no name provided> : R|kotlin/Any| {
private constructor(): R|<no name provided>| {
private [ContainingClassKey=<no name provided>] constructor(): R|<no name provided>| {
super<R|kotlin/Any|>()
}
init {
local final? class classInInit : R|kotlin/Any| {
public? constructor(): R|<no name provided>.classInInit| {
public? [ContainingClassKey=classInInit] constructor(): R|<no name provided>.classInInit| {
super<R|kotlin/Any|>()
}
@@ -1,27 +1,27 @@
FILE: nestedClass.kt
public? abstract class Base : R|kotlin/Any| {
public? constructor(s: String): R|Base| {
public? [ContainingClassKey=Base] constructor(s: String): R|Base| {
super<R|kotlin/Any|>()
}
public? final? val s: String = R|<local>/s|
public? final? [IsFromVarargKey=false] val s: String = R|<local>/s|
public? get(): String
}
public? final? class Outer : R|kotlin/Any| {
public? constructor(): R|Outer| {
public? [ContainingClassKey=Outer] constructor(): R|Outer| {
super<R|kotlin/Any|>()
}
public? final? class Derived : Base {
public? constructor(s: String): R|Outer.Derived| {
public? [ContainingClassKey=Derived] constructor(s: String): R|Outer.Derived| {
super<Base>(s#)
}
}
public? final? object Obj : Base {
private constructor(): R|Outer.Obj| {
private [ContainingClassKey=Obj] constructor(): R|Outer.Obj| {
super<Base>(String())
}
@@ -1,14 +1,14 @@
FILE: noPrimaryConstructor.kt
public? final? class NoPrimary : R|kotlin/Any| {
public? final? val x: String
public? get(): String
[ContainingClassKey=NoPrimary] public? get(): String
public? constructor(x: String): R|NoPrimary| {
public? [ContainingClassKey=NoPrimary] constructor(x: String): R|NoPrimary| {
super<R|kotlin/Any|>()
this#.x# = x#
}
public? constructor(): R|NoPrimary| {
public? [ContainingClassKey=NoPrimary] constructor(): R|NoPrimary| {
this<R|NoPrimary|>(String())
}
@@ -3,35 +3,35 @@ FILE: simpleClass.kt
public? final? fun foo(x: Int, y: String): String
public? final? val bar: Boolean
public? get(): Boolean
[ContainingClassKey=SomeInterface] public? get(): Boolean
}
public? final? class SomeClass : SomeInterface {
public? constructor(): R|SomeClass| {
public? [ContainingClassKey=SomeClass] constructor(): R|SomeClass| {
super<<implicit>>()
}
private final? val baz: <implicit> = IntegerLiteral(42)
private get(): <implicit>
[ContainingClassKey=SomeClass] private get(): <implicit>
public? open? override fun foo(x: Int, y: String): String {
^foo y#.plus#(x#).plus#(baz#)
}
public? open? override var bar: Boolean
public? get(): Boolean {
[ContainingClassKey=SomeClass] public? get(): Boolean {
^ Boolean(true)
}
public? set(value: Boolean): R|kotlin/Unit| {
[ContainingClassKey=SomeClass] public? set(value: Boolean): R|kotlin/Unit| {
}
public? final? lateinit var fau: Double
public? get(): Double
public? set(value: Double): R|kotlin/Unit|
[ContainingClassKey=SomeClass] public? get(): Double
[ContainingClassKey=SomeClass] public? set(value: Double): R|kotlin/Unit|
}
public? final? inline class InlineClass : R|kotlin/Any| {
public? constructor(): R|InlineClass| {
public? [ContainingClassKey=InlineClass] constructor(): R|InlineClass| {
super<R|kotlin/Any|>()
}
@@ -3,7 +3,7 @@ FILE: simpleTypeAlias.kt
}
public? final typealias C = B
public? final? class D : C {
public? constructor(): R|D| {
public? [ContainingClassKey=D] constructor(): R|D| {
super<<implicit>>()
}
@@ -1,6 +1,6 @@
FILE: typeAliasWithGeneric.kt
public? open class A : R|kotlin/Any| {
public? constructor(): R|A| {
public? [ContainingClassKey=A] constructor(): R|A| {
super<R|kotlin/Any|>()
}
@@ -9,7 +9,7 @@ FILE: typeAliasWithGeneric.kt
}
public? final typealias C<T> = B<T, A>
public? final? class D : C<A> {
public? constructor(): R|D| {
public? [ContainingClassKey=D] constructor(): R|D| {
super<<implicit>>()
}
@@ -2,30 +2,30 @@ FILE: typeParameterVsNested.kt
public? final? interface Some : R|kotlin/Any| {
}
public? abstract class My<T : Some> : R|kotlin/Any| {
public? constructor<T : Some>(): R|test/My<T>| {
public? [ContainingClassKey=My] constructor<T : Some>(): R|test/My<T>| {
super<R|kotlin/Any|>()
}
public? final? inner class T<T : Some> : R|kotlin/Any| {
public? constructor(): R|test/My.T<T>| {
public? [ContainingClassKey=T] constructor(): R|test/My.T<T>| {
super<R|kotlin/Any|>()
}
}
public? abstract val x: T
public? get(): T
[ContainingClassKey=My] public? get(): T
public? abstract fun foo(arg: T): R|kotlin/Unit|
public? abstract val y: My.T
public? get(): My.T
[ContainingClassKey=My] public? get(): My.T
public? abstract val z: test.My.T
public? get(): test.My.T
[ContainingClassKey=My] public? get(): test.My.T
public? final? class Some : T {
public? constructor(): R|test/My.Some| {
public? [ContainingClassKey=Some] constructor(): R|test/My.Some| {
super<T>()
}
@@ -8,13 +8,13 @@ FILE: typeParameters.kt
public? final typealias StringList = List<out String>
public? final typealias AnyList = List<*>
public? abstract class AbstractList<out T : Any> : List<T> {
public? constructor<out T : Any>(): R|AbstractList<T>| {
public? [ContainingClassKey=AbstractList] constructor<out T : Any>(): R|AbstractList<T>| {
super<<implicit>>()
}
}
public? final? class SomeList : AbstractList<Int> {
public? constructor(): R|SomeList| {
public? [ContainingClassKey=SomeList] constructor(): R|SomeList| {
super<AbstractList<Int>>()
}
@@ -4,7 +4,7 @@ FILE: where.kt
public? final? interface B : R|kotlin/Any| {
}
public? final? class C<T : A, B> : R|kotlin/Any| {
public? constructor<T : A, B>(): R|C<T>| {
public? [ContainingClassKey=C] constructor<T : A, B>(): R|C<T>| {
super<R|kotlin/Any|>()
}
@@ -1,6 +1,6 @@
FILE: annotated.kt
@Target(AnnotationTarget#.EXPRESSION#, AnnotationTarget#.LOCAL_VARIABLE#) @Retention(AnnotationRetention#.SOURCE#) public? final? annotation class Ann : R|kotlin/Annotation| {
public? constructor(): R|Ann| {
public? [ContainingClassKey=Ann] constructor(): R|Ann| {
super<R|kotlin/Any|>()
}
@@ -21,14 +21,14 @@ FILE: annotated.kt
^foo IntegerLiteral(42)
}
public? final? data class Two : R|kotlin/Any| {
public? constructor(x: Int, y: Int): R|Two| {
public? [ContainingClassKey=Two] constructor(x: Int, y: Int): R|Two| {
super<R|kotlin/Any|>()
}
public? final? val x: Int = R|<local>/x|
public? final? [IsFromVarargKey=false] val x: Int = R|<local>/x|
public? get(): Int
public? final? val y: Int = R|<local>/y|
public? final? [IsFromVarargKey=false] val y: Int = R|<local>/y|
public? get(): Int
public final operator fun component1(): Int
@@ -5,11 +5,11 @@ FILE: arrayAccess.kt
^foo IntegerLiteral(1)
}
public? final? class Wrapper : R|kotlin/Any| {
public? constructor(v: IntArray): R|Wrapper| {
public? [ContainingClassKey=Wrapper] constructor(v: IntArray): R|Wrapper| {
super<R|kotlin/Any|>()
}
public? final? val v: IntArray = R|<local>/v|
public? final? [IsFromVarargKey=false] val v: IntArray = R|<local>/v|
public? get(): IntArray
}
@@ -1,6 +1,6 @@
FILE: callableReferences.kt
public? final? class A : R|kotlin/Any| {
public? constructor(): R|A| {
public? [ContainingClassKey=A] constructor(): R|A| {
super<R|kotlin/Any|>()
}
@@ -8,7 +8,7 @@ FILE: callableReferences.kt
}
public? final? val bar: <implicit> = IntegerLiteral(0)
public? get(): <implicit>
[ContainingClassKey=A] public? get(): <implicit>
}
public? final? fun A.qux(): R|kotlin/Unit| {
@@ -9,11 +9,11 @@ FILE: calls.kt
^testRegular IntegerLiteral(3).distance#(IntegerLiteral(4))
}
public? final? class My : R|kotlin/Any| {
public? constructor(x: Int): R|My| {
public? [ContainingClassKey=My] constructor(x: Int): R|My| {
super<R|kotlin/Any|>()
}
public? final? var x: Int = R|<local>/x|
public? final? [IsFromVarargKey=false] var x: Int = R|<local>/x|
public? get(): Int
public? set(value: Int): R|kotlin/Unit|
@@ -1,6 +1,6 @@
FILE: classReference.kt
public? final? class A : R|kotlin/Any| {
public? constructor(): R|test/A| {
public? [ContainingClassKey=A] constructor(): R|test/A| {
super<R|kotlin/Any|>()
}
@@ -1,51 +1,51 @@
FILE: collectionLiterals.kt
public? final? annotation class Ann1 : R|kotlin/Annotation| {
public? constructor(arr: IntArray): R|Ann1| {
public? [ContainingClassKey=Ann1] constructor(arr: IntArray): R|Ann1| {
super<R|kotlin/Any|>()
}
public? final? val arr: IntArray = R|<local>/arr|
public? final? [IsFromVarargKey=false] val arr: IntArray = R|<local>/arr|
public? get(): IntArray
}
public? final? annotation class Ann2 : R|kotlin/Annotation| {
public? constructor(arr: DoubleArray): R|Ann2| {
public? [ContainingClassKey=Ann2] constructor(arr: DoubleArray): R|Ann2| {
super<R|kotlin/Any|>()
}
public? final? val arr: DoubleArray = R|<local>/arr|
public? final? [IsFromVarargKey=false] val arr: DoubleArray = R|<local>/arr|
public? get(): DoubleArray
}
public? final? annotation class Ann3 : R|kotlin/Annotation| {
public? constructor(arr: Array<String>): R|Ann3| {
public? [ContainingClassKey=Ann3] constructor(arr: Array<String>): R|Ann3| {
super<R|kotlin/Any|>()
}
public? final? val arr: Array<String> = R|<local>/arr|
public? final? [IsFromVarargKey=false] val arr: Array<String> = R|<local>/arr|
public? get(): Array<String>
}
@Ann1(<implicitArrayOf>()) @Ann2(<implicitArrayOf>()) @Ann3(<implicitArrayOf>()) public? final? class Zero : R|kotlin/Any| {
public? constructor(): R|Zero| {
public? [ContainingClassKey=Zero] constructor(): R|Zero| {
super<R|kotlin/Any|>()
}
}
@Ann1(<implicitArrayOf>(IntegerLiteral(1), IntegerLiteral(2))) public? final? class First : R|kotlin/Any| {
public? constructor(): R|First| {
public? [ContainingClassKey=First] constructor(): R|First| {
super<R|kotlin/Any|>()
}
}
@Ann2(<implicitArrayOf>(Double(3.14))) public? final? class Second : R|kotlin/Any| {
public? constructor(): R|Second| {
public? [ContainingClassKey=Second] constructor(): R|Second| {
super<R|kotlin/Any|>()
}
}
@Ann3(<implicitArrayOf>(String(Alpha), String(Omega))) public? final? class Third : R|kotlin/Any| {
public? constructor(): R|Third| {
public? [ContainingClassKey=Third] constructor(): R|Third| {
super<R|kotlin/Any|>()
}
@@ -1,16 +1,16 @@
FILE: destructuring.kt
public? final? data class Some : R|kotlin/Any| {
public? constructor(first: Int, second: Double, third: String): R|Some| {
public? [ContainingClassKey=Some] constructor(first: Int, second: Double, third: String): R|Some| {
super<R|kotlin/Any|>()
}
public? final? val first: Int = R|<local>/first|
public? final? [IsFromVarargKey=false] val first: Int = R|<local>/first|
public? get(): Int
public? final? val second: Double = R|<local>/second|
public? final? [IsFromVarargKey=false] val second: Double = R|<local>/second|
public? get(): Double
public? final? val third: String = R|<local>/third|
public? final? [IsFromVarargKey=false] val third: String = R|<local>/third|
public? get(): String
public final operator fun component1(): Int
@@ -38,14 +38,14 @@ FILE: for.kt
}
public? final? data class Some : R|kotlin/Any| {
public? constructor(x: Int, y: Int): R|Some| {
public? [ContainingClassKey=Some] constructor(x: Int, y: Int): R|Some| {
super<R|kotlin/Any|>()
}
public? final? val x: Int = R|<local>/x|
public? final? [IsFromVarargKey=false] val x: Int = R|<local>/x|
public? get(): Int
public? final? val y: Int = R|<local>/y|
public? final? [IsFromVarargKey=false] val y: Int = R|<local>/y|
public? get(): Int
public final operator fun component1(): Int
@@ -1,11 +1,11 @@
FILE: init.kt
public? final? class WithInit : R|kotlin/Any| {
public? constructor(x: Int): R|WithInit| {
public? [ContainingClassKey=WithInit] constructor(x: Int): R|WithInit| {
super<R|kotlin/Any|>()
}
public? final? val x: Int
public? get(): Int
[ContainingClassKey=WithInit] public? get(): Int
init {
this#.x# = x#
@@ -1,13 +1,13 @@
FILE: lambda.kt
public? final? data class Tuple : R|kotlin/Any| {
public? constructor(x: Int, y: Int): R|Tuple| {
public? [ContainingClassKey=Tuple] constructor(x: Int, y: Int): R|Tuple| {
super<R|kotlin/Any|>()
}
public? final? val x: Int = R|<local>/x|
public? final? [IsFromVarargKey=false] val x: Int = R|<local>/x|
public? get(): Int
public? final? val y: Int = R|<local>/y|
public? final? [IsFromVarargKey=false] val y: Int = R|<local>/y|
public? get(): Int
public final operator fun component1(): Int
@@ -1,11 +1,11 @@
FILE: locals.kt
public? final? fun withLocals(p: Int): Int {
local final? class Local : R|kotlin/Any| {
public? constructor(pp: Int): R|Local| {
public? [ContainingClassKey=Local] constructor(pp: Int): R|Local| {
super<R|kotlin/Any|>()
}
public? final? val pp: Int = R|<local>/pp|
public? final? [IsFromVarargKey=false] val pp: Int = R|<local>/pp|
public? get(): Int
public? final? fun diff(): <implicit> {
@@ -20,7 +20,7 @@ FILE: locals.kt
}
lval code: <implicit> = object : Any {
private constructor(): R|<anonymous>| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
super<Any>()
}
@@ -13,7 +13,7 @@ FILE: super.kt
}
public? final? class C : A, B {
public? constructor(): R|C| {
public? [ContainingClassKey=C] constructor(): R|C| {
super<<implicit>>()
}
@@ -1,6 +1,6 @@
FILE: these.kt
public? final? class Some : R|kotlin/Any| {
public? constructor(): R|Some| {
public? [ContainingClassKey=Some] constructor(): R|Some| {
super<R|kotlin/Any|>()
}
@@ -13,7 +13,7 @@ FILE: these.kt
}
public? final? val instance: Some
public? get(): Some {
[ContainingClassKey=Some] public? get(): Some {
^ this@Some#
}
@@ -31,11 +31,11 @@ FILE: unary.kt
}
public? final? class X : R|kotlin/Any| {
public? constructor(i: Int): R|X| {
public? [ContainingClassKey=X] constructor(i: Int): R|X| {
super<R|kotlin/Any|>()
}
public? final? val i: Int = R|<local>/i|
public? final? [IsFromVarargKey=false] val i: Int = R|<local>/i|
public? get(): Int
}
@@ -74,11 +74,11 @@ FILE: unary.kt
}
public? final? class Y : R|kotlin/Any| {
public? constructor(arr: Array<Int>): R|Y| {
public? [ContainingClassKey=Y] constructor(arr: Array<Int>): R|Y| {
super<R|kotlin/Any|>()
}
public? final? val arr: Array<Int> = R|<local>/arr|
public? final? [IsFromVarargKey=false] val arr: Array<Int> = R|<local>/arr|
public? get(): Array<Int>
}
@@ -63,7 +63,7 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase(
protected open fun doRawFirTest(filePath: String) {
val file = createKtFile(filePath)
val firFile = file.toFirFile(RawFirBuilderMode.NORMAL)
val firFileDump = StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString()
val firFileDump = StringBuilder().also { FirRenderer(it, mode = FirRenderer.RenderMode.WithDeclarationAttributes).visitFile(firFile) }.toString()
val expectedPath = filePath.replace(".kt", ".txt")
KotlinTestUtils.assertEqualsToFile(File(expectedPath), firFileDump)
}
@@ -19,17 +19,16 @@ import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.utils.isNotEmpty
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
import org.jetbrains.kotlin.utils.Printer
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import kotlin.reflect.KClass
fun FirElement.renderWithType(mode: FirRenderer.RenderMode = FirRenderer.RenderMode.Normal): String = buildString {
append(this@renderWithType)
@@ -56,6 +55,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
val renderAnnotation: Boolean,
val renderBodies: Boolean = true,
val renderPropertyAccessors: Boolean = true,
val renderDeclarationAttributes: Boolean = false,
) {
object Normal : RenderMode(
renderLambdaBodies = true,
@@ -98,6 +98,15 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
renderBodies = false,
renderPropertyAccessors = false,
)
object WithDeclarationAttributes : RenderMode(
renderLambdaBodies = true,
renderCallArguments = true,
renderCallableFqNames = false,
renderDeclarationResolvePhase = false,
renderAnnotation = true,
renderDeclarationAttributes = true,
)
}
private val printer = Printer(builder)
@@ -366,6 +375,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
}
override fun visitDeclaration(declaration: FirDeclaration) {
declaration.renderDeclarationAttributesIfNeeded()
declaration.renderPhaseIfNeeded()
print(
when (declaration) {
@@ -389,6 +399,27 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
}
}
private fun FirDeclaration.renderDeclarationAttributesIfNeeded() {
if (mode.renderDeclarationAttributes && attributes.arrayMap.isNotEmpty()) {
val attributes = getAttributesWithValues().mapNotNull { (klass, value) ->
value?.let { klass.simpleName to value.renderAsDeclarationAttributeValue() }
}.joinToString { (name, value) -> "$name=$value" }
print("[$attributes] ")
}
}
private fun FirDeclaration.getAttributesWithValues(): List<Pair<KClass<out FirDeclarationDataKey>, Any?>> {
val attributesMap = FirDeclarationDataRegistry.allValuesThreadUnsafeForRendering()
return attributesMap.entries.sortedBy { it.key.simpleName }.map { (klass, index) -> klass to attributes.arrayMap[index] }
}
private fun Any.renderAsDeclarationAttributeValue() = when (this) {
is FirCallableSymbol<*> -> callableId.toString()
is FirClassLikeSymbol<*> -> classId.asString()
else -> toString()
}
private fun List<FirDeclaration>.renderDeclarations() {
renderInBraces {
for (declaration in this) {
@@ -490,6 +521,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
print("actual ")
}
constructor.renderPhaseIfNeeded()
constructor.renderDeclarationAttributesIfNeeded()
print("constructor")
constructor.typeParameters.renderTypeParameters()
constructor.valueParameters.renderParameters()
@@ -512,6 +544,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
override fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor) {
propertyAccessor.renderPhaseIfNeeded()
propertyAccessor.renderDeclarationAttributesIfNeeded()
propertyAccessor.annotations.renderAnnotations()
print(propertyAccessor.visibility.asString() + " ")
print(if (propertyAccessor.isInline) "inline " else "")
@@ -526,6 +559,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction) {
anonymousFunction.renderPhaseIfNeeded()
anonymousFunction.renderDeclarationAttributesIfNeeded()
anonymousFunction.annotations.renderAnnotations()
val label = anonymousFunction.label
if (label != null) {
@@ -625,6 +659,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
override fun visitValueParameter(valueParameter: FirValueParameter) {
valueParameter.renderPhaseIfNeeded()
valueParameter.renderDeclarationAttributesIfNeeded()
valueParameter.annotations.renderAnnotations()
if (valueParameter.isCrossinline) {
print("crossinline ")