mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-04-15 15:52:16 +00:00
[FIR-IDE] Add mapping for FirExpression in diagnostics and generate new IDE ones
This commit is contained in:
@@ -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<*>
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<*>,
|
||||
|
||||
Reference in New Issue
Block a user