IG: introduce convenience methods and cleanup

This commit is contained in:
Bas Leijdekkers
2017-06-10 18:52:15 +02:00
parent cf0338516f
commit 5fffff7b2c
4 changed files with 69 additions and 70 deletions
@@ -59,6 +59,10 @@ public class UnusedSymbolUtil {
return false;
}
public static boolean isImplicitRead(@NotNull PsiVariable variable) {
return isImplicitRead(variable.getProject(), variable, null);
}
public static boolean isImplicitRead(@NotNull Project project, @NotNull PsiVariable element, @Nullable ProgressIndicator progress) {
for(ImplicitUsageProvider provider: Extensions.getExtensions(ImplicitUsageProvider.EP_NAME)) {
checkCanceled(progress);
@@ -69,6 +73,10 @@ public class UnusedSymbolUtil {
return isInjected(project, element);
}
public static boolean isImplicitWrite(@NotNull PsiVariable variable) {
return isImplicitWrite(variable.getProject(), variable, null);
}
public static boolean isImplicitWrite(@NotNull Project project,
@NotNull PsiVariable element,
@Nullable ProgressIndicator progress) {
@@ -93,7 +93,7 @@ public class MismatchedArrayReadWriteInspection extends BaseInspection {
final ArrayReadWriteVisitor visitor = new ArrayReadWriteVisitor(field, !isZeroSizeArrayExpression(field.getInitializer()));
containingClass.accept(visitor);
final boolean written = visitor.isWritten();
if (!visitor.isReferenced() || written == visitor.isRead() || UnusedSymbolUtil.isImplicitWrite(field.getProject(), field, null)) {
if (!visitor.isReferenced() || written == visitor.isRead() || UnusedSymbolUtil.isImplicitWrite(field)) {
return;
}
registerFieldError(field, Boolean.valueOf(written));
@@ -39,8 +39,8 @@ import java.util.HashSet;
import java.util.Set;
public class MismatchedCollectionQueryUpdateInspectionBase extends BaseInspection {
private static final Set<String> QUERY_EXCLUDES = Collections.singleton("java.util.Collections");
private static final Set<String> UPDATE_EXCLUDES = new HashSet<>(CollectionUtils.getAllCollectionNames());
static final Set<String> QUERY_EXCLUDES = Collections.singleton("java.util.Collections");
static final Set<String> UPDATE_EXCLUDES = new HashSet<>(CollectionUtils.getAllCollectionNames());
static {
UPDATE_EXCLUDES.add("java.util.Collections");
}
@@ -57,7 +57,7 @@ public class MismatchedCollectionQueryUpdateInspectionBase extends BaseInspectio
@SuppressWarnings("PublicField")
public final ExternalizableStringSet ignoredClasses = new ExternalizableStringSet();
private static boolean isEmptyCollectionInitializer(PsiExpression initializer) {
static boolean isEmptyCollectionInitializer(PsiExpression initializer) {
if (!(initializer instanceof PsiNewExpression)) {
return ConstructionUtils.isEmptyCollectionInitializer(initializer);
}
@@ -82,12 +82,6 @@ public class MismatchedCollectionQueryUpdateInspectionBase extends BaseInspectio
return true;
}
private static boolean collectionQueriedByAssignment(@NotNull PsiVariable variable, @NotNull PsiElement context) {
final CollectionQueriedByAssignmentVisitor visitor = new CollectionQueriedByAssignmentVisitor(variable);
context.accept(visitor);
return visitor.mayBeQueried();
}
@Pattern(VALID_ID_PATTERN)
@Override
@NotNull
@@ -132,7 +126,7 @@ public class MismatchedCollectionQueryUpdateInspectionBase extends BaseInspectio
private boolean mayBeQueried;
@NotNull private final PsiVariable variable;
private CollectionQueriedByAssignmentVisitor(@NotNull PsiVariable variable) {
CollectionQueriedByAssignmentVisitor(@NotNull PsiVariable variable) {
this.variable = variable;
}
@@ -187,7 +181,7 @@ public class MismatchedCollectionQueryUpdateInspectionBase extends BaseInspectio
mayBeQueried = true;
}
private boolean mayBeQueried() {
boolean mayBeQueried() {
return mayBeQueried;
}
}
@@ -206,7 +200,7 @@ public class MismatchedCollectionQueryUpdateInspectionBase extends BaseInspectio
}
final boolean written = collectionContentsAreUpdated(field, containingClass);
final boolean read = collectionContentsAreQueried(field, containingClass);
if (read == written || UnusedSymbolUtil.isImplicitWrite(field.getProject(), field, null)) {
if (read == written || UnusedSymbolUtil.isImplicitWrite(field)) {
return;
}
registerFieldError(field, Boolean.valueOf(written));
@@ -295,6 +289,12 @@ public class MismatchedCollectionQueryUpdateInspectionBase extends BaseInspectio
context.accept(visitor);
return visitor.isQueriedUpdated();
}
private boolean collectionQueriedByAssignment(@NotNull PsiVariable variable, @NotNull PsiElement context) {
final CollectionQueriedByAssignmentVisitor visitor = new CollectionQueriedByAssignmentVisitor(variable);
context.accept(visitor);
return visitor.mayBeQueried();
}
}
private static class QueryCallProcessor implements Processor<PsiCall> {
@@ -1,5 +1,5 @@
/*
* Copyright 2011-2014 Bas Leijdekkers
* Copyright 2011-2017 Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ import java.util.Set;
public class MismatchedStringBuilderQueryUpdateInspection extends BaseInspection {
@NonNls
private static final Set<String> returnSelfNames =
static final Set<String> returnSelfNames =
ContainerUtil.set("append", "appendCodePoint", "delete", "deleteCharAt", "insert", "replace", "reverse");
@Pattern(VALID_ID_PATTERN)
@@ -93,9 +93,9 @@ public class MismatchedStringBuilderQueryUpdateInspection extends BaseInspection
if (!checkVariable(field, containingClass)) {
return;
}
final boolean queried = stringBuilderContentsAreQueried(field, containingClass);
final boolean updated = stringBuilderContentsAreUpdated(field, containingClass);
if (queried == updated || UnusedSymbolUtil.isImplicitWrite(field.getProject(), field, null)) {
final boolean queried = isStringBuilderQueried(field, containingClass);
final boolean updated = isStringBuilderUpdated(field, containingClass);
if (queried == updated || UnusedSymbolUtil.isImplicitWrite(field)) {
return;
}
registerFieldError(field, Boolean.valueOf(updated), field.getType());
@@ -108,8 +108,8 @@ public class MismatchedStringBuilderQueryUpdateInspection extends BaseInspection
if (!checkVariable(variable, codeBlock)) {
return;
}
final boolean queried = stringBuilderContentsAreQueried(variable, codeBlock);
final boolean updated = stringBuilderContentsAreUpdated(variable, codeBlock);
final boolean queried = isStringBuilderQueried(variable, codeBlock);
final boolean updated = isStringBuilderUpdated(variable, codeBlock);
if (queried == updated) {
return;
}
@@ -141,26 +141,23 @@ public class MismatchedStringBuilderQueryUpdateInspection extends BaseInspection
return !VariableAccessUtils.variableIsUsedInArrayInitializer(variable, context);
}
private static boolean stringBuilderContentsAreUpdated(
PsiVariable variable, PsiElement context) {
private static boolean isStringBuilderUpdated(PsiVariable variable, PsiElement context) {
final PsiExpression initializer = variable.getInitializer();
if (initializer != null && !ConstructionUtils.isEmptyStringBuilderInitializer(initializer)) {
return true;
}
return isStringBuilderUpdated(variable, context);
final StringBuilderUpdateCalledVisitor visitor = new StringBuilderUpdateCalledVisitor(variable);
context.accept(visitor);
return visitor.isUpdated();
}
private static boolean stringBuilderContentsAreQueried(PsiVariable variable, PsiElement context) {
return isStringBuilderQueried(variable, context);
private static boolean isStringBuilderQueried(PsiVariable variable, PsiElement context) {
final StringBuilderQueryCalledVisitor visitor = new StringBuilderQueryCalledVisitor(variable);
context.accept(visitor);
return visitor.isQueried();
}
}
public static boolean isStringBuilderUpdated(PsiVariable variable, PsiElement context) {
final StringBuilderUpdateCalledVisitor visitor = new StringBuilderUpdateCalledVisitor(variable);
context.accept(visitor);
return visitor.isUpdated();
}
private static class StringBuilderUpdateCalledVisitor extends JavaRecursiveElementWalkingVisitor {
@NonNls
private static final Set<String> updateNames =
@@ -201,12 +198,6 @@ public class MismatchedStringBuilderQueryUpdateInspection extends BaseInspection
}
}
private static boolean isStringBuilderQueried(PsiVariable variable, PsiElement context) {
final StringBuilderQueryCalledVisitor visitor = new StringBuilderQueryCalledVisitor(variable);
context.accept(visitor);
return visitor.isQueried();
}
private static class StringBuilderQueryCalledVisitor extends JavaRecursiveElementWalkingVisitor {
@NonNls
private static final Set<String> queryNames = ContainerUtil
@@ -216,7 +207,7 @@ public class MismatchedStringBuilderQueryUpdateInspection extends BaseInspection
private final PsiVariable variable;
private boolean queried;
private StringBuilderQueryCalledVisitor(PsiVariable variable) {
StringBuilderQueryCalledVisitor(PsiVariable variable) {
this.variable = variable;
}
@@ -286,44 +277,44 @@ public class MismatchedStringBuilderQueryUpdateInspection extends BaseInspection
return !"getChars".equals(methodExpression.getReferenceName()) &&
ExpressionUtils.isReferenceTo(methodExpression.getQualifierExpression(), variable);
}
}
private static boolean isVariableValueUsed(PsiExpression expression) {
final PsiElement parent = expression.getParent();
if (parent instanceof PsiParenthesizedExpression) {
final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)parent;
return isVariableValueUsed(parenthesizedExpression);
}
if (parent instanceof PsiTypeCastExpression) {
final PsiTypeCastExpression typeCastExpression = (PsiTypeCastExpression)parent;
return isVariableValueUsed(typeCastExpression);
}
if (parent instanceof PsiReturnStatement) {
return true;
}
if (parent instanceof PsiExpressionList) {
final PsiElement grandParent = parent.getParent();
if (grandParent instanceof PsiMethodCallExpression) {
private static boolean isVariableValueUsed(PsiExpression expression) {
final PsiElement parent = expression.getParent();
if (parent instanceof PsiParenthesizedExpression) {
final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)parent;
return isVariableValueUsed(parenthesizedExpression);
}
if (parent instanceof PsiTypeCastExpression) {
final PsiTypeCastExpression typeCastExpression = (PsiTypeCastExpression)parent;
return isVariableValueUsed(typeCastExpression);
}
if (parent instanceof PsiReturnStatement) {
return true;
}
if (parent instanceof PsiExpressionList) {
final PsiElement grandParent = parent.getParent();
if (grandParent instanceof PsiMethodCallExpression) {
return true;
}
}
else if (parent instanceof PsiArrayInitializerExpression) {
return true;
}
else if (parent instanceof PsiAssignmentExpression) {
final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)parent;
final PsiExpression rhs = assignmentExpression.getRExpression();
return expression.equals(rhs);
}
else if (parent instanceof PsiVariable) {
final PsiVariable variable = (PsiVariable)parent;
final PsiExpression initializer = variable.getInitializer();
return expression.equals(initializer);
}
return false;
}
else if (parent instanceof PsiArrayInitializerExpression) {
return true;
}
else if (parent instanceof PsiAssignmentExpression) {
final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)parent;
final PsiExpression rhs = assignmentExpression.getRExpression();
return expression.equals(rhs);
}
else if (parent instanceof PsiVariable) {
final PsiVariable variable = (PsiVariable)parent;
final PsiExpression initializer = variable.getInitializer();
return expression.equals(initializer);
}
return false;
}
private static boolean hasReferenceToVariable(PsiVariable variable, PsiElement element) {
static boolean hasReferenceToVariable(PsiVariable variable, PsiElement element) {
if (element instanceof PsiReferenceExpression) {
final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)element;
return referenceExpression.isReferenceTo(variable);