[FIR IDE] Fix bug in diagnostics' combining during code generation

This commit is contained in:
Roman Golyshev
2021-10-12 15:53:16 +03:00
committed by Space
parent b946a284b0
commit d3e2f9a3f6
4 changed files with 67 additions and 2 deletions
@@ -365,6 +365,31 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirErrors.SUPER_IS_NOT_AN_EXPRESSION) { firDiagnostic ->
SuperIsNotAnExpressionImpl(
firDiagnostic as FirPsiDiagnostic,
token,
)
}
add(FirErrors.SUPER_NOT_AVAILABLE) { firDiagnostic ->
SuperNotAvailableImpl(
firDiagnostic as FirPsiDiagnostic,
token,
)
}
add(FirErrors.ABSTRACT_SUPER_CALL) { firDiagnostic ->
AbstractSuperCallImpl(
firDiagnostic as FirPsiDiagnostic,
token,
)
}
add(FirErrors.INSTANCE_ACCESS_BEFORE_SUPER_CALL) { firDiagnostic ->
InstanceAccessBeforeSuperCallImpl(
firDiagnostic.a,
firDiagnostic as FirPsiDiagnostic,
token,
)
}
add(FirJvmErrors.SUPER_CALL_WITH_DEFAULT_PARAMETERS) { firDiagnostic ->
SuperCallWithDefaultParametersImpl(
firDiagnostic.a,
@@ -287,6 +287,23 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
abstract val classSymbol: KtClassLikeSymbol
}
abstract class SuperIsNotAnExpression : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = SuperIsNotAnExpression::class
}
abstract class SuperNotAvailable : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = SuperNotAvailable::class
}
abstract class AbstractSuperCall : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = AbstractSuperCall::class
}
abstract class InstanceAccessBeforeSuperCall : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = InstanceAccessBeforeSuperCall::class
abstract val target: String
}
abstract class SuperCallWithDefaultParameters : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = SuperCallWithDefaultParameters::class
abstract val name: String
@@ -332,6 +332,27 @@ internal class ResolutionToClassifierImpl(
override val token: ValidityToken,
) : KtFirDiagnostic.ResolutionToClassifier(), KtAbstractFirDiagnostic<PsiElement>
internal class SuperIsNotAnExpressionImpl(
override val firDiagnostic: FirPsiDiagnostic,
override val token: ValidityToken,
) : KtFirDiagnostic.SuperIsNotAnExpression(), KtAbstractFirDiagnostic<PsiElement>
internal class SuperNotAvailableImpl(
override val firDiagnostic: FirPsiDiagnostic,
override val token: ValidityToken,
) : KtFirDiagnostic.SuperNotAvailable(), KtAbstractFirDiagnostic<PsiElement>
internal class AbstractSuperCallImpl(
override val firDiagnostic: FirPsiDiagnostic,
override val token: ValidityToken,
) : KtFirDiagnostic.AbstractSuperCall(), KtAbstractFirDiagnostic<PsiElement>
internal class InstanceAccessBeforeSuperCallImpl(
override val target: String,
override val firDiagnostic: FirPsiDiagnostic,
override val token: ValidityToken,
) : KtFirDiagnostic.InstanceAccessBeforeSuperCall(), KtAbstractFirDiagnostic<PsiElement>
internal class SuperCallWithDefaultParametersImpl(
override val name: String,
override val firDiagnostic: FirPsiDiagnostic,
@@ -81,10 +81,12 @@ abstract class AbstractDiagnosticGroup @PrivateForInline constructor(val name: S
@OptIn(PrivateForInline::class)
operator fun plus(other: AbstractDiagnosticGroup): AbstractDiagnosticGroup {
require(name == other.name)
val combinedDiagnostics = this.diagnostics + other.diagnostics
return object : AbstractDiagnosticGroup(name, "#Stub") {
init {
_diagnostics.addAll(this.diagnostics)
_diagnostics.addAll(other.diagnostics)
_diagnostics.addAll(combinedDiagnostics)
}
}
}