withstand moronically incorrect parenthesized expressions, like "Object x = ();"

This commit is contained in:
Alexey Kudravtsev
2018-12-13 14:59:00 +03:00
parent 94192e664a
commit 3bb59bface
2 changed files with 29 additions and 41 deletions
@@ -46,11 +46,9 @@ class SliceForwardUtil {
@NotNull final JavaSliceUsage parent,
@NotNull final Processor<? super SliceUsage> processor) {
PsiExpression expression = getMethodCallTarget(element);
if (expression != null) {
SliceUsage usage = SliceUtil.createSliceUsage(expression, parent, parent.getSubstitutor(), parent.indexNesting, "");
if (!processor.process(usage)) {
return false;
}
if (expression != null &&
!SliceUtil.createAndProcessSliceUsage(expression, parent, parent.getSubstitutor(), parent.indexNesting, "", processor)) {
return false;
}
Pair<PsiElement, PsiSubstitutor> pair = getAssignmentTarget(element, parent);
if (pair != null) {
@@ -74,16 +72,14 @@ class SliceForwardUtil {
if (parameters.length <= parameterIndex) return true;
PsiParameter actualParam = parameters[parameterIndex];
SliceUsage usage = SliceUtil.createSliceUsage(actualParam, parent, superSubstitutor,parent.indexNesting, "");
return processor.process(usage);
return SliceUtil.createAndProcessSliceUsage(actualParam, parent, superSubstitutor, parent.indexNesting, "", processor);
};
if (!myProcessor.process(method)) return false;
return OverridingMethodsSearch.search(method, parent.getScope().toSearchScope(), true).forEach(myProcessor);
}
}
SliceUsage usage = SliceUtil.createSliceUsage(target, parent, parent.getSubstitutor(),parent.indexNesting, "");
return processor.process(usage);
return SliceUtil.createAndProcessSliceUsage(target, parent, parent.getSubstitutor(),parent.indexNesting, "", processor);
}
if (element instanceof PsiReferenceExpression) {
@@ -201,13 +197,11 @@ class SliceForwardUtil {
if (!parent.params.scope.contains(element)) return true;
if (element instanceof PsiCompiledElement) element = element.getNavigationElement();
if (element.getLanguage() != JavaLanguage.INSTANCE) {
SliceUsage usage = SliceUtil.createSliceUsage(element, parent, EmptySubstitutor.getInstance(), parent.indexNesting, "");
return processor.process(usage);
return SliceUtil.createAndProcessSliceUsage(element, parent, EmptySubstitutor.getInstance(), parent.indexNesting, "", processor);
}
Pair<PsiElement, PsiSubstitutor> pair = getAssignmentTarget(element, parent);
if (pair != null) {
SliceUsage usage = SliceUtil.createSliceUsage(element, parent, pair.getSecond(), parent.indexNesting, "");
return processor.process(usage);
return SliceUtil.createAndProcessSliceUsage(element, parent, pair.getSecond(), parent.indexNesting, "", processor);
}
if (parent.params.showInstanceDereferences && isDereferenced(element)) {
SliceUsage usage = new JavaSliceDereferenceUsage(element.getParent(), parent, parent.getSubstitutor());
@@ -116,8 +116,7 @@ class SliceUtil {
PsiVariable variable = (PsiVariable)expression;
Collection<PsiExpression> values = DfaUtil.getCachedVariableValues(variable, original);
if (values == null) {
SliceUsage stopUsage = createTooComplexDFAUsage(expression, parent);
return processor.process(stopUsage);
return createAndProcessTooComplexDFAUsage(expression, parent, processor);
}
PsiExpression initializer = variable.getInitializer();
if (values.isEmpty() && initializer != null) {
@@ -200,10 +199,8 @@ class SliceUtil {
}
// check for constructor put arguments
if (expression instanceof PsiNewExpression &&
!processContainerPutArguments((PsiNewExpression)expression, parent, parentSubstitutor, indexNesting, syntheticField, processor)) {
return false;
}
return !(expression instanceof PsiNewExpression) ||
processContainerPutArguments((PsiNewExpression)expression, parent, parentSubstitutor, indexNesting, syntheticField, processor);
}
return true;
}
@@ -238,15 +235,15 @@ class SliceUtil {
final PsiElement realExpression = expression.getParent() instanceof DummyHolder ? expression.getParent().getContext() : expression;
assert realExpression != null;
if (!(realExpression instanceof PsiCompiledElement)) {
SliceUsage usage = createSliceUsage(realExpression, parent, substitutor, indexNesting, syntheticField);
if (!processor.process(usage)) return false;
return createAndProcessSliceUsage(realExpression, parent, substitutor, indexNesting, syntheticField, processor);
}
return true;
}
public static Collection<SliceUsage> collectMethodReturnValues(@NotNull SliceUsage parent,
@NotNull PsiSubstitutor parentSubstitutor,
PsiMethod methodCalled) {
@NotNull
static Collection<SliceUsage> collectMethodReturnValues(@NotNull SliceUsage parent,
@NotNull PsiSubstitutor parentSubstitutor,
PsiMethod methodCalled) {
CommonProcessors.CollectProcessor<SliceUsage> processor = new CommonProcessors.CollectProcessor<>();
processMethodReturnValue(processor, parent, parentSubstitutor, null, methodCalled, null, PsiSubstitutor.EMPTY);
return processor.getResults();
@@ -328,7 +325,7 @@ class SliceUtil {
PsiExpression returnValue = statement.getReturnValue();
if (returnValue == null) return;
PsiType right = superSubstitutor.substitute(superSubstitutor.substitute(returnValue.getType()));
if (right == null || (parentType != null && !TypeConversionUtil.isAssignable(parentType, right))) return;
if (right == null || parentType != null && !TypeConversionUtil.isAssignable(parentType, right)) return;
if (!handToProcessor(returnValue, processor, parent, substitutor, indexNesting, "")) {
stopWalking();
result[0] = false;
@@ -406,18 +403,18 @@ class SliceUtil {
});
}
@NotNull
static SliceUsage createSliceUsage(@NotNull PsiElement element,
static boolean createAndProcessSliceUsage(@NotNull PsiElement element,
@NotNull SliceUsage parent,
@NotNull PsiSubstitutor substitutor,
int indexNesting,
@NotNull String syntheticField) {
return new JavaSliceUsage(simplify(element), parent, substitutor, indexNesting, syntheticField);
@NotNull String syntheticField, @NotNull Processor<? super SliceUsage> processor) {
PsiElement simplified = simplify(element);
return simplified == null || processor.process(new JavaSliceUsage(simplified, parent, substitutor, indexNesting, syntheticField));
}
@NotNull
private static SliceUsage createTooComplexDFAUsage(@NotNull PsiElement element, @NotNull SliceUsage parent) {
return new SliceTooComplexDFAUsage(simplify(element), parent);
private static boolean createAndProcessTooComplexDFAUsage(@NotNull PsiElement element, @NotNull SliceUsage parent, @NotNull Processor<? super SliceUsage> processor) {
PsiElement simplified = simplify(element);
return simplified == null || processor.process(new SliceTooComplexDFAUsage(simplified, parent));
}
private static boolean processParameterUsages(@NotNull final PsiParameter parameter,
@@ -430,10 +427,9 @@ class SliceUtil {
if (declarationScope instanceof PsiForeachStatement) {
PsiForeachStatement statement = (PsiForeachStatement)declarationScope;
PsiExpression iterated = statement.getIteratedValue();
if (statement.getIterationParameter() == parameter && iterated != null) {
if (!handToProcessor(iterated, processor, parent, parentSubstitutor, indexNesting + 1, syntheticField)) return false;
}
return true;
return statement.getIterationParameter() != parameter ||
iterated == null ||
handToProcessor(iterated, processor, parent, parentSubstitutor, indexNesting + 1, syntheticField);
}
if (!(declarationScope instanceof PsiMethod)) return true;
@@ -590,9 +586,7 @@ class SliceUtil {
PsiFile file = foreignElement.getContainingFile();
if (file != null && file.getLanguage() != JavaLanguage.INSTANCE) {
// show foreign language usage as leaf to warn about possible (but unknown to us) flow.
if (!handToProcessor(foreignElement, processor, parent, parentSubstitutor, indexNesting, syntheticField)) {
return false;
}
return handToProcessor(foreignElement, processor, parent, parentSubstitutor, indexNesting, syntheticField);
}
return true;
}
@@ -608,7 +602,7 @@ class SliceUtil {
PsiElement element = reference.getElement();
if (element instanceof PsiExpression && !element.getManager().areElementsEquivalent(element, parent.getElement())) {
PsiExpression expression = (PsiExpression)element;
if (!addContainerItemModification(expression, processor, parent, parentSubstitutor, indexNesting, syntheticField)) return false;
return addContainerItemModification(expression, processor, parent, parentSubstitutor, indexNesting, syntheticField);
}
return true;
});
@@ -633,7 +627,7 @@ class SliceUtil {
}
PsiElement grand = parentElement == null ? null : parentElement.getParent();
if (grand instanceof PsiCallExpression) {
if (!processContainerPutArguments((PsiCallExpression)grand, parent, parentSubstitutor, indexNesting, syntheticField, processor)) return false;
return processContainerPutArguments((PsiCallExpression)grand, parent, parentSubstitutor, indexNesting, syntheticField, processor);
}
return true;
}