@@ -11,78 +11,50 @@ import org.jetbrains.kotlin.fir.FirSession
1111import  org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind 
1212import  org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext 
1313import  org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers 
14+ import  org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirAnonymousFunctionChecker 
1415import  org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirConstructorChecker 
1516import  org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirFileChecker 
16- import  org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirFunctionChecker 
1717import  org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirPropertyAccessorChecker 
1818import  org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirPropertyChecker 
1919import  org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirRegularClassChecker 
20+ import  org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirSimpleFunctionChecker 
2021import  org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirTypeAliasChecker 
2122import  org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirTypeParameterChecker 
2223import  org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirValueParameterChecker 
2324import  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 
2427import  org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessExpressionChecker 
2528import  org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension 
29+ import  org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction 
2630import  org.jetbrains.kotlin.fir.declarations.FirConstructor 
2731import  org.jetbrains.kotlin.fir.declarations.FirFile 
28- import  org.jetbrains.kotlin.fir.declarations.FirFunction 
2932import  org.jetbrains.kotlin.fir.declarations.FirProperty 
3033import  org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor 
3134import  org.jetbrains.kotlin.fir.declarations.FirRegularClass 
35+ import  org.jetbrains.kotlin.fir.declarations.FirSimpleFunction 
3236import  org.jetbrains.kotlin.fir.declarations.FirTypeAlias 
3337import  org.jetbrains.kotlin.fir.declarations.FirTypeParameter 
3438import  org.jetbrains.kotlin.fir.declarations.FirValueParameter 
39+ import  org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess 
40+ import  org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression 
3541import  org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression 
3642import  org.jetbrains.kotlin.fir.references.FirResolvedNamedReference 
43+ import  org.jetbrains.kotlin.fir.resolve.providers.symbolProvider 
44+ import  org.jetbrains.kotlin.name.ClassId 
3745import  org.jetbrains.kotlin.psi.KtDeclaration 
3846import  org.jetbrains.kotlin.resolve.checkers.DeclarationChecker 
3947import  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- 
300300class  AnalyzerDeclarationChecker  : DeclarationChecker  {
301301    override  fun  check (
302302        declaration :  KtDeclaration ,
0 commit comments