CollectMigration.NewListTerminal: support Guava collection constructors (IDEA-219934)

Also remove .distinct() automatically when unnecessary.

GitOrigin-RevId: 504dd9e645f9492a4142c0793c42188912afdde9
This commit is contained in:
Tagir Valeev
2019-08-07 15:56:41 +07:00
committed by intellij-monorepo-bot
parent 67862fe347
commit 2572c79c56
5 changed files with 66 additions and 10 deletions

View File

@@ -323,8 +323,8 @@ class CollectMigration extends BaseStreamApiMigration {
else {
PsiExpression copy = JavaPsiFacade.getElementFactory(initializer.getProject())
.createExpressionFromText(ct.text(initializer), initializer);
if (copy instanceof PsiNewExpression) {
PsiExpressionList argumentList = ((PsiNewExpression)copy).getArgumentList();
if (copy instanceof PsiCallExpression && ConstructionUtils.isPrepopulatedCollectionInitializer(copy)) {
PsiExpressionList argumentList = ((PsiCallExpression)copy).getArgumentList();
if (argumentList != null) {
PsiExpression arg = ArrayUtil.getFirstElement(argumentList.getExpressions());
if (arg != null && !(arg.getType() instanceof PsiPrimitiveType)) {
@@ -850,7 +850,7 @@ class CollectMigration extends BaseStreamApiMigration {
NewListTerminal(CollectTerminal upstream,
PsiLocalVariable variable,
String intermediate,
PsiNewExpression newListExpression,
PsiCallExpression newListExpression,
PsiType resultType) {
super(upstream, variable, intermediate, newListExpression);
myResultType = resultType;
@@ -863,8 +863,11 @@ class CollectMigration extends BaseStreamApiMigration {
@Override
StreamEx<String> fusedElements() {
PsiJavaCodeReferenceElement reference = ((PsiNewExpression)myCreateExpression).getClassReference();
return myUpstream.fusedElements().append(Objects.requireNonNull(reference).getReferenceName());
if (myCreateExpression instanceof PsiNewExpression) {
PsiJavaCodeReferenceElement reference = ((PsiNewExpression)myCreateExpression).getClassReference();
return myUpstream.fusedElements().append(Objects.requireNonNull(reference).getReferenceName());
}
return myUpstream.fusedElements().append(((PsiMethodCallExpression)myCreateExpression).getMethodExpression().getReferenceName());
}
@Nullable
@@ -875,14 +878,19 @@ class CollectMigration extends BaseStreamApiMigration {
WrapperCandidate candidate = WrapperCandidate.tryExtract(terminal, element);
if (candidate == null) return null;
if (!(candidate.myCandidate instanceof PsiNewExpression)) return null;
if (!InheritanceUtil.isInheritor(candidate.myType, CommonClassNames.JAVA_UTIL_COLLECTION)) return null;
PsiNewExpression newExpression = (PsiNewExpression)candidate.myCandidate;
PsiExpressionList argumentList = newExpression.getArgumentList();
if (!(candidate.myCandidate instanceof PsiCallExpression)) return null;
PsiClass targetClass = PsiUtil.resolveClassInClassTypeOnly(candidate.myCandidate.getType());
if (!InheritanceUtil.isInheritor(targetClass, CommonClassNames.JAVA_UTIL_COLLECTION)) return null;
PsiCallExpression callExpression = (PsiCallExpression)candidate.myCandidate;
if (!ConstructionUtils.isPrepopulatedCollectionInitializer(callExpression)) return null;
if (CommonClassNames.JAVA_UTIL_HASH_SET.equals(targetClass.getQualifiedName()) && intermediateSteps.equals(".distinct()")) {
intermediateSteps = "";
}
PsiExpressionList argumentList = callExpression.getArgumentList();
if (argumentList == null) return null;
PsiExpression[] args = argumentList.getExpressions();
if (args.length != 1 || !terminal.isTargetReference(args[0])) return null;
return new NewListTerminal(terminal, candidate.myVar, intermediateSteps, newExpression, candidate.myType);
return new NewListTerminal(terminal, candidate.myVar, intermediateSteps, callExpression, candidate.myType);
}
}

View File

@@ -0,0 +1,9 @@
// "Fuse HashSet into the Stream API chain" "true"
import java.util.*;
import java.util.stream.*;
class X {
void foo(Stream<String> s) {
Set<String> set = s.collect(Collectors.toSet());
}
}

View File

@@ -0,0 +1,15 @@
// "Fuse newHashSet into the Stream API chain" "true"
package com.google.common.collect;
import java.util.*;
import java.util.stream.*;
class X {
void foo(Stream<String> s) {
Set<String> set = s.collect(Collectors.toSet());
}
}
class Sets {
public static native <E> HashSet<E> newHashSet(Iterable<? extends E> var0);
}

View File

@@ -0,0 +1,9 @@
// "Fuse HashSet into the Stream API chain" "true"
import java.util.*;
import java.util.stream.*;
class X {
void foo(Stream<String> s) {
Set<String> set = new HashSet<>(s.co<caret>llect(Collectors.toSet()));
}
}

View File

@@ -0,0 +1,15 @@
// "Fuse newHashSet into the Stream API chain" "true"
package com.google.common.collect;
import java.util.*;
import java.util.stream.*;
class X {
void foo(Stream<String> s) {
Set<String> set = Sets.newHashSet(s.co<caret>llect(Collectors.toSet()));
}
}
class Sets {
public static native <E> HashSet<E> newHashSet(Iterable<? extends E> var0);
}