FirRenderer: slightly change/refactor declaration rendering

This commit is contained in:
Mikhail Glukhikh
2022-07-08 17:13:24 +02:00
committed by Space
parent ac34fe3306
commit 7ce5100946
45 changed files with 330 additions and 329 deletions
@@ -17,7 +17,7 @@ FILE: annotation.kt
}
@base() public? final? [IsFromPrimaryConstructor=true] val x: Int = R|<local>/x|
[ContainingClassKey=correct] public? get(): Int
public? [ContainingClassKey=correct] get(): Int
@base() public? [ContainingClassKey=correct] constructor(): R|correct| {
this<R|correct|>(IntegerLiteral(0))
@@ -16,16 +16,16 @@ FILE: annotationsOnNullableParenthesizedTypes.kt
public? final? fun returnArgument(): B<@A() C?>
public? final? val lambdaType: @A() ( () -> C )?
[ContainingClassKey=AnnotationsOnNullableParenthesizedTypes] public? get(): @A() ( () -> C )?
public? [ContainingClassKey=AnnotationsOnNullableParenthesizedTypes] get(): @A() ( () -> C )?
public? final? val lambdaParameter: ( (@A() C?) -> C )
[ContainingClassKey=AnnotationsOnNullableParenthesizedTypes] public? get(): ( (@A() C?) -> C )
public? [ContainingClassKey=AnnotationsOnNullableParenthesizedTypes] get(): ( (@A() C?) -> C )
public? final? val lambdaReturnValue: ( () -> @A() C? )
[ContainingClassKey=AnnotationsOnNullableParenthesizedTypes] public? get(): ( () -> @A() C? )
public? [ContainingClassKey=AnnotationsOnNullableParenthesizedTypes] get(): ( () -> @A() C? )
public? final? val lambdaReceiver: ( @A() C?.() -> C )
[ContainingClassKey=AnnotationsOnNullableParenthesizedTypes] public? get(): ( @A() C?.() -> C )
public? [ContainingClassKey=AnnotationsOnNullableParenthesizedTypes] get(): ( @A() C?.() -> C )
}
@Target(AnnotationTarget#.TYPE#, AnnotationTarget#.TYPE_PARAMETER#) public? final? annotation class A : R|kotlin/Annotation| {
@@ -16,19 +16,19 @@ FILE: annotationsOnParenthesizedTypes.kt
public? final? fun returnArgument(): B<@A() C>
public? final? val lambdaType: @A() ( () -> C )
[ContainingClassKey=AnnotationsOnParenthesizedTypes] public? get(): @A() ( () -> C )
public? [ContainingClassKey=AnnotationsOnParenthesizedTypes] get(): @A() ( () -> C )
public? final? val lambdaParameter: ( (@A() C) -> C )
[ContainingClassKey=AnnotationsOnParenthesizedTypes] public? get(): ( (@A() C) -> C )
public? [ContainingClassKey=AnnotationsOnParenthesizedTypes] get(): ( (@A() C) -> C )
public? final? val lambdaReturnValue: ( () -> @A() C )
[ContainingClassKey=AnnotationsOnParenthesizedTypes] public? get(): ( () -> @A() C )
public? [ContainingClassKey=AnnotationsOnParenthesizedTypes] get(): ( () -> @A() C )
public? final? val lambdaReceiver: ( @A() C.() -> C )
[ContainingClassKey=AnnotationsOnParenthesizedTypes] public? get(): ( @A() C.() -> C )
public? [ContainingClassKey=AnnotationsOnParenthesizedTypes] get(): ( @A() C.() -> C )
public? final? val lambdaParameterNP: ( (@A() C) -> C )
[ContainingClassKey=AnnotationsOnParenthesizedTypes] public? get(): ( (@A() C) -> C )
public? [ContainingClassKey=AnnotationsOnParenthesizedTypes] get(): ( (@A() C) -> C )
}
@Target(AnnotationTarget#.TYPE#, AnnotationTarget#.TYPE_PARAMETER#) public? final? annotation class A : R|kotlin/Annotation| {
@@ -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<*>, *>
[ContainingClassKey=Test] public? get(): a.b.C<out CharSequence, *>.D<in List<*>, *>
public? [ContainingClassKey=Test] get(): a.b.C<out CharSequence, *>.D<in List<*>, *>
}
@@ -5,14 +5,14 @@ FILE: propertyAccessorsContractDescription.kt
}
public? final? var myInt: Int = IntegerLiteral(0)
[ContainingClassKey=MyClass] public? get(): Int
public? [ContainingClassKey=MyClass] get(): Int
[Contract description] <
returnsNotNull#()
>
{
^ IntegerLiteral(1)
}
[ContainingClassKey=MyClass] public? set(value: Int): R|kotlin/Unit| {
public? [ContainingClassKey=MyClass] set(value: Int): R|kotlin/Unit| {
field# = value#.times#(IntegerLiteral(10))
}
@@ -23,14 +23,14 @@ FILE: propertyAccessorsContractDescription.kt
}
public? final? var anotherInt: Int = IntegerLiteral(0)
[ContainingClassKey=AnotherClass] public? get(): Int
public? [ContainingClassKey=AnotherClass] get(): Int
[Contract description] <
returnsNotNull#()
>
{
^ IntegerLiteral(1)
}
[ContainingClassKey=AnotherClass] public? set(value: Int): R|kotlin/Unit|
public? [ContainingClassKey=AnotherClass] set(value: Int): R|kotlin/Unit|
[Contract description] <
returns#()
>
@@ -45,14 +45,14 @@ FILE: propertyAccessorsContractDescription.kt
}
public? final? var someInt: Int = IntegerLiteral(0)
[ContainingClassKey=SomeClass] public? get(): Int
public? [ContainingClassKey=SomeClass] get(): Int
[Contract description] <
returnsNotNull#()
>
{
^ IntegerLiteral(1)
}
[ContainingClassKey=SomeClass] public? set(value: Int): R|kotlin/Unit|
public? [ContainingClassKey=SomeClass] set(value: Int): R|kotlin/Unit|
[Contract description] <
returns#().implies#(!=(value#, Null(null)))
>
@@ -5,7 +5,7 @@ FILE: derivedClass.kt
}
public? final? [IsFromPrimaryConstructor=true] val x: T = R|<local>/x|
[ContainingClassKey=Base] public? get(): T
public? [ContainingClassKey=Base] get(): T
}
public? final? class Derived<T : Any> : Base<T> {
@@ -20,10 +20,10 @@ FILE: enums.kt
}
public? final? [IsFromPrimaryConstructor=true] val m: Double = R|<local>/m|
[ContainingClassKey=Planet] public? get(): Double
public? [ContainingClassKey=Planet] get(): Double
internal final? [IsFromPrimaryConstructor=true] val r: Double = R|<local>/r|
[ContainingClassKey=Planet] internal get(): Double
internal [ContainingClassKey=Planet] get(): Double
public final static [ContainingClassKey=Planet] enum entry MERCURY: R|Planet| = object : R|Planet| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
@@ -59,7 +59,7 @@ FILE: enums.kt
}
public? final? val g: Double = G#.times#(m#).div#(r#.times#(r#))
[ContainingClassKey=Planet] public? get(): Double
public? [ContainingClassKey=Planet] get(): Double
public? abstract fun sayHello(): R|kotlin/Unit|
@@ -69,7 +69,7 @@ FILE: enums.kt
}
public? final? const val G: <implicit> = Double(6.67E-11)
[ContainingClassKey=Companion] public? get(): <implicit>
public? [ContainingClassKey=Companion] get(): <implicit>
}
@@ -86,7 +86,7 @@ FILE: enums.kt
}
public? final? [IsFromPrimaryConstructor=true] val signature: String = R|<local>/signature|
[ContainingClassKey=PseudoInsn] public? get(): String
public? [ContainingClassKey=PseudoInsn] get(): String
public final static [ContainingClassKey=PseudoInsn] enum entry FIX_STACK_BEFORE_JUMP: R|PseudoInsn| = object : R|PseudoInsn| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
@@ -19,7 +19,7 @@ FILE: enums2.kt
}
public? final? [IsFromPrimaryConstructor=true] val x: Some = R|<local>/x|
[ContainingClassKey=SomeEnum] public? get(): Some
public? [ContainingClassKey=SomeEnum] get(): Some
public final static [ContainingClassKey=SomeEnum] enum entry FIRST: R|SomeEnum| = object : R|SomeEnum| {
private [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| {
@@ -16,8 +16,8 @@ FILE: external.kt
public? final? external fun bar(): String
public? final? var y: Int
[ContainingClassKey=NotExternal] public? external get(): Int
[ContainingClassKey=NotExternal] public? set(value: Int): R|kotlin/Unit| {
public? external [ContainingClassKey=NotExternal] get(): Int
public? [ContainingClassKey=NotExternal] set(value: Int): R|kotlin/Unit| {
}
}
@@ -5,7 +5,7 @@ FILE: nestedClass.kt
}
public? final? [IsFromPrimaryConstructor=true] val s: String = R|<local>/s|
[ContainingClassKey=Base] public? get(): String
public? [ContainingClassKey=Base] get(): String
}
public? final? class Outer : R|kotlin/Any| {
@@ -1,7 +1,7 @@
FILE: noPrimaryConstructor.kt
public? final? class NoPrimary : R|kotlin/Any| {
public? final? val x: String
[ContainingClassKey=NoPrimary] public? get(): String
public? [ContainingClassKey=NoPrimary] get(): String
public? [ContainingClassKey=NoPrimary] constructor(x: String): R|NoPrimary| {
super<R|kotlin/Any|>()
@@ -3,7 +3,7 @@ FILE: simpleClass.kt
public? final? fun foo(x: Int, y: String): String
public? final? val bar: Boolean
[ContainingClassKey=SomeInterface] public? get(): Boolean
public? [ContainingClassKey=SomeInterface] get(): Boolean
}
public? final? class SomeClass : SomeInterface {
@@ -12,22 +12,22 @@ FILE: simpleClass.kt
}
private final? val baz: <implicit> = IntegerLiteral(42)
[ContainingClassKey=SomeClass] private get(): <implicit>
private [ContainingClassKey=SomeClass] get(): <implicit>
public? open? override fun foo(x: Int, y: String): String {
^foo y#.plus#(x#).plus#(baz#)
}
public? open? override var bar: Boolean
[ContainingClassKey=SomeClass] public? get(): Boolean {
public? [ContainingClassKey=SomeClass] get(): Boolean {
^ Boolean(true)
}
[ContainingClassKey=SomeClass] public? set(value: Boolean): R|kotlin/Unit| {
public? [ContainingClassKey=SomeClass] set(value: Boolean): R|kotlin/Unit| {
}
public? final? lateinit var fau: Double
[ContainingClassKey=SomeClass] public? get(): Double
[ContainingClassKey=SomeClass] public? set(value: Double): R|kotlin/Unit|
public? [ContainingClassKey=SomeClass] get(): Double
public? [ContainingClassKey=SomeClass] set(value: Double): R|kotlin/Unit|
}
public? final? inline class InlineClass : R|kotlin/Any| {
@@ -14,15 +14,15 @@ FILE: typeParameterVsNested.kt
}
public? abstract val x: T
[ContainingClassKey=My] public? get(): T
public? [ContainingClassKey=My] get(): T
public? abstract fun foo(arg: T): R|kotlin/Unit|
public? abstract val y: My.T
[ContainingClassKey=My] public? get(): My.T
public? [ContainingClassKey=My] get(): My.T
public? abstract val z: test.My.T
[ContainingClassKey=My] public? get(): test.My.T
public? [ContainingClassKey=My] get(): test.My.T
public? final? class Some : T {
public? [ContainingClassKey=Some] constructor(): R|test/My.Some| {
@@ -26,10 +26,10 @@ FILE: annotated.kt
}
public? final? [IsFromPrimaryConstructor=true] val x: Int = R|<local>/x|
[ContainingClassKey=Two] public? get(): Int
public? [ContainingClassKey=Two] get(): Int
public? final? [IsFromPrimaryConstructor=true] val y: Int = R|<local>/y|
[ContainingClassKey=Two] public? get(): Int
public? [ContainingClassKey=Two] get(): Int
public final operator fun component1(): Int
@@ -10,7 +10,7 @@ FILE: arrayAccess.kt
}
public? final? [IsFromPrimaryConstructor=true] val v: IntArray = R|<local>/v|
[ContainingClassKey=Wrapper] public? get(): IntArray
public? [ContainingClassKey=Wrapper] get(): IntArray
}
public? final? fun test(a: IntArray, w: Wrapper): <implicit> {
@@ -8,7 +8,7 @@ FILE: callableReferences.kt
}
public? final? val bar: <implicit> = IntegerLiteral(0)
[ContainingClassKey=A] public? get(): <implicit>
public? [ContainingClassKey=A] get(): <implicit>
}
public? final? fun A.qux(): R|kotlin/Unit| {
@@ -14,8 +14,8 @@ FILE: calls.kt
}
public? final? [IsFromPrimaryConstructor=true] var x: Int = R|<local>/x|
[ContainingClassKey=My] public? get(): Int
[ContainingClassKey=My] public? set(value: Int): R|kotlin/Unit|
public? [ContainingClassKey=My] get(): Int
public? [ContainingClassKey=My] set(value: Int): R|kotlin/Unit|
public? final? operator fun invoke(): <implicit> {
^invoke x#
@@ -5,7 +5,7 @@ FILE: collectionLiterals.kt
}
public? final? [IsFromPrimaryConstructor=true] val arr: IntArray = R|<local>/arr|
[ContainingClassKey=Ann1] public? get(): IntArray
public? [ContainingClassKey=Ann1] get(): IntArray
}
public? final? annotation class Ann2 : R|kotlin/Annotation| {
@@ -14,7 +14,7 @@ FILE: collectionLiterals.kt
}
public? final? [IsFromPrimaryConstructor=true] val arr: DoubleArray = R|<local>/arr|
[ContainingClassKey=Ann2] public? get(): DoubleArray
public? [ContainingClassKey=Ann2] get(): DoubleArray
}
public? final? annotation class Ann3 : R|kotlin/Annotation| {
@@ -23,7 +23,7 @@ FILE: collectionLiterals.kt
}
public? final? [IsFromPrimaryConstructor=true] val arr: Array<String> = R|<local>/arr|
[ContainingClassKey=Ann3] public? get(): Array<String>
public? [ContainingClassKey=Ann3] get(): Array<String>
}
@Ann1(<implicitArrayOf>()) @Ann2(<implicitArrayOf>()) @Ann3(<implicitArrayOf>()) public? final? class Zero : R|kotlin/Any| {
@@ -5,13 +5,13 @@ FILE: destructuring.kt
}
public? final? [IsFromPrimaryConstructor=true] val first: Int = R|<local>/first|
[ContainingClassKey=Some] public? get(): Int
public? [ContainingClassKey=Some] get(): Int
public? final? [IsFromPrimaryConstructor=true] val second: Double = R|<local>/second|
[ContainingClassKey=Some] public? get(): Double
public? [ContainingClassKey=Some] get(): Double
public? final? [IsFromPrimaryConstructor=true] val third: String = R|<local>/third|
[ContainingClassKey=Some] public? get(): String
public? [ContainingClassKey=Some] get(): String
public final operator fun component1(): Int
@@ -55,10 +55,10 @@ FILE: for.kt
}
public? final? [IsFromPrimaryConstructor=true] val x: Int = R|<local>/x|
[ContainingClassKey=Some] public? get(): Int
public? [ContainingClassKey=Some] get(): Int
public? final? [IsFromPrimaryConstructor=true] val y: Int = R|<local>/y|
[ContainingClassKey=Some] public? get(): Int
public? [ContainingClassKey=Some] get(): Int
public final operator fun component1(): Int
@@ -5,7 +5,7 @@ FILE: init.kt
}
public? final? val x: Int
[ContainingClassKey=WithInit] public? get(): Int
public? [ContainingClassKey=WithInit] get(): Int
init {
this#.x# = x#
@@ -5,10 +5,10 @@ FILE: lambda.kt
}
public? final? [IsFromPrimaryConstructor=true] val x: Int = R|<local>/x|
[ContainingClassKey=Tuple] public? get(): Int
public? [ContainingClassKey=Tuple] get(): Int
public? final? [IsFromPrimaryConstructor=true] val y: Int = R|<local>/y|
[ContainingClassKey=Tuple] public? get(): Int
public? [ContainingClassKey=Tuple] get(): Int
public final operator fun component1(): Int
@@ -6,7 +6,7 @@ FILE: locals.kt
}
public? final? [IsFromPrimaryConstructor=true] val pp: Int = R|<local>/pp|
[ContainingClassKey=Local] public? get(): Int
public? [ContainingClassKey=Local] get(): Int
public? final? fun diff(): <implicit> {
^diff pp#.minus#(p#)
@@ -13,7 +13,7 @@ FILE: these.kt
}
public? final? val instance: Some
[ContainingClassKey=Some] public? get(): Some {
public? [ContainingClassKey=Some] get(): Some {
^ this@Some#
}
@@ -36,7 +36,7 @@ FILE: unary.kt
}
public? final? [IsFromPrimaryConstructor=true] val i: Int = R|<local>/i|
[ContainingClassKey=X] public? get(): Int
public? [ContainingClassKey=X] get(): Int
}
public? final? fun test2(x: X): R|kotlin/Unit| {
@@ -79,7 +79,7 @@ FILE: unary.kt
}
public? final? [IsFromPrimaryConstructor=true] val arr: Array<Int> = R|<local>/arr|
[ContainingClassKey=Y] public? get(): Array<Int>
public? [ContainingClassKey=Y] get(): Array<Int>
}
public? final? fun test4(y: Y): R|kotlin/Unit| {
@@ -5,15 +5,45 @@
package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
open class FirDeclarationRenderer {
internal lateinit var components: FirRendererComponents
protected val printer get() = components.printer
private val resolvePhaseRenderer get() = components.resolvePhaseRenderer
private val typeRenderer get() = components.typeRenderer
fun render(declaration: FirDeclaration) {
renderPhaseAndAttributes(declaration)
if (declaration is FirConstructor) {
declaration.dispatchReceiverType?.let {
typeRenderer.render(it)
printer.print(".")
}
printer.print("constructor")
return
}
printer.print(
when (declaration) {
is FirRegularClass -> declaration.classKind.name.toLowerCaseAsciiOnly().replace("_", " ")
is FirTypeAlias -> "typealias"
is FirAnonymousFunction -> (declaration.label?.let { "${it.name}@" } ?: "") + "fun"
is FirSimpleFunction -> "fun"
is FirProperty -> {
val prefix = if (declaration.isLocal) "l" else ""
prefix + if (declaration.isVal) "val" else "var"
}
is FirPropertyAccessor -> if (declaration.isGetter) "get" else "set"
is FirField -> "field"
is FirEnumEntry -> "enum entry"
else -> "unknown"
}
)
}
internal fun renderPhaseAndAttributes(declaration: FirDeclaration) {
resolvePhaseRenderer?.render(declaration)
with(declaration) {
renderDeclarationAttributes()
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.util.*
@@ -243,7 +242,7 @@ class FirRenderer(
override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration) {
modifierRenderer.renderModifiers(memberDeclaration)
visitDeclaration(memberDeclaration as FirDeclaration)
declarationRenderer.render(memberDeclaration)
when (memberDeclaration) {
is FirClassLikeDeclaration -> {
if (memberDeclaration is FirRegularClass) {
@@ -264,24 +263,6 @@ class FirRenderer(
}
}
override fun visitDeclaration(declaration: FirDeclaration) {
declarationRenderer.render(declaration)
print(
when (declaration) {
is FirRegularClass -> declaration.classKind.name.toLowerCaseAsciiOnly().replace("_", " ")
is FirTypeAlias -> "typealias"
is FirSimpleFunction -> "fun"
is FirProperty -> {
val prefix = if (declaration.isLocal) "l" else ""
prefix + if (declaration.isVal) "val" else "var"
}
is FirField -> "field"
is FirEnumEntry -> "enum entry"
else -> "unknown"
}
)
}
override fun visitRegularClass(regularClass: FirRegularClass) {
renderContexts(regularClass.contextReceivers)
annotationRenderer?.render(regularClass)
@@ -356,11 +337,6 @@ class FirRenderer(
modifierRenderer.renderModifiers(constructor)
declarationRenderer.render(constructor)
constructor.dispatchReceiverType?.let {
typeRenderer.render(it)
print(".")
}
print("constructor")
constructor.typeParameters.renderTypeParameters()
valueParameterRenderer.renderParameters(constructor.valueParameters)
print(": ")
@@ -374,10 +350,9 @@ class FirRenderer(
}
override fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor) {
declarationRenderer.render(propertyAccessor)
annotationRenderer?.render(propertyAccessor)
modifierRenderer.renderModifiers(propertyAccessor)
print(if (propertyAccessor.isGetter) "get" else "set")
declarationRenderer.render(propertyAccessor)
valueParameterRenderer.renderParameters(propertyAccessor.valueParameters)
print(": ")
propertyAccessor.returnTypeRef.accept(this)
@@ -390,13 +365,9 @@ class FirRenderer(
}
override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction) {
declarationRenderer.render(anonymousFunction)
annotationRenderer?.render(anonymousFunction)
val label = anonymousFunction.label
if (label != null) {
print("${label.name}@")
}
print("fun ")
declarationRenderer.render(anonymousFunction)
print(" ")
val receiverType = anonymousFunction.receiverTypeRef
if (receiverType != null) {
receiverType.accept(this)
@@ -422,7 +393,7 @@ class FirRenderer(
override fun visitFunction(function: FirFunction) {
valueParameterRenderer.renderParameters(function.valueParameters)
visitDeclaration(function)
declarationRenderer.render(function)
bodyRenderer?.render(function)
}
@@ -28,7 +28,7 @@ open class FirValueParameterRenderer {
}
fun renderParameter(valueParameter: FirValueParameter) {
declarationRenderer.render(valueParameter)
declarationRenderer.renderPhaseAndAttributes(valueParameter)
annotationRenderer?.render(valueParameter)
modifierRenderer.renderModifiers(valueParameter)
if (valueParameter.name != SpecialNames.NO_NAME_PROVIDED) {