diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 739f088d2a4..e66a2e84058 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -4045,7 +4045,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a), firDiagnostic.b.source!!.psi as KtExpression, firDiagnostic.c, - firDiagnostic.d.source!!.psi as KtExpression, + firDiagnostic.d?.source?.psi as? KtExpression, firDiagnostic as KtPsiDiagnostic, token, ) @@ -4055,7 +4055,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a), firDiagnostic.b.source!!.psi as KtExpression, firDiagnostic.c, - firDiagnostic.d.source!!.psi as KtExpression, + firDiagnostic.d?.source?.psi as? KtExpression, firDiagnostic as KtPsiDiagnostic, token, ) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 171e31036a0..6f944ae230d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2822,7 +2822,7 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val receiverType: KtType val receiverExpression: KtExpression val operator: String - val argumentExpression: KtExpression + val argumentExpression: KtExpression? } interface UnsafeOperatorCall : KtFirDiagnostic { @@ -2830,7 +2830,7 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val receiverType: KtType val receiverExpression: KtExpression val operator: String - val argumentExpression: KtExpression + val argumentExpression: KtExpression? } interface IteratorOnNullable : KtFirDiagnostic { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index af3d723fd58..674cf3042df 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -3396,7 +3396,7 @@ internal class UnsafeInfixCallImpl( override val receiverType: KtType, override val receiverExpression: KtExpression, override val operator: String, - override val argumentExpression: KtExpression, + override val argumentExpression: KtExpression?, firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.UnsafeInfixCall @@ -3405,7 +3405,7 @@ internal class UnsafeOperatorCallImpl( override val receiverType: KtType, override val receiverExpression: KtExpression, override val operator: String, - override val argumentExpression: KtExpression, + override val argumentExpression: KtExpression?, firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.UnsafeOperatorCall diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index e68cc3e83a0..4e17efb9ff9 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -26348,6 +26348,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/nullableTypes/takingNullabilityFromExplicitTypeArgmentsInsteadOfUsingFlexibleTypes.kt"); } + @Test + @TestMetadata("unsafeCallOnOperatorRedCode.kt") + public void testUnsafeCallOnOperatorRedCode() throws Exception { + runTest("compiler/testData/diagnostics/tests/nullableTypes/unsafeCallOnOperatorRedCode.kt"); + } + @Test @TestMetadata("uselessElvis.kt") public void testUselessElvis() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 99f3f067e19..b64534f38b5 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -26348,6 +26348,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/nullableTypes/takingNullabilityFromExplicitTypeArgmentsInsteadOfUsingFlexibleTypes.kt"); } + @Test + @TestMetadata("unsafeCallOnOperatorRedCode.kt") + public void testUnsafeCallOnOperatorRedCode() throws Exception { + runTest("compiler/testData/diagnostics/tests/nullableTypes/unsafeCallOnOperatorRedCode.kt"); + } + @Test @TestMetadata("uselessElvis.kt") public void testUselessElvis() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index d3a5beb6953..cc3e1548308 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -24270,6 +24270,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/nullableTypes/takingNullabilityFromExplicitTypeArgmentsInsteadOfUsingFlexibleTypes.kt"); } + @Test + @TestMetadata("unsafeCallOnOperatorRedCode.kt") + public void testUnsafeCallOnOperatorRedCode() throws Exception { + runTest("compiler/testData/diagnostics/tests/nullableTypes/unsafeCallOnOperatorRedCode.kt"); + } + @Test @TestMetadata("uselessElvis.kt") public void testUselessElvis() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 03a55e8ef4f..f5cbdd23bd8 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -24276,6 +24276,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/nullableTypes/takingNullabilityFromExplicitTypeArgmentsInsteadOfUsingFlexibleTypes.kt"); } + @Test + @TestMetadata("unsafeCallOnOperatorRedCode.kt") + public void testUnsafeCallOnOperatorRedCode() throws Exception { + runTest("compiler/testData/diagnostics/tests/nullableTypes/unsafeCallOnOperatorRedCode.kt"); + } + @Test @TestMetadata("uselessElvis.kt") public void testUselessElvis() throws Exception { diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 2f56166b5d8..3e55fd62a8b 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -1405,13 +1405,13 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter("receiverType") parameter("receiverExpression") parameter("operator") - parameter("argumentExpression") + parameter("argumentExpression") } val UNSAFE_OPERATOR_CALL by error(PositioningStrategy.REFERENCE_BY_QUALIFIED) { parameter("receiverType") parameter("receiverExpression") parameter("operator") - parameter("argumentExpression") + parameter("argumentExpression") } val ITERATOR_ON_NULLABLE by error() val UNNECESSARY_SAFE_CALL by warning(PositioningStrategy.SAFE_ACCESS) { diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 50fe8906167..c079073acce 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -707,8 +707,8 @@ object FirErrors { // Nullability val UNSAFE_CALL by error2(SourceElementPositioningStrategies.DOT_BY_QUALIFIED) val UNSAFE_IMPLICIT_INVOKE_CALL by error1(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) - val UNSAFE_INFIX_CALL by error4(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) - val UNSAFE_OPERATOR_CALL by error4(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + val UNSAFE_INFIX_CALL by error4(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + val UNSAFE_OPERATOR_CALL by error4(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val ITERATOR_ON_NULLABLE by error0() val UNNECESSARY_SAFE_CALL by warning1(SourceElementPositioningStrategies.SAFE_ACCESS) val SAFE_CALL_WILL_CHANGE_NULLABILITY by warning0(SourceElementPositioningStrategies.CALL_ELEMENT_WITH_DOT) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt index 08f1ede6129..0748e0e9305 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt @@ -240,7 +240,7 @@ private fun mapUnsafeCallError( rootCause.actualType, receiverExpression, candidateFunctionName!!.asString(), - singleArgument, + singleArgument.takeIf { it.source != null }, ) } else { FirErrors.UNSAFE_OPERATOR_CALL.createOn( @@ -248,7 +248,7 @@ private fun mapUnsafeCallError( rootCause.actualType, receiverExpression, candidateFunctionName!!.asString(), - singleArgument, + singleArgument.takeIf { it.source != null }, ) } } diff --git a/compiler/testData/diagnostics/tests/nullableTypes/unsafeCallOnOperatorRedCode.fir.kt b/compiler/testData/diagnostics/tests/nullableTypes/unsafeCallOnOperatorRedCode.fir.kt new file mode 100644 index 00000000000..9759a088137 --- /dev/null +++ b/compiler/testData/diagnostics/tests/nullableTypes/unsafeCallOnOperatorRedCode.fir.kt @@ -0,0 +1,3 @@ +fun add(a: Int?, b: Int?): Int { + return a+ +} diff --git a/compiler/testData/diagnostics/tests/nullableTypes/unsafeCallOnOperatorRedCode.kt b/compiler/testData/diagnostics/tests/nullableTypes/unsafeCallOnOperatorRedCode.kt new file mode 100644 index 00000000000..5af72841324 --- /dev/null +++ b/compiler/testData/diagnostics/tests/nullableTypes/unsafeCallOnOperatorRedCode.kt @@ -0,0 +1,3 @@ +fun add(a: Int?, b: Int?): Int { + return a+ +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index c52776e552a..9a6fdbe95b2 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -26348,6 +26348,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/nullableTypes/takingNullabilityFromExplicitTypeArgmentsInsteadOfUsingFlexibleTypes.kt"); } + @Test + @TestMetadata("unsafeCallOnOperatorRedCode.kt") + public void testUnsafeCallOnOperatorRedCode() throws Exception { + runTest("compiler/testData/diagnostics/tests/nullableTypes/unsafeCallOnOperatorRedCode.kt"); + } + @Test @TestMetadata("uselessElvis.kt") public void testUselessElvis() throws Exception {