From 1be98b8f08714f039ba273faef0d5380b120b5b4 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Fri, 15 Sep 2023 18:34:28 +0200 Subject: [PATCH] [IR] Extract some common code into `AbstractIrFileEntry` --- .../org/jetbrains/kotlin/ir/IrFileEntry.kt | 36 +++++++++++++++++++ .../org/jetbrains/kotlin/ir/PsiIrFileEntry.kt | 36 ++----------------- .../kotlin/ir/util/AdditionalIrUtils.kt | 30 +++------------- 3 files changed, 43 insertions(+), 59 deletions(-) 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 39860b58217..d7874b59dd5 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 @@ -30,3 +30,39 @@ interface IrFileEntry { fun getColumnNumber(offset: Int): Int fun getLineAndColumnNumbers(offset: Int): LineAndColumn } + +abstract class AbstractIrFileEntry : IrFileEntry { + protected abstract val lineStartOffsets: IntArray + + override fun getLineNumber(offset: Int): Int { + if (offset < 0) return UNDEFINED_LINE_NUMBER + val index = lineStartOffsets.binarySearch(offset) + return if (index >= 0) index else -index - 2 + } + + override fun getColumnNumber(offset: Int): Int { + if (offset < 0) return UNDEFINED_COLUMN_NUMBER + val lineNumber = getLineNumber(offset) + if (lineNumber < 0) return UNDEFINED_COLUMN_NUMBER + 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 = name, + startOffset = beginOffset, + startLineNumber = getLineNumber(beginOffset), + startColumnNumber = getColumnNumber(beginOffset), + endOffset = endOffset, + endLineNumber = getLineNumber(endOffset), + endColumnNumber = getColumnNumber(endOffset) + ) +} 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 88ac0acaca2..36706cffc91 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 @@ -10,11 +10,11 @@ import com.intellij.psi.PsiFile import com.intellij.psi.util.PsiTreeUtil import kotlin.reflect.KClass -class PsiIrFileEntry(val psiFile: PsiFile) : IrFileEntry { +class PsiIrFileEntry(val psiFile: PsiFile) : AbstractIrFileEntry() { private val psiFileName = psiFile.virtualFile?.path ?: psiFile.name override val maxOffset: Int - private val lineStartOffsets: IntArray + override val lineStartOffsets: IntArray private val fileViewProvider = psiFile.viewProvider init { @@ -23,38 +23,6 @@ class PsiIrFileEntry(val psiFile: PsiFile) : IrFileEntry { lineStartOffsets = IntArray(document.lineCount) { document.getLineStartOffset(it) } } - override fun getLineNumber(offset: Int): Int { - if (offset < 0) return UNDEFINED_LINE_NUMBER - val index = lineStartOffsets.binarySearch(offset) - return if (index >= 0) index else -index - 2 - } - - override fun getColumnNumber(offset: Int): Int { - if (offset < 0) return UNDEFINED_COLUMN_NUMBER - val lineNumber = getLineNumber(offset) - if (lineNumber < 0) return UNDEFINED_COLUMN_NUMBER - 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 = name, - startOffset = beginOffset, - startLineNumber = getLineNumber(beginOffset), - startColumnNumber = getColumnNumber(beginOffset), - endOffset = endOffset, - endLineNumber = getLineNumber(endOffset), - endColumnNumber = getColumnNumber(endOffset) - ) - private fun getRecognizableName(): String = psiFileName override val name: String get() = getRecognizableName() 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 171d421de61..d672c2df867 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 @@ -260,46 +260,26 @@ val IrFileEntry.lineStartOffsets: IntArray class NaiveSourceBasedFileEntryImpl( override val name: String, - private val lineStartOffsets: IntArray = intArrayOf(), + override val lineStartOffsets: IntArray = intArrayOf(), override val maxOffset: Int = UNDEFINED_OFFSET -) : IrFileEntry { +) : AbstractIrFileEntry() { val lineStartOffsetsAreEmpty: Boolean get() = lineStartOffsets.isEmpty() override fun getLineNumber(offset: Int): Int { if (offset == SYNTHETIC_OFFSET) return 0 - if (offset < 0) return UNDEFINED_LINE_NUMBER - val index = lineStartOffsets.binarySearch(offset) - return if (index >= 0) index else -index - 2 + return super.getLineNumber(offset) } override fun getColumnNumber(offset: Int): Int { if (offset == SYNTHETIC_OFFSET) return 0 - if (offset < 0) return UNDEFINED_COLUMN_NUMBER - val lineNumber = getLineNumber(offset) - if (lineNumber < 0) return UNDEFINED_COLUMN_NUMBER - return offset - lineStartOffsets[lineNumber] + return super.getColumnNumber(offset) } 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) + return super.getLineAndColumnNumbers(offset) } - - override fun getSourceRangeInfo(beginOffset: Int, endOffset: Int): SourceRangeInfo = - SourceRangeInfo( - filePath = name, - startOffset = beginOffset, - startLineNumber = getLineNumber(beginOffset), - startColumnNumber = getColumnNumber(beginOffset), - endOffset = endOffset, - endLineNumber = getLineNumber(endOffset), - endColumnNumber = getColumnNumber(endOffset) - ) } private fun IrClass.getPropertyDeclaration(name: String): IrProperty? {