From 6039d39546a6794e9250dd5e2061af868905ecf1 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Fri, 15 Sep 2023 18:25:03 +0200 Subject: [PATCH] [IR] Add new method `IrFileEntry.getLineAndColumnNumbers` Calling this method instead of sequence of `getLineNumber` and `getLineNumber` is faster because we eliminate one exess `getLineNumber` call. --- .../jetbrains/kotlin/backend/jvm/MultifileFacades.kt | 4 ++++ .../kotlin/backend/wasm/WasmBackendContext.kt | 7 ++++++- .../kotlin/psi2ir/generators/ModuleGenerator.kt | 6 ++---- .../src/org/jetbrains/kotlin/ir/IrFileEntry.kt | 3 +++ .../src/org/jetbrains/kotlin/ir/PsiIrFileEntry.kt | 10 +++++++++- .../jetbrains/kotlin/ir/util/AdditionalIrUtils.kt | 12 +++++++++++- 6 files changed, 35 insertions(+), 7 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MultifileFacades.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MultifileFacades.kt index 493b2f44011..fa289f603af 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MultifileFacades.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MultifileFacades.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.jvm import org.jetbrains.kotlin.ir.IrFileEntry +import org.jetbrains.kotlin.ir.LineAndColumn import org.jetbrains.kotlin.ir.SourceRangeInfo import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.IrClass @@ -34,6 +35,9 @@ class MultifileFacadeFileEntry( override fun getColumnNumber(offset: Int): Int = error("Multifile facade doesn't support debug info: $className") + + override fun getLineAndColumnNumbers(offset: Int): LineAndColumn = + error("Multifile facade doesn't support debug info: $className") } fun IrFunction.isMultifileBridge(): Boolean = diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt index 247dec70e1f..6428c8ced2d 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt @@ -28,7 +28,6 @@ import org.jetbrains.kotlin.ir.types.IrTypeSystemContext import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.addChild -import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -95,6 +94,9 @@ class WasmBackendContext( override fun getLineNumber(offset: Int) = UNDEFINED_LINE_NUMBER override fun getColumnNumber(offset: Int) = UNDEFINED_COLUMN_NUMBER + override fun getLineAndColumnNumbers(offset: Int): LineAndColumn { + return LineAndColumn(UNDEFINED_LINE_NUMBER, UNDEFINED_COLUMN_NUMBER) + } }, internalPackageFragmentDescriptor, irModuleFragment).also { irModuleFragment.files += it } @@ -167,6 +169,9 @@ class WasmBackendContext( override fun getLineNumber(offset: Int) = UNDEFINED_LINE_NUMBER override fun getColumnNumber(offset: Int) = UNDEFINED_COLUMN_NUMBER + override fun getLineAndColumnNumbers(offset: Int): LineAndColumn { + return LineAndColumn(UNDEFINED_LINE_NUMBER, UNDEFINED_COLUMN_NUMBER) + } }, internalPackageFragmentDescriptor, module).also { module.files += it } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt index 71acb0aa50f..63bd4f0ce3d 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt @@ -18,10 +18,7 @@ package org.jetbrains.kotlin.psi2ir.generators import org.jetbrains.kotlin.backend.common.CodegenUtil import org.jetbrains.kotlin.descriptors.impl.EmptyPackageFragmentDescriptor -import org.jetbrains.kotlin.ir.IrFileEntry -import org.jetbrains.kotlin.ir.PsiIrFileEntry -import org.jetbrains.kotlin.ir.SourceRangeInfo -import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET +import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl @@ -105,6 +102,7 @@ open class ModuleGenerator(override val context: GeneratorContext) : Generator { override fun getSourceRangeInfo(beginOffset: Int, endOffset: Int): SourceRangeInfo = TODO("Not yet implemented") override fun getLineNumber(offset: Int): Int = TODO("Not yet implemented") override fun getColumnNumber(offset: Int): Int = TODO("Not yet implemented") + override fun getLineAndColumnNumbers(offset: Int): LineAndColumn = TODO("Not yet implemented") } val fakeFile = IrFileImpl( fakeFileEntry, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrFileEntry.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrFileEntry.kt index 6e74083ab3f..39860b58217 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrFileEntry.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrFileEntry.kt @@ -19,6 +19,8 @@ data class SourceRangeInfo( val endColumnNumber: Int ) +data class LineAndColumn(val line: Int, val column: Int) + interface IrFileEntry { val name: String val maxOffset: Int @@ -26,4 +28,5 @@ interface IrFileEntry { fun getSourceRangeInfo(beginOffset: Int, endOffset: Int): SourceRangeInfo fun getLineNumber(offset: Int): Int fun getColumnNumber(offset: Int): Int + fun getLineAndColumnNumbers(offset: Int): LineAndColumn } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/PsiIrFileEntry.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/PsiIrFileEntry.kt index a6922c63513..88ac0acaca2 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/PsiIrFileEntry.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/PsiIrFileEntry.kt @@ -36,9 +36,17 @@ class PsiIrFileEntry(val psiFile: PsiFile) : IrFileEntry { return offset - lineStartOffsets[lineNumber] } + override fun getLineAndColumnNumbers(offset: Int): LineAndColumn { + if (offset < 0) return LineAndColumn(UNDEFINED_LINE_NUMBER, UNDEFINED_COLUMN_NUMBER) + val lineNumber = getLineNumber(offset) + if (lineNumber < 0) return LineAndColumn(lineNumber, UNDEFINED_COLUMN_NUMBER) + val columnNumber = offset - lineStartOffsets[lineNumber] + return LineAndColumn(lineNumber, columnNumber) + } + override fun getSourceRangeInfo(beginOffset: Int, endOffset: Int): SourceRangeInfo = SourceRangeInfo( - filePath = getRecognizableName(), + filePath = name, startOffset = beginOffset, startLineNumber = getLineNumber(beginOffset), startColumnNumber = getColumnNumber(beginOffset), 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 d8ebc3670af..171d421de61 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 @@ -277,7 +277,17 @@ class NaiveSourceBasedFileEntryImpl( if (offset == SYNTHETIC_OFFSET) return 0 if (offset < 0) return UNDEFINED_COLUMN_NUMBER val lineNumber = getLineNumber(offset) - return if (lineNumber < 0) UNDEFINED_COLUMN_NUMBER else offset - lineStartOffsets[lineNumber] + if (lineNumber < 0) return UNDEFINED_COLUMN_NUMBER + return offset - lineStartOffsets[lineNumber] + } + + override fun getLineAndColumnNumbers(offset: Int): LineAndColumn { + if (offset == SYNTHETIC_OFFSET) return LineAndColumn(0, 0) + if (offset < 0) return LineAndColumn(UNDEFINED_LINE_NUMBER, UNDEFINED_COLUMN_NUMBER) + val lineNumber = getLineNumber(offset) + if (lineNumber < 0) return LineAndColumn(lineNumber, UNDEFINED_COLUMN_NUMBER) + val columnNumber = offset - lineStartOffsets[lineNumber] + return LineAndColumn(lineNumber, columnNumber) } override fun getSourceRangeInfo(beginOffset: Int, endOffset: Int): SourceRangeInfo =