diff --git a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt index e2132f8e6e36a21ac107c690a5cf9fc73e195fb8..96f9c01df2144506c0430fa0f1e608ef1064bf7d 100644 --- a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt +++ b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt @@ -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 +} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index 13a7aaafd6c3a461f328ce073e97f5723a079d25..7168f951a3e38cc2b7602982327407ca1cd5cf96 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -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 -> diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 82824f7a4c8ecc8416adb7d2a6847cbd515ac344..c14587e956d3263871e9cfec47533261ff73340a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -689,6 +689,25 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val receiverType: KtType } + abstract class UnsafeImplicitInvokeCall : KtFirDiagnostic() { + override val diagnosticClass get() = UnsafeImplicitInvokeCall::class + abstract val receiverType: KtType + } + + abstract class UnsafeInfixCall : KtFirDiagnostic() { + override val diagnosticClass get() = UnsafeInfixCall::class + abstract val lhs: KtExpression + abstract val operator: String + abstract val rhs: KtExpression + } + + abstract class UnsafeOperatorCall : KtFirDiagnostic() { + override val diagnosticClass get() = UnsafeOperatorCall::class + abstract val lhs: KtExpression + abstract val operator: String + abstract val rhs: KtExpression + } + abstract class NoElseInWhen : KtFirDiagnostic() { override val diagnosticClass get() = NoElseInWhen::class abstract val missingWhenCases: List diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index dbfdffeb99159d964719c367ef9a10f8513d5ed4..7f4c57fb3fa3b43a5e5223c3b9b20b44711d6504 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -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 { + 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 { + 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 { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + internal class NoElseInWhenImpl( override val missingWhenCases: List, firDiagnostic: FirPsiDiagnostic<*>,