Skip to content

Commit 685091b

Browse files
author
Ernald Nicolas
committed
Bug & Test Fixes
1 parent a3a13d0 commit 685091b

File tree

12 files changed

+348
-298
lines changed

12 files changed

+348
-298
lines changed

semanticdb-kotlinc/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ tasks.test {
169169
exceptionFormat = TestExceptionFormat.FULL
170170
events("passed", "failed")
171171
}
172+
maxHeapSize = "2g"
172173
}
173174

174175
subprojects {
@@ -210,7 +211,7 @@ subprojects {
210211
"-P",
211212
"plugin:semanticdb-kotlinc:sourceroot=${sourceroot}",
212213
"-P",
213-
"plugin:semanticdb-kotlinc:targetroot=${targetroot}"
214+
"plugin:semanticdb-kotlinc:targetroot=${targetroot}",
214215
)
215216
}
216217
}

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

Lines changed: 68 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -11,78 +11,50 @@ import org.jetbrains.kotlin.fir.FirSession
1111
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
1212
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
1313
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers
14+
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirAnonymousFunctionChecker
1415
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirConstructorChecker
1516
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirFileChecker
16-
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirFunctionChecker
1717
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirPropertyAccessorChecker
1818
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirPropertyChecker
1919
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirRegularClassChecker
20+
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirSimpleFunctionChecker
2021
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirTypeAliasChecker
2122
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirTypeParameterChecker
2223
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirValueParameterChecker
2324
import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers
25+
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirCallableReferenceAccessChecker
26+
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirPropertyAccessExpressionChecker
2427
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessExpressionChecker
2528
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
29+
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
2630
import org.jetbrains.kotlin.fir.declarations.FirConstructor
2731
import org.jetbrains.kotlin.fir.declarations.FirFile
28-
import org.jetbrains.kotlin.fir.declarations.FirFunction
2932
import org.jetbrains.kotlin.fir.declarations.FirProperty
3033
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
3134
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
35+
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
3236
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
3337
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
3438
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
39+
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
40+
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
3541
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
3642
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
43+
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
44+
import org.jetbrains.kotlin.name.ClassId
3745
import org.jetbrains.kotlin.psi.KtDeclaration
3846
import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker
3947
import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext
4048

41-
class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtension(session) {
49+
open class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtension(session) {
4250
companion object {
4351
@OptIn(ExperimentalContracts::class)
4452
val visitors: MutableMap<KtSourceFile, SemanticdbVisitor> = mutableMapOf()
4553
}
46-
47-
// override val declarationCheckers: DeclarationCheckers
48-
// get() = object : DeclarationCheckers() {
49-
// override val fileCheckers: Set<FirFileChecker> = setOf()
50-
// override val regularClassCheckers: Set<FirRegularClassChecker> = emptySet()
51-
// override val functionCheckers: Set<FirFunctionChecker> = emptySet()
52-
// override val propertyCheckers: Set<FirPropertyChecker> = emptySet()
53-
// override val constructorCheckers: Set<FirConstructorChecker> = emptySet()
54-
// override val typeParameterCheckers: Set<FirTypeParameterChecker> = emptySet()
55-
// override val valueParameterCheckers: Set<FirValueParameterChecker> = emptySet()
56-
// override val typeAliasCheckers: Set<FirTypeAliasChecker> = emptySet()
57-
// override val propertyAccessorCheckers: Set<FirPropertyAccessorChecker> =
58-
// emptySet()
59-
//
60-
// }
6154
override val declarationCheckers: DeclarationCheckers
6255
get() =
63-
object : DeclarationCheckers() {
64-
override val fileCheckers: Set<FirFileChecker> =
65-
setOf(
66-
SemanticFileChecker(
67-
session.diTransformerService.sourceroot,
68-
session.diTransformerService.callback))
69-
override val regularClassCheckers: Set<FirRegularClassChecker> =
70-
setOf(SemanticRegularClassChecker())
71-
override val constructorCheckers: Set<FirConstructorChecker> =
72-
setOf(SemanticConstructorChecker())
73-
override val functionCheckers: Set<FirFunctionChecker> =
74-
setOf(SemanticFunctionChecker())
75-
override val propertyCheckers: Set<FirPropertyChecker> =
76-
setOf(SemanticPropertyChecker())
77-
override val valueParameterCheckers: Set<FirValueParameterChecker> =
78-
setOf(SemanticValueParameterChecker())
79-
override val typeParameterCheckers: Set<FirTypeParameterChecker> =
80-
setOf(SemanticTypeParameterChecker())
81-
override val typeAliasCheckers: Set<FirTypeAliasChecker> =
82-
setOf(SemanticTypeAliasChecker())
83-
override val propertyAccessorCheckers: Set<FirPropertyAccessorChecker> =
84-
setOf(SemanticPropertAccessorChecker())
85-
}
56+
AnalyzerDeclarationCheckers(
57+
session.analyzerParamsProvider.sourceroot, session.analyzerParamsProvider.callback)
8658

8759
override val expressionCheckers: ExpressionCheckers
8860
get() =
@@ -92,6 +64,28 @@ class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtension(ses
9264
setOf(SemanticQualifiedAccessExpressionChecker())
9365
}
9466

67+
open class AnalyzerDeclarationCheckers(
68+
sourceroot: Path,
69+
callback: (Semanticdb.TextDocument) -> Unit
70+
) : DeclarationCheckers() {
71+
override val fileCheckers: Set<FirFileChecker> =
72+
setOf(SemanticFileChecker(sourceroot, callback), SemanticImportsChecker())
73+
override val regularClassCheckers: Set<FirRegularClassChecker> =
74+
setOf(SemanticRegularClassChecker())
75+
override val constructorCheckers: Set<FirConstructorChecker> =
76+
setOf(SemanticConstructorChecker())
77+
override val simpleFunctionCheckers: Set<FirSimpleFunctionChecker> = setOf(SemanticSimpleFunctionChecker())
78+
override val anonymousFunctionCheckers: Set<FirAnonymousFunctionChecker> = setOf(SemanticAnonymousFunctionChecker())
79+
override val propertyCheckers: Set<FirPropertyChecker> = setOf(SemanticPropertyChecker())
80+
override val valueParameterCheckers: Set<FirValueParameterChecker> =
81+
setOf(SemanticValueParameterChecker())
82+
override val typeParameterCheckers: Set<FirTypeParameterChecker> =
83+
setOf(SemanticTypeParameterChecker())
84+
override val typeAliasCheckers: Set<FirTypeAliasChecker> = setOf(SemanticTypeAliasChecker())
85+
override val propertyAccessorCheckers: Set<FirPropertyAccessorChecker> =
86+
setOf(SemanticPropertyAccessorChecker())
87+
}
88+
9589
private class SemanticFileChecker(
9690
private val sourceroot: Path,
9791
private val callback: (Semanticdb.TextDocument) -> Unit
@@ -106,24 +100,21 @@ class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtension(ses
106100
context: CheckerContext,
107101
reporter: DiagnosticReporter
108102
) {
109-
println("Ernald - FirFile1")
110103
val ktFile = declaration.sourceFile ?: return
111-
val source = declaration.source ?: return
112-
println("Ernald - FirFile2")
113104
val lineMap = LineMap(declaration)
114105
val visitor = SemanticdbVisitor(sourceroot, ktFile, lineMap, globals)
115106
visitors[ktFile] = visitor
116107
}
117108

118109
private fun semanticdbOutPathForFile(session: FirSession, file: KtSourceFile): Path? {
119-
val sourceRoot = session.diTransformerService.sourceroot
110+
val sourceRoot = session.analyzerParamsProvider.sourceroot
120111
val normalizedPath = Paths.get(file.path).normalize()
121112
if (normalizedPath.startsWith(sourceRoot)) {
122113
val relative = sourceRoot.relativize(normalizedPath)
123114
val filename = relative.fileName.toString() + ".semanticdb"
124115
val semanticdbOutPath =
125116
session
126-
.diTransformerService
117+
.analyzerParamsProvider
127118
.targetroot
128119
.resolve("META-INF")
129120
.resolve("semanticdb")
@@ -139,18 +130,29 @@ class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtension(ses
139130
}
140131
}
141132

133+
class SemanticImportsChecker : FirFileChecker(MppCheckerKind.Common) {
134+
@OptIn(ExperimentalContracts::class)
135+
override fun check(declaration: FirFile, context: CheckerContext, reporter: DiagnosticReporter) {
136+
val ktFile = declaration.sourceFile ?: return
137+
declaration.imports.forEach { import ->
138+
val source = import.source ?: return@forEach
139+
val visitor = visitors[ktFile]
140+
val fqName = import.importedFqName ?: return@forEach
141+
val importedClassSymbol = context.session.symbolProvider.getClassLikeSymbolByClassId(ClassId.topLevel(fqName)) ?: return@forEach
142+
visitor?.visitImport(importedClassSymbol, source)
143+
}
144+
}
145+
}
146+
142147
private class SemanticRegularClassChecker : FirRegularClassChecker(MppCheckerKind.Common) {
143148
@OptIn(ExperimentalContracts::class)
144149
override fun check(
145150
declaration: FirRegularClass,
146151
context: CheckerContext,
147152
reporter: DiagnosticReporter
148153
) {
149-
println("Ernald - FirRegularClass1")
150154
val source = declaration.source ?: return
151-
println("Ernald - FirRegularClass2")
152155
val ktFile = context.containingFile?.sourceFile ?: return
153-
println("Ernald - FirRegularClass3")
154156
val visitor = visitors[ktFile]
155157
visitor?.visitClassOrObject(declaration, source)
156158
}
@@ -175,10 +177,24 @@ class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtension(ses
175177
}
176178
}
177179

178-
private class SemanticFunctionChecker : FirFunctionChecker(MppCheckerKind.Common) {
180+
private class SemanticSimpleFunctionChecker : FirSimpleFunctionChecker(MppCheckerKind.Common) {
179181
@OptIn(ExperimentalContracts::class)
180182
override fun check(
181-
declaration: FirFunction,
183+
declaration: FirSimpleFunction,
184+
context: CheckerContext,
185+
reporter: DiagnosticReporter
186+
) {
187+
val source = declaration.source ?: return
188+
val ktFile = context.containingFile?.sourceFile ?: return
189+
val visitor = visitors[ktFile]
190+
visitor?.visitNamedFunction(declaration, source)
191+
}
192+
}
193+
194+
private class SemanticAnonymousFunctionChecker : FirAnonymousFunctionChecker(MppCheckerKind.Common) {
195+
@OptIn(ExperimentalContracts::class)
196+
override fun check(
197+
declaration: FirAnonymousFunction,
182198
context: CheckerContext,
183199
reporter: DiagnosticReporter
184200
) {
@@ -245,7 +261,7 @@ class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtension(ses
245261
}
246262
}
247263

248-
private class SemanticPropertAccessorChecker :
264+
private class SemanticPropertyAccessorChecker :
249265
FirPropertyAccessorChecker(MppCheckerKind.Common) {
250266
@OptIn(ExperimentalContracts::class)
251267
override fun check(
@@ -281,22 +297,6 @@ class AnalyzerCheckers(session: FirSession) : FirAdditionalCheckersExtension(ses
281297
}
282298
}
283299

284-
// private fun FirElement.findKtFile(): KtSourceFile? = source?.psi?.containingFile as? KtSourceFile
285-
286-
/*
287-
KtObjectDeclaration -> FirRegularClassChecker
288-
KTClass -> FirRegularClassChecker
289-
KtPrimaryConstructor -> FirConstructorChecker
290-
KtSecondaryConstructor -> FirConstructorChecker
291-
KtNamedFunction -> FirFunctionChecker
292-
KtProperty -> FirPropertyChecker
293-
KtParameter -> FirValueParameterChecker
294-
KtTypeParameter -> FirTypeParameterChecker
295-
KtTypeAlias -> FirTypeAliasChecker
296-
KtPropertyAccessor -> FirPropertyAccessorChecker
297-
KtSimpleNameExpression -> TBD (using FirQualifiedAccessExpression)
298-
*/
299-
300300
class AnalyzerDeclarationChecker : DeclarationChecker {
301301
override fun check(
302302
declaration: KtDeclaration,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class AnalyzerFirExtensionRegistrar(
99
private val callback: (Semanticdb.TextDocument) -> Unit
1010
) : FirExtensionRegistrar() {
1111
override fun ExtensionRegistrarContext.configurePlugin() {
12-
+DiTransformerService.getFactory(sourceroot, targetroot, callback)
12+
+AnalyzerParamsProvider.getFactory(sourceroot, targetroot, callback)
1313
+::AnalyzerCheckers
1414
}
1515
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import java.nio.file.Path
44
import org.jetbrains.kotlin.fir.FirSession
55
import org.jetbrains.kotlin.fir.extensions.FirExtensionSessionComponent
66

7-
class DiTransformerService(
7+
open class AnalyzerParamsProvider(
88
session: FirSession,
99
sourceroot: Path,
1010
targetroot: Path,
@@ -16,7 +16,7 @@ class DiTransformerService(
1616
targetroot: Path,
1717
callback: (Semanticdb.TextDocument) -> Unit
1818
): Factory {
19-
return Factory { DiTransformerService(it, sourceroot, targetroot, callback) }
19+
return Factory { AnalyzerParamsProvider(it, sourceroot, targetroot, callback) }
2020
}
2121
}
2222

@@ -25,4 +25,4 @@ class DiTransformerService(
2525
val callback: (Semanticdb.TextDocument) -> Unit = callback
2626
}
2727

28-
val FirSession.diTransformerService: DiTransformerService by FirSession.sessionComponentAccessor()
28+
val FirSession.analyzerParamsProvider: AnalyzerParamsProvider by FirSession.sessionComponentAccessor()

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,6 @@ import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter
1212
class AnalyzerRegistrar(private val callback: (Semanticdb.TextDocument) -> Unit = {}) :
1313
CompilerPluginRegistrar() {
1414
override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
15-
println("Ernald - AnalyzerRegistrar")
16-
// AnalysisHandlerExtension.registerExtension(
17-
// Analyzer(
18-
// sourceroot = configuration[KEY_SOURCES]
19-
// ?: throw IllegalArgumentException("configuration key $KEY_SOURCES
20-
// missing"),
21-
// targetroot = configuration[KEY_TARGET]
22-
// ?: throw IllegalArgumentException("configuration key $KEY_TARGET
23-
// missing"),
24-
// callback = callback))
25-
2615
FirExtensionRegistrarAdapter.registerExtension(
2716
AnalyzerFirExtensionRegistrar(
2817
sourceroot = configuration[KEY_SOURCES]!!,

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

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,35 +16,13 @@ class PostAnalysisExtension(
1616
) : IrGenerationExtension {
1717
@OptIn(ExperimentalContracts::class)
1818
override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
19-
println("Ernald - generate - count:${AnalyzerCheckers.visitors.size}")
2019
for ((ktSourceFile, visitor) in AnalyzerCheckers.visitors) {
21-
println("Ernald - callback1")
2220
val document = visitor.build()
23-
println("Ernald - callback2")
2421
semanticdbOutPathForFile(ktSourceFile)?.apply {
25-
println("Ernald - callback3")
2622
Files.write(this, TextDocuments { addDocuments(document) }.toByteArray())
27-
println("Ernald - callback4")
2823
}
29-
println("Ernald - callback5")
3024
callback(document)
31-
println("Ernald - callback6")
3225
}
33-
// AnalyzerCheckers.visitors.forEach { (ktSourceFile, visitor) -> {
34-
// println("Ernald - callback1")
35-
// val document = visitor.build()
36-
// println("Ernald - callback2")
37-
// semanticdbOutPathForFile(ktSourceFile)?.apply {
38-
// println("Ernald - callback3")
39-
// Files.write(this, TextDocuments { addDocuments(document)
40-
// }.toByteArray())
41-
// println("Ernald - callback4")
42-
// }
43-
// println("Ernald - callback5")
44-
// callback(document)
45-
// println("Ernald - callback6")
46-
// }
47-
// }
4826
}
4927

5028
private fun semanticdbOutPathForFile(file: KtSourceFile): Path? {

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
2828
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
2929
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
3030
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
31+
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol
32+
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
33+
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
3134
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
3235
import org.jetbrains.kotlin.fir.types.coneType
3336
import org.jetbrains.kotlin.fir.types.coneTypeOrNull
@@ -157,7 +160,7 @@ class SemanticdbTextDocumentBuilder(
157160
}
158161
return SymbolInformation {
159162
this.symbol = symbol.toString()
160-
this.displayName = displayName(element)
163+
this.displayName = displayName(firBasedSymbol)
161164
this.documentation = semanticdbDocumentation(firBasedSymbol.fir, element)
162165
this.addAllOverriddenSymbols(supers)
163166
this.language =
@@ -275,11 +278,15 @@ class SemanticdbTextDocumentBuilder(
275278
}
276279

277280
companion object {
278-
private fun displayName(element: KtSourceElement): String =
279-
when (element) {
280-
is KtPropertyAccessor -> element.namePlaceholder.text
281-
is NavigationItem -> element.name ?: element.text?.toString() ?: ""
282-
else -> element.text?.toString() ?: ""
281+
@OptIn(SymbolInternals::class)
282+
private fun displayName(firBasedSymbol: FirBasedSymbol<*>): String =
283+
when (firBasedSymbol) {
284+
is FirClassSymbol -> firBasedSymbol.classId.asSingleFqName().asString()
285+
is FirPropertyAccessorSymbol -> firBasedSymbol.fir.propertySymbol.name.asString()
286+
is FirFunctionSymbol -> firBasedSymbol.callableId.callableName.asString()
287+
is FirPropertySymbol -> firBasedSymbol.callableId.callableName.asString()
288+
is FirVariableSymbol -> firBasedSymbol.name.asString()
289+
else -> firBasedSymbol.toString()
283290
}
284291
}
285292
}

0 commit comments

Comments
 (0)