From ded996bdf7c0bcb40fdc46964c110e28a2777ef4 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Tue, 24 Mar 2020 17:01:51 +0900 Subject: [PATCH] PlatformExtensionReceiverOfInline: fix false positive with extension function with nullable type receiver #KT-37256 Fixed --- .../PlatformExtensionReceiverOfInlineInspection.kt | 3 ++- .../NullableReceiverType/NullableReceiverType.iml | 11 +++++++++++ .../before/NullableReceiverType/src/JavaFoo.java | 5 +++++ .../before/NullableReceiverType/src/Test.kt | 8 ++++++++ .../before/ToBoolean/src/Test.kt | 2 ++ .../platformExtensionReceiverOfInline.test | 2 +- 6 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/NullableReceiverType/NullableReceiverType.iml create mode 100644 idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/NullableReceiverType/src/JavaFoo.java create mode 100644 idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/NullableReceiverType/src/Test.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/PlatformExtensionReceiverOfInlineInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/PlatformExtensionReceiverOfInlineInspection.kt index 792413010c8..3dd80a3bab1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/PlatformExtensionReceiverOfInlineInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/PlatformExtensionReceiverOfInlineInspection.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.isNullabilityFlexible +import org.jetbrains.kotlin.types.isNullable import java.awt.BorderLayout import java.util.regex.PatternSyntaxException import javax.swing.JPanel @@ -68,7 +69,7 @@ class PlatformExtensionReceiverOfInlineInspection : AbstractKotlinInspection() { val extensionReceiverType = resolvedCall.extensionReceiver?.type ?: return if (!extensionReceiverType.isNullabilityFlexible()) return val descriptor = resolvedCall.resultingDescriptor as? FunctionDescriptor ?: return - if (!descriptor.isInline) return + if (!descriptor.isInline || descriptor.extensionReceiverParameter?.type?.isNullable() == true) return val receiverExpression = expression.receiverExpression val dataFlowValueFactory = receiverExpression.getResolutionFacade().getFrontendService(DataFlowValueFactory::class.java) diff --git a/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/NullableReceiverType/NullableReceiverType.iml b/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/NullableReceiverType/NullableReceiverType.iml new file mode 100644 index 00000000000..c90834f2d60 --- /dev/null +++ b/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/NullableReceiverType/NullableReceiverType.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/NullableReceiverType/src/JavaFoo.java b/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/NullableReceiverType/src/JavaFoo.java new file mode 100644 index 00000000000..e9112e4007f --- /dev/null +++ b/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/NullableReceiverType/src/JavaFoo.java @@ -0,0 +1,5 @@ +public class JavaFoo { + public static String foo() { + return null; + } +} \ No newline at end of file diff --git a/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/NullableReceiverType/src/Test.kt b/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/NullableReceiverType/src/Test.kt new file mode 100644 index 00000000000..5917ebc4cbb --- /dev/null +++ b/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/NullableReceiverType/src/Test.kt @@ -0,0 +1,8 @@ +inline fun String?.contentToByte(): Byte { + return 0 +} + +fun main() { + JavaFoo.foo().toBoolean() + JavaFoo.foo().contentToByte() +} \ No newline at end of file diff --git a/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/ToBoolean/src/Test.kt b/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/ToBoolean/src/Test.kt index 7f1c5c4b5ce..c3c5c5b4e5b 100644 --- a/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/ToBoolean/src/Test.kt +++ b/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/before/ToBoolean/src/Test.kt @@ -13,6 +13,8 @@ fun test() { } } +inline fun String.toBoolean(): Boolean = true + fun String.contentNotInline() {} class My { diff --git a/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/platformExtensionReceiverOfInline.test b/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/platformExtensionReceiverOfInline.test index a689a9f467d..68ab9060c14 100644 --- a/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/platformExtensionReceiverOfInline.test +++ b/idea/testData/multiFileInspections/platformExtensionReceiverOfInline/platformExtensionReceiverOfInline.test @@ -1,5 +1,5 @@ { "inspectionClass": "org.jetbrains.kotlin.idea.inspections.PlatformExtensionReceiverOfInlineInspection", "withRuntime": "true", - "isMultiModule": "false" + "isMultiModule": "true" } \ No newline at end of file