[FIR-IDE] Add mapping for FirExpression in diagnostics and generate new IDE ones
This commit is contained in:
+10
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.DiagnosticParamet
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.WhenMissingCase
|
import org.jetbrains.kotlin.fir.expressions.WhenMissingCase
|
||||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||||
@@ -26,6 +27,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.*
|
|||||||
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
||||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.psi.KtExpression
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
import kotlin.reflect.KType
|
import kotlin.reflect.KType
|
||||||
import kotlin.reflect.full.createType
|
import kotlin.reflect.full.createType
|
||||||
@@ -116,6 +118,14 @@ private object FirToKtConversionCreator {
|
|||||||
"firSymbolBuilder.buildClassLikeSymbol({0})",
|
"firSymbolBuilder.buildClassLikeSymbol({0})",
|
||||||
KtClassLikeSymbol::class.createType()
|
KtClassLikeSymbol::class.createType()
|
||||||
),
|
),
|
||||||
|
FirExpression::class to HLFunctionCallConversion(
|
||||||
|
"{0}.source!!.psi as KtExpression",
|
||||||
|
KtExpression::class.createType(),
|
||||||
|
importsToAdd = listOf(
|
||||||
|
"org.jetbrains.kotlin.psi.KtExpression",
|
||||||
|
"org.jetbrains.kotlin.fir.psi"
|
||||||
|
)
|
||||||
|
),
|
||||||
FirClassLikeSymbol::class to HLFunctionCallConversion(
|
FirClassLikeSymbol::class to HLFunctionCallConversion(
|
||||||
"firSymbolBuilder.buildClassLikeSymbol({0}.fir as FirClass<*>)",
|
"firSymbolBuilder.buildClassLikeSymbol({0}.fir as FirClass<*>)",
|
||||||
KtClassLikeSymbol::class.createType(),
|
KtClassLikeSymbol::class.createType(),
|
||||||
|
|||||||
+26
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||||
import org.jetbrains.kotlin.fir.expressions.WhenMissingCase
|
import org.jetbrains.kotlin.fir.expressions.WhenMissingCase
|
||||||
|
import org.jetbrains.kotlin.fir.psi
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtDestructuringDeclaration
|
import org.jetbrains.kotlin.psi.KtDestructuringDeclaration
|
||||||
@@ -974,6 +975,31 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
|||||||
token,
|
token,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
add(FirErrors.UNSAFE_IMPLICIT_INVOKE_CALL) { firDiagnostic ->
|
||||||
|
UnsafeImplicitInvokeCallImpl(
|
||||||
|
firSymbolBuilder.buildKtType(firDiagnostic.a),
|
||||||
|
firDiagnostic as FirPsiDiagnostic<*>,
|
||||||
|
token,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
add(FirErrors.UNSAFE_INFIX_CALL) { firDiagnostic ->
|
||||||
|
UnsafeInfixCallImpl(
|
||||||
|
firDiagnostic.a.source!!.psi as KtExpression,
|
||||||
|
firDiagnostic.b,
|
||||||
|
firDiagnostic.c.source!!.psi as KtExpression,
|
||||||
|
firDiagnostic as FirPsiDiagnostic<*>,
|
||||||
|
token,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
add(FirErrors.UNSAFE_OPERATOR_CALL) { firDiagnostic ->
|
||||||
|
UnsafeOperatorCallImpl(
|
||||||
|
firDiagnostic.a.source!!.psi as KtExpression,
|
||||||
|
firDiagnostic.b,
|
||||||
|
firDiagnostic.c.source!!.psi as KtExpression,
|
||||||
|
firDiagnostic as FirPsiDiagnostic<*>,
|
||||||
|
token,
|
||||||
|
)
|
||||||
|
}
|
||||||
add(FirErrors.NO_ELSE_IN_WHEN) { firDiagnostic ->
|
add(FirErrors.NO_ELSE_IN_WHEN) { firDiagnostic ->
|
||||||
NoElseInWhenImpl(
|
NoElseInWhenImpl(
|
||||||
firDiagnostic.a.map { whenMissingCase ->
|
firDiagnostic.a.map { whenMissingCase ->
|
||||||
|
|||||||
+19
@@ -689,6 +689,25 @@ sealed class KtFirDiagnostic<PSI: PsiElement> : KtDiagnosticWithPsi<PSI> {
|
|||||||
abstract val receiverType: KtType
|
abstract val receiverType: KtType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract class UnsafeImplicitInvokeCall : KtFirDiagnostic<PsiElement>() {
|
||||||
|
override val diagnosticClass get() = UnsafeImplicitInvokeCall::class
|
||||||
|
abstract val receiverType: KtType
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class UnsafeInfixCall : KtFirDiagnostic<KtExpression>() {
|
||||||
|
override val diagnosticClass get() = UnsafeInfixCall::class
|
||||||
|
abstract val lhs: KtExpression
|
||||||
|
abstract val operator: String
|
||||||
|
abstract val rhs: KtExpression
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class UnsafeOperatorCall : KtFirDiagnostic<KtExpression>() {
|
||||||
|
override val diagnosticClass get() = UnsafeOperatorCall::class
|
||||||
|
abstract val lhs: KtExpression
|
||||||
|
abstract val operator: String
|
||||||
|
abstract val rhs: KtExpression
|
||||||
|
}
|
||||||
|
|
||||||
abstract class NoElseInWhen : KtFirDiagnostic<KtWhenExpression>() {
|
abstract class NoElseInWhen : KtFirDiagnostic<KtWhenExpression>() {
|
||||||
override val diagnosticClass get() = NoElseInWhen::class
|
override val diagnosticClass get() = NoElseInWhen::class
|
||||||
abstract val missingWhenCases: List<Any>
|
abstract val missingWhenCases: List<Any>
|
||||||
|
|||||||
+28
@@ -1110,6 +1110,34 @@ internal class UnsafeCallImpl(
|
|||||||
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal class UnsafeImplicitInvokeCallImpl(
|
||||||
|
override val receiverType: KtType,
|
||||||
|
firDiagnostic: FirPsiDiagnostic<*>,
|
||||||
|
override val token: ValidityToken,
|
||||||
|
) : KtFirDiagnostic.UnsafeImplicitInvokeCall(), KtAbstractFirDiagnostic<PsiElement> {
|
||||||
|
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class UnsafeInfixCallImpl(
|
||||||
|
override val lhs: KtExpression,
|
||||||
|
override val operator: String,
|
||||||
|
override val rhs: KtExpression,
|
||||||
|
firDiagnostic: FirPsiDiagnostic<*>,
|
||||||
|
override val token: ValidityToken,
|
||||||
|
) : KtFirDiagnostic.UnsafeInfixCall(), KtAbstractFirDiagnostic<KtExpression> {
|
||||||
|
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class UnsafeOperatorCallImpl(
|
||||||
|
override val lhs: KtExpression,
|
||||||
|
override val operator: String,
|
||||||
|
override val rhs: KtExpression,
|
||||||
|
firDiagnostic: FirPsiDiagnostic<*>,
|
||||||
|
override val token: ValidityToken,
|
||||||
|
) : KtFirDiagnostic.UnsafeOperatorCall(), KtAbstractFirDiagnostic<KtExpression> {
|
||||||
|
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||||
|
}
|
||||||
|
|
||||||
internal class NoElseInWhenImpl(
|
internal class NoElseInWhenImpl(
|
||||||
override val missingWhenCases: List<Any>,
|
override val missingWhenCases: List<Any>,
|
||||||
firDiagnostic: FirPsiDiagnostic<*>,
|
firDiagnostic: FirPsiDiagnostic<*>,
|
||||||
|
|||||||
Reference in New Issue
Block a user