From a1a4663b73c62bd74781de62986ff720672732b2 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 17 Apr 2018 15:05:45 +0700 Subject: [PATCH] CollectMigration: support toUnmodifiableMap Fixes IDEA-187213 Stream API migration: support Java 10 toUnmodifiableList/Set/Map collections --- .../streamMigration/CollectMigration.java | 20 +++++++++---- .../java10/afterUnmodifiableJava10.java | 13 ++++++++ .../java10/beforeUnmodifiableJava10.java | 30 +++++++++++++++++++ 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/streamMigration/CollectMigration.java b/java/java-impl/src/com/intellij/codeInspection/streamMigration/CollectMigration.java index b6ac8bf8f359..39ea0f3dc737 100644 --- a/java/java-impl/src/com/intellij/codeInspection/streamMigration/CollectMigration.java +++ b/java/java-impl/src/com/intellij/codeInspection/streamMigration/CollectMigration.java @@ -586,6 +586,10 @@ class CollectMigration extends BaseStreamApiMigration { @Override public String generateTerminal(CommentTracker ct, boolean strictMode) { + return generateTerminal(ct, "toMap"); + } + + public String generateTerminal(CommentTracker ct, final String collectorName) { PsiExpression[] args = myMapUpdateCall.getArgumentList().getExpressions(); LOG.assertTrue(args.length >= 2); String methodName = myMapUpdateCall.getMethodExpression().getReferenceName(); @@ -609,14 +613,14 @@ class CollectMigration extends BaseStreamApiMigration { default: return null; } - StringBuilder collector = new StringBuilder(".collect(" + CommonClassNames.JAVA_UTIL_STREAM_COLLECTORS + ".toMap("); + StringBuilder collector = new StringBuilder(".collect(" + CommonClassNames.JAVA_UTIL_STREAM_COLLECTORS + "." + collectorName + "("); collector.append(ct.lambdaText(myElementVariable, args[0])).append(',') .append(ct.lambdaText(myElementVariable, args[1])).append(',') .append(merger); PsiLocalVariable variable = Objects.requireNonNull(getTargetVariable()); PsiExpression initializer = variable.getInitializer(); LOG.assertTrue(initializer != null); - if (!isHashMap(variable)) { + if ("toMap".equals(collectorName) && !isHashMap(variable)) { collector.append(",()->").append(ct.text(initializer)); } collector.append("))"); @@ -885,12 +889,13 @@ class CollectMigration extends BaseStreamApiMigration { private static final Map TYPE_TO_UNMODIFIABLE_WRAPPER = EntryStream.of( CommonClassNames.JAVA_UTIL_ARRAY_LIST, "toUnmodifiableList", "java.util.LinkedList", "toUnmodifiableList", - CommonClassNames.JAVA_UTIL_HASH_SET, "toUnmodifiableSet" + CommonClassNames.JAVA_UTIL_HASH_SET, "toUnmodifiableSet", + CommonClassNames.JAVA_UTIL_HASH_MAP, "toUnmodifiableMap" ).toMap(); - private static final CallMatcher UNMODIFIABLE_WRAPPER = - CallMatcher.staticCall(CommonClassNames.JAVA_UTIL_COLLECTIONS, "unmodifiableList", "unmodifiableSet", "unmodifiableCollection") - .parameterCount(1); + private static final CallMatcher UNMODIFIABLE_WRAPPER = CallMatcher.staticCall( + CommonClassNames.JAVA_UTIL_COLLECTIONS, + "unmodifiableList", "unmodifiableSet", "unmodifiableCollection", "unmodifiableMap").parameterCount(1); private static final CallMatcher STREAM_COLLECT = CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_STREAM_STREAM, "collect").parameterTypes("java.util.stream.Collector"); @@ -911,6 +916,9 @@ class CollectMigration extends BaseStreamApiMigration { @Override public String generateTerminal(CommentTracker ct, boolean strictMode) { + if (myUpstream instanceof ToMapTerminal) { + return ((ToMapTerminal)myUpstream).generateTerminal(ct, myUnmodifiableCollector); + } return ".collect(" + CommonClassNames.JAVA_UTIL_STREAM_COLLECTORS + "." + myUnmodifiableCollector + "())"; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/afterUnmodifiableJava10.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/afterUnmodifiableJava10.java index 15b74f8ae0b3..909bfceffa67 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/afterUnmodifiableJava10.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/afterUnmodifiableJava10.java @@ -20,4 +20,17 @@ class Test { // toUnmodifiableSet will not preserve order; not suggested here return Collections.unmodifiableSet(result); } + + Map map(List input) { + return input.stream().filter(s -> !s.isEmpty()).collect(Collectors.toUnmodifiableMap(s -> s, s -> s.length(), (a, b) -> b)); + } + + Map map1(List input) { + Map result = input.stream().filter(s -> !s.isEmpty()).collect(Collectors.toMap(s -> s, String::length, (a, b) -> b, TreeMap::new)); + return Collections.unmodifiableMap(result); + } + + Map map2(int[] input) { + return Arrays.stream(input).filter(s -> s > 0).boxed().collect(Collectors.toUnmodifiableMap(s -> String.valueOf(s), s -> s, (a, b) -> b)); + } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/beforeUnmodifiableJava10.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/beforeUnmodifiableJava10.java index 35f402e9dec5..e86548dac139 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/beforeUnmodifiableJava10.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/beforeUnmodifiableJava10.java @@ -47,4 +47,34 @@ class Test { // toUnmodifiableSet will not preserve order; not suggested here return Collections.unmodifiableSet(result); } + + Map map(List input) { + Map result = new HashMap<>(100); + for (String s : input) { + if (!s.isEmpty()) { + result.put(s, s.length()); + } + } + return Collections.unmodifiableMap(result); + } + + Map map1(List input) { + Map result = new TreeMap<>(); + for (String s : input) { + if (!s.isEmpty()) { + result.put(s, s.length()); + } + } + return Collections.unmodifiableMap(result); + } + + Map map2(int[] input) { + Map result = new HashMap<>(); + for (int s : input) { + if (s > 0) { + result.put(String.valueOf(s), s); + } + } + return Collections.unmodifiableMap(result); + } } \ No newline at end of file