diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/DiagnosticReporter.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/DiagnosticReporter.kt index b9ae5e81991..9c11c5b0ec3 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/DiagnosticReporter.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/DiagnosticReporter.kt @@ -20,9 +20,10 @@ abstract class DiagnosticReporter { fun
DiagnosticReporter.reportOn( source: FirSourceElement?, factory: FirDiagnosticFactory0
, - context: CheckerContext + context: CheckerContext, + positioningStrategy: SourceElementPositioningStrategy
? = null ) { - source?.let { report(factory.on(it), context) } + source?.let { report(factory.on(it, positioningStrategy), context) } } @OptIn(InternalDiagnosticFactoryMethod::class) @@ -30,9 +31,10 @@ fun
DiagnosticReporter.reportOn( source: FirSourceElement?, factory: FirDiagnosticFactory1
, a: A, - context: CheckerContext + context: CheckerContext, + positioningStrategy: SourceElementPositioningStrategy
? = null ) { - source?.let { report(factory.on(it, a), context) } + source?.let { report(factory.on(it, a, positioningStrategy), context) } } @OptIn(InternalDiagnosticFactoryMethod::class) @@ -41,9 +43,10 @@ fun
DiagnosticReporter.reportOn( factory: FirDiagnosticFactory2
, a: A, b: B, - context: CheckerContext + context: CheckerContext, + positioningStrategy: SourceElementPositioningStrategy
? = null ) { - source?.let { report(factory.on(it, a, b), context) } + source?.let { report(factory.on(it, a, b, positioningStrategy), context) } } @OptIn(InternalDiagnosticFactoryMethod::class) @@ -53,9 +56,10 @@ fun
DiagnosticReporter.reportOn( a: A, b: B, c: C, - context: CheckerContext + context: CheckerContext, + positioningStrategy: SourceElementPositioningStrategy
? = null ) { - source?.let { report(factory.on(it, a, b, c), context) } + source?.let { report(factory.on(it, a, b, c, positioningStrategy), context) } } @OptIn(InternalDiagnosticFactoryMethod::class) @@ -66,9 +70,10 @@ fun
DiagnosticReporter.repo b: B, c: C, d: D, - context: CheckerContext + context: CheckerContext, + positioningStrategy: SourceElementPositioningStrategy
? = null ) { - source?.let { report(factory.on(it, a, b, c, d), context) } + source?.let { report(factory.on(it, a, b, c, d, positioningStrategy), context) } } inline fun withSuppressedDiagnostics( @@ -94,10 +99,11 @@ inline fun withSuppressedDiagnostics( fun
DiagnosticReporter.reportOnWithSuppression( element: FirElement, factory: FirDiagnosticFactory0
, - context: CheckerContext + context: CheckerContext, + positioningStrategy: SourceElementPositioningStrategy
? = null ) { withSuppressedDiagnostics(element, context) { - reportOn(element.source, factory, it) + reportOn(element.source, factory, it, positioningStrategy) } } @@ -105,10 +111,11 @@ fun
DiagnosticReporter.reportOnWithSuppression( element: FirElement, factory: FirDiagnosticFactory1
, a: A, - context: CheckerContext + context: CheckerContext, + positioningStrategy: SourceElementPositioningStrategy
? = null ) { withSuppressedDiagnostics(element, context) { - reportOn(element.source, factory, a, it) + reportOn(element.source, factory, a, it, positioningStrategy) } } @@ -117,10 +124,11 @@ fun
DiagnosticReporter.reportOnWithSuppressio factory: FirDiagnosticFactory2
, a: A, b: B, - context: CheckerContext + context: CheckerContext, + positioningStrategy: SourceElementPositioningStrategy
? = null ) { withSuppressedDiagnostics(element, context) { - reportOn(element.source, factory, a, b, it) + reportOn(element.source, factory, a, b, it, positioningStrategy) } } @@ -130,10 +138,11 @@ fun
DiagnosticReporter.reportOnWithS a: A, b: B, c: C, - context: CheckerContext + context: CheckerContext, + positioningStrategy: SourceElementPositioningStrategy
? = null ) { withSuppressedDiagnostics(element, context) { - reportOn(element.source, factory, a, b, c, it) + reportOn(element.source, factory, a, b, c, it, positioningStrategy) } } @@ -144,10 +153,11 @@ fun
DiagnosticReporter.repo b: B, c: C, d: D, - context: CheckerContext + context: CheckerContext, + positioningStrategy: SourceElementPositioningStrategy
? = null
) {
withSuppressedDiagnostics(element, context) {
- reportOn(element.source, factory, a, b, c, d, it)
+ reportOn(element.source, factory, a, b, c, d, it, positioningStrategy)
}
}
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnostic.kt
index 728335ae7ec..e0efef3834b 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnostic.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnostic.kt
@@ -21,12 +21,13 @@ sealed class FirDiagnostic : Diagnostic {
data class FirPsiSimpleDiagnostic (
override val element: FirPsiSourceElement ,
override val severity: Severity,
- override val factory: FirDiagnosticFactory0
+ override val factory: FirDiagnosticFactory0 ,
+ override val positioningStrategy: SourceElementPositioningStrategy<*>
) : FirSimpleDiagnostic
data class FirPsiDiagnosticWithParameters1 (
override val element: FirPsiSourceElement ,
override val a: A,
override val severity: Severity,
- override val factory: FirDiagnosticFactory1
+ override val factory: FirDiagnosticFactory1 ,
+ override val positioningStrategy: SourceElementPositioningStrategy<*>
) : FirDiagnosticWithParameters1
data class FirPsiDiagnosticWithParameters2 (
@@ -89,7 +92,8 @@ data class FirPsiDiagnosticWithParameters2 (
override val a: A,
override val b: B,
override val severity: Severity,
- override val factory: FirDiagnosticFactory2
+ override val factory: FirDiagnosticFactory2 ,
+ override val positioningStrategy: SourceElementPositioningStrategy<*>
) : FirDiagnosticWithParameters2
data class FirPsiDiagnosticWithParameters3 (
@@ -98,7 +102,8 @@ data class FirPsiDiagnosticWithParameters3 (
override val b: B,
override val c: C,
override val severity: Severity,
- override val factory: FirDiagnosticFactory3
+ override val factory: FirDiagnosticFactory3 ,
+ override val positioningStrategy: SourceElementPositioningStrategy<*>
) : FirDiagnosticWithParameters3
data class FirPsiDiagnosticWithParameters4 (
@@ -108,7 +113,8 @@ data class FirPsiDiagnosticWithParameters4 (
override val c: C,
override val d: D,
override val severity: Severity,
- override val factory: FirDiagnosticFactory4
+ override val factory: FirDiagnosticFactory4 ,
+ override val positioningStrategy: SourceElementPositioningStrategy<*>
) : FirDiagnosticWithParameters4
// ------------------------------ light tree diagnostics ------------------------------
@@ -120,14 +126,16 @@ interface FirLightDiagnostic : UnboundDiagnostic {
data class FirLightSimpleDiagnostic(
override val element: FirLightSourceElement,
override val severity: Severity,
- override val factory: FirDiagnosticFactory0<*>
+ override val factory: FirDiagnosticFactory0<*>,
+ override val positioningStrategy: SourceElementPositioningStrategy<*>
) : FirSimpleDiagnostic ,
+ val defaultPositioningStrategy: SourceElementPositioningStrategy ,
) : DiagnosticFactory (
name: String,
severity: Severity,
- positioningStrategy: SourceElementPositioningStrategy = SourceElementPositioningStrategy.DEFAULT,
-) : AbstractFirDiagnosticFactory = SourceElementPositioningStrategy.DEFAULT,
+) : AbstractFirDiagnosticFactory ?
+ ): FirSimpleDiagnostic<*> {
return when (element) {
is FirPsiSourceElement<*> -> FirPsiSimpleDiagnostic(
- element as FirPsiSourceElement , severity, this
+ element as FirPsiSourceElement , severity, this, positioningStrategy ?: defaultPositioningStrategy
)
- is FirLightSourceElement -> FirLightSimpleDiagnostic(element, severity, this)
+ is FirLightSourceElement -> FirLightSimpleDiagnostic(element, severity, this, positioningStrategy ?: defaultPositioningStrategy)
else -> incorrectElement(element)
}
}
@@ -62,20 +56,30 @@ class FirDiagnosticFactory0 (
class FirDiagnosticFactory1 (
name: String,
severity: Severity,
- positioningStrategy: SourceElementPositioningStrategy = SourceElementPositioningStrategy.DEFAULT,
-) : AbstractFirDiagnosticFactory = SourceElementPositioningStrategy.DEFAULT,
+) : AbstractFirDiagnosticFactory ?
+ ): FirDiagnosticWithParameters1<*, A> {
return when (element) {
is FirPsiSourceElement<*> -> FirPsiDiagnosticWithParameters1(
- element as FirPsiSourceElement , a, severity, this
+ element as FirPsiSourceElement , a, severity, this, positioningStrategy ?: defaultPositioningStrategy
+ )
+ is FirLightSourceElement -> FirLightDiagnosticWithParameters1(
+ element,
+ a,
+ severity,
+ this,
+ positioningStrategy ?: defaultPositioningStrategy
)
- is FirLightSourceElement -> FirLightDiagnosticWithParameters1(element, a, severity, this)
else -> incorrectElement(element)
}
}
@@ -84,8 +88,8 @@ class FirDiagnosticFactory1 (
class FirDiagnosticFactory2 (
name: String,
severity: Severity,
- positioningStrategy: SourceElementPositioningStrategy = SourceElementPositioningStrategy.DEFAULT,
-) : AbstractFirDiagnosticFactory = SourceElementPositioningStrategy.DEFAULT,
+) : AbstractFirDiagnosticFactory (
)
@InternalDiagnosticFactoryMethod
- fun on(element: FirSourceElement, a: A, b: B): FirDiagnosticWithParameters2<*, A, B> {
+ fun on(
+ element: FirSourceElement,
+ a: A,
+ b: B,
+ positioningStrategy: SourceElementPositioningStrategy ?
+ ): FirDiagnosticWithParameters2<*, A, B> {
return when (element) {
is FirPsiSourceElement<*> -> FirPsiDiagnosticWithParameters2(
- element as FirPsiSourceElement , a, b, severity, this
+ element as FirPsiSourceElement , a, b, severity, this, positioningStrategy ?: defaultPositioningStrategy
+ )
+ is FirLightSourceElement -> FirLightDiagnosticWithParameters2(
+ element,
+ a,
+ b,
+ severity,
+ this,
+ positioningStrategy ?: defaultPositioningStrategy
)
- is FirLightSourceElement -> FirLightDiagnosticWithParameters2(element, a, b, severity, this)
else -> incorrectElement(element)
}
}
@@ -107,8 +123,8 @@ class FirDiagnosticFactory2 (
class FirDiagnosticFactory3 (
name: String,
severity: Severity,
- positioningStrategy: SourceElementPositioningStrategy = SourceElementPositioningStrategy.DEFAULT,
-) : AbstractFirDiagnosticFactory = SourceElementPositioningStrategy.DEFAULT,
+) : AbstractFirDiagnosticFactory (
)
@InternalDiagnosticFactoryMethod
- fun on(element: FirSourceElement, a: A, b: B, c: C): FirDiagnosticWithParameters3<*, A, B, C> {
+ fun on(
+ element: FirSourceElement,
+ a: A,
+ b: B,
+ c: C,
+ positioningStrategy: SourceElementPositioningStrategy ?
+ ): FirDiagnosticWithParameters3<*, A, B, C> {
return when (element) {
is FirPsiSourceElement<*> -> FirPsiDiagnosticWithParameters3(
- element as FirPsiSourceElement , a, b, c, severity, this
+ element as FirPsiSourceElement , a, b, c, severity, this, positioningStrategy ?: defaultPositioningStrategy
+ )
+ is FirLightSourceElement -> FirLightDiagnosticWithParameters3(
+ element,
+ a,
+ b,
+ c,
+ severity,
+ this,
+ positioningStrategy ?: defaultPositioningStrategy
)
- is FirLightSourceElement -> FirLightDiagnosticWithParameters3(element, a, b, c, severity, this)
else -> incorrectElement(element)
}
}
@@ -131,8 +161,8 @@ class FirDiagnosticFactory3 (
class FirDiagnosticFactory4 (
name: String,
severity: Severity,
- positioningStrategy: SourceElementPositioningStrategy = SourceElementPositioningStrategy.DEFAULT,
-) : AbstractFirDiagnosticFactory = SourceElementPositioningStrategy.DEFAULT,
+) : AbstractFirDiagnosticFactory (
)
@InternalDiagnosticFactoryMethod
- fun on(element: FirSourceElement, a: A, b: B, c: C, d: D): FirDiagnosticWithParameters4<*, A, B, C, D> {
+ fun on(
+ element: FirSourceElement,
+ a: A,
+ b: B,
+ c: C,
+ d: D,
+ positioningStrategy: SourceElementPositioningStrategy ?
+ ): FirDiagnosticWithParameters4<*, A, B, C, D> {
return when (element) {
is FirPsiSourceElement<*> -> FirPsiDiagnosticWithParameters4(
- element as FirPsiSourceElement , a, b, c, d, severity, this
+ element as FirPsiSourceElement , a, b, c, d, severity, this, positioningStrategy ?: defaultPositioningStrategy
+ )
+ is FirLightSourceElement -> FirLightDiagnosticWithParameters4(
+ element,
+ a,
+ b,
+ c,
+ d,
+ severity,
+ this,
+ positioningStrategy ?: defaultPositioningStrategy
)
- is FirLightSourceElement -> FirLightDiagnosticWithParameters4(element, a, b, c, d, severity, this)
else -> incorrectElement(element)
}
}
@@ -156,45 +202,3 @@ class FirDiagnosticFactory4 (
private fun incorrectElement(element: FirSourceElement): Nothing {
throw IllegalArgumentException("Unknown element type: ${element::class}")
}
-
-@InternalDiagnosticFactoryMethod
-fun FirDiagnosticFactory0 .on(element: FirSourceElement?): FirSimpleDiagnostic<*>? {
- return element?.let { on(it) }
-}
-
-@InternalDiagnosticFactoryMethod
-fun FirDiagnosticFactory1 .on(
- element: FirSourceElement?, a: A
-): FirDiagnosticWithParameters1<*, A>? {
- return element?.let { on(it, a) }
-}
-
-@InternalDiagnosticFactoryMethod
-fun FirDiagnosticFactory2 .on(
- element: FirSourceElement?,
- a: A,
- b: B
-): FirDiagnosticWithParameters2<*, A, B>? {
- return element?.let { on(it, a, b) }
-}
-
-@InternalDiagnosticFactoryMethod
-fun FirDiagnosticFactory3 .on(
- element: FirSourceElement?,
- a: A,
- b: B,
- c: C
-): FirDiagnosticWithParameters3<*, A, B, C>? {
- return element?.let { on(it, a, b, c) }
-}
-
-@InternalDiagnosticFactoryMethod
-fun FirDiagnosticFactory4 .on(
- element: FirSourceElement?,
- a: A,
- b: B,
- c: C,
- d: D
-): FirDiagnosticWithParameters4<*, A, B, C, D>? {
- return element?.let { on(it, a, b, c, d) }
-}
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt
index b2fff2217db..3662734482c 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.analysis.diagnostics
+import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
import org.jetbrains.kotlin.fir.FirSourceElement
@@ -32,58 +33,58 @@ import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
-@OptIn(InternalDiagnosticFactoryMethod::class)
private fun ConeDiagnostic.toFirDiagnostic(
source: FirSourceElement,
qualifiedAccessSource: FirSourceElement?
): FirDiagnostic FirDiagnosticFactory0 .createOn(
+ element: FirSourceElement?
+): FirSimpleDiagnostic<*>? {
+ return element?.let { on(it, positioningStrategy = null) }
+}
+
+@OptIn(InternalDiagnosticFactoryMethod::class)
+private fun FirDiagnosticFactory1 .createOn(
+ element: FirSourceElement?,
+ a: A
+): FirDiagnosticWithParameters1<*, A>? {
+ return element?.let { on(it, a, positioningStrategy = null) }
+}
+
+@OptIn(InternalDiagnosticFactoryMethod::class)
+private fun FirDiagnosticFactory2 .createOn(
+ element: FirSourceElement?,
+ a: A,
+ b: B
+): FirDiagnosticWithParameters2<*, A, B>? {
+ return element?.let { on(it, a, b, positioningStrategy = null) }
+}
+
+@OptIn(InternalDiagnosticFactoryMethod::class)
+private fun FirDiagnosticFactory3 .createOn(
+ element: FirSourceElement?,
+ a: A,
+ b: B,
+ c: C
+): FirDiagnosticWithParameters3<*, A, B, C>? {
+ return element?.let { on(it, a, b, c, positioningStrategy = null) }
+}
diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticCodeMetaInfo.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticCodeMetaInfo.kt
index edc03a75d02..f5d9680ea6e 100644
--- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticCodeMetaInfo.kt
+++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticCodeMetaInfo.kt
@@ -23,7 +23,7 @@ class FirDiagnosticCodeMetaInfo(
renderConfiguration: FirDiagnosticCodeMetaRenderConfiguration
) : CodeMetaInfo {
private val textRangeFromClassicDiagnostic: TextRange = run {
- diagnostic.factory.positioningStrategy.markDiagnostic(diagnostic).first()
+ diagnostic.factory.defaultPositioningStrategy.markDiagnostic(diagnostic).first()
}
override var renderConfiguration: FirDiagnosticCodeMetaRenderConfiguration = renderConfiguration
diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt
index 46bf950fe93..c8583cdef39 100644
--- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt
+++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/handlers/FirDiagnosticsHandler.kt
@@ -120,11 +120,13 @@ class FirDiagnosticsHandler(testServices: TestServices) : FirAnalysisHandler(tes
) {
val metaInfos = if (firFile.psi != null) {
AnalyzingUtils.getSyntaxErrorRanges(firFile.psi!!).map {
- FirErrors.SYNTAX.on(FirRealPsiSourceElement(it)).toMetaInfo(testFile, lightTreeEnabled, lightTreeComparingModeEnabled)
+ FirErrors.SYNTAX.on(FirRealPsiSourceElement(it), positioningStrategy = null)
+ .toMetaInfo(testFile, lightTreeEnabled, lightTreeComparingModeEnabled)
}
} else {
collectLightTreeSyntaxErrors(firFile).map { sourceElement ->
- FirErrors.SYNTAX.on(sourceElement).toMetaInfo(testFile, lightTreeEnabled, lightTreeComparingModeEnabled)
+ FirErrors.SYNTAX.on(sourceElement, positioningStrategy = null)
+ .toMetaInfo(testFile, lightTreeEnabled, lightTreeComparingModeEnabled)
}
}
@@ -245,8 +247,20 @@ class FirDiagnosticsHandler(testServices: TestServices) : FirAnalysisHandler(tes
val argumentText = argument()
val factory = FirDiagnosticFactory1