@@ -2,25 +2,36 @@ package com.sourcegraph.semanticdb_kotlinc
2
2
3
3
import java.nio.file.Path
4
4
import kotlin.contracts.ExperimentalContracts
5
+ import org.jetbrains.kotlin.KtSourceElement
5
6
import org.jetbrains.kotlin.KtSourceFile
6
7
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
8
+ import org.jetbrains.kotlin.diagnostics.findChildByType
7
9
import org.jetbrains.kotlin.fir.FirSession
8
10
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
9
11
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
10
12
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.*
11
13
import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers
12
14
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessExpressionChecker
15
+ import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
13
16
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
14
17
import org.jetbrains.kotlin.fir.declarations.*
15
18
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
16
19
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
17
20
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
21
+ import org.jetbrains.kotlin.lexer.KtTokens
18
22
import org.jetbrains.kotlin.name.ClassId
23
+ import org.jetbrains.kotlin.toKtLightSourceElement
19
24
20
25
open class AnalyzerCheckers (session : FirSession ) : FirAdditionalCheckersExtension(session) {
21
26
companion object {
22
27
@OptIn(ExperimentalContracts ::class )
23
28
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
24
35
}
25
36
override val declarationCheckers: DeclarationCheckers
26
37
get() = AnalyzerDeclarationCheckers (session.analyzerParamsProvider.sourceroot)
@@ -104,7 +115,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
104
115
val source = declaration.source ? : return
105
116
val ktFile = context.containingFile?.sourceFile ? : return
106
117
val visitor = visitors[ktFile]
107
- visitor?.visitClassOrObject(declaration, source)
118
+ visitor?.visitClassOrObject(declaration, getIdentifier( source) )
108
119
}
109
120
}
110
121
@@ -120,9 +131,19 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
120
131
val visitor = visitors[ktFile]
121
132
122
133
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))
124
145
} else {
125
- visitor?.visitSecondaryConstructor(declaration, source)
146
+ visitor?.visitSecondaryConstructor(declaration, getIdentifier( source) )
126
147
}
127
148
}
128
149
}
@@ -137,7 +158,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
137
158
val source = declaration.source ? : return
138
159
val ktFile = context.containingFile?.sourceFile ? : return
139
160
val visitor = visitors[ktFile]
140
- visitor?.visitNamedFunction(declaration, source)
161
+ visitor?.visitNamedFunction(declaration, getIdentifier( source) )
141
162
}
142
163
}
143
164
@@ -166,7 +187,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
166
187
val source = declaration.source ? : return
167
188
val ktFile = context.containingFile?.sourceFile ? : return
168
189
val visitor = visitors[ktFile]
169
- visitor?.visitProperty(declaration, source)
190
+ visitor?.visitProperty(declaration, getIdentifier( source) )
170
191
}
171
192
}
172
193
@@ -180,7 +201,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
180
201
val source = declaration.source ? : return
181
202
val ktFile = context.containingFile?.sourceFile ? : return
182
203
val visitor = visitors[ktFile]
183
- visitor?.visitParameter(declaration, source)
204
+ visitor?.visitParameter(declaration, getIdentifier( source) )
184
205
}
185
206
}
186
207
@@ -194,7 +215,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
194
215
val source = declaration.source ? : return
195
216
val ktFile = context.containingFile?.sourceFile ? : return
196
217
val visitor = visitors[ktFile]
197
- visitor?.visitTypeParameter(declaration, source)
218
+ visitor?.visitTypeParameter(declaration, getIdentifier( source) )
198
219
}
199
220
}
200
221
@@ -208,7 +229,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
208
229
val source = declaration.source ? : return
209
230
val ktFile = context.containingFile?.sourceFile ? : return
210
231
val visitor = visitors[ktFile]
211
- visitor?.visitTypeAlias(declaration, source)
232
+ visitor?.visitTypeAlias(declaration, getIdentifier( source) )
212
233
}
213
234
}
214
235
@@ -223,7 +244,24 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
223
244
val source = declaration.source ? : return
224
245
val ktFile = context.containingFile?.sourceFile ? : return
225
246
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)
227
265
}
228
266
}
229
267
@@ -243,7 +281,7 @@ open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtensio
243
281
244
282
val ktFile = context.containingFile?.sourceFile ? : return
245
283
val visitor = visitors[ktFile]
246
- visitor?.visitSimpleNameExpression(calleeReference, source)
284
+ visitor?.visitSimpleNameExpression(calleeReference, getIdentifier(calleeReference. source ? : source) )
247
285
}
248
286
}
249
287
}
0 commit comments