From 2f63c8a46a4fa74dcab0ea2a36171e3cb77f0b96 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 25 Mar 2020 14:43:44 +0300 Subject: [PATCH] [FIR] Enhance diagnostic DSL to be able to use concrete factories Before this commit, things like DiagnosticFactory0 were effectively unusable. --- .../ErrorNodeDiagnosticCollectorComponent.kt | 2 +- .../fir/analysis/diagnostics/FirDiagnostic.kt | 81 ++++++++++--------- .../diagnostics/FirDiagnosticFactory.kt | 42 ++++++---- .../diagnostics/FirDiagnosticFactoryDsl.kt | 64 ++++++++------- .../FirDiagnosticFactoryToRendererMap.kt | 8 +- .../fir/analysis/diagnostics/FirErrors.kt | 46 ++++++----- .../kotlin/fir/builder/RawFirBuilder.kt | 6 +- .../jetbrains/kotlin/fir/FirSourceElement.kt | 10 +-- .../tests/ObjectWithConstructor.fir.kt | 4 +- ...AbstractFirDiagnosticsWithLightTreeTest.kt | 2 +- 10 files changed, 142 insertions(+), 123 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ErrorNodeDiagnosticCollectorComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ErrorNodeDiagnosticCollectorComponent.kt index 1f7a80ee302..db1dfac7911 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ErrorNodeDiagnosticCollectorComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ErrorNodeDiagnosticCollectorComponent.kt @@ -65,7 +65,7 @@ class ErrorNodeDiagnosticCollectorComponent(collector: AbstractDiagnosticCollect reporter.report(coneDiagnostic) } - private fun ConeSimpleDiagnostic.getFactory(): FirDiagnosticFactory0 { + private fun ConeSimpleDiagnostic.getFactory(): FirDiagnosticFactory0 { @Suppress("UNCHECKED_CAST") return when (kind) { DiagnosticKind.Syntax -> FirErrors.SYNTAX_ERROR 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 9debe271925..14051374c77 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 @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.analysis.diagnostics +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.fir.FirLightSourceElement @@ -20,75 +21,75 @@ sealed class FirDiagnostic { } sealed class FirSimpleDiagnostic : FirDiagnostic() { - abstract override val factory: FirDiagnosticFactory0<*> + abstract override val factory: FirDiagnosticFactory0<*, *> } sealed class FirDiagnosticWithParameters1 : FirDiagnostic() { abstract val a: A - abstract override val factory: FirDiagnosticFactory1<*, A> + abstract override val factory: FirDiagnosticFactory1<*, *, A> } sealed class FirDiagnosticWithParameters2 : FirDiagnostic() { abstract val a: A abstract val b: B - abstract override val factory: FirDiagnosticFactory2<*, A, B> + abstract override val factory: FirDiagnosticFactory2<*, *, A, B> } sealed class FirDiagnosticWithParameters3 : FirDiagnostic() { abstract val a: A abstract val b: B abstract val c: C - abstract override val factory: FirDiagnosticFactory3<*, A, B, C> + abstract override val factory: FirDiagnosticFactory3<*, *, A, B, C> } // ------------------------------ psi diagnostics ------------------------------ -interface FirPsiDiagnostic { +interface FirPsiDiagnostic

{ fun asPsiBasedDiagnostic(): Diagnostic - val element: E + val element: FirPsiSourceElement

} -data class FirPsiSimpleDiagnostic( - override val element: E, +data class FirPsiSimpleDiagnostic

( + override val element: FirPsiSourceElement

, override val severity: Severity, - override val factory: FirDiagnosticFactory0<*> -) : FirSimpleDiagnostic(), FirPsiDiagnostic { + override val factory: FirDiagnosticFactory0, P> +) : FirSimpleDiagnostic>(), FirPsiDiagnostic

{ override fun asPsiBasedDiagnostic(): Diagnostic { return factory.psiDiagnosticFactory.on(element.psi) } } -data class FirPsiDiagnosticWithParameters1( - override val element: E, +data class FirPsiDiagnosticWithParameters1

( + override val element: FirPsiSourceElement

, override val a: A, override val severity: Severity, - override val factory: FirDiagnosticFactory1<*, A> -) : FirDiagnosticWithParameters1(), FirPsiDiagnostic { + override val factory: FirDiagnosticFactory1, P, A> +) : FirDiagnosticWithParameters1, A>(), FirPsiDiagnostic

{ override fun asPsiBasedDiagnostic(): Diagnostic { return factory.psiDiagnosticFactory.on(element.psi, a) } } -data class FirPsiDiagnosticWithParameters2( - override val element: E, +data class FirPsiDiagnosticWithParameters2

( + override val element: FirPsiSourceElement

, override val a: A, override val b: B, override val severity: Severity, - override val factory: FirDiagnosticFactory2<*, A, B> -) : FirDiagnosticWithParameters2(), FirPsiDiagnostic { + override val factory: FirDiagnosticFactory2, P, A, B> +) : FirDiagnosticWithParameters2, A, B>(), FirPsiDiagnostic

{ override fun asPsiBasedDiagnostic(): Diagnostic { return factory.psiDiagnosticFactory.on(element.psi, a, b) } } -data class FirPsiDiagnosticWithParameters3( - override val element: E, +data class FirPsiDiagnosticWithParameters3

( + override val element: FirPsiSourceElement

, override val a: A, override val b: B, override val c: C, override val severity: Severity, - override val factory: FirDiagnosticFactory3<*, A, B, C> -) : FirDiagnosticWithParameters3(), FirPsiDiagnostic { + override val factory: FirDiagnosticFactory3, P, A, B, C> +) : FirDiagnosticWithParameters3, A, B, C>(), FirPsiDiagnostic

{ override fun asPsiBasedDiagnostic(): Diagnostic { return factory.psiDiagnosticFactory.on(element.psi, a, b, c) } @@ -96,36 +97,36 @@ data class FirPsiDiagnosticWithParameters3 // ------------------------------ light tree diagnostics ------------------------------ -interface FirLightDiagnostic { - val element: E +interface FirLightDiagnostic { + val element: FirLightSourceElement } -data class FirLightSimpleDiagnostic( - override val element: E, +data class FirLightSimpleDiagnostic( + override val element: FirLightSourceElement, override val severity: Severity, - override val factory: FirDiagnosticFactory0<*> -) : FirSimpleDiagnostic(), FirLightDiagnostic + override val factory: FirDiagnosticFactory0<*, *> +) : FirSimpleDiagnostic(), FirLightDiagnostic -data class FirLightDiagnosticWithParameters1( - override val element: E, +data class FirLightDiagnosticWithParameters1( + override val element: FirLightSourceElement, override val a: A, override val severity: Severity, - override val factory: FirDiagnosticFactory1<*, A> -) : FirDiagnosticWithParameters1(), FirLightDiagnostic + override val factory: FirDiagnosticFactory1<*, *, A> +) : FirDiagnosticWithParameters1(), FirLightDiagnostic -data class FirLightDiagnosticWithParameters2( - override val element: E, +data class FirLightDiagnosticWithParameters2( + override val element: FirLightSourceElement, override val a: A, override val b: B, override val severity: Severity, - override val factory: FirDiagnosticFactory2<*, A, B> -) : FirDiagnosticWithParameters2(), FirLightDiagnostic + override val factory: FirDiagnosticFactory2<*, *, A, B> +) : FirDiagnosticWithParameters2(), FirLightDiagnostic -data class FirLightDiagnosticWithParameters3( - override val element: E, +data class FirLightDiagnosticWithParameters3( + override val element: FirLightSourceElement, override val a: A, override val b: B, override val c: C, override val severity: Severity, - override val factory: FirDiagnosticFactory3<*, A, B, C> -) : FirDiagnosticWithParameters3(), FirLightDiagnostic \ No newline at end of file + override val factory: FirDiagnosticFactory3<*, *, A, B, C> +) : FirDiagnosticWithParameters3(), FirLightDiagnostic \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactory.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactory.kt index 1ef91b7cea3..abc5c668b18 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactory.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactory.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.FirLightSourceElement import org.jetbrains.kotlin.fir.FirPsiSourceElement import org.jetbrains.kotlin.fir.FirSourceElement -sealed class AbstractFirDiagnosticFactory>( +sealed class AbstractFirDiagnosticFactory>( val name: String, val severity: Severity, ) { @@ -22,51 +22,59 @@ sealed class AbstractFirDiagnosticFactory( - name: String, severity: Severity, override val psiDiagnosticFactory: DiagnosticFactory0 +class FirDiagnosticFactory0( + name: String, severity: Severity, override val psiDiagnosticFactory: DiagnosticFactory0

) : AbstractFirDiagnosticFactory>(name, severity) { fun on(element: E): FirSimpleDiagnostic { return when (element) { - is FirPsiSourceElement -> FirPsiSimpleDiagnostic(element, severity, this) + is FirPsiSourceElement<*> -> FirPsiSimpleDiagnostic( + element as FirPsiSourceElement

, severity, this as FirDiagnosticFactory0, P> + ) is FirLightSourceElement -> FirLightSimpleDiagnostic(element, severity, this) else -> incorrectElement(element) - } + } as FirSimpleDiagnostic } } -class FirDiagnosticFactory1( - name: String, severity: Severity, override val psiDiagnosticFactory: DiagnosticFactory1 +class FirDiagnosticFactory1( + name: String, severity: Severity, override val psiDiagnosticFactory: DiagnosticFactory1 ) : AbstractFirDiagnosticFactory>(name, severity) { fun on(element: E, a: A): FirDiagnosticWithParameters1 { return when (element) { - is FirPsiSourceElement -> FirPsiDiagnosticWithParameters1(element, a, severity, this) + is FirPsiSourceElement<*> -> FirPsiDiagnosticWithParameters1( + element as FirPsiSourceElement

, a, severity, this as FirDiagnosticFactory1, P, A> + ) is FirLightSourceElement -> FirLightDiagnosticWithParameters1(element, a, severity, this) else -> incorrectElement(element) - } + } as FirDiagnosticWithParameters1 } } -class FirDiagnosticFactory2( - name: String, severity: Severity, override val psiDiagnosticFactory: DiagnosticFactory2 +class FirDiagnosticFactory2( + name: String, severity: Severity, override val psiDiagnosticFactory: DiagnosticFactory2 ) : AbstractFirDiagnosticFactory>(name, severity) { fun on(element: E, a: A, b: B): FirDiagnosticWithParameters2 { return when (element) { - is FirPsiSourceElement -> FirPsiDiagnosticWithParameters2(element, a, b, severity, this) + is FirPsiSourceElement<*> -> FirPsiDiagnosticWithParameters2( + element as FirPsiSourceElement

, a, b, severity, this as FirDiagnosticFactory2, P, A, B> + ) is FirLightSourceElement -> FirLightDiagnosticWithParameters2(element, a, b, severity, this) else -> incorrectElement(element) - } + } as FirDiagnosticWithParameters2 } } -class FirDiagnosticFactory3( - name: String, severity: Severity, override val psiDiagnosticFactory: DiagnosticFactory3 +class FirDiagnosticFactory3( + name: String, severity: Severity, override val psiDiagnosticFactory: DiagnosticFactory3 ) : AbstractFirDiagnosticFactory>(name, severity) { fun on(element: E, a: A, b: B, c: C): FirDiagnosticWithParameters3 { return when (element) { - is FirPsiSourceElement -> FirPsiDiagnosticWithParameters3(element, a, b, c, severity, this) + is FirPsiSourceElement<*> -> FirPsiDiagnosticWithParameters3( + element as FirPsiSourceElement

, a, b, c, severity, this as FirDiagnosticFactory3, P, A, B, C> + ) is FirLightSourceElement -> FirLightDiagnosticWithParameters3(element, a, b, c, severity, this) else -> incorrectElement(element) - } + } as FirDiagnosticWithParameters3 } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryDsl.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryDsl.kt index 63631bba178..043169a6482 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryDsl.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryDsl.kt @@ -11,35 +11,35 @@ import org.jetbrains.kotlin.fir.FirSourceElement import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KProperty -fun warning0(): DiagnosticFactory0DelegateProvider { +fun warning0(): DiagnosticFactory0DelegateProvider { return DiagnosticFactory0DelegateProvider(Severity.WARNING, null) } -fun warning1(): DiagnosticFactory1DelegateProvider { +fun warning1(): DiagnosticFactory1DelegateProvider { return DiagnosticFactory1DelegateProvider(Severity.WARNING, null) } -fun warning2(): DiagnosticFactory2DelegateProvider { +fun warning2(): DiagnosticFactory2DelegateProvider { return DiagnosticFactory2DelegateProvider(Severity.WARNING, null) } -fun warning3(): DiagnosticFactory3DelegateProvider { +fun warning3(): DiagnosticFactory3DelegateProvider { return DiagnosticFactory3DelegateProvider(Severity.WARNING, null) } -fun error0(): DiagnosticFactory0DelegateProvider { +fun error0(): DiagnosticFactory0DelegateProvider { return DiagnosticFactory0DelegateProvider(Severity.ERROR, null) } -fun error1(): DiagnosticFactory1DelegateProvider { +fun error1(): DiagnosticFactory1DelegateProvider { return DiagnosticFactory1DelegateProvider(Severity.ERROR, null) } -fun error2(): DiagnosticFactory2DelegateProvider { +fun error2(): DiagnosticFactory2DelegateProvider { return DiagnosticFactory2DelegateProvider(Severity.ERROR, null) } -fun error3(): DiagnosticFactory3DelegateProvider { +fun error3(): DiagnosticFactory3DelegateProvider { return DiagnosticFactory3DelegateProvider(Severity.ERROR, null) } @@ -47,66 +47,74 @@ fun error3(): DiagnosticFactory3DelegateProvider * Note that those functions can be applicable only for factories * that takes `PsiElement` as first type parameter */ -fun existing(psiDiagnosticFactory: DiagnosticFactory0): DiagnosticFactory0DelegateProvider { +fun existing( + psiDiagnosticFactory: DiagnosticFactory0

+): DiagnosticFactory0DelegateProvider { return DiagnosticFactory0DelegateProvider(Severity.ERROR, psiDiagnosticFactory) } -fun existing(psiDiagnosticFactory: DiagnosticFactory1): DiagnosticFactory1DelegateProvider { +fun existing( + psiDiagnosticFactory: DiagnosticFactory1 +): DiagnosticFactory1DelegateProvider { return DiagnosticFactory1DelegateProvider(Severity.ERROR, psiDiagnosticFactory) } -fun existing(psiDiagnosticFactory: DiagnosticFactory2): DiagnosticFactory2DelegateProvider { +fun existing( + psiDiagnosticFactory: DiagnosticFactory2 +): DiagnosticFactory2DelegateProvider { return DiagnosticFactory2DelegateProvider(Severity.ERROR, psiDiagnosticFactory) } -fun existing(psiDiagnosticFactory: DiagnosticFactory3): DiagnosticFactory3DelegateProvider { +fun existing( + psiDiagnosticFactory: DiagnosticFactory3 +): DiagnosticFactory3DelegateProvider { return DiagnosticFactory3DelegateProvider(Severity.ERROR, psiDiagnosticFactory) } // ------------------------------ Providers ------------------------------ -class DiagnosticFactory0DelegateProvider( +class DiagnosticFactory0DelegateProvider( private val severity: Severity, - private val psiDiagnosticFactory: DiagnosticFactory0? + private val psiDiagnosticFactory: DiagnosticFactory0

? ) { - operator fun provideDelegate(thisRef: Any?, prop: KProperty<*>): ReadOnlyProperty> { - val psiFactory = psiDiagnosticFactory ?: DiagnosticFactory0.create(severity).apply { + operator fun provideDelegate(thisRef: Any?, prop: KProperty<*>): ReadOnlyProperty> { + val psiFactory = psiDiagnosticFactory ?: DiagnosticFactory0.create

(severity).apply { initializeName(prop.name) } return DummyDelegate(FirDiagnosticFactory0(prop.name, severity, psiFactory)) } } -class DiagnosticFactory1DelegateProvider( +class DiagnosticFactory1DelegateProvider( private val severity: Severity, - private val psiDiagnosticFactory: DiagnosticFactory1? + private val psiDiagnosticFactory: DiagnosticFactory1? ) { - operator fun provideDelegate(thisRef: Any?, prop: KProperty<*>): ReadOnlyProperty> { - val psiFactory = psiDiagnosticFactory ?: DiagnosticFactory1.create(severity).apply { + operator fun provideDelegate(thisRef: Any?, prop: KProperty<*>): ReadOnlyProperty> { + val psiFactory = psiDiagnosticFactory ?: DiagnosticFactory1.create(severity).apply { initializeName(prop.name) } return DummyDelegate(FirDiagnosticFactory1(prop.name, severity, psiFactory)) } } -class DiagnosticFactory2DelegateProvider( +class DiagnosticFactory2DelegateProvider( private val severity: Severity, - private val psiDiagnosticFactory: DiagnosticFactory2? + private val psiDiagnosticFactory: DiagnosticFactory2? ) { - operator fun provideDelegate(thisRef: Any?, prop: KProperty<*>): ReadOnlyProperty> { - val psiFactory = psiDiagnosticFactory ?: DiagnosticFactory2.create(severity).apply { + operator fun provideDelegate(thisRef: Any?, prop: KProperty<*>): ReadOnlyProperty> { + val psiFactory = psiDiagnosticFactory ?: DiagnosticFactory2.create(severity).apply { initializeName(prop.name) } return DummyDelegate(FirDiagnosticFactory2(prop.name, severity, psiFactory)) } } -class DiagnosticFactory3DelegateProvider( +class DiagnosticFactory3DelegateProvider( private val severity: Severity, - private val psiDiagnosticFactory: DiagnosticFactory3? + private val psiDiagnosticFactory: DiagnosticFactory3? ) { - operator fun provideDelegate(thisRef: Any?, prop: KProperty<*>): ReadOnlyProperty> { - val psiFactory = psiDiagnosticFactory ?: DiagnosticFactory3.create(severity).apply { + operator fun provideDelegate(thisRef: Any?, prop: KProperty<*>): ReadOnlyProperty> { + val psiFactory = psiDiagnosticFactory ?: DiagnosticFactory3.create(severity).apply { initializeName(prop.name) } return DummyDelegate(FirDiagnosticFactory3(prop.name, severity, psiFactory)) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryToRendererMap.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryToRendererMap.kt index 33d0f8a2618..74909add2e5 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryToRendererMap.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticFactoryToRendererMap.kt @@ -16,13 +16,13 @@ class FirDiagnosticFactoryToRendererMap(val name: String) { operator fun get(factory: AbstractFirDiagnosticFactory<*, *>): DiagnosticRenderer<*>? = diagnosticsMap[factory] - fun put(factory: FirDiagnosticFactory0<*>, message: String) { + fun put(factory: FirDiagnosticFactory0<*, *>, message: String) { psiDiagnosticMap.put(factory.psiDiagnosticFactory, message) putToFirMap(factory) } fun put( - factory: FirDiagnosticFactory1<*, A>, + factory: FirDiagnosticFactory1<*, *, A>, message: String, rendererA: DiagnosticParameterRenderer? ) { @@ -31,7 +31,7 @@ class FirDiagnosticFactoryToRendererMap(val name: String) { } fun put( - factory: FirDiagnosticFactory2<*, A, B>, + factory: FirDiagnosticFactory2<*, *, A, B>, message: String, rendererA: DiagnosticParameterRenderer?, rendererB: DiagnosticParameterRenderer? @@ -41,7 +41,7 @@ class FirDiagnosticFactoryToRendererMap(val name: String) { } fun put( - factory: FirDiagnosticFactory3<*, A, B, C>, + factory: FirDiagnosticFactory3<*, *, A, B, C>, message: String, rendererA: DiagnosticParameterRenderer?, rendererB: DiagnosticParameterRenderer?, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index da12ce7193b..97766c1f92f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -5,36 +5,38 @@ package org.jetbrains.kotlin.fir.analysis.diagnostics +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.lexer.KtModifierKeywordToken object FirErrors { - val UNRESOLVED_REFERENCE by error1() - val INAPPLICABLE_CANDIDATE by error1>>() - val AMBIGUITY by error1>>() - val ASSIGN_OPERATOR_AMBIGUITY by error1>>() - val SYNTAX_ERROR by error0() - val UNRESOLVED_LABEL by error0() - val ILLEGAL_CONST_EXPRESSION by error0() - val DESERIALIZATION_ERROR by error0() - val INFERENCE_ERROR by error0() - val NO_SUPERTYPE by error0() - val TYPE_PARAMETER_AS_SUPERTYPE by error0() - val ENUM_AS_SUPERTYPE by error0() - val RECURSION_IN_SUPERTYPES by error0() - val RECURSION_IN_IMPLICIT_TYPES by error0() - val ERROR_FROM_JAVA_RESOLUTION by error0() - val OTHER_ERROR by error0() - val TYPE_MISMATCH by error2() - val VARIABLE_EXPECTED by error0() - val RETURN_NOT_ALLOWED by error0() - val CONSTRUCTOR_IN_OBJECT by error0() - val SUPER_IS_NOT_AN_EXPRESSION by error0() + val UNRESOLVED_REFERENCE by error1() + val INAPPLICABLE_CANDIDATE by error1>>() + val AMBIGUITY by error1>>() + val ASSIGN_OPERATOR_AMBIGUITY by error1>>() + val SYNTAX_ERROR by error0() + val UNRESOLVED_LABEL by error0() + val ILLEGAL_CONST_EXPRESSION by error0() + val DESERIALIZATION_ERROR by error0() + val INFERENCE_ERROR by error0() + val NO_SUPERTYPE by error0() + val TYPE_PARAMETER_AS_SUPERTYPE by error0() + val ENUM_AS_SUPERTYPE by error0() + val RECURSION_IN_SUPERTYPES by error0() + val RECURSION_IN_IMPLICIT_TYPES by error0() + val ERROR_FROM_JAVA_RESOLUTION by error0() + val OTHER_ERROR by error0() + val TYPE_MISMATCH by error2() + val VARIABLE_EXPECTED by error0() + val RETURN_NOT_ALLOWED by error0() + val SUPER_IS_NOT_AN_EXPRESSION by error0() - val INAPPLICABLE_INFIX_MODIFIER by existing(Errors.INAPPLICABLE_INFIX_MODIFIER) + val INAPPLICABLE_INFIX_MODIFIER by existing(Errors.INAPPLICABLE_INFIX_MODIFIER) + val CONSTRUCTOR_IN_OBJECT by existing(Errors.CONSTRUCTOR_IN_OBJECT) val REPEATED_MODIFIER by error1() val REDUNDANT_MODIFIER by error2() diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index e19870fccab..1f17c1b8d52 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -53,7 +53,7 @@ class RawFirBuilder( return file.accept(Visitor(), Unit) as FirFile } - override fun PsiElement.toFirSourceElement(): FirPsiSourceElement { + override fun PsiElement.toFirSourceElement(): FirPsiSourceElement<*> { return FirPsiSourceElement(this) } @@ -1475,7 +1475,7 @@ class RawFirBuilder( private fun splitToCalleeAndReceiver( calleeExpression: KtExpression?, - defaultSource: FirPsiSourceElement, + defaultSource: FirPsiSourceElement<*>, ): Pair { return when (calleeExpression) { is KtSimpleNameExpression -> buildSimpleNamedReference { @@ -1535,7 +1535,7 @@ class RawFirBuilder( override fun visitArrayAccessExpression(expression: KtArrayAccessExpression, data: Unit): FirElement { val arrayExpression = expression.arrayExpression return buildFunctionCall { - val source: FirPsiSourceElement + val source: FirPsiSourceElement<*> val getArgument = context.arraySetArgument.remove(expression) if (getArgument != null) { calleeReference = buildSimpleNamedReference { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt index 791604219e7..56d06a23138 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt @@ -21,7 +21,7 @@ sealed class FirSourceElement { abstract val endOffset: Int } -class FirPsiSourceElement(val psi: PsiElement) : FirSourceElement() { +class FirPsiSourceElement

(val psi: P) : FirSourceElement() { override val elementType: IElementType get() = psi.node.elementType @@ -42,19 +42,19 @@ class FirLightSourceElement( get() = element.tokenType } -val FirSourceElement?.psi: PsiElement? get() = (this as? FirPsiSourceElement)?.psi +val FirSourceElement?.psi: PsiElement? get() = (this as? FirPsiSourceElement<*>)?.psi -val FirElement.psi: PsiElement? get() = (source as? FirPsiSourceElement)?.psi +val FirElement.psi: PsiElement? get() = (source as? FirPsiSourceElement<*>)?.psi @Suppress("NOTHING_TO_INLINE") -inline fun PsiElement.toFirSourceElement(): FirPsiSourceElement = FirPsiSourceElement(this) +inline fun PsiElement.toFirSourceElement(): FirPsiSourceElement<*> = FirPsiSourceElement(this) val FirSourceElement?.lightNode: LighterASTNode? get() = (this as? FirLightSourceElement)?.element fun FirSourceElement?.getModifierList(): FirModifierList? { return when (this) { null -> null - is FirPsiSourceElement -> (psi as? KtModifierListOwner)?.modifierList?.let { FirPsiModifierList(it) } + is FirPsiSourceElement<*> -> (psi as? KtModifierListOwner)?.modifierList?.let { FirPsiModifierList(it) } is FirLightSourceElement -> { val kidsRef = Ref>() tree.getChildren(element, kidsRef) diff --git a/compiler/testData/diagnostics/tests/ObjectWithConstructor.fir.kt b/compiler/testData/diagnostics/tests/ObjectWithConstructor.fir.kt index a54a650bf69..7ee1f433ccc 100644 --- a/compiler/testData/diagnostics/tests/ObjectWithConstructor.fir.kt +++ b/compiler/testData/diagnostics/tests/ObjectWithConstructor.fir.kt @@ -11,10 +11,10 @@ object A2 public constructor(private val prop: Int) { } val x = object (val prop: Int) { - constructor() : this(1) { + constructor() : this(1) { val x = 1 x * x - } + } } class A3 { diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticsWithLightTreeTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticsWithLightTreeTest.kt index 5e34087c4b3..de3d7dcea23 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticsWithLightTreeTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirDiagnosticsWithLightTreeTest.kt @@ -36,7 +36,7 @@ abstract class AbstractFirDiagnosticsWithLightTreeTest : AbstractFirDiagnosticsT val diagnostics = fileToDiagnostics[firFile] ?: emptyList() val actualDiagnostics = diagnostics.groupBy { - require(it is FirLightDiagnostic<*>) + require(it is FirLightDiagnostic) it.element.startOffset }.mapValues { (_, diagnostics) -> diagnostics.map { it.factory.name }.countEntries() }