FIR IDE: use simple KtDiagnostic wrapper for diagnostics
This commit is contained in:
+10
-1
@@ -12,6 +12,7 @@ import com.intellij.codeHighlighting.TextEditorHighlightingPassRegistrar
|
|||||||
import com.intellij.codeInsight.daemon.impl.HighlightInfo
|
import com.intellij.codeInsight.daemon.impl.HighlightInfo
|
||||||
import com.intellij.codeInsight.daemon.impl.HighlightInfoType
|
import com.intellij.codeInsight.daemon.impl.HighlightInfoType
|
||||||
import com.intellij.codeInsight.daemon.impl.UpdateHighlightersUtil
|
import com.intellij.codeInsight.daemon.impl.UpdateHighlightersUtil
|
||||||
|
import com.intellij.openapi.application.ApplicationManager
|
||||||
import com.intellij.openapi.editor.Document
|
import com.intellij.openapi.editor.Document
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.progress.ProgressIndicator
|
import com.intellij.openapi.progress.ProgressIndicator
|
||||||
@@ -19,7 +20,10 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiElementVisitor
|
import com.intellij.psi.PsiElementVisitor
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.analyze
|
import org.jetbrains.kotlin.idea.frontend.api.analyze
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnostic
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.getMessageWithFactoryName
|
||||||
import org.jetbrains.kotlin.idea.highlighter.Diagnostic2Annotation
|
import org.jetbrains.kotlin.idea.highlighter.Diagnostic2Annotation
|
||||||
import org.jetbrains.kotlin.idea.highlighter.IdeErrorMessages
|
import org.jetbrains.kotlin.idea.highlighter.IdeErrorMessages
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
@@ -37,7 +41,7 @@ class KotlinHighLevelDiagnosticHighlightingPass(
|
|||||||
if (!diagnostic.isValid) return@forEach
|
if (!diagnostic.isValid) return@forEach
|
||||||
diagnostic.textRanges.forEach { range ->
|
diagnostic.textRanges.forEach { range ->
|
||||||
HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR/*TODO*/)
|
HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR/*TODO*/)
|
||||||
.descriptionAndTooltip(Diagnostic2Annotation.getMessage(diagnostic, IdeErrorMessages::render))
|
.descriptionAndTooltip(diagnostic.getMessageToRender())
|
||||||
.range(range)
|
.range(range)
|
||||||
.create()
|
.create()
|
||||||
?.let(diagnosticInfos::add)
|
?.let(diagnosticInfos::add)
|
||||||
@@ -45,6 +49,11 @@ class KotlinHighLevelDiagnosticHighlightingPass(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun KtDiagnostic.getMessageToRender(): String =
|
||||||
|
if (ApplicationManager.getApplication().isInternal || ApplicationManager.getApplication().isUnitTestMode)
|
||||||
|
getMessageWithFactoryName()
|
||||||
|
else message
|
||||||
|
|
||||||
|
|
||||||
override fun doApplyInformationToEditor() {
|
override fun doApplyInformationToEditor() {
|
||||||
UpdateHighlightersUtil.setHighlightersToEditor(
|
UpdateHighlightersUtil.setHighlightersToEditor(
|
||||||
|
|||||||
+3
-3
@@ -6,9 +6,9 @@
|
|||||||
package org.jetbrains.kotlin.idea.frontend.api
|
package org.jetbrains.kotlin.idea.frontend.api
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.calls.KtCall
|
import org.jetbrains.kotlin.idea.frontend.api.calls.KtCall
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.components.*
|
import org.jetbrains.kotlin.idea.frontend.api.components.*
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnostic
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.scopes.*
|
import org.jetbrains.kotlin.idea.frontend.api.scopes.*
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithDeclarations
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithDeclarations
|
||||||
@@ -82,9 +82,9 @@ abstract class KtAnalysisSession(final override val token: ValidityToken) : Vali
|
|||||||
|
|
||||||
fun KtClassOrObjectSymbol.buildSelfClassType(): KtType = typeProvider.buildSelfClassType(this)
|
fun KtClassOrObjectSymbol.buildSelfClassType(): KtType = typeProvider.buildSelfClassType(this)
|
||||||
|
|
||||||
fun KtElement.getDiagnostics(): Collection<Diagnostic> = diagnosticProvider.getDiagnosticsForElement(this)
|
fun KtElement.getDiagnostics(): Collection<KtDiagnostic> = diagnosticProvider.getDiagnosticsForElement(this)
|
||||||
|
|
||||||
fun KtFile.collectDiagnosticsForFile(): Collection<Diagnostic> = diagnosticProvider.collectDiagnosticsForFile(this)
|
fun KtFile.collectDiagnosticsForFile(): Collection<KtDiagnostic> = diagnosticProvider.collectDiagnosticsForFile(this)
|
||||||
|
|
||||||
fun KtSymbolWithKind.getContainingSymbol(): KtSymbolWithKind? = containingDeclarationProvider.getContainingDeclaration(this)
|
fun KtSymbolWithKind.getContainingSymbol(): KtSymbolWithKind? = containingDeclarationProvider.getContainingDeclaration(this)
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -5,11 +5,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.frontend.api.components
|
package org.jetbrains.kotlin.idea.frontend.api.components
|
||||||
|
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnostic
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
abstract class KtDiagnosticProvider : KtAnalysisSessionComponent() {
|
abstract class KtDiagnosticProvider : KtAnalysisSessionComponent() {
|
||||||
abstract fun getDiagnosticsForElement(element: KtElement): Collection<Diagnostic>
|
abstract fun getDiagnosticsForElement(element: KtElement): Collection<KtDiagnostic>
|
||||||
abstract fun collectDiagnosticsForFile(ktFile: KtFile): Collection<Diagnostic>
|
abstract fun collectDiagnosticsForFile(ktFile: KtFile): Collection<KtDiagnostic>
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-3
@@ -5,8 +5,21 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.frontend.api.diagnostics
|
package org.jetbrains.kotlin.idea.frontend.api.diagnostics
|
||||||
|
|
||||||
sealed class KtDiagnostic {
|
import com.intellij.openapi.util.TextRange
|
||||||
abstract val message: String
|
|
||||||
|
interface KtDiagnostic {
|
||||||
|
val factoryName: String?
|
||||||
|
val message: String
|
||||||
|
val textRanges: Collection<TextRange>
|
||||||
|
val isValid: Boolean get() = true
|
||||||
}
|
}
|
||||||
|
|
||||||
data class KtSimpleDiagnostic(override val message: String): KtDiagnostic()
|
fun KtDiagnostic.getMessageWithFactoryName(): String =
|
||||||
|
if (factoryName == null) message
|
||||||
|
else "[$factoryName] $message"
|
||||||
|
|
||||||
|
data class KtSimpleDiagnostic(
|
||||||
|
override val factoryName: String?,
|
||||||
|
override val message: String,
|
||||||
|
override val textRanges: Collection<TextRange>,
|
||||||
|
) : KtDiagnostic
|
||||||
+3
-2
@@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project
|
|||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
@@ -83,11 +84,11 @@ internal class FirModuleResolveStateForCompletion(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun getDiagnostics(element: KtElement): List<Diagnostic> {
|
override fun getDiagnostics(element: KtElement): List<FirPsiDiagnostic<*>> {
|
||||||
error("Diagnostics should not be retrieved in completion")
|
error("Diagnostics should not be retrieved in completion")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun collectDiagnosticsForFile(ktFile: KtFile): Collection<Diagnostic> {
|
override fun collectDiagnosticsForFile(ktFile: KtFile): Collection<FirPsiDiagnostic<*>> {
|
||||||
error("Diagnostics should not be retrieved in completion")
|
error("Diagnostics should not be retrieved in completion")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project
|
|||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
@@ -68,10 +69,10 @@ internal class FirModuleResolveStateImpl(
|
|||||||
override fun getFirFile(ktFile: KtFile): FirFile =
|
override fun getFirFile(ktFile: KtFile): FirFile =
|
||||||
firFileBuilder.buildRawFirFileWithCaching(ktFile, rootModuleSession.cache, lazyBodiesMode = false)
|
firFileBuilder.buildRawFirFileWithCaching(ktFile, rootModuleSession.cache, lazyBodiesMode = false)
|
||||||
|
|
||||||
override fun getDiagnostics(element: KtElement): List<Diagnostic> =
|
override fun getDiagnostics(element: KtElement): List<FirPsiDiagnostic<*>> =
|
||||||
diagnosticsCollector.getDiagnosticsFor(element)
|
diagnosticsCollector.getDiagnosticsFor(element)
|
||||||
|
|
||||||
override fun collectDiagnosticsForFile(ktFile: KtFile): Collection<Diagnostic> =
|
override fun collectDiagnosticsForFile(ktFile: KtFile): Collection<FirPsiDiagnostic<*>> =
|
||||||
diagnosticsCollector.collectDiagnosticsForFile(ktFile)
|
diagnosticsCollector.collectDiagnosticsForFile(ktFile)
|
||||||
|
|
||||||
override fun getBuiltFirFileOrNull(ktFile: KtFile): FirFile? {
|
override fun getBuiltFirFileOrNull(ktFile: KtFile): FirFile? {
|
||||||
|
|||||||
+3
-2
@@ -9,6 +9,7 @@ import org.jetbrains.annotations.TestOnly
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirTowerDataContext
|
import org.jetbrains.kotlin.fir.resolve.FirTowerDataContext
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
||||||
@@ -36,9 +37,9 @@ abstract class FirModuleResolveState {
|
|||||||
|
|
||||||
internal abstract fun isFirFileBuilt(ktFile: KtFile): Boolean
|
internal abstract fun isFirFileBuilt(ktFile: KtFile): Boolean
|
||||||
|
|
||||||
internal abstract fun getDiagnostics(element: KtElement): List<Diagnostic>
|
internal abstract fun getDiagnostics(element: KtElement): List<FirPsiDiagnostic<*>>
|
||||||
|
|
||||||
internal abstract fun collectDiagnosticsForFile(ktFile: KtFile): Collection<Diagnostic>
|
internal abstract fun collectDiagnosticsForFile(ktFile: KtFile): Collection<FirPsiDiagnostic<*>>
|
||||||
|
|
||||||
@TestOnly
|
@TestOnly
|
||||||
internal abstract fun getBuiltFirFileOrNull(ktFile: KtFile): FirFile?
|
internal abstract fun getBuiltFirFileOrNull(ktFile: KtFile): FirFile?
|
||||||
|
|||||||
+3
-2
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.api
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.psi
|
import org.jetbrains.kotlin.fir.psi
|
||||||
import org.jetbrains.kotlin.fir.render
|
import org.jetbrains.kotlin.fir.render
|
||||||
@@ -120,13 +121,13 @@ fun <D : FirDeclaration, R> D.withFirDeclaration(
|
|||||||
/**
|
/**
|
||||||
* Returns a list of Diagnostics compiler finds for given [KtElement]
|
* Returns a list of Diagnostics compiler finds for given [KtElement]
|
||||||
*/
|
*/
|
||||||
fun KtElement.getDiagnostics(resolveState: FirModuleResolveState): Collection<Diagnostic> =
|
fun KtElement.getDiagnostics(resolveState: FirModuleResolveState): Collection<FirPsiDiagnostic<*>> =
|
||||||
resolveState.getDiagnostics(this)
|
resolveState.getDiagnostics(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a list of Diagnostics compiler finds for given [KtFile]
|
* Returns a list of Diagnostics compiler finds for given [KtFile]
|
||||||
*/
|
*/
|
||||||
fun KtFile.collectDiagnosticsForFile(resolveState: FirModuleResolveState): Collection<Diagnostic> =
|
fun KtFile.collectDiagnosticsForFile(resolveState: FirModuleResolveState): Collection<FirPsiDiagnostic<*>> =
|
||||||
resolveState.collectDiagnosticsForFile(this)
|
resolveState.collectDiagnosticsForFile(this)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
-1
@@ -36,7 +36,7 @@ internal abstract class AbstractFirIdeDiagnosticsCollector(
|
|||||||
registerAllComponents()
|
registerAllComponents()
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract fun onDiagnostic(diagnostic: Diagnostic)
|
protected abstract fun onDiagnostic(diagnostic: FirPsiDiagnostic<*>)
|
||||||
|
|
||||||
|
|
||||||
private inner class Reporter : DiagnosticReporter() {
|
private inner class Reporter : DiagnosticReporter() {
|
||||||
|
|||||||
+3
-2
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics
|
package org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics
|
||||||
|
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
|
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.file.structure.FileStructureCache
|
import org.jetbrains.kotlin.idea.fir.low.level.api.file.structure.FileStructureCache
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
@@ -15,13 +16,13 @@ internal class DiagnosticsCollector(
|
|||||||
private val fileStructureCache: FileStructureCache,
|
private val fileStructureCache: FileStructureCache,
|
||||||
private val cache: ModuleFileCache,
|
private val cache: ModuleFileCache,
|
||||||
) {
|
) {
|
||||||
fun getDiagnosticsFor(element: KtElement): List<Diagnostic> =
|
fun getDiagnosticsFor(element: KtElement): List<FirPsiDiagnostic<*>> =
|
||||||
fileStructureCache
|
fileStructureCache
|
||||||
.getFileStructure(element.containingKtFile, cache)
|
.getFileStructure(element.containingKtFile, cache)
|
||||||
.getStructureElementFor(element)
|
.getStructureElementFor(element)
|
||||||
.diagnostics.diagnosticsFor(element)
|
.diagnostics.diagnosticsFor(element)
|
||||||
|
|
||||||
fun collectDiagnosticsForFile(ktFile: KtFile): Collection<Diagnostic> =
|
fun collectDiagnosticsForFile(ktFile: KtFile): Collection<FirPsiDiagnostic<*>> =
|
||||||
fileStructureCache
|
fileStructureCache
|
||||||
.getFileStructure(ktFile, cache)
|
.getFileStructure(ktFile, cache)
|
||||||
.getAllDiagnosticsForFile()
|
.getAllDiagnosticsForFile()
|
||||||
|
|||||||
+4
-3
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
|
|
||||||
internal class FirIdeFileDiagnosticsCollector private constructor(
|
internal class FirIdeFileDiagnosticsCollector private constructor(
|
||||||
@@ -14,14 +15,14 @@ internal class FirIdeFileDiagnosticsCollector private constructor(
|
|||||||
) : AbstractFirIdeDiagnosticsCollector(
|
) : AbstractFirIdeDiagnosticsCollector(
|
||||||
session,
|
session,
|
||||||
) {
|
) {
|
||||||
private val result = mutableListOf<Diagnostic>()
|
private val result = mutableListOf<FirPsiDiagnostic<*>>()
|
||||||
|
|
||||||
override fun onDiagnostic(diagnostic: Diagnostic) {
|
override fun onDiagnostic(diagnostic: FirPsiDiagnostic<*>) {
|
||||||
result += diagnostic
|
result += diagnostic
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun collectForFile(firFile: FirFile): List<Diagnostic> =
|
fun collectForFile(firFile: FirFile): List<FirPsiDiagnostic<*>> =
|
||||||
FirIdeFileDiagnosticsCollector(firFile.session).let { collector ->
|
FirIdeFileDiagnosticsCollector(firFile.session).let { collector ->
|
||||||
collector.collectDiagnostics(firFile)
|
collector.collectDiagnostics(firFile)
|
||||||
collector.result
|
collector.result
|
||||||
|
|||||||
+3
-2
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics
|
|||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.analysis.collectors.DiagnosticCollectorDeclarationAction
|
import org.jetbrains.kotlin.fir.analysis.collectors.DiagnosticCollectorDeclarationAction
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
import org.jetbrains.kotlin.fir.psi
|
import org.jetbrains.kotlin.fir.psi
|
||||||
@@ -23,9 +24,9 @@ internal class FirIdeStructureElementDiagnosticsCollector private constructor(
|
|||||||
) : AbstractFirIdeDiagnosticsCollector(
|
) : AbstractFirIdeDiagnosticsCollector(
|
||||||
session,
|
session,
|
||||||
) {
|
) {
|
||||||
private val result = mutableMapOf<KtElement, MutableList<Diagnostic>>()
|
private val result = mutableMapOf<KtElement, MutableList<FirPsiDiagnostic<*>>>()
|
||||||
|
|
||||||
override fun onDiagnostic(diagnostic: Diagnostic) {
|
override fun onDiagnostic(diagnostic: FirPsiDiagnostic<*>) {
|
||||||
(diagnostic.psiElement as? KtElement)?.let { ktElement ->
|
(diagnostic.psiElement as? KtElement)?.let { ktElement ->
|
||||||
result.addValueFor(ktElement, diagnostic)
|
result.addValueFor(ktElement, diagnostic)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.idea.fir.low.level.api.file.structure
|
package org.jetbrains.kotlin.idea.fir.low.level.api.file.structure
|
||||||
|
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerDataContextCollector
|
import org.jetbrains.kotlin.idea.fir.low.level.api.element.builder.FirTowerDataContextCollector
|
||||||
@@ -56,7 +57,7 @@ internal class FileStructure(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalStdlibApi::class)
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
fun getAllDiagnosticsForFile(): Collection<Diagnostic> {
|
fun getAllDiagnosticsForFile(): Collection<FirPsiDiagnostic<*>> {
|
||||||
val containersForStructureElement = buildList {
|
val containersForStructureElement = buildList {
|
||||||
add(ktFile)
|
add(ktFile)
|
||||||
addAll(ktFile.declarations)
|
addAll(ktFile.declarations)
|
||||||
|
|||||||
+5
-3
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.file.structure
|
|||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.analysis.collectors.DiagnosticCollectorDeclarationAction
|
import org.jetbrains.kotlin.fir.analysis.collectors.DiagnosticCollectorDeclarationAction
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.containingClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.psi
|
import org.jetbrains.kotlin.fir.psi
|
||||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||||
@@ -23,11 +25,11 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.util.ktDeclaration
|
|||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
|
||||||
internal class FileStructureElementDiagnostics(
|
internal class FileStructureElementDiagnostics(
|
||||||
private val map: Map<KtElement, List<Diagnostic>>
|
private val map: Map<KtElement, List<FirPsiDiagnostic<*>>>
|
||||||
) {
|
) {
|
||||||
fun diagnosticsFor(element: KtElement): List<Diagnostic> = map[element] ?: emptyList()
|
fun diagnosticsFor(element: KtElement): List<FirPsiDiagnostic<*>> = map[element] ?: emptyList()
|
||||||
|
|
||||||
inline fun forEach(action: (List<Diagnostic>) -> Unit) = map.values.forEach(action)
|
inline fun forEach(action: (List<FirPsiDiagnostic<*>>) -> Unit) = map.values.forEach(action)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal sealed class FileStructureElement {
|
internal sealed class FileStructureElement {
|
||||||
|
|||||||
+1
-1
@@ -40,7 +40,7 @@ private constructor(
|
|||||||
|
|
||||||
override val smartCastProvider: KtSmartCastProvider = KtFirSmartcastProvider(this, token)
|
override val smartCastProvider: KtSmartCastProvider = KtFirSmartcastProvider(this, token)
|
||||||
override val expressionTypeProvider: KtExpressionTypeProvider = KtFirExpressionTypeProvider(this, token)
|
override val expressionTypeProvider: KtExpressionTypeProvider = KtFirExpressionTypeProvider(this, token)
|
||||||
override val diagnosticProvider: KtDiagnosticProvider = KtFirDiagnosticProvider(this, token)
|
public override val diagnosticProvider: KtDiagnosticProvider = KtFirDiagnosticProvider(this, token)
|
||||||
override val containingDeclarationProvider = KtFirSymbolContainingDeclarationProvider(this, token)
|
override val containingDeclarationProvider = KtFirSymbolContainingDeclarationProvider(this, token)
|
||||||
override val callResolver: KtCallResolver = KtFirCallResolver(this, token)
|
override val callResolver: KtCallResolver = KtFirCallResolver(this, token)
|
||||||
override val scopeProvider by threadLocal { KtFirScopeProvider(this, firSymbolBuilder, project, firResolveState, token) }
|
override val scopeProvider by threadLocal { KtFirScopeProvider(this, firSymbolBuilder, project, firResolveState, token) }
|
||||||
|
|||||||
+10
@@ -5,8 +5,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.frontend.api.fir.components
|
package org.jetbrains.kotlin.idea.frontend.api.fir.components
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||||
import org.jetbrains.kotlin.fir.types.ConeTypeCheckerContext
|
import org.jetbrains.kotlin.fir.types.ConeTypeCheckerContext
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnostic
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
|
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
|
||||||
|
|
||||||
internal interface KtFirAnalysisSessionComponent {
|
internal interface KtFirAnalysisSessionComponent {
|
||||||
@@ -16,6 +20,12 @@ internal interface KtFirAnalysisSessionComponent {
|
|||||||
val firResolveState get() = analysisSession.firResolveState
|
val firResolveState get() = analysisSession.firResolveState
|
||||||
fun ConeKotlinType.asKtType() = analysisSession.firSymbolBuilder.buildKtType(this)
|
fun ConeKotlinType.asKtType() = analysisSession.firSymbolBuilder.buildKtType(this)
|
||||||
|
|
||||||
|
fun FirPsiDiagnostic<*>.asKtDiagnostic(): KtDiagnostic =
|
||||||
|
(analysisSession.diagnosticProvider as KtFirDiagnosticProvider).firDiagnosticAsKtDiagnostic(this)
|
||||||
|
|
||||||
|
fun ConeDiagnostic.asKtDiagnostic(source: FirSourceElement): KtDiagnostic? =
|
||||||
|
(analysisSession.diagnosticProvider as KtFirDiagnosticProvider).coneDiagnosticAsKtDiagnostic(this, source)
|
||||||
|
|
||||||
fun createTypeCheckerContext() = ConeTypeCheckerContext(
|
fun createTypeCheckerContext() = ConeTypeCheckerContext(
|
||||||
isErrorTypeEqualsToAnything = true,
|
isErrorTypeEqualsToAnything = true,
|
||||||
isStubTypeEqualsToAnything = true,
|
isStubTypeEqualsToAnything = true,
|
||||||
|
|||||||
+3
-2
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.idea.frontend.api.fir.components
|
package org.jetbrains.kotlin.idea.frontend.api.fir.components
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.toFirDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression
|
import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression
|
||||||
@@ -112,13 +113,13 @@ internal class KtFirCallResolver(
|
|||||||
private fun FirErrorNamedReference.createErrorCallTarget(): KtErrorCallTarget =
|
private fun FirErrorNamedReference.createErrorCallTarget(): KtErrorCallTarget =
|
||||||
KtErrorCallTarget(
|
KtErrorCallTarget(
|
||||||
getCandidateSymbols().mapNotNull { it.fir.buildSymbol(firSymbolBuilder) as? KtFunctionLikeSymbol },
|
getCandidateSymbols().mapNotNull { it.fir.buildSymbol(firSymbolBuilder) as? KtFunctionLikeSymbol },
|
||||||
KtSimpleDiagnostic(diagnostic.reason)
|
source?.let { diagnostic.asKtDiagnostic(it) } ?: KtSimpleDiagnostic(factoryName = null, diagnostic.reason, emptyList())
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun FirErrorReferenceWithCandidate.createErrorCallTarget(): KtErrorCallTarget =
|
private fun FirErrorReferenceWithCandidate.createErrorCallTarget(): KtErrorCallTarget =
|
||||||
KtErrorCallTarget(
|
KtErrorCallTarget(
|
||||||
getCandidateSymbols().mapNotNull { it.fir.buildSymbol(firSymbolBuilder) as? KtFunctionLikeSymbol },
|
getCandidateSymbols().mapNotNull { it.fir.buildSymbol(firSymbolBuilder) as? KtFunctionLikeSymbol },
|
||||||
KtSimpleDiagnostic(diagnostic.reason)
|
source?.let { diagnostic.asKtDiagnostic(it) } ?: KtSimpleDiagnostic(factoryName = null, diagnostic.reason, emptyList())
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun FirResolvedNamedReference.getKtFunctionOrConstructorSymbol(): KtFunctionLikeSymbol? =
|
private fun FirResolvedNamedReference.getKtFunctionOrConstructorSymbol(): KtFunctionLikeSymbol? =
|
||||||
|
|||||||
+22
-5
@@ -5,13 +5,19 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.frontend.api.fir.components
|
package org.jetbrains.kotlin.idea.frontend.api.fir.components
|
||||||
|
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.toFirDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDiagnosticsForFile
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDiagnosticsForFile
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getDiagnostics
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getDiagnostics
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
|
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.components.KtDiagnosticProvider
|
import org.jetbrains.kotlin.idea.frontend.api.components.KtDiagnosticProvider
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtDiagnostic
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.diagnostics.KtSimpleDiagnostic
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
|
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
|
import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
|
||||||
|
import org.jetbrains.kotlin.idea.highlighter.IdeErrorMessages
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
@@ -19,10 +25,21 @@ internal class KtFirDiagnosticProvider(
|
|||||||
override val analysisSession: KtFirAnalysisSession,
|
override val analysisSession: KtFirAnalysisSession,
|
||||||
override val token: ValidityToken,
|
override val token: ValidityToken,
|
||||||
) : KtDiagnosticProvider(), KtFirAnalysisSessionComponent {
|
) : KtDiagnosticProvider(), KtFirAnalysisSessionComponent {
|
||||||
override fun getDiagnosticsForElement(element: KtElement): Collection<Diagnostic> = withValidityAssertion {
|
override fun getDiagnosticsForElement(element: KtElement): Collection<KtDiagnostic> = withValidityAssertion {
|
||||||
element.getDiagnostics(firResolveState)
|
element.getDiagnostics(firResolveState).map { it.asKtDiagnostic() }
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun collectDiagnosticsForFile(ktFile: KtFile): Collection<Diagnostic> =
|
override fun collectDiagnosticsForFile(ktFile: KtFile): Collection<KtDiagnostic> =
|
||||||
ktFile.collectDiagnosticsForFile(firResolveState)
|
ktFile.collectDiagnosticsForFile(firResolveState).map { it.asKtDiagnostic() }
|
||||||
|
|
||||||
|
fun firDiagnosticAsKtDiagnostic(diagnostic: FirPsiDiagnostic<*>): KtDiagnostic {
|
||||||
|
val message = IdeErrorMessages.render(diagnostic)
|
||||||
|
return KtSimpleDiagnostic(diagnostic.factory.name, message, diagnostic.textRanges)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun coneDiagnosticAsKtDiagnostic(coneDiagnostic: ConeDiagnostic, source: FirSourceElement): KtDiagnostic? {
|
||||||
|
val firDiagnostic = coneDiagnostic.toFirDiagnostic(source) ?: return null
|
||||||
|
check(firDiagnostic is FirPsiDiagnostic<*>)
|
||||||
|
return firDiagnosticAsKtDiagnostic(firDiagnostic)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user