[FIR] Switch names of FirDiagnostic and ConeDiagnostic

This commit is contained in:
Dmitriy Novozhilov
2020-03-23 14:11:38 +03:00
parent e6102599ce
commit 1a3fef5fa1
54 changed files with 248 additions and 254 deletions
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.context.PersistentCheckerContext
import org.jetbrains.kotlin.fir.analysis.collectors.components.*
import org.jetbrains.kotlin.fir.analysis.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession
@@ -27,7 +27,7 @@ abstract class AbstractDiagnosticCollector(
override val session: FirSession,
override val scopeSession: ScopeSession = ScopeSession()
) : SessionHolder {
fun collectDiagnostics(firFile: FirFile): Iterable<ConeDiagnostic> {
fun collectDiagnostics(firFile: FirFile): Iterable<FirDiagnostic> {
if (!componentsInitialized) {
throw IllegalStateException("Components are not initialized")
}
@@ -37,7 +37,7 @@ abstract class AbstractDiagnosticCollector(
}
protected abstract fun initializeCollector()
protected abstract fun getCollectedDiagnostics(): Iterable<ConeDiagnostic>
protected abstract fun getCollectedDiagnostics(): Iterable<FirDiagnostic>
abstract fun runCheck(block: (DiagnosticReporter) -> Unit)
private val components: MutableList<AbstractDiagnosticCollectorComponent> = mutableListOf()
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.fir.analysis.collectors
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.SimpleDiagnosticReporter
import java.util.*
@@ -42,10 +42,10 @@ class ParallelDiagnosticsCollector(session: FirSession, private val numberOfThre
futures.clear()
}
override fun getCollectedDiagnostics(): Iterable<ConeDiagnostic> {
override fun getCollectedDiagnostics(): Iterable<FirDiagnostic> {
futures.forEach { it.get() }
return Iterable {
object : Iterator<ConeDiagnostic> {
object : Iterator<FirDiagnostic> {
private val globalIterator = reporters.iterator()
private var localIterator = globalIterator.next().diagnostics.iterator()
@@ -60,7 +60,7 @@ class ParallelDiagnosticsCollector(session: FirSession, private val numberOfThre
return localIterator.hasNext()
}
override fun next(): ConeDiagnostic {
override fun next(): FirDiagnostic {
update()
return localIterator.next()
}
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.fir.analysis.collectors
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.SimpleDiagnosticReporter
@@ -17,7 +17,7 @@ class SimpleDiagnosticsCollector(session: FirSession) : AbstractDiagnosticCollec
reporter = SimpleDiagnosticReporter()
}
override fun getCollectedDiagnostics(): Iterable<ConeDiagnostic> {
override fun getCollectedDiagnostics(): Iterable<FirDiagnostic> {
return reporter.diagnostics
}
@@ -12,10 +12,7 @@ import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollector
import org.jetbrains.kotlin.fir.analysis.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.onSource
import org.jetbrains.kotlin.fir.analysis.diagnostics.*
import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
import org.jetbrains.kotlin.fir.diagnostics.*
import org.jetbrains.kotlin.fir.expressions.FirErrorExpression
@@ -50,25 +47,25 @@ class ErrorNodeDiagnosticCollectorComponent(collector: AbstractDiagnosticCollect
runCheck { reportFirDiagnostic(errorFunction.diagnostic, source, it) }
}
private fun reportFirDiagnostic(diagnostic: FirDiagnostic, source: FirSourceElement, reporter: DiagnosticReporter) {
private fun reportFirDiagnostic(diagnostic: ConeDiagnostic, source: FirSourceElement, reporter: DiagnosticReporter) {
val coneDiagnostic = when (diagnostic) {
is FirUnresolvedReferenceError -> FirErrors.UNRESOLVED_REFERENCE.onSource(source, diagnostic.name?.asString())
is FirUnresolvedSymbolError -> FirErrors.UNRESOLVED_REFERENCE.onSource(source, diagnostic.classId.asString())
is FirUnresolvedNameError -> FirErrors.UNRESOLVED_REFERENCE.onSource(source, diagnostic.name.asString())
is FirInapplicableCandidateError -> FirErrors.INAPPLICABLE_CANDIDATE.onSource(source, diagnostic.candidates.map { it.symbol })
is FirAmbiguityError -> FirErrors.AMBIGUITY.onSource(source, diagnostic.candidates)
is FirOperatorAmbiguityError -> FirErrors.ASSIGN_OPERATOR_AMBIGUITY.onSource(source, diagnostic.candidates)
is FirVariableExpectedError -> Errors.VARIABLE_EXPECTED.onSource(source)
is FirTypeMismatchError -> FirErrors.TYPE_MISMATCH.onSource(source, diagnostic.expectedType, diagnostic.actualType)
is FirSimpleDiagnostic -> diagnostic.getFactory().onSource(source)
is FirDiagnosticWithParameters1<*> -> diagnostic.getFactory().tryOnSource(source, diagnostic.a)
is FirStubDiagnostic -> null
is ConeUnresolvedReferenceError -> FirErrors.UNRESOLVED_REFERENCE.onSource(source, diagnostic.name?.asString())
is ConeUnresolvedSymbolError -> FirErrors.UNRESOLVED_REFERENCE.onSource(source, diagnostic.classId.asString())
is ConeUnresolvedNameError -> FirErrors.UNRESOLVED_REFERENCE.onSource(source, diagnostic.name.asString())
is ConeInapplicableCandidateError -> FirErrors.INAPPLICABLE_CANDIDATE.onSource(source, diagnostic.candidates.map { it.symbol })
is ConeAmbiguityError -> FirErrors.AMBIGUITY.onSource(source, diagnostic.candidates)
is ConeOperatorAmbiguityError -> FirErrors.ASSIGN_OPERATOR_AMBIGUITY.onSource(source, diagnostic.candidates)
is ConeVariableExpectedError -> Errors.VARIABLE_EXPECTED.onSource(source)
is ConeTypeMismatchError -> FirErrors.TYPE_MISMATCH.onSource(source, diagnostic.expectedType, diagnostic.actualType)
is ConeSimpleDiagnostic -> diagnostic.getFactory().onSource(source)
is ConeSimpleDiagnosticWithParameters1<*> -> diagnostic.getFactory().tryOnSource(source, diagnostic.a)
is ConeStubDiagnostic -> null
else -> throw IllegalArgumentException("Unsupported diagnostic type: ${diagnostic.javaClass}")
}
reporter.report(coneDiagnostic)
}
private fun FirSimpleDiagnostic.getFactory(): DiagnosticFactory0<PsiElement> {
private fun ConeSimpleDiagnostic.getFactory(): DiagnosticFactory0<PsiElement> {
@Suppress("UNCHECKED_CAST")
return when (kind) {
DiagnosticKind.Syntax -> FirErrors.SYNTAX_ERROR
@@ -89,19 +86,11 @@ class ErrorNodeDiagnosticCollectorComponent(collector: AbstractDiagnosticCollect
} as DiagnosticFactory0<PsiElement>
}
private fun FirDiagnosticWithParameters1<*>.getFactory(): DiagnosticFactory1<PsiElement, Any?> {
private fun ConeSimpleDiagnosticWithParameters1<*>.getFactory(): DiagnosticFactory1<PsiElement, Any?> {
@Suppress("UNCHECKED_CAST")
return when (kind) {
DiagnosticKind.SuperNotAllowed -> Errors.SUPER_IS_NOT_AN_EXPRESSION
else -> throw IllegalArgumentException("Unsupported diagnostic kind: $kind at $javaClass")
} as DiagnosticFactory1<PsiElement, Any?>
}
private inline fun <reified E : PsiElement, reified A> DiagnosticFactory1<E, A>.tryOnSource(
source: FirSourceElement,
a: Any?
): ConeDiagnostic? {
val aa = a as? A ?: throw IllegalArgumentException("Parameter passed to the factory is of incompatible type!")
return onSource(source, aa)
}
}
@@ -6,13 +6,13 @@
package org.jetbrains.kotlin.fir.analysis.diagnostics
abstract class DiagnosticReporter {
abstract fun report(diagnostic: ConeDiagnostic?)
abstract fun report(diagnostic: FirDiagnostic?)
}
class SimpleDiagnosticReporter : DiagnosticReporter() {
val diagnostics: MutableList<ConeDiagnostic> = mutableListOf()
val diagnostics: MutableList<FirDiagnostic> = mutableListOf()
override fun report(diagnostic: ConeDiagnostic?) {
override fun report(diagnostic: FirDiagnostic?) {
if (diagnostic == null) return
diagnostics += diagnostic
}
@@ -10,31 +10,39 @@ import org.jetbrains.kotlin.diagnostics.*
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.psi
class ConeDiagnostic(
class FirDiagnostic(
val diagnostic: Diagnostic,
val source: FirSourceElement
)
inline fun <reified E : PsiElement> DiagnosticFactory0<E>.onSource(source: FirSourceElement): ConeDiagnostic? {
inline fun <reified E : PsiElement> DiagnosticFactory0<E>.onSource(source: FirSourceElement): FirDiagnostic? {
val psi = source.psi as? E
?: throw IllegalArgumentException("Incompatible PSI: expected ${E::class}, actual ${source.psi?.let { it::class }}")
return ConeDiagnostic(this.on(psi), source)
return FirDiagnostic(this.on(psi), source)
}
inline fun <reified E : PsiElement, A> DiagnosticFactory1<E, A>.onSource(source: FirSourceElement, a: A): ConeDiagnostic? {
inline fun <reified E : PsiElement, A> DiagnosticFactory1<E, A>.onSource(source: FirSourceElement, a: A): FirDiagnostic? {
val psi = source.psi as? E
?: throw IllegalArgumentException("Incompatible PSI: expected ${E::class}, actual ${source.psi?.let { it::class }}")
return ConeDiagnostic(this.on(psi, a), source)
return FirDiagnostic(this.on(psi, a), source)
}
inline fun <reified E : PsiElement, A, B> DiagnosticFactory2<E, A, B>.onSource(source: FirSourceElement, a: A, b: B): ConeDiagnostic? {
inline fun <reified E : PsiElement, A, B> DiagnosticFactory2<E, A, B>.onSource(source: FirSourceElement, a: A, b: B): FirDiagnostic? {
val psi = source.psi as? E
?: throw IllegalArgumentException("Incompatible PSI: expected ${E::class}, actual ${source.psi?.let { it::class }}")
return ConeDiagnostic(this.on(psi, a, b), source)
return FirDiagnostic(this.on(psi, a, b), source)
}
inline fun <reified E : PsiElement, A, B, C> DiagnosticFactory3<E, A, B, C>.onSource(source: FirSourceElement, a: A, b: B, c: C): ConeDiagnostic? {
inline fun <reified E : PsiElement, A, B, C> DiagnosticFactory3<E, A, B, C>.onSource(source: FirSourceElement, a: A, b: B, c: C): FirDiagnostic? {
val psi = source.psi as? E
?: throw IllegalArgumentException("Incompatible PSI: expected ${E::class}, actual ${source.psi?.let { it::class }}")
return ConeDiagnostic(this.on(psi, a, b, c), source)
return FirDiagnostic(this.on(psi, a, b, c), source)
}
inline fun <reified E : PsiElement, reified A> DiagnosticFactory1<E, A>.tryOnSource(
source: FirSourceElement,
a: Any?
): FirDiagnostic? {
val aa = a as? A ?: throw IllegalArgumentException("Parameter passed to the factory is of incompatible type!")
return onSource(source, aa)
}