From 3cf1ba922cec4cd0f22b8ea76aff008aff64dd9b Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 23 Sep 2016 16:24:59 +0200 Subject: [PATCH] SSR: handle parentheses in read/write detection --- .../matcher/predicates/ReadPredicate.java | 9 ++++-- .../matcher/predicates/WritePredicate.java | 29 ++++++++----------- .../StructuralSearchTest.java | 2 +- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ReadPredicate.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ReadPredicate.java index a5967d5ca661..1beb850f693d 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ReadPredicate.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ReadPredicate.java @@ -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; } diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/WritePredicate.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/WritePredicate.java index e0d86824a920..1e9838b29cbc 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/WritePredicate.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/WritePredicate.java @@ -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; } } diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java index 77e1dd6f58f7..316aadc640d3 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java @@ -1387,7 +1387,7 @@ public class StructuralSearchTest extends StructuralSearchTestCase { " {" + " int i = 0;" + " i += 1;" + - " i = 3;" + + " (i) = 3;" + " int j = i;" + " i();" + " }" +