[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
This commit is contained in:
committed by
Space Team
parent
c482786bc4
commit
dd219cb6e6
-2
@@ -1,4 +1,2 @@
|
||||
// IGNORE_FIR
|
||||
|
||||
@Suppress("MUST_BE_INITIALIZED")
|
||||
val foo: Int
|
||||
|
||||
+11
-4
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user