From 96cf01152f352cb1fa76417a5d039f68e789972e Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 27 Dec 2016 13:58:09 +0700 Subject: [PATCH] StreamToLoop/ToPrimitiveArrayTerminalOperation: reassign final array making it possible to reuse existing variable --- .../streamToLoop/TerminalOperation.java | 4 +-- .../streamToLoop/afterToPrimitiveArray.java | 3 ++- .../afterToPrimitiveArraySortedAssign.java | 27 +++++++++++++++++++ .../beforeToPrimitiveArraySortedAssign.java | 15 +++++++++++ 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterToPrimitiveArraySortedAssign.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeToPrimitiveArraySortedAssign.java diff --git a/java/java-impl/src/com/intellij/codeInspection/streamToLoop/TerminalOperation.java b/java/java-impl/src/com/intellij/codeInspection/streamToLoop/TerminalOperation.java index b52d07a61f3b..cfeba71ca357 100644 --- a/java/java-impl/src/com/intellij/codeInspection/streamToLoop/TerminalOperation.java +++ b/java/java-impl/src/com/intellij/codeInspection/streamToLoop/TerminalOperation.java @@ -449,9 +449,9 @@ abstract class TerminalOperation extends Operation { @Override String generate(StreamVariable inVar, StreamToLoopReplacementContext context) { - String arr = context.declareResult("arr", myType + "[]", "new " + myType + "[10]", ResultKind.UNKNOWN); + String arr = context.declareResult("arr", myType + "[]", "new " + myType + "[10]", ResultKind.NON_FINAL); String count = context.declare("count", "int", "0"); - context.setFinisher("java.util.Arrays.copyOfRange("+arr+",0,"+count+")"); + context.addAfterStep(arr + "=java.util.Arrays.copyOfRange(" + arr + ",0," + count + ");\n"); return "if(" + arr + ".length==" + count + ") " + arr + "=java.util.Arrays.copyOf(" + arr + "," + count + "*2);\n" + arr + "[" + count + "++]=" + inVar + ";\n"; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterToPrimitiveArray.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterToPrimitiveArray.java index 600f42597393..52af11869fc4 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterToPrimitiveArray.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterToPrimitiveArray.java @@ -13,7 +13,8 @@ public class Main { arr[count++] = x; } } - return Arrays.copyOfRange(arr, 0, count); + arr = Arrays.copyOfRange(arr, 0, count); + return arr; } public static void main(String[] args) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterToPrimitiveArraySortedAssign.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterToPrimitiveArraySortedAssign.java new file mode 100644 index 000000000000..02c24c10355b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/afterToPrimitiveArraySortedAssign.java @@ -0,0 +1,27 @@ +// "Replace Stream API chain with loop" "true" + +import java.util.*; + +public class Main { + public int[] testPrimitive(List list) { + List toSort = new ArrayList<>(); + for (String s : list) { + toSort.add(s); + } + toSort.sort(null); + int[] ints = new int[10]; + int count = 0; + for (String s : toSort) { + int length = s.length(); + if (ints.length == count) ints = Arrays.copyOf(ints, count * 2); + ints[count++] = length; + } + ints = Arrays.copyOfRange(ints, 0, count); + return ints; + } + + public static void main(String[] args) { + System.out.println(Arrays + .toString(new Main().testPrimitive(asList("sdfg", "asd", "sdgfdsg", "adas", "asgfsgf", "werrew")))); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeToPrimitiveArraySortedAssign.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeToPrimitiveArraySortedAssign.java new file mode 100644 index 000000000000..0f9fe3377b13 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamToLoop/beforeToPrimitiveArraySortedAssign.java @@ -0,0 +1,15 @@ +// "Replace Stream API chain with loop" "true" + +import java.util.*; + +public class Main { + public int[] testPrimitive(List list) { + int[] ints = list.stream().sorted().mapToInt(String::length).toArray(); + return ints; + } + + public static void main(String[] args) { + System.out.println(Arrays + .toString(new Main().testPrimitive(asList("sdfg", "asd", "sdgfdsg", "adas", "asgfsgf", "werrew")))); + } +} \ No newline at end of file