[IR] Add dumpKotlinLike for IrType and IrTypeArgument
This commit is contained in:
@@ -29,9 +29,22 @@ import org.jetbrains.kotlin.utils.Printer
|
||||
* * IMPLICIT_DYNAMIC_CAST -- expr /*~> dynamic */
|
||||
* * REINTERPRET_CAST -- expr /*=> Type */
|
||||
*/
|
||||
fun IrElement.dumpKotlinLike(options: KotlinLikeDumpOptions = KotlinLikeDumpOptions()): String {
|
||||
fun IrElement.dumpKotlinLike(options: KotlinLikeDumpOptions = KotlinLikeDumpOptions()): String =
|
||||
dumpKotlinLike(this, KotlinLikeDumper::printElement, options)
|
||||
|
||||
fun IrType.dumpKotlinLike(): String =
|
||||
dumpKotlinLike(this, KotlinLikeDumper::printType)
|
||||
|
||||
fun IrTypeArgument.dumpKotlinLike(): String =
|
||||
dumpKotlinLike(this, KotlinLikeDumper::printTypeArgument)
|
||||
|
||||
private inline fun <T> dumpKotlinLike(
|
||||
target: T,
|
||||
print: KotlinLikeDumper.(T) -> Unit,
|
||||
options: KotlinLikeDumpOptions = KotlinLikeDumpOptions()
|
||||
): String {
|
||||
val sb = StringBuilder()
|
||||
accept(KotlinLikeDumper(Printer(sb, 1, " "), options), null)
|
||||
KotlinLikeDumper(Printer(sb, 1, " "), options).print(target)
|
||||
return sb.toString()
|
||||
}
|
||||
|
||||
@@ -98,6 +111,18 @@ enum class FakeOverridesStrategy {
|
||||
*/
|
||||
|
||||
private class KotlinLikeDumper(val p: Printer, val options: KotlinLikeDumpOptions) : IrElementVisitor<Unit, IrDeclaration?> {
|
||||
fun printElement(element: IrElement) {
|
||||
element.accept(this, null)
|
||||
}
|
||||
|
||||
fun printType(type: IrType) {
|
||||
type.printTypeWithNoIndent()
|
||||
}
|
||||
|
||||
fun printTypeArgument(typeArg: IrTypeArgument) {
|
||||
typeArg.printTypeArgumentWithNoIndent()
|
||||
}
|
||||
|
||||
override fun visitElement(element: IrElement, data: IrDeclaration?) {
|
||||
val e = "/* ERROR: unsupported element type: " + element.javaClass.simpleName + " */"
|
||||
if (element is IrExpression) {
|
||||
@@ -397,14 +422,7 @@ private class KotlinLikeDumper(val p: Printer, val options: KotlinLikeDumpOption
|
||||
arguments.forEachIndexed { i, typeArg ->
|
||||
p(i > 0, ",")
|
||||
|
||||
when (typeArg) {
|
||||
is IrStarProjection ->
|
||||
p.printWithNoIndent("*")
|
||||
is IrTypeProjection -> {
|
||||
typeArg.variance.printVarianceWithNoIndent()
|
||||
typeArg.type.printTypeWithNoIndent()
|
||||
}
|
||||
}
|
||||
typeArg.printTypeArgumentWithNoIndent()
|
||||
}
|
||||
p.printWithNoIndent(">")
|
||||
}
|
||||
@@ -420,6 +438,17 @@ private class KotlinLikeDumper(val p: Printer, val options: KotlinLikeDumpOption
|
||||
}
|
||||
}
|
||||
|
||||
private fun IrTypeArgument.printTypeArgumentWithNoIndent() {
|
||||
when (this) {
|
||||
is IrStarProjection ->
|
||||
p.printWithNoIndent("*")
|
||||
is IrTypeProjection -> {
|
||||
variance.printVarianceWithNoIndent()
|
||||
type.printTypeWithNoIndent()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitTypeAlias(declaration: IrTypeAlias, data: IrDeclaration?) {
|
||||
declaration.printlnAnnotations()
|
||||
p.printIndent()
|
||||
|
||||
Reference in New Issue
Block a user