[FIR] Render backing fields by FirRenderer

This commit is contained in:
Roman Golyshev
2021-09-14 18:06:09 +03:00
committed by Space
parent 36b02082a6
commit bb2b0107c6
15 changed files with 63 additions and 0 deletions
@@ -5,24 +5,31 @@ FILE: backingFieldModifiers.kt
} }
public final val a: R|kotlin/Number| public final val a: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(1)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final val b: R|kotlin/Number| public final val b: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(1)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final val c: R|kotlin/Number| public final val c: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(1)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final val d: R|kotlin/Number| public final val d: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(1)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final val e: R|kotlin/Number| public final val e: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(1)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final val f: R|kotlin/Number| public final val f: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(1)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final val g: R|kotlin/Number| public final val g: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(1)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
} }
@@ -6,15 +6,19 @@ FILE: A.kt
} }
public final val a: R|kotlin/Number| public final val a: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(1)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final val b: R|kotlin/Number| public final val b: R|kotlin/Number|
internal <explicit backing field>: R|kotlin/Int| = Int(2)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final val c: R|kotlin/Number| public final val c: R|kotlin/Number|
protected <explicit backing field>: R|kotlin/Int| = Int(3)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final val d: R|kotlin/Number| public final val d: R|kotlin/Number|
public <explicit backing field>: R|kotlin/Int| = Int(5)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final fun rest(): R|kotlin/Unit| { public final fun rest(): R|kotlin/Unit| {
@@ -1,5 +1,6 @@
FILE: backingFieldWithSmartTypeParameters.kt FILE: backingFieldWithSmartTypeParameters.kt
public final val items: R|kotlin/collections/List<kotlin/String>| public final val items: R|kotlin/collections/List<kotlin/String>|
private <explicit backing field>: R|kotlin/collections/MutableList<kotlin/String>| = R|kotlin/collections/mutableListOf|<R|kotlin/String|>()
public get(): R|kotlin/collections/List<kotlin/String>| public get(): R|kotlin/collections/List<kotlin/String>|
public final fun test(): R|kotlin/Unit| { public final fun test(): R|kotlin/Unit| {
R|/items|.R|SubstitutionOverride<kotlin/collections/MutableList.add: R|kotlin/Boolean|>|(String(one more item)) R|/items|.R|SubstitutionOverride<kotlin/collections/MutableList.add: R|kotlin/Boolean|>|(String(one more item))
@@ -1,6 +1,7 @@
FILE: explicitBackingFieldInInterface.kt FILE: explicitBackingFieldInInterface.kt
public abstract interface I : R|kotlin/Any| { public abstract interface I : R|kotlin/Any| {
public abstract val it: R|kotlin/Number| public abstract val it: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(10)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
} }
@@ -8,31 +8,39 @@ FILE: explicitBackingFieldType.kt
public get(): R|kotlin/Int| public get(): R|kotlin/Int|
public final val it: R|kotlin/Number| public final val it: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(4)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final val joke: R|kotlin/Number| public final val joke: R|kotlin/Number|
private <explicit backing field>: R|kotlin/String| = String(Haha)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final val incompatible: R|kotlin/Number| public final val incompatible: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Any?| = Int(42)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final val customGetterNeeded: R|kotlin/Int| public final val customGetterNeeded: R|kotlin/Int|
private <explicit backing field>: R|kotlin/Number| = Int(42)
public get(): R|kotlin/Int| public get(): R|kotlin/Int|
public final val invertedTypes: R|kotlin/Int| public final val invertedTypes: R|kotlin/Int|
private <explicit backing field>: R|kotlin/Number| = Int(42)
public get(): R|kotlin/Int| { public get(): R|kotlin/Int| {
^ Int(30) ^ Int(30)
} }
public final val uninitialized: R|kotlin/Number| public final val uninitialized: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int|
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final val uninitializedWithGetter: R|kotlin/Number| public final val uninitializedWithGetter: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int|
public get(): R|kotlin/Number| { public get(): R|kotlin/Number| {
^ Int(2) ^ Int(2)
} }
public final val initiaizedWithExplicitBackingField: R|kotlin/collections/List<kotlin/Int>| = R|kotlin/collections/listOf|<R|kotlin/Int|>(vararg(Int(1), Int(2))) public final val initiaizedWithExplicitBackingField: R|kotlin/collections/List<kotlin/Int>| = R|kotlin/collections/listOf|<R|kotlin/Int|>(vararg(Int(1), Int(2)))
private <explicit backing field>: R|kotlin/collections/MutableList<kotlin/Int>|
public get(): R|kotlin/collections/List<kotlin/Int>| public get(): R|kotlin/collections/List<kotlin/Int>|
public final val p: R|kotlin/Int| = Int(5) public final val p: R|kotlin/Int| = Int(5)
@@ -41,6 +49,7 @@ FILE: explicitBackingFieldType.kt
} }
public final var setterNeeded: R|kotlin/Int| public final var setterNeeded: R|kotlin/Int|
private <explicit backing field>: R|kotlin/String| = String(test)
public get(): R|kotlin/Int| { public get(): R|kotlin/Int| {
^ this@R|/A|.F|/A.setterNeeded|.R|kotlin/String.length| ^ this@R|/A|.F|/A.setterNeeded|.R|kotlin/String.length|
} }
@@ -3,6 +3,7 @@ FILE: explicitBackingFieldsWithDelegates.kt
^ (Int(2) as R|kotlin/Number|) ^ (Int(2) as R|kotlin/Number|)
} }
) )
private <explicit backing field>: R|kotlin/Int| = Int(10)
public get(): R|kotlin/Number| { public get(): R|kotlin/Number| {
^ D|/thingWithDelefate|.R|kotlin/getValue|<R|kotlin/Number|>(Null(null), ::R|/thingWithDelefate|) ^ D|/thingWithDelefate|.R|kotlin/getValue|<R|kotlin/Number|>(Null(null), ::R|/thingWithDelefate|)
} }
@@ -1,5 +1,6 @@
FILE: filePrivateBackingFieldAccess.kt FILE: filePrivateBackingFieldAccess.kt
public final val list: R|kotlin/collections/List<kotlin/String>| public final val list: R|kotlin/collections/List<kotlin/String>|
private <explicit backing field>: R|kotlin/collections/MutableList<kotlin/String>| = R|kotlin/collections/mutableListOf|<R|kotlin/String|>()
public get(): R|kotlin/collections/List<kotlin/String>| public get(): R|kotlin/collections/List<kotlin/String>|
public final fun add(s: R|kotlin/String|): R|kotlin/Unit| { public final fun add(s: R|kotlin/String|): R|kotlin/Unit| {
R|/list|.R|SubstitutionOverride<kotlin/collections/MutableList.add: R|kotlin/Boolean|>|(R|<local>/s|) R|/list|.R|SubstitutionOverride<kotlin/collections/MutableList.add: R|kotlin/Boolean|>|(R|<local>/s|)
@@ -1,5 +1,6 @@
FILE: lateinitBackingFields.kt FILE: lateinitBackingFields.kt
public final var that: R|kotlin/Int| public final var that: R|kotlin/Int|
private <explicit backing field>: R|kotlin/String|
public get(): R|kotlin/Int| { public get(): R|kotlin/Int| {
^ F|/that|.R|kotlin/String.length| ^ F|/that|.R|kotlin/String.length|
} }
@@ -11,18 +12,22 @@ FILE: lateinitBackingFields.kt
R|kotlin/io/println|(R|/that|) R|kotlin/io/println|(R|/that|)
} }
public final lateinit var number: R|kotlin/Number| public final lateinit var number: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(4)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public set(value: R|kotlin/Number|): R|kotlin/Unit| { public set(value: R|kotlin/Number|): R|kotlin/Unit| {
F|/number| = Int(10) F|/number| = Int(10)
} }
public final val something: R|kotlin/Number| public final val something: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(4)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final lateinit var oneMore: R|kotlin/Number| public final lateinit var oneMore: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(4)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public set(value: R|kotlin/Number|): R|kotlin/Unit| { public set(value: R|kotlin/Number|): R|kotlin/Unit| {
F|/oneMore| = Int(10) F|/oneMore| = Int(10)
} }
public final var thingWithNullableField: R|kotlin/Number| public final var thingWithNullableField: R|kotlin/Number|
private <explicit backing field>: R|kotlin/String?|
public get(): R|kotlin/Number| { public get(): R|kotlin/Number| {
^ Int(20) ^ Int(20)
} }
@@ -1,5 +1,6 @@
FILE: localVariablesWithBackingFields.kt FILE: localVariablesWithBackingFields.kt
public final val that: R|kotlin/Number| public final val that: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(239)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final fun test(): R|kotlin/Unit| { public final fun test(): R|kotlin/Unit| {
lval a: R|kotlin/Number| lval a: R|kotlin/Number|
@@ -19,12 +20,14 @@ FILE: localVariablesWithBackingFields.kt
^ Int(2) ^ Int(2)
} }
) )
private <explicit backing field>: R|kotlin/Int| = Int(10)
public get(): R|kotlin/Number| { public get(): R|kotlin/Number| {
^ this@R|/A|.D|/A.c|.R|kotlin/getValue|<R|kotlin/Int|>(this@R|/A|, ::R|/A.c|) ^ this@R|/A|.D|/A.c|.R|kotlin/getValue|<R|kotlin/Int|>(this@R|/A|, ::R|/A.c|)
} }
} }
public final val R|A|.cc: R|kotlin/Number| public final val R|A|.cc: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(10)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final fun R|A|.cc(): R|kotlin/Unit| { public final fun R|A|.cc(): R|kotlin/Unit| {
lval it: <ERROR TYPE REF: Ambiguity: plus, [kotlin/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/sequences/plus]> = <Unresolved name: a>#.<Ambiguity: plus, [kotlin/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/sequences/plus]>#(Int(2)) lval it: <ERROR TYPE REF: Ambiguity: plus, [kotlin/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/sequences/plus]> = <Unresolved name: a>#.<Ambiguity: plus, [kotlin/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/collections/plus, kotlin/sequences/plus]>#(Int(2))
@@ -5,6 +5,7 @@ FILE: overriddenPropertiesWithExplicitBackingFields.kt
} }
public open var it: R|kotlin/Number| public open var it: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(3)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public set(value: R|kotlin/Number|): R|kotlin/Unit| { public set(value: R|kotlin/Number|): R|kotlin/Unit| {
this@R|/A|.F|/A.it| = R|<local>/value|.R|kotlin/Number.toInt|() this@R|/A|.F|/A.it| = R|<local>/value|.R|kotlin/Number.toInt|()
@@ -5,6 +5,7 @@ FILE: propertyTypeNarrowing.kt
} }
public final val it: R|kotlin/Number| public final val it: R|kotlin/Number|
private <explicit backing field>: R|kotlin/Int| = Int(4)
public get(): R|kotlin/Number| public get(): R|kotlin/Number|
public final fun test(): R|kotlin/Int| { public final fun test(): R|kotlin/Int| {
@@ -5,6 +5,7 @@ FILE: randomWeirdBackingFields.kt
} }
public abstract val foo: R|kotlin/collections/List<kotlin/Int>| public abstract val foo: R|kotlin/collections/List<kotlin/Int>|
internal <explicit backing field>: R|kotlin/collections/MutableList<kotlin/Int>| = R|kotlin/collections/mutableListOf|<R|kotlin/Int|>()
public get(): R|kotlin/collections/List<kotlin/Int>| public get(): R|kotlin/collections/List<kotlin/Int>|
} }
@@ -1,3 +1,4 @@
FILE: redundantExplicitBackingField.kt FILE: redundantExplicitBackingField.kt
public final val it: R|kotlin/Int| public final val it: R|kotlin/Int|
private <explicit backing field>: R|kotlin/Int| = Int(42)
public get(): R|kotlin/Int| public get(): R|kotlin/Int|
@@ -16,38 +16,48 @@ FILE: untypedPropertyWithBackingFieldUsage.kt
^ F|/simpleTypeExpression| ^ F|/simpleTypeExpression|
} }
public final val withFieldNoTypeBlock: R|kotlin/Int| public final val withFieldNoTypeBlock: R|kotlin/Int|
private <explicit backing field>: R|kotlin/Double| = Double(3.14)
public get(): R|kotlin/Int| { public get(): R|kotlin/Int| {
^ <Unresolved name: field>#.R|kotlin/text/toInt|() ^ <Unresolved name: field>#.R|kotlin/text/toInt|()
} }
public final val withFieldNoTypeExpression: R|kotlin/Int| public final val withFieldNoTypeExpression: R|kotlin/Int|
private <explicit backing field>: R|kotlin/Double| = Double(3.14)
public get(): R|kotlin/Int| { public get(): R|kotlin/Int| {
^ <Unresolved name: field>#.R|kotlin/text/toInt|() ^ <Unresolved name: field>#.R|kotlin/text/toInt|()
} }
public final val withFieldTypeBlock: R|kotlin/Int| public final val withFieldTypeBlock: R|kotlin/Int|
private <explicit backing field>: R|kotlin/Double| = Double(3.14)
public get(): R|kotlin/Int| { public get(): R|kotlin/Int| {
^ F|/withFieldTypeBlock|.R|kotlin/Double.toInt|() ^ F|/withFieldTypeBlock|.R|kotlin/Double.toInt|()
} }
public final val withFieldTypeExpression: R|kotlin/Int| public final val withFieldTypeExpression: R|kotlin/Int|
private <explicit backing field>: R|kotlin/Double| = Double(3.14)
public get(): R|kotlin/Int| { public get(): R|kotlin/Int| {
^ F|/withFieldTypeExpression|.R|kotlin/Double.toInt|() ^ F|/withFieldTypeExpression|.R|kotlin/Double.toInt|()
} }
public final val minimalFieldWithInitializer: <ERROR TYPE REF: Cannot infer variable type without initializer / getter / delegate> public final val minimalFieldWithInitializer: <ERROR TYPE REF: Cannot infer variable type without initializer / getter / delegate>
private <explicit backing field>: R|kotlin/Int| = Int(1)
public get(): <ERROR TYPE REF: Cannot infer variable type without initializer / getter / delegate> public get(): <ERROR TYPE REF: Cannot infer variable type without initializer / getter / delegate>
public final val minimalFieldWithNoInitializer: <ERROR TYPE REF: Cannot infer variable type without initializer / getter / delegate> public final val minimalFieldWithNoInitializer: <ERROR TYPE REF: Cannot infer variable type without initializer / getter / delegate>
private <explicit backing field>: R|kotlin/Int|
public get(): <ERROR TYPE REF: Cannot infer variable type without initializer / getter / delegate> public get(): <ERROR TYPE REF: Cannot infer variable type without initializer / getter / delegate>
public final val constWithFieldNoTypeBlock: R|kotlin/Int| public final val constWithFieldNoTypeBlock: R|kotlin/Int|
private <explicit backing field>: R|kotlin/Double| = Double(3.14)
public get(): R|kotlin/Int| { public get(): R|kotlin/Int| {
^ Int(10) ^ Int(10)
} }
public final val constWithFieldNoTypeExpression: R|kotlin/Int| public final val constWithFieldNoTypeExpression: R|kotlin/Int|
private <explicit backing field>: R|kotlin/Double| = Double(3.14)
public get(): R|kotlin/Int| { public get(): R|kotlin/Int| {
^ Int(10) ^ Int(10)
} }
public final val constWithFieldTypeBlock: R|kotlin/Int| public final val constWithFieldTypeBlock: R|kotlin/Int|
private <explicit backing field>: R|kotlin/Double| = Double(3.14)
public get(): R|kotlin/Int| { public get(): R|kotlin/Int| {
^ Int(10) ^ Int(10)
} }
public final val constWithFieldTypeExpression: R|kotlin/Int| public final val constWithFieldTypeExpression: R|kotlin/Int|
private <explicit backing field>: R|kotlin/Double| = Double(3.14)
public get(): R|kotlin/Int| { public get(): R|kotlin/Int| {
^ Int(10) ^ Int(10)
} }
@@ -518,6 +518,12 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
if (!mode.renderPropertyAccessors) return if (!mode.renderPropertyAccessors) return
println() println()
pushIndent() pushIndent()
if (property.hasExplicitBackingField) {
property.backingField?.accept(this)
println()
}
property.getter?.accept(this) property.getter?.accept(this)
if (property.getter?.body == null) { if (property.getter?.body == null) {
println() println()
@@ -531,6 +537,17 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
popIndent() popIndent()
} }
override fun visitBackingField(backingField: FirBackingField) {
print(backingField.visibility.asString() + " ")
print("<explicit backing field>: ")
backingField.returnTypeRef.accept(this)
backingField.initializer?.let {
print(" = ")
it.accept(this)
}
}
override fun visitSimpleFunction(simpleFunction: FirSimpleFunction) { override fun visitSimpleFunction(simpleFunction: FirSimpleFunction) {
visitCallableDeclaration(simpleFunction) visitCallableDeclaration(simpleFunction)
simpleFunction.body?.renderBody() simpleFunction.body?.renderBody()