From f36d4710f1c9dd28c9b84421e6e508f8afd91ade Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 28 Feb 2017 13:05:21 +0700 Subject: [PATCH] Java9CollectionFactoryInspection: add type argument if necessary --- .../Java9CollectionFactoryInspection.java | 25 +++++++++++++++++-- .../afterArrayListAsList.java | 2 +- .../afterArrayListDoubleBrace.java | 2 +- .../afterArrayListExplicit.java | 2 +- .../java9CollectionFactory/afterAsList.java | 2 +- .../afterAsListArray.java | 8 ++++++ .../afterHashMap10.java | 2 +- .../afterHashMapSimple.java | 2 +- .../afterHashSetAsList.java | 2 +- .../afterHashSetDoubleBrace.java | 2 +- .../afterHashSetExplicit.java | 2 +- .../afterHashSetExplicitReusedVar.java | 2 +- .../afterStreamToList.java | 2 +- .../afterStreamToSet.java | 2 +- .../beforeAsListArray.java | 8 ++++++ 15 files changed, 51 insertions(+), 14 deletions(-) create mode 100644 java/java-tests/testData/inspection/java9CollectionFactory/afterAsListArray.java create mode 100644 java/java-tests/testData/inspection/java9CollectionFactory/beforeAsListArray.java diff --git a/java/java-impl/src/com/intellij/codeInspection/java19api/Java9CollectionFactoryInspection.java b/java/java-impl/src/com/intellij/codeInspection/java19api/Java9CollectionFactoryInspection.java index 256bd8f24d6c..549c8eeb5f6c 100644 --- a/java/java-impl/src/com/intellij/codeInspection/java19api/Java9CollectionFactoryInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/java19api/Java9CollectionFactoryInspection.java @@ -22,6 +22,7 @@ import com.intellij.openapi.project.Project; import com.intellij.profile.codeInspection.InspectionProjectProfileManager; import com.intellij.psi.*; import com.intellij.psi.controlFlow.DefUseUtil; +import com.intellij.psi.impl.PsiDiamondTypeUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.containers.ContainerUtil; @@ -305,10 +306,30 @@ public class Java9CollectionFactoryInspection extends BaseLocalInspectionTool { if(call == null) return; PrepopulatedCollectionModel model = MAPPER.mapFirst(call); if(model == null) return; + String typeArgument = getTypeArguments(call.getType(), model.myType); CommentTracker ct = new CommentTracker(); model.myElementsToDelete.forEach(ct::delete); - ct.replaceAndRestoreComments(call, StreamEx.of(model.myContent).map(ct::text) - .joining(",", "java.util." + model.myType + ".of(", ")")); + PsiElement replacement = ct.replaceAndRestoreComments(call, StreamEx.of(model.myContent).map(ct::text) + .joining(",", "java.util." + model.myType + "." + typeArgument + "of(", ")")); + PsiDiamondTypeUtil.removeRedundantTypeArguments(replacement); + } + + @NotNull + private static String getTypeArguments(PsiType type, String typeName) { + if (typeName.equals("Map")) { + PsiType keyType = PsiUtil.substituteTypeParameter(type, CommonClassNames.JAVA_UTIL_MAP, 0, false); + PsiType valueType = PsiUtil.substituteTypeParameter(type, CommonClassNames.JAVA_UTIL_MAP, 1, false); + if (keyType != null && valueType != null) { + return "<" + keyType.getCanonicalText() + "," + valueType.getCanonicalText() + ">"; + } + } + else { + PsiType elementType = PsiUtil.substituteTypeParameter(type, CommonClassNames.JAVA_UTIL_COLLECTION, 0, false); + if (elementType != null) { + return "<" + elementType.getCanonicalText() + ">"; + } + } + return ""; } } } diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/afterArrayListAsList.java b/java/java-tests/testData/inspection/java9CollectionFactory/afterArrayListAsList.java index 760dd9493d8d..05242c299274 100644 --- a/java/java-tests/testData/inspection/java9CollectionFactory/afterArrayListAsList.java +++ b/java/java-tests/testData/inspection/java9CollectionFactory/afterArrayListAsList.java @@ -5,5 +5,5 @@ import java.util.Collections; import java.util.List; public class Test { - public static final List EVEN = List.of(2, 4, 6, 8, 10); + public static final List EVEN = List.of(2, 4, 6, 8, 10); } diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/afterArrayListDoubleBrace.java b/java/java-tests/testData/inspection/java9CollectionFactory/afterArrayListDoubleBrace.java index c9d8eba623d6..aef70fd2cdea 100644 --- a/java/java-tests/testData/inspection/java9CollectionFactory/afterArrayListDoubleBrace.java +++ b/java/java-tests/testData/inspection/java9CollectionFactory/afterArrayListDoubleBrace.java @@ -4,5 +4,5 @@ import java.util.Collections; import java.util.List; public class Test { - public static final List EVEN = List.of(0, 2, 4, 6, 8); + public static final List EVEN = List.of(0, 2, 4, 6, 8); } diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/afterArrayListExplicit.java b/java/java-tests/testData/inspection/java9CollectionFactory/afterArrayListExplicit.java index 29e332c90bcc..d1188ed732b6 100644 --- a/java/java-tests/testData/inspection/java9CollectionFactory/afterArrayListExplicit.java +++ b/java/java-tests/testData/inspection/java9CollectionFactory/afterArrayListExplicit.java @@ -4,7 +4,7 @@ import java.util.*; public class Test { public void testList() { List list; - list = List.of(1, 2); + list = List.of(1, 2); System.out.println(list); } } diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/afterAsList.java b/java/java-tests/testData/inspection/java9CollectionFactory/afterAsList.java index 29392eb96ab9..4758a7891608 100644 --- a/java/java-tests/testData/inspection/java9CollectionFactory/afterAsList.java +++ b/java/java-tests/testData/inspection/java9CollectionFactory/afterAsList.java @@ -4,5 +4,5 @@ import java.util.Collections; import java.util.List; public class Test { - public static final List EVEN = List.of(2, 4, 6, 8, 10, 2); + public static final List EVEN = List.of(2, 4, 6, 8, 10, 2); } diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/afterAsListArray.java b/java/java-tests/testData/inspection/java9CollectionFactory/afterAsListArray.java new file mode 100644 index 000000000000..9eb02845b901 --- /dev/null +++ b/java/java-tests/testData/inspection/java9CollectionFactory/afterAsListArray.java @@ -0,0 +1,8 @@ +// "Replace with 'List.of' call" "true" +import java.util.*; + +public class Test { + public void test() { + List list = List.of(new String[]{"aaa"}); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/afterHashMap10.java b/java/java-tests/testData/inspection/java9CollectionFactory/afterHashMap10.java index 8a084000a148..530e4ae759a1 100644 --- a/java/java-tests/testData/inspection/java9CollectionFactory/afterHashMap10.java +++ b/java/java-tests/testData/inspection/java9CollectionFactory/afterHashMap10.java @@ -4,6 +4,6 @@ import java.util.*; public class Test { public void test() { Map myMap; - myMap = Map.of("a", "1", "b", "1", "c", "1", "d", "1", "e", "1", "f", "1", "g", "1", "h", "1", "i", "1", "j", "1"); + myMap = Map.of("a", "1", "b", "1", "c", "1", "d", "1", "e", "1", "f", "1", "g", "1", "h", "1", "i", "1", "j", "1"); } } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/afterHashMapSimple.java b/java/java-tests/testData/inspection/java9CollectionFactory/afterHashMapSimple.java index a5dcd1da34d4..02f6e2e80d3c 100644 --- a/java/java-tests/testData/inspection/java9CollectionFactory/afterHashMapSimple.java +++ b/java/java-tests/testData/inspection/java9CollectionFactory/afterHashMapSimple.java @@ -4,6 +4,6 @@ import java.util.*; public class Test { public void test() { Map myMap; - myMap = Map.of("a", "b", "c", "b"); + myMap = Map.of("a", "b", "c", "b"); } } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetAsList.java b/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetAsList.java index 7f2c1ffa5879..f5d47c8a7bf5 100644 --- a/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetAsList.java +++ b/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetAsList.java @@ -5,5 +5,5 @@ import java.util.HashSet; import java.util.Set; public class Test { - public static final Set MY_SET = Set.of("a", "b", "c", Math.random() > 0.5 ? "d" : Math.random() > 0.5 ? "e" : "d"); + public static final Set MY_SET = Set.of("a", "b", "c", Math.random() > 0.5 ? "d" : Math.random() > 0.5 ? "e" : "d"); } diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetDoubleBrace.java b/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetDoubleBrace.java index 307b38126b1b..2fa360827e1d 100644 --- a/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetDoubleBrace.java +++ b/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetDoubleBrace.java @@ -4,5 +4,5 @@ import java.util.HashSet; import java.util.Set; public class Test { - public static final Set MY_SET = Set.of("a", "b", "c".toUpperCase()); + public static final Set MY_SET = Set.of("a", "b", "c".toUpperCase()); } diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetExplicit.java b/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetExplicit.java index 81b7dd158366..0144d22d3fb3 100644 --- a/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetExplicit.java +++ b/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetExplicit.java @@ -6,6 +6,6 @@ public class Test { static { Set set; - MY_SET = Set.of("foo", "bar", "xyz"); + MY_SET = Set.of("foo", "bar", "xyz"); } } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetExplicitReusedVar.java b/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetExplicitReusedVar.java index 31d4eb7e0032..8d990faece92 100644 --- a/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetExplicitReusedVar.java +++ b/java/java-tests/testData/inspection/java9CollectionFactory/afterHashSetExplicitReusedVar.java @@ -4,7 +4,7 @@ import java.util.*; public class Test { public void test2() { Set set; - set = Set.of("foo", "bar", "xyz"); + set = Set.of("foo", "bar", "xyz"); System.out.println(set); } } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/afterStreamToList.java b/java/java-tests/testData/inspection/java9CollectionFactory/afterStreamToList.java index 704e3a80dfa0..b865779c4db6 100644 --- a/java/java-tests/testData/inspection/java9CollectionFactory/afterStreamToList.java +++ b/java/java-tests/testData/inspection/java9CollectionFactory/afterStreamToList.java @@ -5,5 +5,5 @@ import java.util.stream.Collectors; import java.util.stream.Stream; public class Test { - public static final List> MY_LIST = List.of(String.class, int.class, Object.class); + public static final List> MY_LIST = List.>of(String.class, int.class, Object.class); } diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/afterStreamToSet.java b/java/java-tests/testData/inspection/java9CollectionFactory/afterStreamToSet.java index 343895844464..79c8990dae50 100644 --- a/java/java-tests/testData/inspection/java9CollectionFactory/afterStreamToSet.java +++ b/java/java-tests/testData/inspection/java9CollectionFactory/afterStreamToSet.java @@ -5,5 +5,5 @@ import java.util.stream.Collectors; import java.util.stream.Stream; public class Test { - public static final Set> MY_SET = Set.of(String.class, int.class, Object.class); + public static final Set> MY_SET = Set.>of(String.class, int.class, Object.class); } diff --git a/java/java-tests/testData/inspection/java9CollectionFactory/beforeAsListArray.java b/java/java-tests/testData/inspection/java9CollectionFactory/beforeAsListArray.java new file mode 100644 index 000000000000..8d2cba62e219 --- /dev/null +++ b/java/java-tests/testData/inspection/java9CollectionFactory/beforeAsListArray.java @@ -0,0 +1,8 @@ +// "Replace with 'List.of' call" "true" +import java.util.*; + +public class Test { + public void test() { + List list = Collections.unmodifiableList(Arrays.asList(new String[] {"aaa"})); + } +} \ No newline at end of file