Fix default positioning strategy handling

that causes flaky tests because the default positioning strategy
was dependent on the order of the reported messages.
The code led to it was introduced in an attempt to extract common
PSI-independent strategy because PSI is leaking into the abstract
diagnostic infrastructure. The approach is definitely problematic,
but to fix it now, the leaking dependency to the psi-based module
is introduced. This should be fixed in the future by introducing
better abstractions.
Fixes flaky tests touched in the commit.
#KT-63002 fixed
This commit is contained in:
Ilya Chernikov
2023-11-06 11:51:07 +01:00
committed by Space Team
parent 0de04f934e
commit 1ad4f19181
10 changed files with 24 additions and 51 deletions
@@ -12,6 +12,7 @@ dependencies {
api(project(":compiler:fir:tree"))
implementation(kotlinxCollectionsImmutable())
implementation(project(":compiler:frontend.common-psi"))
implementation(project(":compiler:psi"))
compileOnly(intellijCore())
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 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.
*/
@@ -13,96 +13,96 @@ import kotlin.reflect.KClass
import kotlin.reflect.KProperty
inline fun <reified P : PsiElement> warning0(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory0DelegateProvider {
return DiagnosticFactory0DelegateProvider(Severity.WARNING, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement, A> warning1(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory1DelegateProvider<A> {
return DiagnosticFactory1DelegateProvider(Severity.WARNING, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement, A, B> warning2(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory2DelegateProvider<A, B> {
return DiagnosticFactory2DelegateProvider(Severity.WARNING, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement, A, B, C> warning3(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory3DelegateProvider<A, B, C> {
return DiagnosticFactory3DelegateProvider(Severity.WARNING, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement, A, B, C, D> warning4(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory4DelegateProvider<A, B, C, D> {
return DiagnosticFactory4DelegateProvider(Severity.WARNING, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement> error0(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory0DelegateProvider {
return DiagnosticFactory0DelegateProvider(Severity.ERROR, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement, A> error1(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory1DelegateProvider<A> {
return DiagnosticFactory1DelegateProvider(Severity.ERROR, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement, A, B> error2(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory2DelegateProvider<A, B> {
return DiagnosticFactory2DelegateProvider(Severity.ERROR, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement, A, B, C> error3(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory3DelegateProvider<A, B, C> {
return DiagnosticFactory3DelegateProvider(Severity.ERROR, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement, A, B, C, D> error4(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory4DelegateProvider<A, B, C, D> {
return DiagnosticFactory4DelegateProvider(Severity.ERROR, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement> deprecationError0(
featureForError: LanguageFeature,
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DeprecationDiagnosticFactory0DelegateProvider {
return DeprecationDiagnosticFactory0DelegateProvider(featureForError, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement, A> deprecationError1(
featureForError: LanguageFeature,
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DeprecationDiagnosticFactory1DelegateProvider<A> {
return DeprecationDiagnosticFactory1DelegateProvider(featureForError, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement, A, B> deprecationError2(
featureForError: LanguageFeature,
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DeprecationDiagnosticFactory2DelegateProvider<A, B> {
return DeprecationDiagnosticFactory2DelegateProvider(featureForError, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement, A, B, C> deprecationError3(
featureForError: LanguageFeature,
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DeprecationDiagnosticFactory3DelegateProvider<A, B, C> {
return DeprecationDiagnosticFactory3DelegateProvider(featureForError, positioningStrategy, P::class)
}
inline fun <reified P : PsiElement, A, B, C, D> deprecationError4(
featureForError: LanguageFeature,
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT
positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DeprecationDiagnosticFactory4DelegateProvider<A, B, C, D> {
return DeprecationDiagnosticFactory4DelegateProvider(featureForError, positioningStrategy, P::class)
}
@@ -9,9 +9,7 @@ object SourceElementPositioningStrategies {
val DEFAULT = SourceElementPositioningStrategy(
LightTreePositioningStrategies.DEFAULT,
PositioningStrategies.DEFAULT
).also {
AbstractSourceElementPositioningStrategy.setDefault(it)
}
)
val VAL_OR_VAR_NODE = SourceElementPositioningStrategy(
LightTreePositioningStrategies.VAL_OR_VAR_NODE,
@@ -12,15 +12,4 @@ abstract class AbstractSourceElementPositioningStrategy {
abstract fun markDiagnostic(diagnostic: KtDiagnostic): List<TextRange>
abstract fun isValid(element: AbstractKtSourceElement): Boolean
companion object {
@JvmStatic
fun setDefault(default: AbstractSourceElementPositioningStrategy) {
DEFAULT = default
}
var DEFAULT: AbstractSourceElementPositioningStrategy = OffsetsOnlyPositioningStrategy()
private set
}
}
}
@@ -1,11 +0,0 @@
// ISSUE: KT-62447, KT-62628
// FIR_DUMP
fun main() {
val x: <!SYNTAX, WRONG_ANNOTATION_TARGET!>@SinceKotlin("2.0")<!><!SYNTAX!><!>
}
@Target(AnnotationTarget.TYPE)
annotation class Anno
val prop: @Anno <!UNRESOLVED_REFERENCE!>Foo<!>? = null
@@ -1,4 +1,4 @@
FILE: AnnotatedErrorTypeRef.fir.kt
FILE: AnnotatedErrorTypeRef.kt
public final fun main(): R|kotlin/Unit| {
lval x: @R|kotlin/SinceKotlin|(version = String(2.0)) <ERROR TYPE REF: Incomplete code>
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// ISSUE: KT-62447, KT-62628
// FIR_DUMP
@@ -1,6 +0,0 @@
// DIAGNOSTICS: -DEBUG_INFO_MISSING_UNRESOLVED
interface I
fun <E> foo() where E: I {}
fun <E> fooE1() where <!SYNTAX!><!>: I {}
fun <E> fooE2() where E: <!SYNTAX, SYNTAX!><!>{}
fun <E> fooE3() where <!SYNTAX!><!>{}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// DIAGNOSTICS: -DEBUG_INFO_MISSING_UNRESOLVED
interface I
fun <E> foo() where E: I {}
@@ -449,7 +449,7 @@ private class DebugDiagnosticConsumer(
val factory = KtDiagnosticFactory0(
name = debugFactory.name,
severity = debugFactory.severity,
defaultPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT,
defaultPositioningStrategy = SourceElementPositioningStrategies.DEFAULT,
psiType = PsiElement::class
)
@@ -490,7 +490,7 @@ private class DebugDiagnosticConsumer(
val factory = KtDiagnosticFactory1<String>(
name = debugFactory.name,
severity = debugFactory.severity,
defaultPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT,
defaultPositioningStrategy = SourceElementPositioningStrategies.DEFAULT,
psiType = PsiElement::class
)