Last active
May 13, 2020 09:47
-
-
Save minamoto79/7b42d4420cf1295a5ff9dc8fe3bca4e0 to your computer and use it in GitHub Desktop.
dump IR with line numbers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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