IDEA-168203 Follow-up: do not suggest if initializer may throw checked exception or accesses non-final variable

This commit is contained in:
Tagir Valeev
2017-02-17 12:47:39 +07:00
parent 86b7bcfe0a
commit b8c9f1a1e0
3 changed files with 29 additions and 3 deletions
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInspection.streamMigration;
import com.intellij.codeInspection.util.LambdaGenerationUtil;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
@@ -174,6 +175,13 @@ class CollectMigration extends BaseStreamApiMigration {
}
}
@Contract("null -> false")
static boolean hasLambdaCompatibleEmptyInitializer(@Nullable PsiLocalVariable target) {
return target != null &&
ConstructionUtils.isEmptyCollectionInitializer(target.getInitializer()) &&
LambdaGenerationUtil.canBeUncheckedLambda(target.getInitializer());
}
static boolean isUsedOutsideOf(PsiVariable collectionVariable, Collection<PsiElement> allowedParents) {
return !ReferencesSearch.search(collectionVariable)
.forEach(ref -> {
@@ -240,7 +248,7 @@ class CollectMigration extends BaseStreamApiMigration {
PsiMethodCallExpression addCall,
PsiLoopStatement loop,
InitializerUsageStatus status) {
super(target, loop, ConstructionUtils.isEmptyCollectionInitializer(target.getInitializer()) ? status : ControlFlowUtils.InitializerUsageStatus.UNKNOWN);
super(target, loop, hasLambdaCompatibleEmptyInitializer(target) ? status : ControlFlowUtils.InitializerUsageStatus.UNKNOWN);
myTargetType = target.getType();
myInitializer = target.getInitializer();
myElement = element;
@@ -445,7 +453,7 @@ class CollectMigration extends BaseStreamApiMigration {
PsiExpression body = LambdaUtil.extractSingleExpressionFromBody(lambda.getBody());
if (ConstructionUtils.isEmptyCollectionInitializer(body)) {
PsiLocalVariable variable = extractQualifierVariable(tb, qualifierCall);
if (variable != null && ConstructionUtils.isEmptyCollectionInitializer(variable.getInitializer())) {
if (hasLambdaCompatibleEmptyInitializer(variable)) {
PsiType mapType = variable.getType();
PsiType valueType = PsiUtil.substituteTypeParameter(mapType, CommonClassNames.JAVA_UTIL_MAP, 1, false);
if (valueType == null) return null;
@@ -519,7 +527,7 @@ class CollectMigration extends BaseStreamApiMigration {
return null;
}
PsiLocalVariable variable = extractQualifierVariable(tb, call);
if (variable == null || !ConstructionUtils.isEmptyCollectionInitializer(variable.getInitializer())) return null;
if (!hasLambdaCompatibleEmptyInitializer(variable)) return null;
InitializerUsageStatus status = getInitializerUsageStatus(variable, tb.getMainLoop());
return new ToMapTerminal(call, tb.getVariable(), variable, tb.getMainLoop(), status);
}
@@ -16,6 +16,13 @@ public class Test {
ArrayList<String> result3 = new ArrayList<>(input);
input.stream().filter(s -> !s.isEmpty()).forEach(result3::add);
System.out.println(result3);
// Non-final var used in initializer
int size = 5;
if(size < input.size()) size = input.size();
List<String> result4 = new ArrayList<>(size);
input.stream().filter(s -> !s.isEmpty()).forEach(result4::add);
System.out.println(result4);
}
void testSet(List<String> input) {
@@ -29,6 +29,17 @@ public class Test {
}
}
System.out.println(result3);
// Non-final var used in initializer
int size = 5;
if(size < input.size()) size = input.size();
List<String> result4 = new ArrayList<>(size);
for (String s : input) {
if(!s.isEmpty()) {
result4.add(s);
}
}
System.out.println(result4);
}
void testSet(List<String> input) {