From dd219cb6e6a2ffc5f4c1cc3196ad6ba9096cfd8d Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Thu, 9 Nov 2023 16:36:55 +0100 Subject: [PATCH] [LL] Commit pending diagnostics from file checkers on script declarations - In addition to file declarations and class members, we also need to commit pending diagnostics on declarations in scripts, to honor suppressions before the diagnostics are committed indiscriminately. ^KT-62899 --- .../scriptUninitializedTopLevelProperty.kts | 2 -- .../api/fir/diagnostics/LLFirDiagnosticVisitor.kt | 15 +++++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/suppression/scriptUninitializedTopLevelProperty.kts b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/suppression/scriptUninitializedTopLevelProperty.kts index 114d0e2c7aa..fe565b4dba2 100644 --- a/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/suppression/scriptUninitializedTopLevelProperty.kts +++ b/analysis/analysis-api/testData/components/diagnosticsProvider/diagnostics/suppression/scriptUninitializedTopLevelProperty.kts @@ -1,4 +1,2 @@ -// IGNORE_FIR - @Suppress("MUST_BE_INITIALIZED") val foo: Int diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/LLFirDiagnosticVisitor.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/LLFirDiagnosticVisitor.kt index 12d8fee545b..b21c0a0b55c 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/LLFirDiagnosticVisitor.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/LLFirDiagnosticVisitor.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getFirResolveSession import org.jetbrains.kotlin.analysis.low.level.api.fir.api.resolveToFirSymbol import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkCanceled +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.forEachDeclaration import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider import org.jetbrains.kotlin.analysis.utils.printer.parentsOfType import org.jetbrains.kotlin.fir.FirElement @@ -18,6 +19,7 @@ import org.jetbrains.kotlin.fir.declarations.FirCodeFragment 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.psi import org.jetbrains.kotlin.psi.KtCodeFragment import org.jetbrains.kotlin.psi.KtDeclaration @@ -100,13 +102,18 @@ internal open class LLFirDiagnosticVisitor( * accessible children. For example, a file checker can report a diagnostic on a top-level class, but not its member function. */ private fun commitPendingDiagnosticsOnNestedDeclarations(element: FirElement) { - val declarations = when (element) { - is FirFile -> element.declarations - is FirRegularClass -> element.declarations + val declarationContainer = when (element) { + // Script `FirFile`s can be checked by file checkers, which report diagnostics on the declarations inside the `FirScript`, so we + // have to unwrap the script from the file to commit the diagnostics on the script's declarations. + is FirFile -> element.declarations.singleOrNull() as? FirScript ?: element + + is FirScript, is FirRegularClass -> element else -> return } - for (declaration in declarations) { + // Casting to `FirDeclaration` is required in K1. + @Suppress("USELESS_CAST") + (declarationContainer as FirDeclaration).forEachDeclaration { declaration -> withAnnotationContainer(declaration) { declaration.accept(components.reportCommitter, context) }