SSR: handle parentheses in read/write detection

This commit is contained in:
Bas Leijdekkers
2016-09-26 15:03:16 +02:00
parent f3ba4d8193
commit 3cf1ba922c
3 changed files with 20 additions and 20 deletions
@@ -1,26 +1,31 @@
package com.intellij.structuralsearch.impl.matcher.predicates;
import com.intellij.psi.*;
import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.structuralsearch.impl.matcher.MatchContext;
import com.intellij.structuralsearch.impl.matcher.MatchUtils;
import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate;
/**
* Handler for value read
*/
public final class ReadPredicate extends MatchPredicate {
@Override
public boolean match(PsiElement patternNode, PsiElement matchedNode, MatchContext context) {
PsiElement parent = matchedNode.getParent();
if (matchedNode instanceof PsiIdentifier) {
matchedNode = parent;
parent = matchedNode.getParent();
}
parent = PsiUtil.skipParenthesizedExprUp(parent);
if (!(matchedNode instanceof PsiReferenceExpression) || parent instanceof PsiMethodCallExpression) {
return false;
}
if (parent instanceof PsiAssignmentExpression) {
final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)parent;
if (assignmentExpression.getLExpression() == matchedNode &&
if (PsiTreeUtil.isAncestor(assignmentExpression.getLExpression(), matchedNode, false) &&
assignmentExpression.getOperationTokenType() == JavaTokenType.EQ) {
return false;
}
@@ -1,33 +1,28 @@
package com.intellij.structuralsearch.impl.matcher.predicates;
import com.intellij.psi.*;
import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.structuralsearch.impl.matcher.MatchContext;
import com.intellij.structuralsearch.impl.matcher.MatchUtils;
import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate;
/**
* Handler for reading
*/
public final class WritePredicate extends MatchPredicate {
@Override
public boolean match(PsiElement patternNode, PsiElement matchedNode, MatchContext context) {
if (matchedNode instanceof PsiIdentifier) {
matchedNode = matchedNode.getParent();
}
if (( matchedNode instanceof PsiReferenceExpression &&
matchedNode.getParent() instanceof PsiAssignmentExpression &&
((PsiAssignmentExpression)matchedNode.getParent()).getLExpression() == matchedNode &&
MatchUtils.getReferencedElement(matchedNode) instanceof PsiVariable
) ||
(
matchedNode instanceof PsiVariable &&
((PsiVariable)matchedNode).getInitializer()!=null
) ||
matchedNode.getParent() instanceof PsiPostfixExpression ||
matchedNode.getParent() instanceof PsiPrefixExpression
) {
return true;
} else {
return false;
}
final PsiElement parent = PsiTreeUtil.skipParentsOfType(matchedNode, PsiParenthesizedExpression.class);
return (matchedNode instanceof PsiReferenceExpression &&
parent instanceof PsiAssignmentExpression &&
PsiTreeUtil.isAncestor(((PsiAssignmentExpression)parent).getLExpression(), matchedNode, false) &&
MatchUtils.getReferencedElement(matchedNode) instanceof PsiVariable) ||
(matchedNode instanceof PsiVariable && ((PsiVariable)matchedNode).getInitializer() != null) ||
parent instanceof PsiPostfixExpression ||
parent instanceof PsiPrefixExpression;
}
}