[FIR] Refactor: extract resolved named reference rendering out of FirRenderer
^KT-62585
This commit is contained in:
committed by
Space Team
parent
37a0dd9487
commit
6b1e340364
@@ -46,6 +46,7 @@ class FirRenderer(
|
|||||||
override val valueParameterRenderer: FirValueParameterRenderer? = FirValueParameterRenderer(),
|
override val valueParameterRenderer: FirValueParameterRenderer? = FirValueParameterRenderer(),
|
||||||
override val errorExpressionRenderer: FirErrorExpressionRenderer? = FirErrorExpressionOnlyErrorRenderer(),
|
override val errorExpressionRenderer: FirErrorExpressionRenderer? = FirErrorExpressionOnlyErrorRenderer(),
|
||||||
override val fileAnnotationsContainerRenderer: FirFileAnnotationsContainerRenderer? = null,
|
override val fileAnnotationsContainerRenderer: FirFileAnnotationsContainerRenderer? = null,
|
||||||
|
override val resolvedNamedReferenceRenderer: FirResolvedNamedReferenceRenderer = FirResolvedNamedReferenceRendererWithLabel()
|
||||||
) : FirRendererComponents {
|
) : FirRendererComponents {
|
||||||
|
|
||||||
override val visitor = Visitor()
|
override val visitor = Visitor()
|
||||||
@@ -98,6 +99,7 @@ class FirRenderer(
|
|||||||
valueParameterRenderer?.components = this
|
valueParameterRenderer?.components = this
|
||||||
errorExpressionRenderer?.components = this
|
errorExpressionRenderer?.components = this
|
||||||
fileAnnotationsContainerRenderer?.components = this
|
fileAnnotationsContainerRenderer?.components = this
|
||||||
|
resolvedNamedReferenceRenderer.components = this
|
||||||
}
|
}
|
||||||
|
|
||||||
fun renderElementAsString(element: FirElement, trim: Boolean = false): String {
|
fun renderElementAsString(element: FirElement, trim: Boolean = false): String {
|
||||||
@@ -924,57 +926,13 @@ class FirRenderer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitResolvedNamedReference(resolvedNamedReference: FirResolvedNamedReference) {
|
override fun visitResolvedNamedReference(resolvedNamedReference: FirResolvedNamedReference) {
|
||||||
print("R|")
|
resolvedNamedReferenceRenderer.render(resolvedNamedReference)
|
||||||
val symbol = resolvedNamedReference.resolvedSymbol
|
|
||||||
val isSubstitutionOverride = (symbol.fir as? FirCallableDeclaration)?.isSubstitutionOverride == true
|
|
||||||
|
|
||||||
if (isSubstitutionOverride) {
|
|
||||||
print("SubstitutionOverride<")
|
|
||||||
}
|
|
||||||
|
|
||||||
referencedSymbolRenderer.printReference(symbol.unwrapIntersectionOverrides())
|
|
||||||
|
|
||||||
if (resolvedNamedReference is FirResolvedCallableReference) {
|
|
||||||
if (resolvedNamedReference.inferredTypeArguments.isNotEmpty()) {
|
|
||||||
print("<")
|
|
||||||
for ((index, element) in resolvedNamedReference.inferredTypeArguments.withIndex()) {
|
|
||||||
if (index > 0) {
|
|
||||||
print(", ")
|
|
||||||
}
|
|
||||||
typeRenderer.render(element)
|
|
||||||
}
|
|
||||||
print(">")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isSubstitutionOverride) {
|
|
||||||
when (symbol) {
|
|
||||||
is FirNamedFunctionSymbol -> {
|
|
||||||
print(": ")
|
|
||||||
symbol.fir.returnTypeRef.accept(this)
|
|
||||||
}
|
|
||||||
is FirPropertySymbol -> {
|
|
||||||
print(": ")
|
|
||||||
symbol.fir.returnTypeRef.accept(this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print(">")
|
|
||||||
}
|
|
||||||
if (resolvedNamedReference is FirResolvedErrorReference) {
|
|
||||||
print("<${resolvedNamedReference.diagnostic.reason}>#")
|
|
||||||
}
|
|
||||||
print("|")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference) {
|
override fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference) {
|
||||||
visitResolvedNamedReference(resolvedErrorReference)
|
visitResolvedNamedReference(resolvedErrorReference)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FirBasedSymbol<*>.unwrapIntersectionOverrides(): FirBasedSymbol<*> {
|
|
||||||
(this as? FirCallableSymbol<*>)?.baseForIntersectionOverride?.let { return it.unwrapIntersectionOverrides() }
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitResolvedCallableReference(resolvedCallableReference: FirResolvedCallableReference) {
|
override fun visitResolvedCallableReference(resolvedCallableReference: FirResolvedCallableReference) {
|
||||||
visitResolvedNamedReference(resolvedCallableReference)
|
visitResolvedNamedReference(resolvedCallableReference)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,4 +26,5 @@ internal interface FirRendererComponents {
|
|||||||
val valueParameterRenderer: FirValueParameterRenderer?
|
val valueParameterRenderer: FirValueParameterRenderer?
|
||||||
val errorExpressionRenderer: FirErrorExpressionRenderer?
|
val errorExpressionRenderer: FirErrorExpressionRenderer?
|
||||||
val fileAnnotationsContainerRenderer: FirFileAnnotationsContainerRenderer?
|
val fileAnnotationsContainerRenderer: FirFileAnnotationsContainerRenderer?
|
||||||
|
val resolvedNamedReferenceRenderer: FirResolvedNamedReferenceRenderer
|
||||||
}
|
}
|
||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.renderer
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.baseForIntersectionOverride
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.isSubstitutionOverride
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||||
|
|
||||||
|
open class FirResolvedNamedReferenceRenderer {
|
||||||
|
|
||||||
|
internal lateinit var components: FirRendererComponents
|
||||||
|
|
||||||
|
protected val printer: FirPrinter get() = components.printer
|
||||||
|
private val visitor: FirRenderer.Visitor get() = components.visitor
|
||||||
|
|
||||||
|
internal open fun render(resolvedNamedReference: FirResolvedNamedReference) {
|
||||||
|
val symbol = resolvedNamedReference.resolvedSymbol
|
||||||
|
val isSubstitutionOverride = (symbol.fir as? FirCallableDeclaration)?.isSubstitutionOverride == true
|
||||||
|
|
||||||
|
if (isSubstitutionOverride) {
|
||||||
|
printer.print("SubstitutionOverride<")
|
||||||
|
}
|
||||||
|
|
||||||
|
components.referencedSymbolRenderer.printReference(symbol.unwrapIntersectionOverrides())
|
||||||
|
|
||||||
|
if (resolvedNamedReference is FirResolvedCallableReference) {
|
||||||
|
if (resolvedNamedReference.inferredTypeArguments.isNotEmpty()) {
|
||||||
|
printer.print("<")
|
||||||
|
for ((index, element) in resolvedNamedReference.inferredTypeArguments.withIndex()) {
|
||||||
|
if (index > 0) {
|
||||||
|
printer.print(", ")
|
||||||
|
}
|
||||||
|
components.typeRenderer.render(element)
|
||||||
|
}
|
||||||
|
printer.print(">")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isSubstitutionOverride) {
|
||||||
|
when (symbol) {
|
||||||
|
is FirNamedFunctionSymbol -> {
|
||||||
|
printer.print(": ")
|
||||||
|
symbol.fir.returnTypeRef.accept(visitor)
|
||||||
|
}
|
||||||
|
is FirPropertySymbol -> {
|
||||||
|
printer.print(": ")
|
||||||
|
symbol.fir.returnTypeRef.accept(visitor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printer.print(">")
|
||||||
|
}
|
||||||
|
if (resolvedNamedReference is FirResolvedErrorReference) {
|
||||||
|
printer.print("<${resolvedNamedReference.diagnostic.reason}>#")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun FirBasedSymbol<*>.unwrapIntersectionOverrides(): FirBasedSymbol<*> {
|
||||||
|
(this as? FirCallableSymbol<*>)?.baseForIntersectionOverride?.let { return it.unwrapIntersectionOverrides() }
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class FirResolvedNamedReferenceRendererWithLabel : FirResolvedNamedReferenceRenderer() {
|
||||||
|
override fun render(resolvedNamedReference: FirResolvedNamedReference) {
|
||||||
|
printer.print("R|")
|
||||||
|
super.render(resolvedNamedReference)
|
||||||
|
printer.print("|")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user