[KT-58817] Implicit import issues cannot be reported

To be reported with [1] imports require source. It was missing for
implicit script imports.

`FirScriptConfiguratorExtensionImpl` was extended and now adds fake
source elements (users don't see imports in the source code).

Since diagnostics for implicit import statements are meaningless for
IDE, they are suppressed in `LLFirDiagnosticReporter`.

----------------------------------------------------------------------
[1]: DiagnosticReporter.reportOn()
This commit is contained in:
Andrei Klunnyi
2023-05-09 15:28:14 +02:00
committed by Space Team
parent 28ff94533a
commit 2a1d4a42ae
4 changed files with 22 additions and 2 deletions
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.AbstractKtSourceElement
import org.jetbrains.kotlin.KtFakeSourceElement
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.addValueFor
import org.jetbrains.kotlin.diagnostics.*
@@ -18,6 +20,10 @@ internal class LLFirDiagnosticReporter : DiagnosticReporter() {
if (diagnostic == null) return
if (context.isDiagnosticSuppressed(diagnostic)) return
// Implicit imports for scripts are currently implemented via FIR-tree mutation (they do not exist in default importing scopes).
// So as a temporary solution we filter out related diagnostics here.
if (diagnostic.isAboutImplicitImport()) return
val psiDiagnostic = when (diagnostic) {
is KtPsiDiagnostic -> diagnostic
is KtLightDiagnostic -> diagnostic.toPsiDiagnostic()
@@ -51,6 +57,10 @@ internal class LLFirDiagnosticReporter : DiagnosticReporter() {
}
}
private fun KtDiagnostic.isAboutImplicitImport() =
(element is KtFakeSourceElement && (element as KtFakeSourceElement).kind == KtFakeSourceElementKind.ImplicitImport)
private fun KtLightDiagnostic.toPsiDiagnostic(): KtPsiDiagnostic {
val psiSourceElement = element.unwrapToKtPsiSourceElement()
?: error("Diagnostic should be created from PSI in IDE")