From f9bef68e1043fa40fd50668504e2fce6b6fd2731 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Mon, 4 Apr 2016 19:03:25 +0200 Subject: [PATCH] Fix handling of nullable types in LetImplementInterfaceFix #KT-11404 --- .../idea/quickfix/LetImplementInterfaceFix.kt | 8 ++++++-- .../letClassImplementInterfaceNullable.kt | 13 +++++++++++++ .../letClassImplementInterfaceNullable.kt.after | 13 +++++++++++++ .../kotlin/idea/quickfix/QuickFixTestGenerated.java | 7 +++++++ 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 idea/testData/quickfix/typeMismatch/letClassImplementInterfaceNullable.kt create mode 100644 idea/testData/quickfix/typeMismatch/letClassImplementInterfaceNullable.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/LetImplementInterfaceFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/LetImplementInterfaceFix.kt index f0e398c0c01..fd8f1ff7031 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/LetImplementInterfaceFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/LetImplementInterfaceFix.kt @@ -38,15 +38,19 @@ class LetImplementInterfaceFix( private fun KotlinType.renderShort() = IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(this) - private val expectedTypeName = expectedType.renderShort() + private val expectedTypeName: String - private val expectedTypeNameSourceCode = IdeDescriptorRenderers.SOURCE_CODE.renderType(expectedType) + private val expectedTypeNameSourceCode: String private val prefix: String private val validExpectedType: Boolean init { + val expectedTypeNotNullable = TypeUtils.makeNotNullable(expectedType) + expectedTypeName = expectedTypeNotNullable.renderShort() + expectedTypeNameSourceCode = IdeDescriptorRenderers.SOURCE_CODE.renderType(expectedTypeNotNullable) + val verb = if (expressionType.isInterface()) "extend" else "implement" prefix = "Let '${expressionType.renderShort()}' $verb" diff --git a/idea/testData/quickfix/typeMismatch/letClassImplementInterfaceNullable.kt b/idea/testData/quickfix/typeMismatch/letClassImplementInterfaceNullable.kt new file mode 100644 index 00000000000..6588a23f1fd --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/letClassImplementInterfaceNullable.kt @@ -0,0 +1,13 @@ +// "Let 'B' implement interface 'A'" "true" +package let.implement + +fun bar() { + foo(B()) +} + + +fun foo(a: A?) { +} + +interface A +class B \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/letClassImplementInterfaceNullable.kt.after b/idea/testData/quickfix/typeMismatch/letClassImplementInterfaceNullable.kt.after new file mode 100644 index 00000000000..392ba2b65af --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/letClassImplementInterfaceNullable.kt.after @@ -0,0 +1,13 @@ +// "Let 'B' implement interface 'A'" "true" +package let.implement + +fun bar() { + foo(B()) +} + + +fun foo(a: A?) { +} + +interface A +class B : A \ 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 fe3e728c4bd..b4384fed0a7 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -7366,6 +7366,13 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("letClassImplementInterfaceNullable.kt") + public void testLetClassImplementInterfaceNullable() throws Exception { + String fileName = + KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/letClassImplementInterfaceNullable.kt"); + doTest(fileName); + } + @TestMetadata("letInterfaceExtendInterface.kt") public void testLetInterfaceExtendInterface() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/letInterfaceExtendInterface.kt");