From 42980624be8783b0229ead33d566c7f1656d7c18 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Sun, 28 Dec 2014 19:46:33 +0100 Subject: [PATCH] SSR: matching for annotated type casts --- .../impl/matcher/JavaMatchingVisitor.java | 11 ++++++++++- .../structuralsearch/StructuralSearchTest.java | 6 ++++++ 2 files changed, 16 insertions(+), 1 deletion(-) 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 a52b9c4c8be4..88ce7b2c6ea9 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 @@ -1521,7 +1521,16 @@ public class JavaMatchingVisitor extends JavaElementVisitor { @Override public void visitTypeElement(final PsiTypeElement typeElement) { - myMatchingVisitor.setResult(matchType(typeElement, myMatchingVisitor.getElement())); + final PsiElement other = myMatchingVisitor.getElement(); // might not be a PsiTypeElement + + final PsiAnnotation[] annotations = PsiTreeUtil.getChildrenOfType(typeElement, PsiAnnotation.class); + // also can't use AnnotationOwner api because it is not implemented completely yet (see e.g. ClsTypeParameterImpl) + final PsiAnnotation[] annotations2 = PsiTreeUtil.getChildrenOfType(other, PsiAnnotation.class); + if (annotations != null) { + myMatchingVisitor.setResult(annotations2 != null && myMatchingVisitor.matchInAnyOrder(annotations, annotations2)); + if (!myMatchingVisitor.getResult()) return; + } + myMatchingVisitor.setResult(matchType(typeElement, other)); } @Override diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java index d605c8b4e51d..12aa4bd41979 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java @@ -2444,6 +2444,12 @@ public class StructuralSearchTest extends StructuralSearchTestCase { " }\n" + "}\n"; assertEquals("Find all annotations", 4, findMatchesCount(source2, "@'_Annotation")); + + String source3 = "class A {\n" + + " @HH final String s = (@HH String) new Object();\n" + + " final String t = (String) new Object();\n" + + "}\n"; + assertEquals("Find annotated casts", 1, findMatchesCount(source3, "(@'_A 'Cast) '_Expression")); } public void testBoxingAndUnboxing() {