FIR renderer: extract separate ConeTypeRenderer
This commit is contained in:
+3
-1
@@ -5,6 +5,8 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.contracts.description
|
||||
|
||||
import org.jetbrains.kotlin.fir.types.renderForDebugging
|
||||
|
||||
class ConeContractRenderer(private val builder: StringBuilder) : ConeContractDescriptionVisitor<Unit, Nothing?>() {
|
||||
override fun visitConditionalEffectDeclaration(conditionalEffect: ConeConditionalEffectDeclaration, data: Nothing?) {
|
||||
conditionalEffect.effect.accept(this, data)
|
||||
@@ -37,7 +39,7 @@ class ConeContractRenderer(private val builder: StringBuilder) : ConeContractDes
|
||||
|
||||
override fun visitIsInstancePredicate(isInstancePredicate: ConeIsInstancePredicate, data: Nothing?) {
|
||||
isInstancePredicate.arg.accept(this, data)
|
||||
builder.append(" ${if (isInstancePredicate.isNegated) "!" else ""}is ${isInstancePredicate.type}")
|
||||
builder.append(" ${if (isInstancePredicate.isNegated) "!" else ""}is ${isInstancePredicate.type.renderForDebugging()}")
|
||||
}
|
||||
|
||||
override fun visitIsNullPredicate(isNullPredicate: ConeIsNullPredicate, data: Nothing?) {
|
||||
|
||||
@@ -23,7 +23,7 @@ open class FirAnnotationRenderer internal constructor(components: FirRendererCom
|
||||
}
|
||||
}
|
||||
|
||||
private fun renderAnnotation(annotation: FirAnnotation) {
|
||||
internal fun renderAnnotation(annotation: FirAnnotation) {
|
||||
printer.print("@")
|
||||
annotation.useSiteTarget?.let {
|
||||
printer.print(it.name)
|
||||
|
||||
@@ -20,7 +20,7 @@ class FirBodyRenderer internal constructor(components: FirRendererComponents) :
|
||||
if (block == null) return
|
||||
when (block) {
|
||||
is FirLazyBlock -> {
|
||||
println(" { LAZY_BLOCK }")
|
||||
printer.println(" { LAZY_BLOCK }")
|
||||
}
|
||||
else -> {
|
||||
annotationRenderer?.render(block)
|
||||
|
||||
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.renderer
|
||||
|
||||
import org.jetbrains.kotlin.utils.Printer
|
||||
|
||||
abstract class FirPrinter internal constructor(builder: StringBuilder) {
|
||||
open class FirPrinter(builder: StringBuilder) {
|
||||
private val printer = Printer(builder)
|
||||
|
||||
private var lineBeginning = true
|
||||
|
||||
@@ -47,6 +47,8 @@ open class FirRenderer private constructor(
|
||||
|
||||
override var bodyRenderer: FirBodyRenderer? = null
|
||||
|
||||
override lateinit var typeRenderer: ConeTypeRenderer
|
||||
|
||||
override lateinit var visitor: Visitor
|
||||
|
||||
override lateinit var printer: FirPrinter
|
||||
@@ -154,12 +156,18 @@ open class FirRenderer private constructor(
|
||||
else ->
|
||||
null
|
||||
}
|
||||
private val bodyRenderer = if (mode.renderBodies) FirBodyRenderer(components) else null
|
||||
private val bodyRenderer =
|
||||
if (mode.renderBodies) FirBodyRenderer(components) else null
|
||||
|
||||
@Suppress("LeakingThis")
|
||||
private val typeRenderer =
|
||||
if (mode.renderDetailedTypeReferences) ConeTypeRendererForDebugging(builder) else ConeTypeRenderer(builder)
|
||||
|
||||
init {
|
||||
components.visitor = visitor
|
||||
components.annotationRenderer = annotationRenderer
|
||||
components.bodyRenderer = bodyRenderer
|
||||
components.typeRenderer = typeRenderer
|
||||
@Suppress("LeakingThis")
|
||||
components.printer = this
|
||||
}
|
||||
@@ -188,7 +196,7 @@ open class FirRenderer private constructor(
|
||||
if (index > 0) {
|
||||
print(", ")
|
||||
}
|
||||
print(element.render())
|
||||
print(element.renderForDebugging())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -318,6 +326,10 @@ open class FirRenderer private constructor(
|
||||
}
|
||||
}
|
||||
|
||||
fun renderAnnotations(annotationContainer: FirAnnotationContainer) {
|
||||
annotationRenderer?.render(annotationContainer)
|
||||
}
|
||||
|
||||
protected open fun renderClassDeclarations(regularClass: FirRegularClass) {
|
||||
if (mode.renderNestedDeclarations) {
|
||||
regularClass.declarations.renderDeclarations()
|
||||
@@ -346,6 +358,14 @@ open class FirRenderer private constructor(
|
||||
popIndent()
|
||||
}
|
||||
|
||||
override fun visitAnnotation(annotation: FirAnnotation) {
|
||||
annotationRenderer?.renderAnnotation(annotation)
|
||||
}
|
||||
|
||||
override fun visitAnnotationCall(annotationCall: FirAnnotationCall) {
|
||||
annotationRenderer?.renderAnnotation(annotationCall)
|
||||
}
|
||||
|
||||
override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration) {
|
||||
renderContexts(callableDeclaration.contextReceivers)
|
||||
annotationRenderer?.render(callableDeclaration)
|
||||
@@ -603,7 +623,7 @@ open class FirRenderer private constructor(
|
||||
constructor.renderDeclarationData()
|
||||
|
||||
constructor.dispatchReceiverType?.let {
|
||||
print(it.render())
|
||||
typeRenderer.render(it)
|
||||
print(".")
|
||||
}
|
||||
print("constructor")
|
||||
@@ -1051,15 +1071,7 @@ open class FirRenderer private constructor(
|
||||
}
|
||||
|
||||
override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef) {
|
||||
val kind = resolvedTypeRef.functionTypeKind
|
||||
if (mode.renderDetailedTypeReferences) {
|
||||
print("R|")
|
||||
}
|
||||
val coneType = resolvedTypeRef.type
|
||||
print(coneType.renderFunctionType(kind, renderFqNames = mode.renderDetailedTypeReferences))
|
||||
if (mode.renderDetailedTypeReferences) {
|
||||
print("|")
|
||||
}
|
||||
typeRenderer.renderAsPossibleFunctionType(resolvedTypeRef.type)
|
||||
}
|
||||
|
||||
override fun visitUserTypeRef(userTypeRef: FirUserTypeRef) {
|
||||
|
||||
@@ -10,4 +10,5 @@ internal interface FirRendererComponents {
|
||||
val printer: FirPrinter
|
||||
val annotationRenderer: FirAnnotationRenderer?
|
||||
val bodyRenderer: FirBodyRenderer?
|
||||
val typeRenderer: ConeTypeRenderer
|
||||
}
|
||||
@@ -75,13 +75,13 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
|
||||
when (a) {
|
||||
is ConeErrorType -> {
|
||||
require(b is ConeErrorType) {
|
||||
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
|
||||
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
|
||||
}
|
||||
return a.hashCode() - b.hashCode()
|
||||
}
|
||||
is ConeLookupTagBasedType -> {
|
||||
require(b is ConeLookupTagBasedType) {
|
||||
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
|
||||
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
|
||||
}
|
||||
val nameDiff = a.lookupTag.name.compareTo(b.lookupTag.name)
|
||||
if (nameDiff != 0) {
|
||||
@@ -95,7 +95,7 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
|
||||
}
|
||||
is ConeFlexibleType -> {
|
||||
require(b is ConeFlexibleType) {
|
||||
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
|
||||
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
|
||||
}
|
||||
val lowerBoundDiff = compare(a.lowerBound, b.lowerBound)
|
||||
if (lowerBoundDiff != 0) {
|
||||
@@ -105,7 +105,7 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
|
||||
}
|
||||
is ConeCapturedType -> {
|
||||
require(b is ConeCapturedType) {
|
||||
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
|
||||
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
|
||||
}
|
||||
val aHasLowerType = if (a.lowerType != null) 1 else 0
|
||||
val bHasLowerType = if (b.lowerType != null) 1 else 0
|
||||
@@ -127,13 +127,13 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
|
||||
}
|
||||
is ConeDefinitelyNotNullType -> {
|
||||
require(b is ConeDefinitelyNotNullType) {
|
||||
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
|
||||
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
|
||||
}
|
||||
return compare(a.original, b.original)
|
||||
}
|
||||
is ConeIntersectionType -> {
|
||||
require(b is ConeIntersectionType) {
|
||||
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
|
||||
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
|
||||
}
|
||||
val sizeDiff = a.intersectedTypes.size - b.intersectedTypes.size
|
||||
if (sizeDiff != 0) {
|
||||
@@ -144,7 +144,7 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
|
||||
}
|
||||
is ConeStubType -> {
|
||||
require(b is ConeStubType) {
|
||||
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
|
||||
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
|
||||
}
|
||||
val nameDiff = a.constructor.variable.typeConstructor.name.compareTo(b.constructor.variable.typeConstructor.name)
|
||||
if (nameDiff != 0) {
|
||||
@@ -154,7 +154,7 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
|
||||
}
|
||||
is ConeIntegerLiteralConstantType -> {
|
||||
require(b is ConeIntegerLiteralConstantType) {
|
||||
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
|
||||
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
|
||||
}
|
||||
val valueDiff = a.value - b.value
|
||||
if (valueDiff != 0L) {
|
||||
@@ -171,7 +171,7 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
|
||||
return compare(a.nullability, b.nullability)
|
||||
}
|
||||
else ->
|
||||
error("Unsupported type comparison: ${a.render()} v.s. ${b.render()}")
|
||||
error("Unsupported type comparison: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
package org.jetbrains.kotlin.fir.types
|
||||
|
||||
import org.jetbrains.kotlin.builtins.StandardNames
|
||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
|
||||
@@ -15,6 +14,8 @@ import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast
|
||||
import org.jetbrains.kotlin.fir.extensions.extensionService
|
||||
import org.jetbrains.kotlin.fir.extensions.typeAttributeExtensions
|
||||
import org.jetbrains.kotlin.fir.render
|
||||
import org.jetbrains.kotlin.fir.renderer.ConeTypeRenderer
|
||||
import org.jetbrains.kotlin.fir.renderer.ConeTypeRendererForDebugging
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.StandardClassIds
|
||||
@@ -195,13 +196,3 @@ val ConeKotlinType.canBeNull: Boolean
|
||||
}
|
||||
}
|
||||
|
||||
val ConeKotlinType?.functionTypeKind: FunctionClassKind?
|
||||
get() {
|
||||
val classId = (this as? ConeClassLikeType)?.lookupTag?.classId ?: return null
|
||||
return FunctionClassKind.getFunctionalClassKind(
|
||||
classId.shortClassName.asString(), classId.packageFqName
|
||||
)
|
||||
}
|
||||
|
||||
val FirResolvedTypeRef.functionTypeKind: FunctionClassKind?
|
||||
get() = type.functionTypeKind
|
||||
|
||||
Reference in New Issue
Block a user