[FIR] Additional errors to distinguish resolution to classifier cases

When a call is resolved to a classifier, only a single error message was
being used for multiple cases. This lead to confusion as the default
message may not be applicable to a given error case. Added additional
errors and messages to distinguish between these error cases.

#KT-57251 Fixed
This commit is contained in:
Brian Norman
2023-06-02 09:34:49 -05:00
committed by Space Team
parent ac79633590
commit 0ff9982b31
44 changed files with 582 additions and 39 deletions
@@ -389,6 +389,27 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirErrors.INTERFACE_AS_FUNCTION) { firDiagnostic ->
InterfaceAsFunctionImpl(
firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a),
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.EXPECT_CLASS_AS_FUNCTION) { firDiagnostic ->
ExpectClassAsFunctionImpl(
firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a),
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.INNER_CLASS_CONSTRUCTOR_NO_RECEIVER) { firDiagnostic ->
InnerClassConstructorNoReceiverImpl(
firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a),
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.RESOLUTION_TO_CLASSIFIER) { firDiagnostic ->
ResolutionToClassifierImpl(
firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a),
@@ -313,6 +313,21 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
val type: KtType
}
interface InterfaceAsFunction : KtFirDiagnostic<PsiElement> {
override val diagnosticClass get() = InterfaceAsFunction::class
val classSymbol: KtClassLikeSymbol
}
interface ExpectClassAsFunction : KtFirDiagnostic<PsiElement> {
override val diagnosticClass get() = ExpectClassAsFunction::class
val classSymbol: KtClassLikeSymbol
}
interface InnerClassConstructorNoReceiver : KtFirDiagnostic<PsiElement> {
override val diagnosticClass get() = InnerClassConstructorNoReceiver::class
val classSymbol: KtClassLikeSymbol
}
interface ResolutionToClassifier : KtFirDiagnostic<PsiElement> {
override val diagnosticClass get() = ResolutionToClassifier::class
val classSymbol: KtClassLikeSymbol
@@ -361,6 +361,24 @@ internal class FunctionExpectedImpl(
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.FunctionExpected
internal class InterfaceAsFunctionImpl(
override val classSymbol: KtClassLikeSymbol,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.InterfaceAsFunction
internal class ExpectClassAsFunctionImpl(
override val classSymbol: KtClassLikeSymbol,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.ExpectClassAsFunction
internal class InnerClassConstructorNoReceiverImpl(
override val classSymbol: KtClassLikeSymbol,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.InnerClassConstructorNoReceiver
internal class ResolutionToClassifierImpl(
override val classSymbol: KtClassLikeSymbol,
firDiagnostic: KtPsiDiagnostic,