diff options
author | Dmitry Gridin <dmitry.gridin@jetbrains.com> | 2020-08-12 13:50:10 +0700 |
---|---|---|
committer | kotlin-ide-monorepo-bot <kotlin-ide-monorepo-bot-no-reply@jetbrains.com> | 2020-08-12 08:05:18 +0000 |
commit | 50bf9f560ce6d3c15d2a4a7b96520cd2c38cbe81 (patch) | |
tree | 8889059d7ec4af7922128f3f56c830ce7e3add32 | |
parent | 7279c6ba393b5c5c688b36e54b3e8ec70adc518b (diff) | |
download | intellij-kotlin-50bf9f560ce6d3c15d2a4a7b96520cd2c38cbe81.tar.gz |
[inline] show "is never used" if "keep declaration" is selected
#KT-40909
#KT-41022 Fixed
GitOrigin-RevId: 507707b2ec34c713998d5b13e2d21ab754de38b0
7 files changed, 39 insertions, 18 deletions
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<TDeclaration : KtNamedDe KotlinBundle.message("text.local.variable") else KotlinBundle.message("text.local.property") + is KtTypeAlias -> 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<TDeclaration : KtNamedDe return usages.toArray(UsageInfo.EMPTY_ARRAY) } - open fun additionalPreprocessUsages(usages: Array<out UsageInfo>, conflicts: MultiMap<PsiElement, String>): Boolean = true + open fun additionalPreprocessUsages(usages: Array<out UsageInfo>, conflicts: MultiMap<PsiElement, String>) = Unit final override fun preprocessUsages(refUsages: Ref<Array<UsageInfo>>): Boolean { val usagesInfo = refUsages.get() val conflicts = MultiMap<PsiElement, String>() - if (!additionalPreprocessUsages(usagesInfo, conflicts)) return false + additionalPreprocessUsages(usagesInfo, conflicts) if (deleteAfter) { for (superDeclaration in findSuperMethodsNoWrapping(declaration)) { @@ -123,7 +127,27 @@ abstract class AbstractKotlinInlineDeclarationProcessor<TDeclaration : KtNamedDe return showConflicts(conflicts, usagesInfo) } + private fun postActions() { + if (deleteAfter) { + declaration.deleteWithCompanion() + postDeleteAction() + } + + postAction() + } + override fun performRefactoring(usages: Array<out UsageInfo>) { + 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<TDeclaration : KtNamedDe myProject, commandName ) { - if (deleteAfter) { - declaration.deleteWithCompanion() - postDeleteAction() - } - - postAction() + postActions() } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlinePropertyProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlinePropertyProcessor.kt index 9e17514a8fa2..e55ed2f55ff7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlinePropertyProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlinePropertyProcessor.kt @@ -61,13 +61,7 @@ class KotlinInlinePropertyProcessor( statementToDelete?.delete() } - override fun additionalPreprocessUsages(usages: Array<out UsageInfo>, conflicts: MultiMap<PsiElement, String>): 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<out UsageInfo>, conflicts: MultiMap<PsiElement, String>) { 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 <caret>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 <caret>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() { +} |