mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
withstand moronically incorrect parenthesized expressions, like "Object x = ();"
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user