[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
|
package org.jetbrains.kotlin.fir.resolve.diagnostics
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.diagnostics.*
|
||||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.psi
|
||||||
class ConeDiagnosticFactory {
|
|
||||||
lateinit var name: String
|
|
||||||
|
|
||||||
fun on(source: FirSourceElement): ConeDiagnostic = ConeDiagnostic(this, source)
|
|
||||||
}
|
|
||||||
|
|
||||||
class ConeDiagnostic(
|
class ConeDiagnostic(
|
||||||
val factory: ConeDiagnosticFactory,
|
val diagnostic: Diagnostic,
|
||||||
val source: FirSourceElement
|
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
|
package org.jetbrains.kotlin.fir.resolve.diagnostics
|
||||||
|
|
||||||
abstract class DiagnosticReporter {
|
abstract class DiagnosticReporter {
|
||||||
abstract fun report(diagnostic: ConeDiagnostic)
|
abstract fun report(diagnostic: ConeDiagnostic?)
|
||||||
}
|
}
|
||||||
|
|
||||||
class SimpleDiagnosticReporter : DiagnosticReporter() {
|
class SimpleDiagnosticReporter : DiagnosticReporter() {
|
||||||
val diagnostics: MutableList<ConeDiagnostic> = mutableListOf()
|
val diagnostics: MutableList<ConeDiagnostic> = mutableListOf()
|
||||||
|
|
||||||
override fun report(diagnostic: ConeDiagnostic) {
|
override fun report(diagnostic: ConeDiagnostic?) {
|
||||||
|
if (diagnostic == null) return
|
||||||
diagnostics += diagnostic
|
diagnostics += diagnostic
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+3
-2
@@ -5,11 +5,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.resolve.diagnostics.checkers.declaration
|
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.FirSourceElement
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||||
import org.jetbrains.kotlin.fir.declarations.isInfix
|
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
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.DiagnosticReporter
|
||||||
|
|
||||||
object FirInfixFunctionDeclarationChecker : FirDeclarationChecker<FirMemberDeclaration>() {
|
object FirInfixFunctionDeclarationChecker : FirDeclarationChecker<FirMemberDeclaration>() {
|
||||||
@@ -26,6 +27,6 @@ object FirInfixFunctionDeclarationChecker : FirDeclarationChecker<FirMemberDecla
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun DiagnosticReporter.report(source: FirSourceElement?) {
|
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 actual = diagnostics.joinToString("\n\n") {
|
||||||
val text = (it.source as FirPsiSourceElement).psi.text
|
val text = (it.source as FirPsiSourceElement).psi.text
|
||||||
"<${it.factory.name}>: $text"
|
"<${it.diagnostic.factory.name}>: $text"
|
||||||
}
|
}
|
||||||
KotlinTestUtils.assertEqualsToFile(expectedFile, actual)
|
KotlinTestUtils.assertEqualsToFile(expectedFile, actual)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user