[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.
This commit is contained in:
Ivan Kylchik
2023-09-15 18:25:03 +02:00
committed by Space Team
parent a30d0aeeb0
commit 6039d39546
6 changed files with 35 additions and 7 deletions
@@ -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 =
@@ -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
}
@@ -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,
@@ -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
}
@@ -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),
@@ -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 =