提交 2cd1aefd 编写于 作者: D Dmitriy Novozhilov

[FIR-IDE] Add mapping for FirExpression in diagnostics and generate new IDE ones

上级 9b1f01ab
......@@ -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.FirClass
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.symbols.AbstractFirBasedSymbol
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.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtExpression
import kotlin.reflect.KClass
import kotlin.reflect.KType
import kotlin.reflect.full.createType
......@@ -116,6 +118,14 @@ private object FirToKtConversionCreator {
"firSymbolBuilder.buildClassLikeSymbol({0})",
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(
"firSymbolBuilder.buildClassLikeSymbol({0}.fir as FirClass<*>)",
KtClassLikeSymbol::class.createType(),
......@@ -171,4 +181,4 @@ private object FirToKtConversionCreator {
private val KType.kClass: KClass<*>
get() = classifier as KClass<*>
}
\ No newline at end of file
}
......@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.expressions.WhenMissingCase
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtDestructuringDeclaration
......@@ -974,6 +975,31 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
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 ->
NoElseInWhenImpl(
firDiagnostic.a.map { whenMissingCase ->
......
......@@ -689,6 +689,25 @@ sealed class KtFirDiagnostic<PSI: PsiElement> : KtDiagnosticWithPsi<PSI> {
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>() {
override val diagnosticClass get() = NoElseInWhen::class
abstract val missingWhenCases: List<Any>
......
......@@ -1110,6 +1110,34 @@ internal class UnsafeCallImpl(
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(
override val missingWhenCases: List<Any>,
firDiagnostic: FirPsiDiagnostic<*>,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册