[FIR] Add bridge for diagnostics from old FE to ConeDiagnostic
This commit is contained in:
+25
-8
@@ -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)
|
||||
}
|
||||
|
||||
-20
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -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
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -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")) }
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user