[IR] Extract some common code into AbstractIrFileEntry

This commit is contained in:
Ivan Kylchik
2023-09-15 18:34:28 +02:00
committed by Space Team
parent 6039d39546
commit 1be98b8f08
3 changed files with 43 additions and 59 deletions
@@ -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)
)
}
@@ -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()
@@ -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? {