diff --git a/java/java-impl/src/com/intellij/slicer/SliceForwardUtil.java b/java/java-impl/src/com/intellij/slicer/SliceForwardUtil.java index 5041d3ca261e..f99eee6ba678 100644 --- a/java/java-impl/src/com/intellij/slicer/SliceForwardUtil.java +++ b/java/java-impl/src/com/intellij/slicer/SliceForwardUtil.java @@ -46,11 +46,9 @@ class SliceForwardUtil { @NotNull final JavaSliceUsage parent, @NotNull final Processor 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 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 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()); diff --git a/java/java-impl/src/com/intellij/slicer/SliceUtil.java b/java/java-impl/src/com/intellij/slicer/SliceUtil.java index 7f4a2c02dfaa..d9888228cc80 100644 --- a/java/java-impl/src/com/intellij/slicer/SliceUtil.java +++ b/java/java-impl/src/com/intellij/slicer/SliceUtil.java @@ -116,8 +116,7 @@ class SliceUtil { PsiVariable variable = (PsiVariable)expression; Collection 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 collectMethodReturnValues(@NotNull SliceUsage parent, - @NotNull PsiSubstitutor parentSubstitutor, - PsiMethod methodCalled) { + @NotNull + static Collection collectMethodReturnValues(@NotNull SliceUsage parent, + @NotNull PsiSubstitutor parentSubstitutor, + PsiMethod methodCalled) { CommonProcessors.CollectProcessor 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 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 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; }