From 50bf9f560ce6d3c15d2a4a7b96520cd2c38cbe81 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Wed, 12 Aug 2020 13:50:10 +0700 Subject: [inline] show "is never used" if "keep declaration" is selected #KT-40909 #KT-41022 Fixed GitOrigin-RevId: 507707b2ec34c713998d5b13e2d21ab754de38b0 --- .../AbstractKotlinInlineDeclarationProcessor.kt | 35 +++++++++++++++++----- .../inline/KotlinInlinePropertyProcessor.kt | 10 +------ .../refactoring/inline/InlineTestGenerated.java | 5 ++++ .../refactoring/inline/function/withoutUsage.kt | 3 ++ .../inline/function/withoutUsage.kt.after | 1 + .../inline/inlineVariableOrProperty/noUsages.kt | 1 - .../inlineVariableOrProperty/noUsages.kt.after | 2 ++ 7 files changed, 39 insertions(+), 18 deletions(-) create mode 100644 idea/testData/refactoring/inline/function/withoutUsage.kt create mode 100644 idea/testData/refactoring/inline/function/withoutUsage.kt.after create mode 100644 idea/testData/refactoring/inline/inlineVariableOrProperty/noUsages.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/AbstractKotlinInlineDeclarationProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/AbstractKotlinInlineDeclarationProcessor.kt index a27a6cf4a049..b0928e1a55fd 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/AbstractKotlinInlineDeclarationProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/AbstractKotlinInlineDeclarationProcessor.kt @@ -27,10 +27,12 @@ import com.intellij.refactoring.BaseRefactoringProcessor import com.intellij.refactoring.OverrideMethodsProcessor import com.intellij.refactoring.RefactoringBundle import com.intellij.refactoring.inline.GenericInlineHandler +import com.intellij.refactoring.util.CommonRefactoringUtil import com.intellij.usageView.UsageInfo import com.intellij.usageView.UsageViewBundle import com.intellij.usageView.UsageViewDescriptor import com.intellij.util.containers.MultiMap +import org.jetbrains.annotations.Nls import org.jetbrains.kotlin.asJava.unwrapped import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.KotlinLanguage @@ -61,9 +63,11 @@ abstract class AbstractKotlinInlineDeclarationProcessor KotlinBundle.message("text.type.alias") else -> KotlinBundle.message("text.declaration") } + @Nls private val commandName = KotlinBundle.message( "text.inlining.0.1", kind, @@ -97,12 +101,12 @@ abstract class AbstractKotlinInlineDeclarationProcessor, conflicts: MultiMap): Boolean = true + open fun additionalPreprocessUsages(usages: Array, conflicts: MultiMap) = Unit final override fun preprocessUsages(refUsages: Ref>): Boolean { val usagesInfo = refUsages.get() val conflicts = MultiMap() - if (!additionalPreprocessUsages(usagesInfo, conflicts)) return false + additionalPreprocessUsages(usagesInfo, conflicts) if (deleteAfter) { for (superDeclaration in findSuperMethodsNoWrapping(declaration)) { @@ -123,7 +127,27 @@ abstract class AbstractKotlinInlineDeclarationProcessor) { + if (usages.isEmpty()) { + if (!deleteAfter) { + val message = KotlinBundle.message("0.1.is.never.used", kind.capitalize(), declaration.name.toString()) + CommonRefactoringUtil.showErrorHint(myProject, editor, message, commandName, null) + } else { + postActions() + } + + return + } + val replacementStrategy = createReplacementStrategy() ?: return val (kotlinReferenceUsages, nonKotlinReferenceUsages) = usages.partition { it !is OverrideUsageInfo && it.element is KtReferenceExpression } @@ -144,12 +168,7 @@ abstract class AbstractKotlinInlineDeclarationProcessor, conflicts: MultiMap): Boolean { - if (usages.isEmpty()) { - val message = KotlinBundle.message("0.1.is.never.used", kind.capitalize(), declaration.name.toString()) - KotlinInlinePropertyHandler.showErrorHint(myProject, editor, message) - return false - } - + override fun additionalPreprocessUsages(usages: Array, conflicts: MultiMap) { val initializer by lazy { extractInitialization(declaration).initializerOrNull?.assignment?.left } for (usage in usages) { val expression = usage.element?.writeOrReadWriteExpression ?: continue @@ -75,8 +69,6 @@ class KotlinInlinePropertyProcessor( conflicts.putValue(expression, KotlinBundle.message("unsupported.usage.0", expression.parent.text)) } } - - return true } class Initializer(val value: KtExpression, val assignment: KtBinaryExpression?) diff --git a/idea/test/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java b/idea/test/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java index 4a3fd3da920f..b75a810f7472 100644 --- a/idea/test/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java +++ b/idea/test/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java @@ -239,6 +239,11 @@ public class InlineTestGenerated extends AbstractInlineTest { runTest("testData/refactoring/inline/function/UnitReturnType4.kt"); } + @TestMetadata("withoutUsage.kt") + public void testWithoutUsage() throws Exception { + runTest("testData/refactoring/inline/function/withoutUsage.kt"); + } + @RunWith(JUnit3RunnerWithInners.class) @TestMetadata("testData/refactoring/inline/function/expressionBody") public static class ExpressionBody extends AbstractInlineTest { diff --git a/idea/testData/refactoring/inline/function/withoutUsage.kt b/idea/testData/refactoring/inline/function/withoutUsage.kt new file mode 100644 index 000000000000..eec228c4f8d0 --- /dev/null +++ b/idea/testData/refactoring/inline/function/withoutUsage.kt @@ -0,0 +1,3 @@ +fun a() { + +} diff --git a/idea/testData/refactoring/inline/function/withoutUsage.kt.after b/idea/testData/refactoring/inline/function/withoutUsage.kt.after new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/idea/testData/refactoring/inline/function/withoutUsage.kt.after @@ -0,0 +1 @@ + diff --git a/idea/testData/refactoring/inline/inlineVariableOrProperty/noUsages.kt b/idea/testData/refactoring/inline/inlineVariableOrProperty/noUsages.kt index ae00ff298beb..4b7aea1df445 100644 --- a/idea/testData/refactoring/inline/inlineVariableOrProperty/noUsages.kt +++ b/idea/testData/refactoring/inline/inlineVariableOrProperty/noUsages.kt @@ -1,4 +1,3 @@ -// ERROR: Local variable 'a' is never used fun foo() { val a = 1 + 2 } \ No newline at end of file diff --git a/idea/testData/refactoring/inline/inlineVariableOrProperty/noUsages.kt.after b/idea/testData/refactoring/inline/inlineVariableOrProperty/noUsages.kt.after new file mode 100644 index 000000000000..661f3c98cd71 --- /dev/null +++ b/idea/testData/refactoring/inline/inlineVariableOrProperty/noUsages.kt.after @@ -0,0 +1,2 @@ +fun foo() { +} -- cgit v1.2.3