@@ -2,25 +2,36 @@ package com.sourcegraph.semanticdb_kotlinc
22
33import java.nio.file.Path
44import kotlin.contracts.ExperimentalContracts
5+ import org.jetbrains.kotlin.KtSourceElement
56import org.jetbrains.kotlin.KtSourceFile
67import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
8+ import org.jetbrains.kotlin.diagnostics.findChildByType
79import org.jetbrains.kotlin.fir.FirSession
810import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
911import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
1012import org.jetbrains.kotlin.fir.analysis.checkers.declaration.*
1113import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers
1214import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessExpressionChecker
15+ import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
1316import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
1417import org.jetbrains.kotlin.fir.declarations.*
1518import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
1619import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
1720import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
21+ import org.jetbrains.kotlin.lexer.KtTokens
1822import org.jetbrains.kotlin.name.ClassId
23+ import org.jetbrains.kotlin.toKtLightSourceElement
1924
2025open 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}
0 commit comments