From c6427d57f13cf11f1fcf9ce186334945e12908ed Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Thu, 27 May 2021 22:20:34 +0000 Subject: [PATCH] FIR IDE: Enable AddExclExclCallFix for ASSIGNMENT_TYPE_MISMATCH and INITIALIZER_TYPE_MISMATCH. --- .../kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt | 2 ++ .../idea/quickfix/fixes/TypeMismatchFactories.kt | 8 ++++++++ .../fir/quickfix/HighLevelQuickFixTestGenerated.java | 10 ++++++++++ .../quickfix/addExclExclCall/nullExpression.kt | 5 ++++- .../addExclExclCall/typeMismatch/assignmentRValue.kt | 10 ++++------ .../typeMismatch/assignmentRValue.kt.after | 10 ++++------ .../addExclExclCall/typeMismatch/initializer.kt | 4 ++++ .../addExclExclCall/typeMismatch/initializer.kt.after | 4 ++++ .../memberAccessInExtensionAsAssignmentRValue.kt | 7 +++---- .../memberAccessInExtensionAsAssignmentRValue.kt.after | 7 +++---- .../memberAccessInExtensionAsInitializer.kt | 9 +++++++++ .../memberAccessInExtensionAsInitializer.kt.after | 9 +++++++++ .../kotlin/idea/quickfix/QuickFixTestGenerated.java | 10 ++++++++++ 13 files changed, 74 insertions(+), 21 deletions(-) create mode 100644 idea/testData/quickfix/addExclExclCall/typeMismatch/initializer.kt create mode 100644 idea/testData/quickfix/addExclExclCall/typeMismatch/initializer.kt.after create mode 100644 idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsInitializer.kt create mode 100644 idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsInitializer.kt.after diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt index 849634ed7aa..adb5d516a01 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt @@ -118,6 +118,8 @@ class MainKtQuickFixRegistrar : KtQuickFixRegistrar() { registerApplicator(AddExclExclCallFixFactories.iteratorOnNullableFactory) registerApplicator(TypeMismatchFactories.argumentTypeMismatchFactory) registerApplicator(TypeMismatchFactories.returnTypeMismatchFactory) + registerApplicator(TypeMismatchFactories.assignmentTypeMismatch) + registerApplicator(TypeMismatchFactories.initializerTypeMismatch) // TODO: NON_EXHAUSTIVE_WHEN[_ON_SEALED_CLASS] will be replaced in future. We need to register the fix for those diagnostics as well registerPsiQuickFixes(KtFirDiagnostic.NoElseInWhen::class, AddWhenElseBranchFix) diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/TypeMismatchFactories.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/TypeMismatchFactories.kt index 69775896704..2efe24dc3fe 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/TypeMismatchFactories.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/TypeMismatchFactories.kt @@ -22,6 +22,14 @@ object TypeMismatchFactories { getFixesForTypeMismatch(diagnostic.psi, diagnostic.expectedType, diagnostic.actualType) } + val assignmentTypeMismatch = diagnosticFixFactory { diagnostic -> + getFixesForTypeMismatch(diagnostic.psi, diagnostic.expectedType, diagnostic.actualType) + } + + val initializerTypeMismatch = diagnosticFixFactory { diagnostic -> + diagnostic.psi.initializer?.let { getFixesForTypeMismatch(it, diagnostic.expectedType, diagnostic.actualType) } ?: emptyList() + } + private fun KtAnalysisSession.getFixesForTypeMismatch( psi: PsiElement, expectedType: KtType, diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/quickfix/HighLevelQuickFixTestGenerated.java b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/quickfix/HighLevelQuickFixTestGenerated.java index 7d01a09b7a1..c24aea87dfd 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/quickfix/HighLevelQuickFixTestGenerated.java +++ b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/quickfix/HighLevelQuickFixTestGenerated.java @@ -361,6 +361,11 @@ public class HighLevelQuickFixTestGenerated extends AbstractHighLevelQuickFixTes runTest("idea/testData/quickfix/addExclExclCall/typeMismatch/assignmentRValue.kt"); } + @TestMetadata("initializer.kt") + public void testInitializer() throws Exception { + runTest("idea/testData/quickfix/addExclExclCall/typeMismatch/initializer.kt"); + } + @TestMetadata("memberAccessInExtension.kt") public void testMemberAccessInExtension() throws Exception { runTest("idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtension.kt"); @@ -371,6 +376,11 @@ public class HighLevelQuickFixTestGenerated extends AbstractHighLevelQuickFixTes runTest("idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsAssignmentRValue.kt"); } + @TestMetadata("memberAccessInExtensionAsInitializer.kt") + public void testMemberAccessInExtensionAsInitializer() throws Exception { + runTest("idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsInitializer.kt"); + } + @TestMetadata("nullArgument.kt") public void testNullArgument() throws Exception { runTest("idea/testData/quickfix/addExclExclCall/typeMismatch/nullArgument.kt"); diff --git a/idea/testData/quickfix/addExclExclCall/nullExpression.kt b/idea/testData/quickfix/addExclExclCall/nullExpression.kt index 0da26f48e2e..dafab36c9c6 100644 --- a/idea/testData/quickfix/addExclExclCall/nullExpression.kt +++ b/idea/testData/quickfix/addExclExclCall/nullExpression.kt @@ -8,4 +8,7 @@ fun foo(arg: String?) { if (arg == null) { val x: String = arg } -} \ No newline at end of file +} + +// TODO: Need data flow info from null check +/* IGNORE_FIR */ diff --git a/idea/testData/quickfix/addExclExclCall/typeMismatch/assignmentRValue.kt b/idea/testData/quickfix/addExclExclCall/typeMismatch/assignmentRValue.kt index bc2edd5fe04..584df770e52 100644 --- a/idea/testData/quickfix/addExclExclCall/typeMismatch/assignmentRValue.kt +++ b/idea/testData/quickfix/addExclExclCall/typeMismatch/assignmentRValue.kt @@ -1,7 +1,5 @@ // "Add non-null asserted (!!) call" "true" -fun test() { - val s: String? = null - val z: String = s -} -// TODO: Enable when FIR reports TYPE_MISMATCH for assignments -/* IGNORE_FIR */ +fun test(s: String?) { + var z: String = "" + z = s +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/typeMismatch/assignmentRValue.kt.after b/idea/testData/quickfix/addExclExclCall/typeMismatch/assignmentRValue.kt.after index c799da27992..daef7cb5d6e 100644 --- a/idea/testData/quickfix/addExclExclCall/typeMismatch/assignmentRValue.kt.after +++ b/idea/testData/quickfix/addExclExclCall/typeMismatch/assignmentRValue.kt.after @@ -1,7 +1,5 @@ // "Add non-null asserted (!!) call" "true" -fun test() { - val s: String? = null - val z: String = s!! -} -// TODO: Enable when FIR reports TYPE_MISMATCH for assignments -/* IGNORE_FIR */ +fun test(s: String?) { + var z: String = "" + z = s!! +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/typeMismatch/initializer.kt b/idea/testData/quickfix/addExclExclCall/typeMismatch/initializer.kt new file mode 100644 index 00000000000..fc672c4ab7f --- /dev/null +++ b/idea/testData/quickfix/addExclExclCall/typeMismatch/initializer.kt @@ -0,0 +1,4 @@ +// "Add non-null asserted (!!) call" "true" +fun test(s: String?) { + val z: String = s +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/typeMismatch/initializer.kt.after b/idea/testData/quickfix/addExclExclCall/typeMismatch/initializer.kt.after new file mode 100644 index 00000000000..1113251ff32 --- /dev/null +++ b/idea/testData/quickfix/addExclExclCall/typeMismatch/initializer.kt.after @@ -0,0 +1,4 @@ +// "Add non-null asserted (!!) call" "true" +fun test(s: String?) { + val z: String = s!! +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsAssignmentRValue.kt b/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsAssignmentRValue.kt index a544a022cb9..8da6e31ef40 100644 --- a/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsAssignmentRValue.kt +++ b/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsAssignmentRValue.kt @@ -5,7 +5,6 @@ class C { // Test for KTIJ-10052 fun C.test() { - val z: String = s -} -// TODO: Enable when FIR reports TYPE_MISMATCH for assignments -/* IGNORE_FIR */ + var z: String = "" + z = s +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsAssignmentRValue.kt.after b/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsAssignmentRValue.kt.after index 0d0f94a3d03..fd1852259b7 100644 --- a/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsAssignmentRValue.kt.after +++ b/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsAssignmentRValue.kt.after @@ -5,7 +5,6 @@ class C { // Test for KTIJ-10052 fun C.test() { - val z: String = s!! -} -// TODO: Enable when FIR reports TYPE_MISMATCH for assignments -/* IGNORE_FIR */ + var z: String = "" + z = s!! +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsInitializer.kt b/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsInitializer.kt new file mode 100644 index 00000000000..2a5b42d1dde --- /dev/null +++ b/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsInitializer.kt @@ -0,0 +1,9 @@ +// "Add non-null asserted (!!) call" "true" +class C { + val s: String? = null +} + +// Test for KTIJ-10052 +fun C.test() { + var z: String = s +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsInitializer.kt.after b/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsInitializer.kt.after new file mode 100644 index 00000000000..62c6cd22e7d --- /dev/null +++ b/idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsInitializer.kt.after @@ -0,0 +1,9 @@ +// "Add non-null asserted (!!) call" "true" +class C { + val s: String? = null +} + +// Test for KTIJ-10052 +fun C.test() { + var z: String = s!! +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 4d52a3b7e40..c8dfc143316 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -774,6 +774,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/addExclExclCall/typeMismatch/assignmentRValue.kt"); } + @TestMetadata("initializer.kt") + public void testInitializer() throws Exception { + runTest("idea/testData/quickfix/addExclExclCall/typeMismatch/initializer.kt"); + } + @TestMetadata("memberAccessInExtension.kt") public void testMemberAccessInExtension() throws Exception { runTest("idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtension.kt"); @@ -784,6 +789,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsAssignmentRValue.kt"); } + @TestMetadata("memberAccessInExtensionAsInitializer.kt") + public void testMemberAccessInExtensionAsInitializer() throws Exception { + runTest("idea/testData/quickfix/addExclExclCall/typeMismatch/memberAccessInExtensionAsInitializer.kt"); + } + @TestMetadata("nullArgument.kt") public void testNullArgument() throws Exception { runTest("idea/testData/quickfix/addExclExclCall/typeMismatch/nullArgument.kt");