[FIR] Prevent replacing UNNECESSARY_SAFE_CALL with UNEXPECTED_SAFE_CALL
UNNECESSARY_SAFE_CALL is a warning,
UNEXPECTED_SAFE_CALL is an error, thus
it's a breaking change.
^KT-59860 Fixed
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 34bbd52..04ce9c7 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
@@ -1234,6 +1234,12 @@
}
@Test
+ @TestMetadata("unexpectedSafeCall.kt")
+ public void testUnexpectedSafeCall() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/unexpectedSafeCall.kt");
+ }
+
+ @Test
@TestMetadata("UnitByDefaultForFunctionTypes.kt")
public void testUnitByDefaultForFunctionTypes() throws Exception {
runTest("compiler/testData/diagnostics/tests/UnitByDefaultForFunctionTypes.kt");
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 4d02df8..bcf7678 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
@@ -1234,6 +1234,12 @@
}
@Test
+ @TestMetadata("unexpectedSafeCall.kt")
+ public void testUnexpectedSafeCall() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/unexpectedSafeCall.kt");
+ }
+
+ @Test
@TestMetadata("UnitByDefaultForFunctionTypes.kt")
public void testUnitByDefaultForFunctionTypes() throws Exception {
runTest("compiler/testData/diagnostics/tests/UnitByDefaultForFunctionTypes.kt");
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 ce6772b..21285e1 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
@@ -1234,6 +1234,12 @@
}
@Test
+ @TestMetadata("unexpectedSafeCall.kt")
+ public void testUnexpectedSafeCall() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/unexpectedSafeCall.kt");
+ }
+
+ @Test
@TestMetadata("UnitByDefaultForFunctionTypes.kt")
public void testUnitByDefaultForFunctionTypes() throws Exception {
runTest("compiler/testData/diagnostics/tests/UnitByDefaultForFunctionTypes.kt");
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 695e05c..dfd4956 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
@@ -1234,6 +1234,12 @@
}
@Test
+ @TestMetadata("unexpectedSafeCall.kt")
+ public void testUnexpectedSafeCall() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/unexpectedSafeCall.kt");
+ }
+
+ @Test
@TestMetadata("UnitByDefaultForFunctionTypes.kt")
public void testUnitByDefaultForFunctionTypes() throws Exception {
runTest("compiler/testData/diagnostics/tests/UnitByDefaultForFunctionTypes.kt");
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnnecessarySafeCallChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnnecessarySafeCallChecker.kt
index 246ad63..6f34ff2 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnnecessarySafeCallChecker.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnnecessarySafeCallChecker.kt
@@ -12,8 +12,13 @@
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression
+import org.jetbrains.kotlin.fir.expressions.calleeReference
import org.jetbrains.kotlin.fir.languageVersionSettings
+import org.jetbrains.kotlin.fir.references.resolved
+import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
+import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
+import org.jetbrains.kotlin.fir.types.ConeErrorType
import org.jetbrains.kotlin.fir.types.canBeNull
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.types.isUnit
@@ -21,7 +26,7 @@
object FirUnnecessarySafeCallChecker : FirSafeCallExpressionChecker() {
override fun check(expression: FirSafeCallExpression, context: CheckerContext, reporter: DiagnosticReporter) {
val receiverType = expression.receiver.typeRef.coneType.fullyExpandedType(context.session)
- if (receiverType.isUnit || expression.receiver.source?.elementType == KtNodeTypes.SUPER_EXPRESSION) {
+ if (expression.receiver.source?.elementType == KtNodeTypes.SUPER_EXPRESSION) {
reporter.reportOn(expression.source, FirErrors.UNEXPECTED_SAFE_CALL, context)
return
}
diff --git a/compiler/testData/diagnostics/tests/SafeCallOnFakePackage.fir.kt b/compiler/testData/diagnostics/tests/SafeCallOnFakePackage.fir.kt
index bb6402e..8ce0b47 100644
--- a/compiler/testData/diagnostics/tests/SafeCallOnFakePackage.fir.kt
+++ b/compiler/testData/diagnostics/tests/SafeCallOnFakePackage.fir.kt
@@ -10,7 +10,7 @@
// FILE: test.kt
fun ff() {
- val a = <!NO_COMPANION_OBJECT!>Test<!><!UNEXPECTED_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>FOO<!>
- val b = <!EXPRESSION_EXPECTED_PACKAGE_FOUND!>foo<!><!UNEXPECTED_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>s<!>
- <!NO_COMPANION_OBJECT!>System<!><!UNEXPECTED_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>out<!>.println(a + b)
+ val a = <!NO_COMPANION_OBJECT!>Test<!><!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>FOO<!>
+ val b = <!EXPRESSION_EXPECTED_PACKAGE_FOUND!>foo<!><!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>s<!>
+ <!NO_COMPANION_OBJECT!>System<!><!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>out<!>.println(a + b)
}
diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/safeCallAfterVariableInitialization.fir.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/safeCallAfterVariableInitialization.fir.kt
index 3dac965..72a5947 100644
--- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/safeCallAfterVariableInitialization.fir.kt
+++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/safeCallAfterVariableInitialization.fir.kt
@@ -2,6 +2,6 @@
fun test() {
val b: Int
- run { b = 1 }<!UNEXPECTED_SAFE_CALL!>?.<!>let {}
+ run { b = 1 }<!UNNECESSARY_SAFE_CALL!>?.<!>let {}
b.inc()
}
diff --git a/compiler/testData/diagnostics/tests/unexpectedSafeCall.kt b/compiler/testData/diagnostics/tests/unexpectedSafeCall.kt
new file mode 100644
index 0000000..296fb105
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/unexpectedSafeCall.kt
@@ -0,0 +1,8 @@
+// FIR_IDENTICAL
+// DIAGNOSTICS: -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE
+// ISSUE: KT-59860
+
+fun test() {
+ val b: Int
+ run { b = 1 }<!UNNECESSARY_SAFE_CALL!>?.<!>let {} // K1: UNNECESSARY_SAFE_CALL, K2: UNEXPECTED_SAFE_CALL
+}
diff --git a/compiler/testData/diagnostics/testsWithStdLib/resolve/javaStaticMembers.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/resolve/javaStaticMembers.fir.kt
index 3bfaa40..a341c52 100644
--- a/compiler/testData/diagnostics/testsWithStdLib/resolve/javaStaticMembers.fir.kt
+++ b/compiler/testData/diagnostics/testsWithStdLib/resolve/javaStaticMembers.fir.kt
@@ -6,7 +6,7 @@
// FILE: test.kt
fun ff() {
val a = Test.FOO
- val b = <!NO_COMPANION_OBJECT!>Test<!><!UNEXPECTED_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>FOO<!>
+ val b = <!NO_COMPANION_OBJECT!>Test<!><!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>FOO<!>
System.out.println(a + b)
- <!NO_COMPANION_OBJECT!>System<!><!UNEXPECTED_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>out<!>.println(a + b)
+ <!NO_COMPANION_OBJECT!>System<!><!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>out<!>.println(a + b)
}
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 82f83fd..1a312d7 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
@@ -1234,6 +1234,12 @@
}
@Test
+ @TestMetadata("unexpectedSafeCall.kt")
+ public void testUnexpectedSafeCall() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/unexpectedSafeCall.kt");
+ }
+
+ @Test
@TestMetadata("UnitByDefaultForFunctionTypes.kt")
public void testUnitByDefaultForFunctionTypes() throws Exception {
runTest("compiler/testData/diagnostics/tests/UnitByDefaultForFunctionTypes.kt");