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")) api(project(":compiler:fir:tree"))
implementation(kotlinxCollectionsImmutable()) implementation(kotlinxCollectionsImmutable())
implementation(project(":compiler:frontend.common-psi"))
implementation(project(":compiler:psi")) implementation(project(":compiler:psi"))
compileOnly(intellijCore()) 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. * 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 import kotlin.reflect.KProperty
inline fun <reified P : PsiElement> warning0( inline fun <reified P : PsiElement> warning0(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory0DelegateProvider { ): DiagnosticFactory0DelegateProvider {
return DiagnosticFactory0DelegateProvider(Severity.WARNING, positioningStrategy, P::class) return DiagnosticFactory0DelegateProvider(Severity.WARNING, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement, A> warning1( inline fun <reified P : PsiElement, A> warning1(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory1DelegateProvider<A> { ): DiagnosticFactory1DelegateProvider<A> {
return DiagnosticFactory1DelegateProvider(Severity.WARNING, positioningStrategy, P::class) return DiagnosticFactory1DelegateProvider(Severity.WARNING, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement, A, B> warning2( inline fun <reified P : PsiElement, A, B> warning2(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory2DelegateProvider<A, B> { ): DiagnosticFactory2DelegateProvider<A, B> {
return DiagnosticFactory2DelegateProvider(Severity.WARNING, positioningStrategy, P::class) return DiagnosticFactory2DelegateProvider(Severity.WARNING, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement, A, B, C> warning3( inline fun <reified P : PsiElement, A, B, C> warning3(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory3DelegateProvider<A, B, C> { ): DiagnosticFactory3DelegateProvider<A, B, C> {
return DiagnosticFactory3DelegateProvider(Severity.WARNING, positioningStrategy, P::class) return DiagnosticFactory3DelegateProvider(Severity.WARNING, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement, A, B, C, D> warning4( inline fun <reified P : PsiElement, A, B, C, D> warning4(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory4DelegateProvider<A, B, C, D> { ): DiagnosticFactory4DelegateProvider<A, B, C, D> {
return DiagnosticFactory4DelegateProvider(Severity.WARNING, positioningStrategy, P::class) return DiagnosticFactory4DelegateProvider(Severity.WARNING, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement> error0( inline fun <reified P : PsiElement> error0(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory0DelegateProvider { ): DiagnosticFactory0DelegateProvider {
return DiagnosticFactory0DelegateProvider(Severity.ERROR, positioningStrategy, P::class) return DiagnosticFactory0DelegateProvider(Severity.ERROR, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement, A> error1( inline fun <reified P : PsiElement, A> error1(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory1DelegateProvider<A> { ): DiagnosticFactory1DelegateProvider<A> {
return DiagnosticFactory1DelegateProvider(Severity.ERROR, positioningStrategy, P::class) return DiagnosticFactory1DelegateProvider(Severity.ERROR, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement, A, B> error2( inline fun <reified P : PsiElement, A, B> error2(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory2DelegateProvider<A, B> { ): DiagnosticFactory2DelegateProvider<A, B> {
return DiagnosticFactory2DelegateProvider(Severity.ERROR, positioningStrategy, P::class) return DiagnosticFactory2DelegateProvider(Severity.ERROR, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement, A, B, C> error3( inline fun <reified P : PsiElement, A, B, C> error3(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory3DelegateProvider<A, B, C> { ): DiagnosticFactory3DelegateProvider<A, B, C> {
return DiagnosticFactory3DelegateProvider(Severity.ERROR, positioningStrategy, P::class) return DiagnosticFactory3DelegateProvider(Severity.ERROR, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement, A, B, C, D> error4( inline fun <reified P : PsiElement, A, B, C, D> error4(
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DiagnosticFactory4DelegateProvider<A, B, C, D> { ): DiagnosticFactory4DelegateProvider<A, B, C, D> {
return DiagnosticFactory4DelegateProvider(Severity.ERROR, positioningStrategy, P::class) return DiagnosticFactory4DelegateProvider(Severity.ERROR, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement> deprecationError0( inline fun <reified P : PsiElement> deprecationError0(
featureForError: LanguageFeature, featureForError: LanguageFeature,
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DeprecationDiagnosticFactory0DelegateProvider { ): DeprecationDiagnosticFactory0DelegateProvider {
return DeprecationDiagnosticFactory0DelegateProvider(featureForError, positioningStrategy, P::class) return DeprecationDiagnosticFactory0DelegateProvider(featureForError, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement, A> deprecationError1( inline fun <reified P : PsiElement, A> deprecationError1(
featureForError: LanguageFeature, featureForError: LanguageFeature,
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DeprecationDiagnosticFactory1DelegateProvider<A> { ): DeprecationDiagnosticFactory1DelegateProvider<A> {
return DeprecationDiagnosticFactory1DelegateProvider(featureForError, positioningStrategy, P::class) return DeprecationDiagnosticFactory1DelegateProvider(featureForError, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement, A, B> deprecationError2( inline fun <reified P : PsiElement, A, B> deprecationError2(
featureForError: LanguageFeature, featureForError: LanguageFeature,
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DeprecationDiagnosticFactory2DelegateProvider<A, B> { ): DeprecationDiagnosticFactory2DelegateProvider<A, B> {
return DeprecationDiagnosticFactory2DelegateProvider(featureForError, positioningStrategy, P::class) return DeprecationDiagnosticFactory2DelegateProvider(featureForError, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement, A, B, C> deprecationError3( inline fun <reified P : PsiElement, A, B, C> deprecationError3(
featureForError: LanguageFeature, featureForError: LanguageFeature,
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DeprecationDiagnosticFactory3DelegateProvider<A, B, C> { ): DeprecationDiagnosticFactory3DelegateProvider<A, B, C> {
return DeprecationDiagnosticFactory3DelegateProvider(featureForError, positioningStrategy, P::class) return DeprecationDiagnosticFactory3DelegateProvider(featureForError, positioningStrategy, P::class)
} }
inline fun <reified P : PsiElement, A, B, C, D> deprecationError4( inline fun <reified P : PsiElement, A, B, C, D> deprecationError4(
featureForError: LanguageFeature, featureForError: LanguageFeature,
positioningStrategy: AbstractSourceElementPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT positioningStrategy: AbstractSourceElementPositioningStrategy = SourceElementPositioningStrategies.DEFAULT
): DeprecationDiagnosticFactory4DelegateProvider<A, B, C, D> { ): DeprecationDiagnosticFactory4DelegateProvider<A, B, C, D> {
return DeprecationDiagnosticFactory4DelegateProvider(featureForError, positioningStrategy, P::class) return DeprecationDiagnosticFactory4DelegateProvider(featureForError, positioningStrategy, P::class)
} }
@@ -9,9 +9,7 @@ object SourceElementPositioningStrategies {
val DEFAULT = SourceElementPositioningStrategy( val DEFAULT = SourceElementPositioningStrategy(
LightTreePositioningStrategies.DEFAULT, LightTreePositioningStrategies.DEFAULT,
PositioningStrategies.DEFAULT PositioningStrategies.DEFAULT
).also { )
AbstractSourceElementPositioningStrategy.setDefault(it)
}
val VAL_OR_VAR_NODE = SourceElementPositioningStrategy( val VAL_OR_VAR_NODE = SourceElementPositioningStrategy(
LightTreePositioningStrategies.VAL_OR_VAR_NODE, LightTreePositioningStrategies.VAL_OR_VAR_NODE,
@@ -12,15 +12,4 @@ abstract class AbstractSourceElementPositioningStrategy {
abstract fun markDiagnostic(diagnostic: KtDiagnostic): List<TextRange> abstract fun markDiagnostic(diagnostic: KtDiagnostic): List<TextRange>
abstract fun isValid(element: AbstractKtSourceElement): Boolean 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| { public final fun main(): R|kotlin/Unit| {
lval x: @R|kotlin/SinceKotlin|(version = String(2.0)) <ERROR TYPE REF: Incomplete code> 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 // ISSUE: KT-62447, KT-62628
// FIR_DUMP // 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 // DIAGNOSTICS: -DEBUG_INFO_MISSING_UNRESOLVED
interface I interface I
fun <E> foo() where E: I {} fun <E> foo() where E: I {}
@@ -449,7 +449,7 @@ private class DebugDiagnosticConsumer(
val factory = KtDiagnosticFactory0( val factory = KtDiagnosticFactory0(
name = debugFactory.name, name = debugFactory.name,
severity = debugFactory.severity, severity = debugFactory.severity,
defaultPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT, defaultPositioningStrategy = SourceElementPositioningStrategies.DEFAULT,
psiType = PsiElement::class psiType = PsiElement::class
) )
@@ -490,7 +490,7 @@ private class DebugDiagnosticConsumer(
val factory = KtDiagnosticFactory1<String>( val factory = KtDiagnosticFactory1<String>(
name = debugFactory.name, name = debugFactory.name,
severity = debugFactory.severity, severity = debugFactory.severity,
defaultPositioningStrategy = AbstractSourceElementPositioningStrategy.DEFAULT, defaultPositioningStrategy = SourceElementPositioningStrategies.DEFAULT,
psiType = PsiElement::class psiType = PsiElement::class
) )