[FIR] Add bridge for diagnostics from old FE to ConeDiagnostic

This commit is contained in:
Dmitriy Novozhilov
2019-10-29 12:02:43 +03:00
parent 9b77dec99c
commit 8b900624d3
5 changed files with 32 additions and 33 deletions
@@ -5,15 +5,32 @@
package org.jetbrains.kotlin.fir.resolve.diagnostics
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.diagnostics.*
import org.jetbrains.kotlin.fir.FirSourceElement
class ConeDiagnosticFactory {
lateinit var name: String
fun on(source: FirSourceElement): ConeDiagnostic = ConeDiagnostic(this, source)
}
import org.jetbrains.kotlin.fir.psi
class ConeDiagnostic(
val factory: ConeDiagnosticFactory,
val diagnostic: Diagnostic,
val source: FirSourceElement
)
)
inline fun <reified E : PsiElement> DiagnosticFactory0<E>.on(source: FirSourceElement): ConeDiagnostic? {
val psi = source.psi as? E ?: return null
return ConeDiagnostic(this.on(psi), source)
}
inline fun <reified E : PsiElement, A> DiagnosticFactory1<E, A>.on(source: FirSourceElement, a: A): ConeDiagnostic? {
val psi = source.psi as? E ?: return null
return ConeDiagnostic(this.on(psi, a), source)
}
inline fun <reified E : PsiElement, A, B> DiagnosticFactory2<E, A, B>.on(source: FirSourceElement, a: A, b: B): ConeDiagnostic? {
val psi = source.psi as? E ?: return null
return ConeDiagnostic(this.on(psi, a, b), source)
}
inline fun <reified E : PsiElement, A, B, C> DiagnosticFactory3<E, A, B, C>.on(source: FirSourceElement, a: A, b: B, c: C): ConeDiagnostic? {
val psi = source.psi as? E ?: return null
return ConeDiagnostic(this.on(psi, a, b, c), source)
}
@@ -1,20 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.resolve.diagnostics
import kotlin.reflect.KProperty
object ConeDiagnostics {
val INFIX_MODIFIER_REQUIRED = ConeDiagnosticFactory()
val INAPPLICABLE_INFIX_MODIFIER = ConeDiagnosticFactory()
init {
ConeDiagnostics::class.members.filterIsInstance<KProperty<*>>().forEach { property ->
val factory = property.getter.call(this) as? ConeDiagnosticFactory
factory?.name = property.name
}
}
}
@@ -6,13 +6,14 @@
package org.jetbrains.kotlin.fir.resolve.diagnostics
abstract class DiagnosticReporter {
abstract fun report(diagnostic: ConeDiagnostic)
abstract fun report(diagnostic: ConeDiagnostic?)
}
class SimpleDiagnosticReporter : DiagnosticReporter() {
val diagnostics: MutableList<ConeDiagnostic> = mutableListOf()
override fun report(diagnostic: ConeDiagnostic) {
override fun report(diagnostic: ConeDiagnostic?) {
if (diagnostic == null) return
diagnostics += diagnostic
}
}
@@ -5,11 +5,12 @@
package org.jetbrains.kotlin.fir.resolve.diagnostics.checkers.declaration
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.isInfix
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDiagnostics
import org.jetbrains.kotlin.fir.resolve.diagnostics.on
import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter
object FirInfixFunctionDeclarationChecker : FirDeclarationChecker<FirMemberDeclaration>() {
@@ -26,6 +27,6 @@ object FirInfixFunctionDeclarationChecker : FirDeclarationChecker<FirMemberDecla
}
private fun DiagnosticReporter.report(source: FirSourceElement?) {
source?.let { report(ConeDiagnostics.INAPPLICABLE_INFIX_MODIFIER.on(it)) }
source?.let { report(Errors.INAPPLICABLE_INFIX_MODIFIER.on(it, "Inapplicable infix modifier")) }
}
}
@@ -37,7 +37,7 @@ abstract class AbstractFirResolveWithDiagnosticsTestCase : AbstractFirResolveTes
val actual = diagnostics.joinToString("\n\n") {
val text = (it.source as FirPsiSourceElement).psi.text
"<${it.factory.name}>: $text"
"<${it.diagnostic.factory.name}>: $text"
}
KotlinTestUtils.assertEqualsToFile(expectedFile, actual)
}