Skip to content

Instantly share code, notes, and snippets.

@minamoto79
Last active May 13, 2020 09:47
Show Gist options
  • Select an option

  • Save minamoto79/7b42d4420cf1295a5ff9dc8fe3bca4e0 to your computer and use it in GitHub Desktop.

Select an option

Save minamoto79/7b42d4420cf1295a5ff9dc8fe3bca4e0 to your computer and use it in GitHub Desktop.
dump IR with line numbers
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt
index b97743e9181..85320dff811 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt
@@ -157,7 +157,7 @@ class NaiveSourceBasedFileEntryImpl(override val name: String, val lineStartOffs
//-------------------------------------------------------------------------//
override fun getLineNumber(offset: Int): Int {
- assert(offset != UNDEFINED_OFFSET)
+ if (offset == UNDEFINED_OFFSET) return 0
if (offset == SYNTHETIC_OFFSET) return 0
val index = lineStartOffsets.binarySearch(offset)
return if (index >= 0) index else -index - 2
@@ -166,7 +166,7 @@ class NaiveSourceBasedFileEntryImpl(override val name: String, val lineStartOffs
//-------------------------------------------------------------------------//
override fun getColumnNumber(offset: Int): Int {
- assert(offset != UNDEFINED_OFFSET)
+ if (offset == UNDEFINED_OFFSET) return 0
if (offset == SYNTHETIC_OFFSET) return 0
val lineNumber = getLineNumber(offset)
return offset - lineStartOffsets[lineNumber]
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt
index c512eebc3a5..76aa0ac9e88 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt
@@ -62,10 +62,12 @@ class DumpIrTreeVisitor(
}
override fun visitFile(declaration: IrFile, data: String) {
+ elementRenderer.file = declaration
declaration.dumpLabeledElementWith(data) {
dumpAnnotations(declaration)
declaration.declarations.dumpElements()
}
+ elementRenderer.file = null
}
override fun visitClass(declaration: IrClass, data: String) {
@@ -121,6 +123,17 @@ class DumpIrTreeVisitor(
}
}
+ override fun visitBlock(expression: IrBlock, data: String) {
+ expression.dumpLabeledElementWith(data){
+ val oldFile = elementRenderer.file
+ elementRenderer.file = (expression as? IrReturnableBlock)?.sourceFileSymbol?.owner ?: elementRenderer.file
+ expression.statements.forEach {
+ it.accept(this, "")
+ }
+ elementRenderer.file = oldFile
+ }
+ }
+
override fun visitProperty(declaration: IrProperty, data: String) {
declaration.dumpLabeledElementWith(data) {
dumpAnnotations(declaration)
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt
index 4caf0c21204..ae42f66deaf 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt
@@ -311,16 +311,22 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
override fun visitExternalPackageFragment(declaration: IrExternalPackageFragment, data: Nothing?): String =
"EXTERNAL_PACKAGE_FRAGMENT fqName:${declaration.fqName}"
- override fun visitFile(declaration: IrFile, data: Nothing?): String =
- "FILE fqName:${declaration.fqName} fileName:${declaration.path}"
+ internal var file:IrFile? = null
+ override fun visitFile(declaration: IrFile, data: Nothing?): String = "FILE fqName:${declaration.fqName} fileName:${declaration.path}"
+
+ val IrElement.location:String?
+ get() = file?.run {
+ fun line(x:Int) = fileEntry.getLineNumber(x)
+ fun column(x:Int) = fileEntry.getColumnNumber(x)
+ "@$name ${line([email protected])}:${column([email protected])} ... ${line([email protected])}:${column([email protected])}" }
override fun visitFunction(declaration: IrFunction, data: Nothing?): String =
- "FUN ${declaration.renderOriginIfNonTrivial()}"
+ "FUN ${declaration.renderOriginIfNonTrivial()} ${declaration.location}"
override fun visitSimpleFunction(declaration: IrSimpleFunction, data: Nothing?): String =
declaration.run {
"FUN ${renderOriginIfNonTrivial()}" +
- "name:$name visibility:$visibility modality:$modality " +
+ "name:$name ${declaration.location} visibility:$visibility modality:$modality " +
renderTypeParameters() + " " +
renderValueParameterTypes() + " " +
"returnType:${returnType.render()} " +
@@ -356,6 +362,7 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
override fun visitConstructor(declaration: IrConstructor, data: Nothing?): String =
declaration.run {
"CONSTRUCTOR ${renderOriginIfNonTrivial()}" +
+ "${declaration.location} " +
"visibility:$visibility " +
renderTypeParameters() + " " +
renderValueParameterTypes() + " " +
@@ -373,6 +380,7 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
override fun visitProperty(declaration: IrProperty, data: Nothing?): String =
declaration.run {
"PROPERTY ${renderOriginIfNonTrivial()}" +
+ "${declaration.location} " +
"name:$name visibility:$visibility modality:$modality " +
renderPropertyFlags()
}
@@ -388,7 +396,7 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
override fun visitField(declaration: IrField, data: Nothing?): String =
"FIELD ${declaration.renderOriginIfNonTrivial()}" +
- "name:${declaration.name} type:${declaration.type.render()} visibility:${declaration.visibility} " +
+ "name:${declaration.name} ${declaration.location} type:${declaration.type.render()} visibility:${declaration.visibility} " +
declaration.renderFieldFlags()
private fun IrField.renderFieldFlags() =
@@ -401,7 +409,7 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
override fun visitClass(declaration: IrClass, data: Nothing?): String =
declaration.run {
"CLASS ${renderOriginIfNonTrivial()}" +
- "$kind name:$name modality:$modality visibility:$visibility " +
+ "$kind name:$name ${declaration.location} modality:$modality visibility:$visibility " +
renderClassFlags() +
"superTypes:[${superTypes.joinToString(separator = "; ") { it.render() }}]"
}
@@ -417,7 +425,7 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
override fun visitVariable(declaration: IrVariable, data: Nothing?): String =
"VAR ${declaration.renderOriginIfNonTrivial()}" +
- "name:${declaration.name} type:${declaration.type.render()} ${declaration.renderVariableFlags()}"
+ "name:${declaration.name} ${declaration.location} type:${declaration.type.render()} ${declaration.renderVariableFlags()}"
private fun IrVariable.renderVariableFlags(): String =
renderFlagsList(
@@ -427,7 +435,7 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
)
override fun visitEnumEntry(declaration: IrEnumEntry, data: Nothing?): String =
- "ENUM_ENTRY ${declaration.renderOriginIfNonTrivial()}name:${declaration.name}"
+ "ENUM_ENTRY ${declaration.renderOriginIfNonTrivial()}name:${declaration.name} ${declaration.location}"
override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer, data: Nothing?): String =
"ANONYMOUS_INITIALIZER isStatic=${declaration.isStatic}"
@@ -493,8 +501,11 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
override fun visitSpreadElement(spread: IrSpreadElement, data: Nothing?): String =
"SPREAD_ELEMENT"
+ val IrBlock.isReturnable: Boolean
+ get() = this is IrReturnableBlock
+
override fun visitBlock(expression: IrBlock, data: Nothing?): String =
- "BLOCK type=${expression.type.render()} origin=${expression.origin}"
+ "BLOCK(returnable: ${expression.isReturnable}) ${expression.location} type=${expression.type.render()} origin=${expression.origin}"
override fun visitComposite(expression: IrComposite, data: Nothing?): String =
"COMPOSITE type=${expression.type.render()} origin=${expression.origin}"
@@ -504,40 +515,40 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
override fun visitCall(expression: IrCall, data: Nothing?): String =
"CALL '${expression.symbol.renderReference()}' ${expression.renderSuperQualifier()}" +
- "type=${expression.type.render()} origin=${expression.origin}"
+ "type=${expression.type.render()} origin=${expression.origin} ${expression.location}"
private fun IrCall.renderSuperQualifier(): String =
superQualifierSymbol?.let { "superQualifier='${it.renderReference()}' " } ?: ""
override fun visitConstructorCall(expression: IrConstructorCall, data: Nothing?): String =
- "CONSTRUCTOR_CALL '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
+ "CONSTRUCTOR_CALL '${expression.symbol.renderReference()}' ${expression.location} type=${expression.type.render()} origin=${expression.origin}"
override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, data: Nothing?): String =
- "DELEGATING_CONSTRUCTOR_CALL '${expression.symbol.renderReference()}'"
+ "DELEGATING_CONSTRUCTOR_CALL '${expression.symbol.renderReference()}' ${expression.location}"
override fun visitEnumConstructorCall(expression: IrEnumConstructorCall, data: Nothing?): String =
- "ENUM_CONSTRUCTOR_CALL '${expression.symbol.renderReference()}'"
+ "ENUM_CONSTRUCTOR_CALL '${expression.symbol.renderReference()}' ${expression.location}"
override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall, data: Nothing?): String =
- "INSTANCE_INITIALIZER_CALL classDescriptor='${expression.classSymbol.renderReference()}'"
+ "INSTANCE_INITIALIZER_CALL classDescriptor='${expression.classSymbol.renderReference()}' ${expression.location}"
override fun visitGetValue(expression: IrGetValue, data: Nothing?): String =
- "GET_VAR '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
+ "GET_VAR '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin} ${expression.location}"
override fun visitSetVariable(expression: IrSetVariable, data: Nothing?): String =
- "SET_VAR '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
+ "SET_VAR '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin} ${expression.location}"
override fun visitGetField(expression: IrGetField, data: Nothing?): String =
- "GET_FIELD '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
+ "GET_FIELD '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin} ${expression.location}"
override fun visitSetField(expression: IrSetField, data: Nothing?): String =
- "SET_FIELD '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
+ "SET_FIELD '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin} ${expression.location}"
override fun visitGetObjectValue(expression: IrGetObjectValue, data: Nothing?): String =
- "GET_OBJECT '${expression.symbol.renderReference()}' type=${expression.type.render()}"
+ "GET_OBJECT '${expression.symbol.renderReference()}' type=${expression.type.render()} ${expression.location}"
override fun visitGetEnumValue(expression: IrGetEnumValue, data: Nothing?): String =
- "GET_ENUM '${expression.symbol.renderReference()}' type=${expression.type.render()}"
+ "GET_ENUM '${expression.symbol.renderReference()}' type=${expression.type.render()} ${expression.location}"
override fun visitStringConcatenation(expression: IrStringConcatenation, data: Nothing?): String =
"STRING_CONCATENATION type=${expression.type.render()}"
@@ -546,25 +557,25 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
"TYPE_OP type=${expression.type.render()} origin=${expression.operator} typeOperand=${expression.typeOperand.render()}"
override fun visitWhen(expression: IrWhen, data: Nothing?): String =
- "WHEN type=${expression.type.render()} origin=${expression.origin}"
+ "WHEN type=${expression.type.render()} origin=${expression.origin} ${expression.location}"
override fun visitBranch(branch: IrBranch, data: Nothing?): String =
- "BRANCH"
+ "BRANCH ${branch.location}"
override fun visitWhileLoop(loop: IrWhileLoop, data: Nothing?): String =
- "WHILE label=${loop.label} origin=${loop.origin}"
+ "WHILE label=${loop.label} origin=${loop.origin} ${loop.location}"
override fun visitDoWhileLoop(loop: IrDoWhileLoop, data: Nothing?): String =
- "DO_WHILE label=${loop.label} origin=${loop.origin}"
+ "DO_WHILE label=${loop.label} origin=${loop.origin} ${loop.location}"
override fun visitBreak(jump: IrBreak, data: Nothing?): String =
- "BREAK label=${jump.label} loop.label=${jump.loop.label}"
+ "BREAK label=${jump.label} loop.label=${jump.loop.label} ${jump.location}"
override fun visitContinue(jump: IrContinue, data: Nothing?): String =
- "CONTINUE label=${jump.label} loop.label=${jump.loop.label}"
+ "CONTINUE label=${jump.label} loop.label=${jump.loop.label} ${jump.location}"
override fun visitThrow(expression: IrThrow, data: Nothing?): String =
- "THROW type=${expression.type.render()}"
+ "THROW type=${expression.type.render()} ${expression.location}"
override fun visitFunctionReference(expression: IrFunctionReference, data: Nothing?): String =
"FUNCTION_REFERENCE '${expression.symbol.renderReference()}' type=${expression.type.render()} origin=${expression.origin}"
@@ -608,10 +619,10 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
"GET_CLASS type=${expression.type.render()}"
override fun visitTry(aTry: IrTry, data: Nothing?): String =
- "TRY type=${aTry.type.render()}"
+ "TRY type=${aTry.type.render()} ${aTry.location}"
override fun visitCatch(aCatch: IrCatch, data: Nothing?): String =
- "CATCH parameter=${aCatch.catchParameter.symbol.renderReference()}"
+ "CATCH parameter=${aCatch.catchParameter.symbol.renderReference()} ${aCatch.location}"
override fun visitDynamicOperatorExpression(expression: IrDynamicOperatorExpression, data: Nothing?): String =
"DYN_OP operator=${expression.operator} type=${expression.type.render()}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment