diff --git a/java/java-analysis-impl/src/messages/QuickFixBundle.properties b/java/java-analysis-impl/src/messages/QuickFixBundle.properties index 8dfaaecdb5a6..47064e105a5c 100644 --- a/java/java-analysis-impl/src/messages/QuickFixBundle.properties +++ b/java/java-analysis-impl/src/messages/QuickFixBundle.properties @@ -88,7 +88,7 @@ create.getter.for.field=Create getter for ''{0}'' create.setter.for.field=Create setter for ''{0}'' create.getter.and.setter.for.field=Create getter and setter for ''{0}'' create.local.from.usage.family=Create Local from Usage -create.local.from.instanceof.usage.family=Create Local Var from instanceof Usage +create.local.from.instanceof.usage.family=Create local variable from instanceof usage create.local.from.instanceof.usage.text=Insert ''({0}){1}'' declaration create.member.from.usage.family=Create member from usage create.method.from.usage.family=Create method from usage diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateLocalVarFromInstanceofAction.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateLocalVarFromInstanceofAction.java index 472b1fc0c86a..c21b5e197726 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateLocalVarFromInstanceofAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateLocalVarFromInstanceofAction.java @@ -19,20 +19,21 @@ import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; -import com.intellij.psi.codeStyle.SuggestedNameInfo; +import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.refactoring.JavaRefactoringSettings; -import com.intellij.refactoring.introduceVariable.IntroduceVariableBase; import com.intellij.refactoring.util.RefactoringChangeUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.ArrayUtilRt; import com.intellij.util.IncorrectOperationException; import com.siyeh.ig.psiutils.EquivalenceChecker; +import com.siyeh.ig.psiutils.VariableNameGenerator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.Objects; /** @@ -198,18 +199,18 @@ public class CreateLocalVarFromInstanceofAction extends BaseIntentionAction { PsiLocalVariable localVariable = (PsiLocalVariable)decl.getDeclaredElements()[0]; PsiExpression initializer = Objects.requireNonNull(localVariable.getInitializer()); - SuggestedNameInfo nameInfo = IntroduceVariableBase.getSuggestedName(localVariable.getType(), initializer, initializer); - String defaultName = ArrayUtil.getFirstElement(nameInfo.names); + List names = new VariableNameGenerator(initializer, VariableKind.LOCAL_VARIABLE).byExpression(initializer) + .byType(localVariable.getType()).generateAll(true); PsiIdentifier identifier = Objects.requireNonNull(localVariable.getNameIdentifier()); - if (defaultName != null) { - identifier = (PsiIdentifier)identifier.replace(JavaPsiFacade.getElementFactory(project).createIdentifier(defaultName)); + if (!file.isPhysical()) { + identifier.replace(JavaPsiFacade.getElementFactory(project).createIdentifier(names.get(0))); + return; } - if (!file.isPhysical()) return; TemplateBuilderImpl builder = new TemplateBuilderImpl(localVariable); builder.setEndVariableAfter(localVariable.getNameIdentifier()); - Template template = generateTemplate(project, nameInfo); + Template template = generateTemplate(project, names); Editor newEditor = CreateFromUsageBaseFix.positionCursor(project, file, identifier); if (newEditor == null) return; TextRange range = localVariable.getNameIdentifier().getTextRange(); @@ -454,14 +455,15 @@ public class CreateLocalVarFromInstanceofAction extends BaseIntentionAction { return element instanceof PsiPrefixExpression && ((PsiPrefixExpression)element).getOperationTokenType() == JavaTokenType.EXCL; } - private static Template generateTemplate(Project project, SuggestedNameInfo suggestedNameInfo) { + private static Template generateTemplate(Project project, List names) { final TemplateManager templateManager = TemplateManager.getInstance(project); final Template template = templateManager.createTemplate("", ""); template.setToReformat(true); - final Result result = suggestedNameInfo.names.length == 0 ? null : new TextResult(suggestedNameInfo.names[0]); + final Result result = new TextResult(names.get(0)); - Expression expr = new ConstantNode(result).withLookupStrings(suggestedNameInfo.names.length > 1 ? suggestedNameInfo.names : ArrayUtilRt.EMPTY_STRING_ARRAY); + Expression expr = new ConstantNode(result).withLookupStrings( + names.size() > 1 ? ArrayUtil.toStringArray(names) : ArrayUtilRt.EMPTY_STRING_ARRAY); template.addVariable("", expr, expr, true); return template; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/after8.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/after8.java index 59f4c170448c..ccb36e7c2b8c 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/after8.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/after8.java @@ -2,7 +2,7 @@ class C { void f(Object o) { if (o instanceof String) { - String o1 = (String) o; + String s = (String) o; o = ""; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterBrokenCode.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterBrokenCode.java index 70ed92c84641..ff8609142f5a 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterBrokenCode.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterBrokenCode.java @@ -2,7 +2,7 @@ class X { void foo(Object o) { if (o instanceof String) { - String o1 = (String) o; + String s = (String) o; String substring = o.(); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterFormatting.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterFormatting.java index 316614ce5f2e..cb6c2fefcea3 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterFormatting.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterFormatting.java @@ -4,7 +4,7 @@ import java.io.IOException; class C { void f(Object o) { if (o instanceof IOException) { - IOException o1 = (IOException) o; + IOException ioException = (IOException) o; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterInSimpleMethod.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterInSimpleMethod.java index 736a9b129d83..f4477b22bed5 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterInSimpleMethod.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterInSimpleMethod.java @@ -2,7 +2,7 @@ public abstract class A { public void getNodeElements(Object parent) { if (!(parent instanceof NodeInfo)) return; - NodeInfo parent1 = (NodeInfo) parent; + NodeInfo nodeInfo = (NodeInfo) parent; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterInsertInEmptyLine.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterInsertInEmptyLine.java index 01151e51479f..117e4497f9de 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterInsertInEmptyLine.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterInsertInEmptyLine.java @@ -4,7 +4,7 @@ class X { if (o instanceof String) { String a; String b; - String o1 = (String) o; + String s = (String) o; String c; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterIntersection.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterIntersection.java index 8a125441c98c..019f14148c47 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterIntersection.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterIntersection.java @@ -2,7 +2,7 @@ class C { void f(Object o, Object f) { if (o instanceof String && f == null) { - String o1 = (String) o; + String s = (String) o; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterLineEndComment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterLineEndComment.java index 913734c870ff..58b0c5dc7611 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterLineEndComment.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterLineEndComment.java @@ -2,7 +2,7 @@ class C { void f(Object o, Object f) { if (o instanceof String) {//todo comment - String o1 = (String) o; + String s = (String) o; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterOnRef.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterOnRef.java index 6e95eeaa9c2b..c80764d3564d 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterOnRef.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterOnRef.java @@ -2,7 +2,7 @@ class C { void f(Object o) { if (o instanceof Runnable) { - Runnable o1 = (Runnable) o; + Runnable runnable = (Runnable) o; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterShadowField.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterShadowField.java index 96aa9eaacb69..7589c9d5c349 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterShadowField.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterShadowField.java @@ -1,11 +1,11 @@ // "Insert '(String)x' declaration" "true" class C { - Object x = new Object(); + Object s = new Object(); void x() { if (x instanceof String) { - String x = (String) this.x; + String s1 = (String) x; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/beforeShadowField.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/beforeShadowField.java index c20e7f9291ee..4590474cead0 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/beforeShadowField.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/beforeShadowField.java @@ -1,7 +1,7 @@ // "Insert '(String)x' declaration" "true" class C { - Object x = new Object(); + Object s = new Object(); void x() { if (x instanceof String) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableNameGenerator.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableNameGenerator.java index dbf9bc7ae7af..edd21a5c0e6c 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableNameGenerator.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableNameGenerator.java @@ -11,10 +11,7 @@ import com.intellij.psi.codeStyle.VariableKind; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.Set; +import java.util.*; /** * A convenience helper class to generate unique name for new variable. To use it, call several by* methods in chain, then call @@ -109,4 +106,17 @@ public final class VariableNameGenerator { } return suffixed; } + + @NotNull + public List generateAll(boolean lookForward) { + List suffixed = new ArrayList<>(); + List result = new ArrayList<>(); + for (String candidate : candidates.isEmpty() ? Collections.singleton("v") : candidates) { + String name = myManager.suggestUniqueVariableName(candidate, myContext, lookForward); + if (name.equals(candidate)) result.add(name); + else suffixed.add(name); + } + result.addAll(suffixed); + return result; + } }