Skip to content

Commit d25d6f0

Browse files
jupblbchristoph-sg
authored andcommitted
Keep occurrence ranges within source lines
1 parent b629d66 commit d25d6f0

3 files changed

Lines changed: 32 additions & 22 deletions

File tree

‎scip-kotlin-analysis/src/main/kotlin/org/scip_code/scip_java/kotlin_analysis/KotlinAnalysisIndexer.kt‎

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.psi.KtDeclaration
3434
import org.jetbrains.kotlin.psi.KtDestructuringDeclaration
3535
import org.jetbrains.kotlin.psi.KtDestructuringDeclarationEntry
3636
import org.jetbrains.kotlin.psi.KtEnumEntry
37+
import org.jetbrains.kotlin.psi.KtEnumEntrySuperclassReferenceExpression
3738
import org.jetbrains.kotlin.psi.KtExpression
3839
import org.jetbrains.kotlin.psi.KtFile
3940
import org.jetbrains.kotlin.psi.KtForExpression
@@ -191,6 +192,10 @@ class KotlinAnalysisIndexer(
191192
super.visitSimpleNameExpression(expression)
192193
val referencedName = expression.getReferencedName()
193194
if (referencedName == "this" || referencedName == "super") return
195+
// The synthetic superclass reference of an enum entry initializer
196+
// (`HEARTS('h')`) has no source token of its own: its "name element"
197+
// is the whole enum class.
198+
if (expression is KtEnumEntrySuperclassReferenceExpression) return
194199
val target = with(session) { expression.mainReference.resolveToSymbol() } ?: return
195200
val range = expression.getReferencedNameElement().textRange
196201

@@ -922,9 +927,9 @@ internal class LineIndex(private val text: String) {
922927
}
923928

924929
/**
925-
* Occurrence anchors are always single-line, like in scip-kotlinc: multiline declarations are
926-
* collapsed onto their start line with the end character measured from that line's start. The
927-
* true extent lives in the enclosing range.
930+
* Occurrence anchors are always single-line: multiline declarations are collapsed onto their
931+
* start line, clamped to that line's end so the range stays within the source. The true extent
932+
* lives in the enclosing range.
928933
*/
929934
fun anchorRange(range: TextRange): ScipRange? {
930935
if (range.startOffset > text.length || range.endOffset > text.length) return null
@@ -933,12 +938,18 @@ internal class LineIndex(private val text: String) {
933938
if (startLine == endLine) {
934939
return ScipRange.singleLine(startLine, startCharacter, endCharacter)
935940
}
936-
val flattenedEnd = range.endOffset - lineStart(startLine)
937-
return ScipRange.singleLine(startLine, startCharacter, flattenedEnd)
941+
return ScipRange.singleLine(startLine, startCharacter, lineLength(startLine))
938942
}
939943

940944
private fun lineStart(line: Int): Int = lineStartOffsets[line]
941945

946+
/** Length of [line] excluding its trailing newline. */
947+
private fun lineLength(line: Int): Int {
948+
val end =
949+
if (line + 1 < lineStartOffsets.size) lineStartOffsets[line + 1] - 1 else text.length
950+
return end - lineStart(line)
951+
}
952+
942953
private fun position(offset: Int): Pair<Int, Int> {
943954
var line = Arrays.binarySearch(lineStartOffsets, offset)
944955
if (line < 0) line = -line - 2

‎scip-snapshots/expected/kotlin/common/scip-snapshots/cases/kotlin/common/src/main/kotlin/snapshots/CompanionOwner.kt‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
// ⌄ enclosing_range_start scip-java maven . . snapshots/CompanionOwner#Companion#
1616
// ⌄ enclosing_range_start scip-java maven . . snapshots/CompanionOwner#Companion#`<init>`().
1717
companion object {
18-
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/CompanionOwner#Companion#
19-
// display_name Companion
20-
// signature_documentation
21-
// > public final companion object Companion : Any
22-
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/CompanionOwner#Companion#`<init>`().
23-
// display_name Companion
24-
// signature_documentation
25-
// > private constructor(): CompanionOwner.Companion
18+
// ^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/CompanionOwner#Companion#
19+
// display_name Companion
20+
// signature_documentation
21+
// > public final companion object Companion : Any
22+
// ^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/CompanionOwner#Companion#`<init>`().
23+
// display_name Companion
24+
// signature_documentation
25+
// > private constructor(): CompanionOwner.Companion
2626
// ⌄ enclosing_range_start scip-java maven . . snapshots/CompanionOwner#Companion#create().
2727
fun create(): CompanionOwner = CompanionOwner()
2828
// ^^^^^^ definition scip-java maven . . snapshots/CompanionOwner#Companion#create().

‎scip-snapshots/expected/kotlin/common/scip-snapshots/cases/kotlin/common/src/main/kotlin/snapshots/Enums.kt‎

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
// ⌄ enclosing_range_start scip-java maven . . snapshots/Suit#symbol.
1313
// ⌄ enclosing_range_start scip-java maven . . snapshots/Suit#getSymbol().
1414
enum class Suit(val symbol: Char) {
15-
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ reference scip-java maven . . snapshots/Suit#
1615
// ^^^^ definition scip-java maven . . snapshots/Suit#
1716
// display_name Suit
1817
// signature_documentation
@@ -90,14 +89,14 @@
9089
// ⌄ enclosing_range_start scip-java maven . . snapshots/Suit#Companion#
9190
// ⌄ enclosing_range_start scip-java maven . . snapshots/Suit#Companion#`<init>`().
9291
companion object {
93-
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/Suit#Companion#
94-
// display_name Companion
95-
// signature_documentation
96-
// > public final companion object Companion : Any
97-
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/Suit#Companion#`<init>`().
98-
// display_name Companion
99-
// signature_documentation
100-
// > private constructor(): Suit.Companion
92+
// ^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/Suit#Companion#
93+
// display_name Companion
94+
// signature_documentation
95+
// > public final companion object Companion : Any
96+
// ^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/Suit#Companion#`<init>`().
97+
// display_name Companion
98+
// signature_documentation
99+
// > private constructor(): Suit.Companion
101100
// ⌄ enclosing_range_start scip-java maven . . snapshots/Suit#Companion#fromSymbol().
102101
// ⌄ enclosing_range_start scip-java maven . . snapshots/Suit#Companion#fromSymbol().(symbol)
103102
// ⌄ enclosing_range_start local 0

0 commit comments

Comments
 (0)