From c149c37ac7e2f714301ea557b6d0f138ad0ccc6e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 7 Sep 2017 19:07:45 +0300 Subject: [PATCH] Do not suggest destructuring for invisible properties #KT-18665 Fixed --- .../idea/intentions/DestructureIntention.kt | 6 ++++++ .../inspectionData/expected.xml | 8 ++++++++ .../destructuringInLambda/invisible.kt | 16 ++++++++++++++++ .../intentions/destructuringInLambda/visible.kt | 11 +++++++++++ .../destructuringInLambda/visible.kt.after | 11 +++++++++++ .../idea/intentions/IntentionTestGenerated.java | 12 ++++++++++++ 6 files changed, 64 insertions(+) create mode 100644 idea/testData/intentions/destructuringInLambda/invisible.kt create mode 100644 idea/testData/intentions/destructuringInLambda/visible.kt create mode 100644 idea/testData/intentions/destructuringInLambda/visible.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/DestructureIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/DestructureIntention.kt index 6363b149f0c..198f96287ab 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/DestructureIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/DestructureIntention.kt @@ -28,8 +28,10 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator +import org.jetbrains.kotlin.idea.core.isVisible import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.incremental.components.NoLookupLocation @@ -333,6 +335,10 @@ class DestructureIntention : SelfTargetingRangeIntention( if (property != null && property.isVar) return null val descriptor = qualifiedExpression.getResolvedCall(context)?.resultingDescriptor ?: return null + if (!descriptor.isVisible(dataClassUsage, qualifiedExpression.receiverExpression, + context, dataClassUsage.containingKtFile.getResolutionFacade())) { + return null + } return SingleUsageData(descriptor = descriptor, usageToReplace = qualifiedExpression, declarationToDrop = property) } diff --git a/idea/testData/intentions/destructuringInLambda/inspectionData/expected.xml b/idea/testData/intentions/destructuringInLambda/inspectionData/expected.xml index 8bc9c151b25..de4a0a51cc0 100644 --- a/idea/testData/intentions/destructuringInLambda/inspectionData/expected.xml +++ b/idea/testData/intentions/destructuringInLambda/inspectionData/expected.xml @@ -71,4 +71,12 @@ Use destructuring declaration Use destructuring declaration + + visible.kt + 7 + light_idea_test_case + + Use destructuring declaration + Use destructuring declaration + \ No newline at end of file diff --git a/idea/testData/intentions/destructuringInLambda/invisible.kt b/idea/testData/intentions/destructuringInLambda/invisible.kt new file mode 100644 index 00000000000..41ba3a50892 --- /dev/null +++ b/idea/testData/intentions/destructuringInLambda/invisible.kt @@ -0,0 +1,16 @@ +// SKIP_ERRORS_BEFORE +// SKIP_ERRORS_AFTER +// IS_APPLICABLE: false + +fun foo(s: String) {} + +data class Example(private val str: String) { + fun doWithExample(block : (Example) -> Unit) = block(Example("hello")) + +} + +fun Example.runExample() { + doWithExample { example -> + foo(example.str) + } +} \ No newline at end of file diff --git a/idea/testData/intentions/destructuringInLambda/visible.kt b/idea/testData/intentions/destructuringInLambda/visible.kt new file mode 100644 index 00000000000..893df7fff16 --- /dev/null +++ b/idea/testData/intentions/destructuringInLambda/visible.kt @@ -0,0 +1,11 @@ +fun foo(s: String) {} + +data class Example(private val str: String) { + fun doWithExample(block : (Example) -> Unit) = block(Example("hello")) + + fun runExample() { + doWithExample { example -> + foo(example.str) + } + } +} \ No newline at end of file diff --git a/idea/testData/intentions/destructuringInLambda/visible.kt.after b/idea/testData/intentions/destructuringInLambda/visible.kt.after new file mode 100644 index 00000000000..94e02b90002 --- /dev/null +++ b/idea/testData/intentions/destructuringInLambda/visible.kt.after @@ -0,0 +1,11 @@ +fun foo(s: String) {} + +data class Example(private val str: String) { + fun doWithExample(block : (Example) -> Unit) = block(Example("hello")) + + fun runExample() { + doWithExample { (str1) -> + foo(str1) + } + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index fd087d9ce5a..8b4b54ec681 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -7985,6 +7985,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("invisible.kt") + public void testInvisible() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/destructuringInLambda/invisible.kt"); + doTest(fileName); + } + @TestMetadata("last.kt") public void testLast() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/destructuringInLambda/last.kt"); @@ -8056,6 +8062,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/destructuringInLambda/variables.kt"); doTest(fileName); } + + @TestMetadata("visible.kt") + public void testVisible() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/destructuringInLambda/visible.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/intentions/destructuringVariables")