FIR: handle labeled super reference properly

This commit is contained in:
Jinseong Jeon
2020-04-30 23:37:37 -07:00
committed by Mikhail Glukhikh
parent 260683c20e
commit 7b01cf7b04
32 changed files with 141 additions and 299 deletions
@@ -27,7 +27,7 @@ internal class FirDelegatedConstructorCallImpl(
override var constructedTypeRef: FirTypeRef,
override val isThis: Boolean,
) : FirDelegatedConstructorCall() {
override var calleeReference: FirReference = if (isThis) FirExplicitThisReference(source, null) else FirExplicitSuperReference(source, constructedTypeRef)
override var calleeReference: FirReference = if (isThis) FirExplicitThisReference(source, null) else FirExplicitSuperReference(source, null, constructedTypeRef)
override val isSuper: Boolean get() = !isThis
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.visitors.*
abstract class FirSuperReference : FirReference() {
abstract override val source: FirSourceElement?
abstract val labelName: String?
abstract val superTypeRef: FirTypeRef
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitSuperReference(this, data)
@@ -21,11 +21,13 @@ import org.jetbrains.kotlin.fir.visitors.*
@FirBuilderDsl
class FirExplicitSuperReferenceBuilder {
var source: FirSourceElement? = null
var labelName: String? = null
lateinit var superTypeRef: FirTypeRef
fun build(): FirSuperReference {
return FirExplicitSuperReference(
source,
labelName,
superTypeRef,
)
}
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.visitors.*
internal class FirExplicitSuperReference(
override val source: FirSourceElement?,
override val labelName: String?,
override var superTypeRef: FirTypeRef,
) : FirSuperReference() {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
@@ -962,6 +962,9 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
print("super<")
superReference.superTypeRef.accept(this)
print(">")
superReference.labelName?.let {
print("@$it#")
}
}
override fun visitQualifiedAccess(qualifiedAccess: FirQualifiedAccess) {
@@ -105,7 +105,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
impl(delegatedConstructorCall) {
default(
"calleeReference",
"if (isThis) FirExplicitThisReference(source, null) else FirExplicitSuperReference(source, constructedTypeRef)"
"if (isThis) FirExplicitThisReference(source, null) else FirExplicitSuperReference(source, null, constructedTypeRef)"
)
default("isSuper") {
value = "!isThis"
@@ -521,6 +521,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
}
superReference.configure {
+stringField("labelName", nullable = true)
+field("superTypeRef", typeRef, withReplace = true)
}