mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-26 19:06:24 +07:00
SSR: handle parentheses in read/write detection
This commit is contained in:
+7
-2
@@ -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;
|
||||
}
|
||||
|
||||
+12
-17
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user