From 4ed027a1fe071f3f3d1a7ba60df8782d9185f784 Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Wed, 29 Nov 2017 12:59:41 +0300 Subject: [PATCH] Java: Inline redundant returned variable after moving 'return' (IDEA-182669) --- ...urnSeparatedFromComputationInspection.java | 90 ++++++++++++++++++- .../afterDoWhileTrue.java | 3 +- .../afterElseIfThis.java | 10 +++ .../afterElseIfUnary.java | 10 +++ .../afterExprInitManyAssignments.java | 16 ++++ .../afterFinalField.java | 10 +++ .../afterForWithoutCondition.java | 1 - .../afterGenericTypeCompatible.java | 3 +- .../afterIfElseThrow.java | 1 - .../afterIfElseWriteInBoth.java | 1 - .../afterIfElseWriteInElse.java | 3 +- .../afterIfElseWriteInIf.java | 3 +- .../afterIfThrowElse.java | 1 - .../afterIfTryCatch.java | 3 +- .../afterIncrementedParameter.java | 9 ++ .../afterInitExprOneUsage.java | 10 +++ .../afterInitExprThreeUsages.java | 13 +++ .../afterInitExprTwoUsages.java | 10 +++ .../afterLabeledFor.java | 3 +- .../afterLabeledFor3.java | 3 +- .../afterLabeledIf.java | 3 +- .../afterNestedBlock.java | 1 - .../afterNestedIf.java | 3 +- .../afterNestedIfInnerElse.java | 3 +- .../afterNestedIfOuterElse.java | 3 +- .../afterNonFinalField.java | 10 +++ .../afterNonReturnUsage.java | 9 ++ .../afterReturnOutsideTryWithResources.java | 1 - .../afterSimpleDoWhile.java | 3 +- .../afterSimpleFor.java | 3 +- .../afterSimpleForeach.java | 3 +- .../afterSimpleIf.java | 3 +- .../afterSimpleIfDefaultValueParameter.java | 3 +- .../afterSimpleWhile.java | 3 +- .../afterSwitch1.java | 3 +- .../afterSwitch2.java | 3 +- .../afterSwitch3.java | 1 - .../afterSwitch4.java | 3 +- .../afterSwitch5.java | 1 - .../afterTryWhile1.java | 1 - .../afterTryWhile2.java | 3 +- .../afterWhileContinue.java | 3 +- .../afterWhileTrue.java | 1 - .../beforeElseIfThis.java | 11 +++ .../beforeElseIfUnary.java | 11 +++ .../beforeExprInitManyAssignments.java | 16 ++++ .../beforeFinalField.java | 11 +++ .../beforeIncrementedParameter.java | 9 ++ .../beforeInitExprOneUsage.java | 11 +++ .../beforeInitExprThreeUsages.java | 13 +++ .../beforeInitExprTwoUsages.java | 11 +++ .../beforeNonFinalField.java | 11 +++ .../beforeNonReturnUsage.java | 9 ++ .../afterIfInLambda.java | 3 +- .../afterInferredInLambda.java | 3 +- .../afterWhileInLambda.java | 1 - 56 files changed, 333 insertions(+), 60 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterElseIfThis.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterElseIfUnary.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterExprInitManyAssignments.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterFinalField.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIncrementedParameter.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterInitExprOneUsage.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterInitExprThreeUsages.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterInitExprTwoUsages.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNonFinalField.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNonReturnUsage.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeElseIfThis.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeElseIfUnary.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeExprInitManyAssignments.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeFinalField.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeIncrementedParameter.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeInitExprOneUsage.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeInitExprThreeUsages.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeInitExprTwoUsages.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeNonFinalField.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeNonReturnUsage.java diff --git a/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java b/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java index 0f0c02110160..f83a02c282e4 100644 --- a/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/intermediaryVariable/ReturnSeparatedFromComputationInspection.java @@ -6,13 +6,19 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.controlFlow.*; +import com.intellij.psi.search.LocalSearchScope; +import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTypesUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.util.RefactoringUtil; +import com.intellij.util.Query; import com.siyeh.ig.psiutils.CommentTracker; import com.siyeh.ig.psiutils.ExpressionUtils; +import com.siyeh.ig.psiutils.SideEffectChecker; import gnu.trove.THashMap; import gnu.trove.THashSet; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,6 +34,9 @@ public class ReturnSeparatedFromComputationInspection extends AbstractBaseJavaLo @NotNull @Override public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { + if (!(holder.getFile() instanceof PsiJavaFile)) { + return PsiElementVisitor.EMPTY_VISITOR; + } return new JavaElementVisitor() { @Override public void visitReturnStatement(PsiReturnStatement returnStatement) { @@ -177,11 +186,90 @@ public class ReturnSeparatedFromComputationInspection extends AbstractBaseJavaLo boolean removeReturn = mover.moveTo(context.refactoredStatement, true); if (!mover.isEmpty()) { applyChanges(mover, context, removeReturn); + + deleteRedundantVariable(context); } } } } + private static void deleteRedundantVariable(@NotNull ReturnContext context) { + PsiExpression value = PsiUtil.skipParenthesizedExprDown(context.returnedVariable.getInitializer()); + if (value != null && SideEffectChecker.mayHaveSideEffects(value)) { + return; + } + boolean isConstant = value instanceof PsiLiteralExpression || value instanceof PsiThisExpression || PsiUtil.isConstantExpression(value); + boolean isSimple = isSimpleExpression(value); + + if (value != null && !isConstant) { + List references = findAnyReferences(value); + for (PsiReferenceExpression reference : references) { + if (isModifiedInScope(reference, context.variableScope)) { + return; + } + } + } + Query query = ReferencesSearch.search(context.returnedVariable, new LocalSearchScope(context.variableScope)); + Collection usages = query.findAll(); + for (PsiReference usage : usages) { + PsiElement parent = PsiTreeUtil.skipParentsOfType(usage.getElement(), + PsiParenthesizedExpression.class, PsiTypeCastExpression.class); + if (!(parent instanceof PsiReturnStatement)) { + return; + } + } + boolean isSingleUsage = value != null && usages.size() == 1; + if (isSimple || isSingleUsage) { + for (PsiReference usage : usages) { + usage.getElement().replace(value); + } + } + if (isSimple || isSingleUsage || usages.isEmpty()) { + context.returnedVariable.delete(); + } + } + + @Contract("null -> false") + private static boolean isSimpleExpression(PsiExpression expression) { + if (expression instanceof PsiReferenceExpression) { + return ((PsiReferenceExpression)expression).resolve() instanceof PsiVariable; + } + if (expression instanceof PsiUnaryExpression) { + return ((PsiUnaryExpression)expression).getOperand() instanceof PsiLiteralExpression; // "-1" and "!true" + } + return expression instanceof PsiLiteralExpression || + expression instanceof PsiThisExpression || + expression instanceof PsiClassObjectAccessExpression; + } + + @NotNull + private static List findAnyReferences(@NotNull PsiElement element) { + List references = new ArrayList<>(); + element.accept(new JavaRecursiveElementWalkingVisitor() { + @Override + public void visitReferenceExpression(PsiReferenceExpression expression) { + references.add(expression); + super.visitReferenceExpression(expression); + } + }); + return references; + } + + private static boolean isModifiedInScope(@NotNull PsiReferenceExpression reference, @NotNull PsiElement scope) { + PsiElement resolved = reference.resolve(); + if (resolved instanceof PsiVariable) { + PsiVariable variable = (PsiVariable)resolved; + if (variable.hasModifierProperty(PsiModifier.FINAL)) { + return false; + } + if (!(variable instanceof PsiLocalVariable) && !(variable instanceof PsiParameter)) { + return true; + } + return RefactoringUtil.isModifiedInScope(variable, scope); + } + return false; + } + private static void applyChanges(@NotNull Mover mover, @NotNull ReturnContext context, boolean removeReturn) { mover.insertBefore.forEach(e -> e.getParent().addBefore(context.returnStatement, e)); mover.replaceInline.forEach(e -> { @@ -517,7 +605,7 @@ public class ReturnSeparatedFromComputationInspection extends AbstractBaseJavaLo public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { PsiElement element = descriptor.getPsiElement(); if (element instanceof PsiReturnStatement) { - doApply(((PsiReturnStatement)element)); + doApply((PsiReturnStatement)element); } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterDoWhileTrue.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterDoWhileTrue.java index 88ff45206762..03fb542ad10c 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterDoWhileTrue.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterDoWhileTrue.java @@ -1,9 +1,8 @@ // "Move 'return' closer to computation of the value of 'r'" "true" class T { String f() { - String r = ""; do { - if (!hasNext()) return r; + if (!hasNext()) return ""; String s = next(); if (s != null) { return s; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterElseIfThis.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterElseIfThis.java new file mode 100644 index 000000000000..4a54bec7dba6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterElseIfThis.java @@ -0,0 +1,10 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +class T { + T f(int k) { + if (k == 1) + return new T(); + else if (k == 2) + return null; + return this; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterElseIfUnary.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterElseIfUnary.java new file mode 100644 index 000000000000..d40d8cbc9a93 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterElseIfUnary.java @@ -0,0 +1,10 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +class T { + int f(int k) { + if (k == 1) + return 1; + else if (k == 2) + return 2; + return -1; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterExprInitManyAssignments.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterExprInitManyAssignments.java new file mode 100644 index 000000000000..47807a495503 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterExprInitManyAssignments.java @@ -0,0 +1,16 @@ +// "Move 'return' closer to computation of the value of 'r'" "true" +class T { + int foo(String s) { + int r = s.length(); + if (s.isEmpty()) { + return r; + } + + String t = s.substring(1); + if (!t.isEmpty()) { + return t.length(); + } + + return r; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterFinalField.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterFinalField.java new file mode 100644 index 000000000000..78ba0b218f55 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterFinalField.java @@ -0,0 +1,10 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +class T { + final int k = 1; + + int foo() { + if (k < 0) + return -1; + return k; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterForWithoutCondition.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterForWithoutCondition.java index 3de096028497..820b72a6d308 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterForWithoutCondition.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterForWithoutCondition.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f() { - int n = -1; for(int i=0;; i++) { if (i % 127 == 0 && i % 129 == 0) { return i + 1; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterGenericTypeCompatible.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterGenericTypeCompatible.java index 8675d8200686..00f50275ae3d 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterGenericTypeCompatible.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterGenericTypeCompatible.java @@ -3,11 +3,10 @@ import java.util.*; class T { List f(boolean b) { - List raw = null; if (b) { return g(); } - return raw; + return null; } List g() { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseThrow.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseThrow.java index 33d11882b489..cc27126a1660 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseThrow.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseThrow.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(boolean b) { - int n = -1; if (b) { return 1; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseWriteInBoth.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseWriteInBoth.java index e195cb41e4ba..e35b4ae5d2f7 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseWriteInBoth.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseWriteInBoth.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(boolean b) { - int n = 0; if (b) return 1; else return 2; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseWriteInElse.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseWriteInElse.java index fd000cb5dbcb..be38a1446b4d 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseWriteInElse.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseWriteInElse.java @@ -1,9 +1,8 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(boolean b) { - int n = 0; if (b) System.out.println("yes"); else return 2; - return n; + return 0; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseWriteInIf.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseWriteInIf.java index ccfb27604e48..0ddcc1bfcf95 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseWriteInIf.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfElseWriteInIf.java @@ -1,9 +1,8 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(boolean b) { - int n = 0; if (b) return 1; else System.out.println("no"); - return n; + return 0; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfThrowElse.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfThrowElse.java index a0088e2af6b7..796488cfee58 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfThrowElse.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfThrowElse.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(boolean b) { - int n = -1; if (b) { throw new RuntimeException(); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfTryCatch.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfTryCatch.java index 869375c5bb07..87720217e7af 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfTryCatch.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIfTryCatch.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(boolean b, boolean c) { - int n = -1; if (b) { try { return g(); @@ -13,7 +12,7 @@ class T { else { return 2; } - return n; + return -1; } int g() { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIncrementedParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIncrementedParameter.java new file mode 100644 index 000000000000..9fdeae947f06 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterIncrementedParameter.java @@ -0,0 +1,9 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +class T { + int foo(int k) { + int n = k; + k++; + if (k < 0) return -1; + return n; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterInitExprOneUsage.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterInitExprOneUsage.java new file mode 100644 index 000000000000..7d89ce89279a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterInitExprOneUsage.java @@ -0,0 +1,10 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +import java.util.*; + +class T { + List foo(boolean b) { + if (b) + return null; + return new ArrayList(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterInitExprThreeUsages.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterInitExprThreeUsages.java new file mode 100644 index 000000000000..04d074d795b9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterInitExprThreeUsages.java @@ -0,0 +1,13 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +import java.util.*; + +class T { + List foo(int k) { + List n = new ArrayList(); + if (k == 1) + n = new ArrayList(1); + if (k == 2) + return new ArrayList(2); + return n; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterInitExprTwoUsages.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterInitExprTwoUsages.java new file mode 100644 index 000000000000..fe5cea410800 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterInitExprTwoUsages.java @@ -0,0 +1,10 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +import java.util.*; + +class T { + List foo(boolean b) { + if (b) + return new ArrayList(1); + return new ArrayList(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledFor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledFor.java index c1fb348ebc9b..eec272770560 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledFor.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledFor.java @@ -1,13 +1,12 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(int[] a) { - int n = -1; myLabel: for (int i = 0; i < a.length; i++) { if (a[0] == 0) { return i; } } - return n; + return -1; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledFor3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledFor3.java index 3813db0cc9cc..e494447f0fda 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledFor3.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledFor3.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(int[][] a) { - int n = -1; myLabel: for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { @@ -10,6 +9,6 @@ class T { } } } - return n; + return -1; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledIf.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledIf.java index f5c56a41fbfe..f23a53e0977f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledIf.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterLabeledIf.java @@ -1,9 +1,8 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(boolean b) { - int n = 0; myLabel: if (b) return 1; - else return n; + else return 0; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedBlock.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedBlock.java index 3284973c296d..a3b33c3204fd 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedBlock.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedBlock.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f() { - int n; { return 1; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedIf.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedIf.java index e5b51a0d65d9..1e4793ddb26f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedIf.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedIf.java @@ -1,12 +1,11 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(boolean a, boolean b) { - int n = -1; if (a) { if (b) { return 1; } } - return n; + return -1; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedIfInnerElse.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedIfInnerElse.java index 4363c7f96e01..3eb3758b35d1 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedIfInnerElse.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedIfInnerElse.java @@ -1,11 +1,10 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(boolean a, boolean b) { - int n = -1; if (a) { if (b) return 1; else return 2; } - return n; + return -1; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedIfOuterElse.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedIfOuterElse.java index a6608d0d284e..62c87cc1fe70 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedIfOuterElse.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNestedIfOuterElse.java @@ -1,11 +1,10 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(boolean a, boolean b) { - int n = -1; if (a) { if (b) return 1; } else return 2; - return n; + return -1; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNonFinalField.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNonFinalField.java new file mode 100644 index 000000000000..8ac1183a903a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNonFinalField.java @@ -0,0 +1,10 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +class T { + int k; + + int foo() { + int n = k; + if (k < 0) return -1; + return n; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNonReturnUsage.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNonReturnUsage.java new file mode 100644 index 000000000000..66f1aeef22df --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterNonReturnUsage.java @@ -0,0 +1,9 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +class T { + int foo(int k) { + int n = k; + if (n < 0) + return -1; + return n; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterReturnOutsideTryWithResources.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterReturnOutsideTryWithResources.java index bc901c8f4d3f..9bab14be58e0 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterReturnOutsideTryWithResources.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterReturnOutsideTryWithResources.java @@ -3,7 +3,6 @@ import java.io.*; class T { private static String getString() throws IOException { - String s; try (BufferedReader r = open()) { return r.readLine(); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleDoWhile.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleDoWhile.java index 50b1a447b3d8..9d6b286ac030 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleDoWhile.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleDoWhile.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'r'" "true" class T { String f(String a) { - String r = ""; int i = 0; do { int j = a.indexOf(",", i); @@ -12,7 +11,7 @@ class T { i = j + 1; } while (i >= 0); - return r; + return ""; } boolean hasNext() { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleFor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleFor.java index e83828c53d25..e62409192e34 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleFor.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleFor.java @@ -1,12 +1,11 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(int[] a, int b) { - int n = -1; for (int i = 0; i < a.length; i++) { if (a[i] == b) { return i; } } - return n; + return -1; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleForeach.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleForeach.java index b377c503ea92..9278ec38a057 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleForeach.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleForeach.java @@ -1,12 +1,11 @@ // "Move 'return' closer to computation of the value of 'r'" "true" class T { String f(String[] a) { - String r = ""; for (String s : a) { if (s != null && s.contains("@")) { return s + ":" + s.length(); } } - return r; + return ""; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleIf.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleIf.java index 2e91a94cfe9a..46312f4e4c11 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleIf.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleIf.java @@ -1,8 +1,7 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(boolean b) { - int n = 0; if (b) return 1; - return n; + return 0; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleIfDefaultValueParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleIfDefaultValueParameter.java index 3781bc15017c..99c537f7f407 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleIfDefaultValueParameter.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleIfDefaultValueParameter.java @@ -1,8 +1,7 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(boolean b, int d) { - int n = d; if (b) return 1; - return n; + return d; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleWhile.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleWhile.java index bebbffc5f9db..94f34c7ec1af 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleWhile.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSimpleWhile.java @@ -1,14 +1,13 @@ // "Move 'return' closer to computation of the value of 'r'" "true" class T { String f() { - String r = ""; while (hasNext()) { String s = next(); if (s != null) { return s; } } - return r; + return ""; } boolean hasNext() { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch1.java index 41e2a08b16d0..bf2fcd8c01fa 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch1.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch1.java @@ -1,13 +1,12 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(int a) { - int n = -1; switch (a) { case 1: return 2; case 2: return 4; } - return n; + return -1; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch2.java index 41e2a08b16d0..bf2fcd8c01fa 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch2.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch2.java @@ -1,13 +1,12 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(int a) { - int n = -1; switch (a) { case 1: return 2; case 2: return 4; } - return n; + return -1; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch3.java index f12a1758a78a..7b4f925ecfc5 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch3.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch3.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(int a) { - int n = -1; switch (a) { case 1: return 2; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch4.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch4.java index 38ec798848fa..25fba774ef74 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch4.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch4.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(int a) { - int n = -1; switch (a) { case 1: return 2; @@ -11,6 +10,6 @@ class T { return 0; case 0: } - return n; + return -1; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch5.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch5.java index f25426d4e5f7..c03d28cb7ae9 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch5.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterSwitch5.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(int a) { - int n = -1; switch (a) { case 1: return 2; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterTryWhile1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterTryWhile1.java index d09334e3b926..18bbc62b655f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterTryWhile1.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterTryWhile1.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'r'" "true" class T { String f(String p) { - String r = null; try { while (true) { String n = next(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterTryWhile2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterTryWhile2.java index 872297ef431f..7ccd6f049241 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterTryWhile2.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterTryWhile2.java @@ -1,11 +1,10 @@ // "Move 'return' closer to computation of the value of 'r'" "true" class T { String f(String p) { - String r = null; try { while (true) { String n = next(); - if (n != null) return r; + if (n != null) return null; if ("@".eqals(n)) { String t = n.toLowerCase(); if (t.equals(p)) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterWhileContinue.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterWhileContinue.java index 278cb69045a3..89801c7e47ad 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterWhileContinue.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterWhileContinue.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'n'" "true" class T { int f(int a) { - int n = -1; int t = a; while (t != null) { if (t == 1) { @@ -15,6 +14,6 @@ class T { continue; } } - return n; + return -1; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterWhileTrue.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterWhileTrue.java index a86ab1ee881a..70d1a7459839 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterWhileTrue.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/afterWhileTrue.java @@ -1,7 +1,6 @@ // "Move 'return' closer to computation of the value of 'r'" "true" class T { long f() { - long r; long s = System.currentTimeMillis(); long t = s; while (true) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeElseIfThis.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeElseIfThis.java new file mode 100644 index 000000000000..22e04db88b37 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeElseIfThis.java @@ -0,0 +1,11 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +class T { + T f(int k) { + T n = this; + if (k == 1) + n = new T(); + else if (k == 2) + n = null; + return n; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeElseIfUnary.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeElseIfUnary.java new file mode 100644 index 000000000000..d2b632a6613b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeElseIfUnary.java @@ -0,0 +1,11 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +class T { + int f(int k) { + int n = -1; + if (k == 1) + n = 1; + else if (k == 2) + n = 2; + return n; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeExprInitManyAssignments.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeExprInitManyAssignments.java new file mode 100644 index 000000000000..d0bfa524a9be --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeExprInitManyAssignments.java @@ -0,0 +1,16 @@ +// "Move 'return' closer to computation of the value of 'r'" "true" +class T { + int foo(String s) { + int r = s.length(); + if (s.isEmpty()) { + return r; + } + + String t = s.substring(1); + if (!t.isEmpty()) { + r = t.length(); + } + + return r; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeFinalField.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeFinalField.java new file mode 100644 index 000000000000..82094ef7b49d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeFinalField.java @@ -0,0 +1,11 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +class T { + final int k = 1; + + int foo() { + int n = k; + if (k < 0) + n = -1; + return n; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeIncrementedParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeIncrementedParameter.java new file mode 100644 index 000000000000..dac1eb969ab5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeIncrementedParameter.java @@ -0,0 +1,9 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +class T { + int foo(int k) { + int n = k; + k++; + if (k < 0) n = -1; + return n; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeInitExprOneUsage.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeInitExprOneUsage.java new file mode 100644 index 000000000000..a08b7c838221 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeInitExprOneUsage.java @@ -0,0 +1,11 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +import java.util.*; + +class T { + List foo(boolean b) { + List n = new ArrayList(); + if (b) + n = null; + return n; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeInitExprThreeUsages.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeInitExprThreeUsages.java new file mode 100644 index 000000000000..0534d0e8d538 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeInitExprThreeUsages.java @@ -0,0 +1,13 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +import java.util.*; + +class T { + List foo(int k) { + List n = new ArrayList(); + if (k == 1) + n = new ArrayList(1); + if (k == 2) + n = new ArrayList(2); + return n; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeInitExprTwoUsages.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeInitExprTwoUsages.java new file mode 100644 index 000000000000..6f8b27b37426 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeInitExprTwoUsages.java @@ -0,0 +1,11 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +import java.util.*; + +class T { + List foo(boolean b) { + List n = new ArrayList(); + if (b) + n = new ArrayList(1); + return n; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeNonFinalField.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeNonFinalField.java new file mode 100644 index 000000000000..589a64a58b3a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeNonFinalField.java @@ -0,0 +1,11 @@ +// "Move 'return' closer to computation of the value of 'n'" "false" +class T { + int k; + + int foo() { + int n = k; + if (k < 0) + return -1; + return n; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeNonReturnUsage.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeNonReturnUsage.java new file mode 100644 index 000000000000..bcc16a22b49f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation/beforeNonReturnUsage.java @@ -0,0 +1,9 @@ +// "Move 'return' closer to computation of the value of 'n'" "true" +class T { + int foo(int k) { + int n = k; + if (n < 0) + n = -1; + return n; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterIfInLambda.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterIfInLambda.java index a3000a616d11..99ff849ce09d 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterIfInLambda.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterIfInLambda.java @@ -5,9 +5,8 @@ class T { } void f(boolean b) { g(() -> { - int n = -1; if (b) return 1; - return n; + return -1; }); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterInferredInLambda.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterInferredInLambda.java index aa256fdb7b2a..03bda6274d62 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterInferredInLambda.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterInferredInLambda.java @@ -4,8 +4,7 @@ import java.util.stream.Stream; class T { String[] f(String[] a) { return Stream.of(a).map(s -> { - String r; - if (s.startsWith("#")) return s.substring(1); + if (s.startsWith("#")) return s.substring(1); else if (s.startsWith("//")) return s.substring(2); else return s; }).toArray(String[]::new); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterWhileInLambda.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterWhileInLambda.java index 9de9ab16d54b..5cdf16447670 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterWhileInLambda.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/returnSeparatedFromComputation8/afterWhileInLambda.java @@ -5,7 +5,6 @@ class T { } void f(boolean b) { g(() -> { - int n = -1; while (true) { if (h()) { return 1;