From fb786d36c06625a5d436cdcdd2350ce3c94e4870 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 21 Jul 2014 17:42:55 +0200 Subject: [PATCH] SSR: improve annotation name value pair matching --- .../impl/matcher/JavaMatchingVisitor.java | 22 ++++++++----------- .../StructuralSearchTest.java | 9 ++++++-- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java index 401b84004858..0ea857b16362 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java @@ -321,18 +321,14 @@ public class JavaMatchingVisitor extends JavaElementVisitor { @Override public void visitNameValuePair(PsiNameValuePair pair) { final PsiIdentifier nameIdentifier = pair.getNameIdentifier(); - if (nameIdentifier == null) { - myMatchingVisitor.setResult(true); - return; - } final PsiNameValuePair elementNameValuePair = (PsiNameValuePair)myMatchingVisitor.getElement(); - PsiIdentifier matchedNameValuePair = elementNameValuePair.getNameIdentifier(); + final PsiIdentifier otherIdentifier = elementNameValuePair.getNameIdentifier(); - PsiAnnotationMemberValue annotationInitializer = pair.getValue(); + final PsiAnnotationMemberValue annotationInitializer = pair.getValue(); if (annotationInitializer != null) { - boolean isTypedInitializer = myMatchingVisitor.getMatchContext().getPattern().isTypedVar(annotationInitializer) && - annotationInitializer instanceof PsiReferenceExpression; + final boolean isTypedInitializer = myMatchingVisitor.getMatchContext().getPattern().isTypedVar(annotationInitializer) && + annotationInitializer instanceof PsiReferenceExpression; myMatchingVisitor.setResult(myMatchingVisitor.match(annotationInitializer, elementNameValuePair.getValue()) || (isTypedInitializer && @@ -344,13 +340,13 @@ public class JavaMatchingVisitor extends JavaElementVisitor { final MatchingHandler handler = myMatchingVisitor.getMatchContext().getPattern().getHandler(nameIdentifier); if (handler instanceof SubstitutionHandler) { - myMatchingVisitor - .setResult(((SubstitutionHandler)handler).handle(matchedNameValuePair, - myMatchingVisitor.getMatchContext())); + myMatchingVisitor.setResult(((SubstitutionHandler)handler).handle(otherIdentifier, myMatchingVisitor.getMatchContext())); + } + else if (nameIdentifier != null) { + myMatchingVisitor.setResult(myMatchingVisitor.match(nameIdentifier, otherIdentifier)); } else { - myMatchingVisitor - .setResult(myMatchingVisitor.match(nameIdentifier, matchedNameValuePair)); + myMatchingVisitor.setResult(otherIdentifier == null || otherIdentifier.getText().equals("value")); } } } diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java index 18e5e8e1ea5e..da479a70f93c 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java @@ -2288,14 +2288,19 @@ public class StructuralSearchTest extends StructuralSearchTestCase { "@MyBean2(\"\")\n" + "public class TestBean {}\n" + "@MyBean2(\"\")\n" + - "@MyBean(\"\")\n" + + "@MyBean(value=\"\")\n" + "public class TestBean2 {}\n" + - "public class TestBean3 {}\n"; + "public class TestBean3 {}\n" + + "@MyBean(\"a\")\n" + + "@MyBean2(\"a\")\n" + + "public class TestBean4"; String s2 = "@MyBean(\"\")\n" + "@MyBean2(\"\")\n" + "public class $a$ {}\n"; assertEquals("Simple find annotated class",2,findMatchesCount(s1,s2,false)); + assertEquals("Match value of anonymous name value pair 1", 1, findMatchesCount(s1, "@MyBean(\"a\") class $a$ {}")); + assertEquals("Match value of anonymous name value pair 2", 2, findMatchesCount(s1, "@MyBean(\"\") class $a$ {}")); String s3 = "@VisualBean(\"????????? ?????????? ? ??\")\n" + "public class TestBean\n" +