[LL FIR] FileStructureElementDiagnosticRetriever: deduplicate code
This commit is contained in:
committed by
Space Team
parent
3f31bdb877
commit
2e17d8d524
+68
-68
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@@ -17,39 +17,49 @@ import org.jetbrains.kotlin.fir.correspondingProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirScript
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor
|
||||
import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
|
||||
import org.jetbrains.kotlin.util.withSourceCodeAnalysisExceptionUnwrapping
|
||||
|
||||
internal abstract class FileStructureElementDiagnosticRetriever {
|
||||
abstract fun retrieve(
|
||||
firFile: FirFile,
|
||||
collector: FileStructureElementDiagnosticsCollector,
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
): FileStructureElementDiagnosticList
|
||||
}
|
||||
|
||||
internal class ClassDiagnosticRetriever(
|
||||
private val structureElementDeclaration: FirRegularClass
|
||||
) : FileStructureElementDiagnosticRetriever() {
|
||||
override fun retrieve(
|
||||
firFile: FirFile,
|
||||
collector: FileStructureElementDiagnosticsCollector,
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
): FileStructureElementDiagnosticList {
|
||||
internal sealed class FileStructureElementDiagnosticRetriever(
|
||||
val declaration: FirDeclaration,
|
||||
private val file: FirFile,
|
||||
private val moduleComponents: LLFirModuleResolveComponents,
|
||||
) {
|
||||
fun retrieve(collector: FileStructureElementDiagnosticsCollector): FileStructureElementDiagnosticList {
|
||||
val sessionHolder = SessionHolderImpl(moduleComponents.session, moduleComponents.scopeSessionProvider.getScopeSession())
|
||||
val context = PersistenceContextCollector.collectContext(sessionHolder, firFile, structureElementDeclaration)
|
||||
val context = if (declaration is FirFile) {
|
||||
PersistentCheckerContextFactory.createEmptyPersistenceCheckerContext(sessionHolder)
|
||||
} else {
|
||||
PersistenceContextCollector.collectContext(sessionHolder, file, declaration)
|
||||
}
|
||||
|
||||
return withSourceCodeAnalysisExceptionUnwrapping {
|
||||
collector.collectForStructureElement(structureElementDeclaration) { components ->
|
||||
Visitor(structureElementDeclaration, context, components)
|
||||
collector.collectForStructureElement(declaration) { components ->
|
||||
createVisitor(context, components)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
abstract fun createVisitor(context: CheckerContextForProvider, components: DiagnosticCollectorComponents): LLFirDiagnosticVisitor
|
||||
}
|
||||
|
||||
internal class ClassDiagnosticRetriever(
|
||||
declaration: FirDeclaration,
|
||||
file: FirFile,
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
) : FileStructureElementDiagnosticRetriever(
|
||||
declaration,
|
||||
file,
|
||||
moduleComponents,
|
||||
) {
|
||||
override fun createVisitor(context: CheckerContextForProvider, components: DiagnosticCollectorComponents): LLFirDiagnosticVisitor {
|
||||
return Visitor(declaration, context, components)
|
||||
}
|
||||
|
||||
private class Visitor(
|
||||
private val structureElementDeclaration: FirRegularClass,
|
||||
private val structureElementDeclaration: FirDeclaration,
|
||||
context: CheckerContextForProvider,
|
||||
components: DiagnosticCollectorComponents,
|
||||
) : LLFirDiagnosticVisitor(context, components) {
|
||||
@@ -89,25 +99,21 @@ internal val FirElement.isImplicitConstructor: Boolean
|
||||
get() = this is FirConstructor && source?.kind == KtFakeSourceElementKind.ImplicitConstructor
|
||||
|
||||
internal class SingleNonLocalDeclarationDiagnosticRetriever(
|
||||
private val structureElementDeclaration: FirDeclaration
|
||||
) : FileStructureElementDiagnosticRetriever() {
|
||||
override fun retrieve(
|
||||
firFile: FirFile,
|
||||
collector: FileStructureElementDiagnosticsCollector,
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
): FileStructureElementDiagnosticList {
|
||||
val sessionHolder = SessionHolderImpl(moduleComponents.session, moduleComponents.scopeSessionProvider.getScopeSession())
|
||||
val context = PersistenceContextCollector.collectContext(sessionHolder, firFile, structureElementDeclaration)
|
||||
return withSourceCodeAnalysisExceptionUnwrapping {
|
||||
collector.collectForStructureElement(structureElementDeclaration) { components ->
|
||||
Visitor(context, components)
|
||||
}
|
||||
}
|
||||
declaration: FirDeclaration,
|
||||
file: FirFile,
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
) : FileStructureElementDiagnosticRetriever(
|
||||
declaration,
|
||||
file,
|
||||
moduleComponents,
|
||||
) {
|
||||
override fun createVisitor(context: CheckerContextForProvider, components: DiagnosticCollectorComponents): LLFirDiagnosticVisitor {
|
||||
return Visitor(context, components)
|
||||
}
|
||||
|
||||
private class Visitor(
|
||||
context: CheckerContextForProvider,
|
||||
components: DiagnosticCollectorComponents
|
||||
components: DiagnosticCollectorComponents,
|
||||
) : LLFirDiagnosticVisitor(context, components) {
|
||||
override fun visitConstructor(constructor: FirConstructor, data: Nothing?) {
|
||||
super.visitConstructor(constructor, data)
|
||||
@@ -123,27 +129,23 @@ internal class SingleNonLocalDeclarationDiagnosticRetriever(
|
||||
}
|
||||
}
|
||||
|
||||
internal object FileDiagnosticRetriever : FileStructureElementDiagnosticRetriever() {
|
||||
override fun retrieve(
|
||||
firFile: FirFile,
|
||||
collector: FileStructureElementDiagnosticsCollector,
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
): FileStructureElementDiagnosticList =
|
||||
withSourceCodeAnalysisExceptionUnwrapping {
|
||||
collector.collectForStructureElement(firFile) { components ->
|
||||
Visitor(components, moduleComponents)
|
||||
}
|
||||
}
|
||||
internal class FileDiagnosticRetriever(
|
||||
declaration: FirDeclaration,
|
||||
file: FirFile,
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
) : FileStructureElementDiagnosticRetriever(
|
||||
declaration,
|
||||
file,
|
||||
moduleComponents,
|
||||
) {
|
||||
override fun createVisitor(context: CheckerContextForProvider, components: DiagnosticCollectorComponents): LLFirDiagnosticVisitor {
|
||||
return Visitor(context, components)
|
||||
}
|
||||
|
||||
private class Visitor(
|
||||
context: CheckerContextForProvider,
|
||||
components: DiagnosticCollectorComponents,
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
) : LLFirDiagnosticVisitor(
|
||||
PersistentCheckerContextFactory.createEmptyPersistenceCheckerContext(
|
||||
SessionHolderImpl(moduleComponents.session, moduleComponents.scopeSessionProvider.getScopeSession())
|
||||
),
|
||||
components,
|
||||
) {
|
||||
) : LLFirDiagnosticVisitor(context, components) {
|
||||
override fun visitFile(file: FirFile, data: Nothing?) {
|
||||
withAnnotationContainer(file) {
|
||||
visitWithFile(file) {
|
||||
@@ -157,19 +159,17 @@ internal object FileDiagnosticRetriever : FileStructureElementDiagnosticRetrieve
|
||||
}
|
||||
}
|
||||
|
||||
internal class ScriptDiagnosticRetriever(private val script: FirScript) : FileStructureElementDiagnosticRetriever() {
|
||||
override fun retrieve(
|
||||
firFile: FirFile,
|
||||
collector: FileStructureElementDiagnosticsCollector,
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
): FileStructureElementDiagnosticList {
|
||||
val sessionHolder = SessionHolderImpl(moduleComponents.session, moduleComponents.scopeSessionProvider.getScopeSession())
|
||||
val context = PersistenceContextCollector.collectContext(sessionHolder, firFile, script)
|
||||
return withSourceCodeAnalysisExceptionUnwrapping {
|
||||
collector.collectForStructureElement(script) { components ->
|
||||
Visitor(context, components)
|
||||
}
|
||||
}
|
||||
internal class ScriptDiagnosticRetriever(
|
||||
declaration: FirDeclaration,
|
||||
file: FirFile,
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
) : FileStructureElementDiagnosticRetriever(
|
||||
declaration,
|
||||
file,
|
||||
moduleComponents,
|
||||
) {
|
||||
override fun createVisitor(context: CheckerContextForProvider, components: DiagnosticCollectorComponents): LLFirDiagnosticVisitor {
|
||||
return Visitor(context, components)
|
||||
}
|
||||
|
||||
private class Visitor(
|
||||
|
||||
+3
-9
@@ -7,22 +7,16 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.util.SmartList
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter
|
||||
import org.jetbrains.kotlin.diagnostics.KtPsiDiagnostic
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
|
||||
internal class FileStructureElementDiagnostics(
|
||||
private val firFile: FirFile,
|
||||
private val retriever: FileStructureElementDiagnosticRetriever,
|
||||
private val moduleComponents: LLFirModuleResolveComponents,
|
||||
) {
|
||||
internal class FileStructureElementDiagnostics(private val retriever: FileStructureElementDiagnosticRetriever) {
|
||||
private val diagnosticByCommonCheckers: FileStructureElementDiagnosticList by lazy {
|
||||
retriever.retrieve(firFile, FileStructureElementDiagnosticsCollector.USUAL_COLLECTOR, moduleComponents)
|
||||
retriever.retrieve(FileStructureElementDiagnosticsCollector.USUAL_COLLECTOR)
|
||||
}
|
||||
|
||||
private val diagnosticByExtendedCheckers: FileStructureElementDiagnosticList by lazy {
|
||||
retriever.retrieve(firFile, FileStructureElementDiagnosticsCollector.EXTENDED_COLLECTOR, moduleComponents)
|
||||
retriever.retrieve(FileStructureElementDiagnosticsCollector.EXTENDED_COLLECTOR)
|
||||
}
|
||||
|
||||
fun diagnosticsFor(filter: DiagnosticCheckerFilter, element: PsiElement): List<KtPsiDiagnostic> =
|
||||
|
||||
+29
-22
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.ClassDiagnosticRetriever
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.FileDiagnosticRetriever
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.FileStructureElementDiagnosticRetriever
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.FileStructureElementDiagnostics
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.ScriptDiagnosticRetriever
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.SingleNonLocalDeclarationDiagnosticRetriever
|
||||
@@ -27,9 +26,7 @@ import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment
|
||||
|
||||
internal sealed class FileStructureElement(
|
||||
val declaration: FirDeclaration,
|
||||
firFile: FirFile,
|
||||
retriever: FileStructureElementDiagnosticRetriever,
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
val diagnostics: FileStructureElementDiagnostics,
|
||||
) {
|
||||
init {
|
||||
val actualResolvePhase = declaration.resolvePhase
|
||||
@@ -48,12 +45,6 @@ internal sealed class FileStructureElement(
|
||||
|
||||
val mappings: KtToFirMapping = KtToFirMapping(declaration)
|
||||
|
||||
val diagnostics: FileStructureElementDiagnostics = FileStructureElementDiagnostics(
|
||||
firFile,
|
||||
retriever,
|
||||
moduleComponents,
|
||||
)
|
||||
|
||||
companion object {
|
||||
fun recorderFor(fir: FirDeclaration): FirElementsRecorder = when (fir) {
|
||||
is FirFile -> RootStructureElement.Recorder
|
||||
@@ -146,9 +137,13 @@ internal class RootScriptStructureElement(
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
) : FileStructureElement(
|
||||
declaration = script,
|
||||
firFile = file,
|
||||
retriever = ScriptDiagnosticRetriever(script),
|
||||
moduleComponents = moduleComponents,
|
||||
diagnostics = FileStructureElementDiagnostics(
|
||||
ScriptDiagnosticRetriever(
|
||||
declaration = script,
|
||||
file = file,
|
||||
moduleComponents = moduleComponents,
|
||||
)
|
||||
),
|
||||
) {
|
||||
object Recorder : FirElementsRecorder() {
|
||||
override fun visitScript(script: FirScript, data: MutableMap<KtElement, FirElement>) {
|
||||
@@ -169,9 +164,13 @@ internal class ClassDeclarationStructureElement(
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
) : FileStructureElement(
|
||||
declaration = clazz,
|
||||
firFile = file,
|
||||
retriever = ClassDiagnosticRetriever(clazz),
|
||||
moduleComponents = moduleComponents
|
||||
diagnostics = FileStructureElementDiagnostics(
|
||||
ClassDiagnosticRetriever(
|
||||
declaration = clazz,
|
||||
file = file,
|
||||
moduleComponents = moduleComponents,
|
||||
)
|
||||
),
|
||||
) {
|
||||
class Recorder(private val firClass: FirRegularClass) : FirElementsRecorder() {
|
||||
override fun visitProperty(property: FirProperty, data: MutableMap<KtElement, FirElement>) {
|
||||
@@ -217,9 +216,13 @@ internal class DeclarationStructureElement(
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
) : FileStructureElement(
|
||||
declaration = declaration,
|
||||
firFile = file,
|
||||
retriever = SingleNonLocalDeclarationDiagnosticRetriever(declaration),
|
||||
moduleComponents = moduleComponents,
|
||||
diagnostics = FileStructureElementDiagnostics(
|
||||
SingleNonLocalDeclarationDiagnosticRetriever(
|
||||
declaration = declaration,
|
||||
file = file,
|
||||
moduleComponents = moduleComponents,
|
||||
)
|
||||
),
|
||||
) {
|
||||
object Recorder : FirElementsRecorder() {
|
||||
override fun visitConstructor(constructor: FirConstructor, data: MutableMap<KtElement, FirElement>) {
|
||||
@@ -241,9 +244,13 @@ internal class RootStructureElement(
|
||||
moduleComponents: LLFirModuleResolveComponents,
|
||||
) : FileStructureElement(
|
||||
declaration = file,
|
||||
firFile = file,
|
||||
retriever = FileDiagnosticRetriever,
|
||||
moduleComponents = moduleComponents
|
||||
diagnostics = FileStructureElementDiagnostics(
|
||||
FileDiagnosticRetriever(
|
||||
declaration = file,
|
||||
file = file,
|
||||
moduleComponents = moduleComponents,
|
||||
)
|
||||
),
|
||||
) {
|
||||
object Recorder : FirElementsRecorder() {
|
||||
override fun visitElement(element: FirElement, data: MutableMap<KtElement, FirElement>) {
|
||||
|
||||
Reference in New Issue
Block a user