From 43e7f54faec4e2621da6a8184c7b60de227ca786 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 24 Jul 2019 16:15:40 +0300 Subject: [PATCH] [FIR] Add string representation for ConeKotlinType `ConeKotlinType.render` moved from `tree` module to `types` module --- .../jetbrains/kotlin/fir/types/ConeTypes.kt | 4 ++ .../kotlin/fir/types/TypeRenderer.kt | 44 +++++++++++++++++++ .../kotlin/fir/backend/Fir2IrVisitor.kt | 1 + .../org/jetbrains/kotlin/fir/FirRenderer.kt | 39 ---------------- 4 files changed, 49 insertions(+), 39 deletions(-) create mode 100644 compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/TypeRenderer.kt diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt index e7631c3f5ed..a61a2f744fb 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/ConeTypes.kt @@ -64,6 +64,10 @@ sealed class ConeKotlinType : ConeKotlinTypeProjection(), ConeTypedProjection, K get() = this abstract val nullability: ConeNullability + + override fun toString(): String { + return render() + } } val ConeKotlinType.isNullable: Boolean get() = nullability != ConeNullability.NOT_NULL diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/TypeRenderer.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/TypeRenderer.kt new file mode 100644 index 00000000000..228f10afee2 --- /dev/null +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/TypeRenderer.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2010-2019 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.types + +fun ConeKotlinType.render(): String { + return when (this) { + is ConeTypeVariableType -> "TypeVariable(${this.lookupTag.name})" + is ConeDefinitelyNotNullType -> "${original.render()}!" + is ConeClassErrorType -> "class error: $reason" + is ConeCapturedType -> "captured type: lowerType = ${lowerType?.render()}" + is ConeClassLikeType -> { + buildString { + append(lookupTag.classId.asString()) + if (typeArguments.isNotEmpty()) { + append(typeArguments.joinToString(prefix = "<", postfix = ">") { + when (it) { + ConeStarProjection -> "*" + is ConeKotlinTypeProjectionIn -> "in ${it.type.render()}" + is ConeKotlinTypeProjectionOut -> "out ${it.type.render()}" + is ConeKotlinType -> it.render() + } + }) + } + } + } + is ConeTypeParameterType -> { + lookupTag.name.asString() + } + is ConeFlexibleType -> { + buildString { + append("ft<") + append(lowerBound.render()) + append(lowerBound.nullability.suffix) + append(", ") + append(upperBound.render()) + append(upperBound.nullability.suffix) + append(">") + } + } + } +} diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 782c83e122d..c910a3e6352 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.impl.* +import org.jetbrains.kotlin.fir.types.render import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 0a0e127e3eb..3ef2f4ca19d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -37,45 +37,6 @@ fun FirElement.renderWithType(): String = buildString { fun FirElement.render(): String = buildString { this@render.accept(FirRenderer(this)) } - -fun ConeKotlinType.render(): String { - return when (this) { - is ConeTypeVariableType -> "TypeVariable(${this.lookupTag.name})" - is ConeDefinitelyNotNullType -> "${original.render()}!" - is ConeClassErrorType -> "class error: $reason" - is ConeCapturedType -> "captured type: lowerType = ${lowerType?.render()}" - is ConeClassLikeType -> { - val sb = StringBuilder() - sb.append(lookupTag.classId.asString()) - if (typeArguments.isNotEmpty()) { - sb.append(typeArguments.joinToString(prefix = "<", postfix = ">") { - when (it) { - ConeStarProjection -> "*" - is ConeKotlinTypeProjectionIn -> "in ${it.type.render()}" - is ConeKotlinTypeProjectionOut -> "out ${it.type.render()}" - is ConeKotlinType -> it.render() - } - }) - } - sb.toString() - } - is ConeTypeParameterType -> { - lookupTag.name.asString() - } - is ConeFlexibleType -> { - buildString { - append("ft<") - append(lowerBound.render()) - append(lowerBound.nullability.suffix) - append(", ") - append(upperBound.render()) - append(upperBound.nullability.suffix) - append(">") - } - } - } -} - class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { private val printer = Printer(builder)