Skip to content

Commit c134ab6

Browse files
nicolas-guichardantonsviridov-src
authored andcommitted
Fix occurence ranges
We are generally interested in the identifier for each item, but sometimes want some other token instead, such as the constructor, get or set keywords. Down to 5 failing tests.
1 parent 22f5ea3 commit c134ab6

File tree

2 files changed

+49
-11
lines changed

2 files changed

+49
-11
lines changed

semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/AnalyzerCheckers.kt

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,36 @@ package com.sourcegraph.semanticdb_kotlinc
22

33
import java.nio.file.Path
44
import kotlin.contracts.ExperimentalContracts
5+
import org.jetbrains.kotlin.KtSourceElement
56
import org.jetbrains.kotlin.KtSourceFile
67
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
8+
import org.jetbrains.kotlin.diagnostics.findChildByType
79
import org.jetbrains.kotlin.fir.FirSession
810
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
911
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
1012
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.*
1113
import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers
1214
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessExpressionChecker
15+
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
1316
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
1417
import org.jetbrains.kotlin.fir.declarations.*
1518
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
1619
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
1720
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
21+
import org.jetbrains.kotlin.lexer.KtTokens
1822
import org.jetbrains.kotlin.name.ClassId
23+
import org.jetbrains.kotlin.toKtLightSourceElement
1924

2025
open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtension(session) {
2126
companion object {
2227
@OptIn(ExperimentalContracts::class)
2328
val visitors: MutableMap<KtSourceFile, SemanticdbVisitor> = mutableMapOf()
29+
30+
private fun getIdentifier(element: KtSourceElement): KtSourceElement =
31+
element
32+
.treeStructure
33+
.findChildByType(element.lighterASTNode, KtTokens.IDENTIFIER)
34+
?.toKtLightSourceElement(element.treeStructure) ?: element
2435
}
2536
override val declarationCheckers: DeclarationCheckers
2637
get() = AnalyzerDeclarationCheckers(session.analyzerParamsProvider.sourceroot)
@@ -104,7 +115,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
104115
val source = declaration.source ?: return
105116
val ktFile = context.containingFile?.sourceFile ?: return
106117
val visitor = visitors[ktFile]
107-
visitor?.visitClassOrObject(declaration, source)
118+
visitor?.visitClassOrObject(declaration, getIdentifier(source))
108119
}
109120
}
110121

@@ -120,9 +131,19 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
120131
val visitor = visitors[ktFile]
121132

122133
if (declaration.isPrimary) {
123-
visitor?.visitPrimaryConstructor(declaration, source)
134+
// if the constructor is not denoted by the 'constructor' keyword, we want to link it to the
135+
// class identifier
136+
val klass = declaration.symbol.getContainingClassSymbol()
137+
val klassSource = klass?.source ?: source
138+
val constructorKeyboard =
139+
source
140+
.treeStructure
141+
.findChildByType(source.lighterASTNode, KtTokens.CONSTRUCTOR_KEYWORD)
142+
?.toKtLightSourceElement(source.treeStructure)
143+
144+
visitor?.visitPrimaryConstructor(declaration, constructorKeyboard ?: getIdentifier(klassSource))
124145
} else {
125-
visitor?.visitSecondaryConstructor(declaration, source)
146+
visitor?.visitSecondaryConstructor(declaration, getIdentifier(source))
126147
}
127148
}
128149
}
@@ -137,7 +158,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
137158
val source = declaration.source ?: return
138159
val ktFile = context.containingFile?.sourceFile ?: return
139160
val visitor = visitors[ktFile]
140-
visitor?.visitNamedFunction(declaration, source)
161+
visitor?.visitNamedFunction(declaration, getIdentifier(source))
141162
}
142163
}
143164

@@ -166,7 +187,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
166187
val source = declaration.source ?: return
167188
val ktFile = context.containingFile?.sourceFile ?: return
168189
val visitor = visitors[ktFile]
169-
visitor?.visitProperty(declaration, source)
190+
visitor?.visitProperty(declaration, getIdentifier(source))
170191
}
171192
}
172193

@@ -180,7 +201,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
180201
val source = declaration.source ?: return
181202
val ktFile = context.containingFile?.sourceFile ?: return
182203
val visitor = visitors[ktFile]
183-
visitor?.visitParameter(declaration, source)
204+
visitor?.visitParameter(declaration, getIdentifier(source))
184205
}
185206
}
186207

@@ -194,7 +215,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
194215
val source = declaration.source ?: return
195216
val ktFile = context.containingFile?.sourceFile ?: return
196217
val visitor = visitors[ktFile]
197-
visitor?.visitTypeParameter(declaration, source)
218+
visitor?.visitTypeParameter(declaration, getIdentifier(source))
198219
}
199220
}
200221

@@ -208,7 +229,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
208229
val source = declaration.source ?: return
209230
val ktFile = context.containingFile?.sourceFile ?: return
210231
val visitor = visitors[ktFile]
211-
visitor?.visitTypeAlias(declaration, source)
232+
visitor?.visitTypeAlias(declaration, getIdentifier(source))
212233
}
213234
}
214235

@@ -223,7 +244,24 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
223244
val source = declaration.source ?: return
224245
val ktFile = context.containingFile?.sourceFile ?: return
225246
val visitor = visitors[ktFile]
226-
visitor?.visitPropertyAccessor(declaration, source)
247+
val identifierSource =
248+
if (declaration.isGetter) {
249+
source
250+
.treeStructure
251+
.findChildByType(source.lighterASTNode, KtTokens.GET_KEYWORD)
252+
?.toKtLightSourceElement(source.treeStructure)
253+
?: getIdentifier(source)
254+
} else if (declaration.isSetter) {
255+
source
256+
.treeStructure
257+
.findChildByType(source.lighterASTNode, KtTokens.SET_KEYWORD)
258+
?.toKtLightSourceElement(source.treeStructure)
259+
?: getIdentifier(source)
260+
} else {
261+
getIdentifier(source)
262+
}
263+
264+
visitor?.visitPropertyAccessor(declaration, identifierSource)
227265
}
228266
}
229267

@@ -243,7 +281,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
243281

244282
val ktFile = context.containingFile?.sourceFile ?: return
245283
val visitor = visitors[ktFile]
246-
visitor?.visitSimpleNameExpression(calleeReference, source)
284+
visitor?.visitSimpleNameExpression(calleeReference, getIdentifier(calleeReference.source ?: source))
247285
}
248286
}
249287
}

semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbTextDocumentBuilder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class SemanticdbTextDocumentBuilder(
109109
return Range {
110110
startCharacter = lineMap.startCharacter(element)
111111
startLine = lineMap.lineNumber(element) - 1
112-
endCharacter = lineMap.endCharacter(element) - 1
112+
endCharacter = lineMap.endCharacter(element)
113113
endLine = lineMap.lineNumber(element) - 1
114114
}
115115
}

0 commit comments

Comments
 (0)