From 61b27afb44109f95a616c0d9e82349f2f5fbf2bf Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Sat, 14 Oct 2017 20:10:31 +0200 Subject: [PATCH] SSR: allow to match classes, interfaces and enums with a single query --- .../JavaPredefinedConfigurations.java | 7 ++++++- .../impl/matcher/JavaMatchingVisitor.java | 2 +- .../source/messages/SSRBundle.properties | 1 + .../structuralsearch/StructuralSearchTest.java | 12 +++++++++--- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java index 94f6e5fc72c4..8b21f0d47de8 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java @@ -84,7 +84,12 @@ class JavaPredefinedConfigurations { ), createSearchTemplateInfo( SSRBundle.message("predefined.configuration.classes"), - "class 'Class {}", + "class 'Class:[script( \"!__context__.interface && !__context__.enum\" )] {}", + CLASS_TYPE + ), + createSearchTemplateInfo( + SSRBundle.message("predefined.configuration.classes.interfaces.enums"), + "class 'ClassInterfaceEnum {}", CLASS_TYPE ), createSearchTemplateInfo( 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 89539ae3bbd6..1f257a80643c 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 @@ -470,7 +470,7 @@ public class JavaMatchingVisitor extends JavaElementVisitor { boolean result = false; try { final boolean templateIsInterface = clazz.isInterface(); - if (templateIsInterface != clazz2.isInterface()) return false; + if (templateIsInterface && !clazz2.isInterface()) return false; if (templateIsInterface && clazz.isAnnotationType() && !clazz2.isAnnotationType()) return false; if (clazz.isEnum() && !clazz2.isEnum()) return false; if (clazz instanceof PsiTypeParameter != clazz2 instanceof PsiTypeParameter) return false; diff --git a/platform/structuralsearch/source/messages/SSRBundle.properties b/platform/structuralsearch/source/messages/SSRBundle.properties index 9613d2778a47..b682a65904cd 100644 --- a/platform/structuralsearch/source/messages/SSRBundle.properties +++ b/platform/structuralsearch/source/messages/SSRBundle.properties @@ -146,6 +146,7 @@ predefined.configuration.all.fields.of.the.class=all fields of the class predefined.configuration.instance.fields.of.the.class=instance fields of the class predefined.configuration.packagelocal.fields.of.the.class=package-private fields of the class predefined.configuration.classes=classes +predefined.configuration.classes.interfaces.enums=classes, interfaces & enums predefined.configuration.new.expressions=new expressions predefined.configuration.lambdas=lambdas predefined.configuration.method.references=method references diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java index 47105d29e8e8..2652d253b86d 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java @@ -1278,10 +1278,16 @@ public class StructuralSearchTest extends StructuralSearchTestCase { final String s105 = "class B {} class A extends B { } class C {} class D extends C {}"; assertEquals("extends match", 1, findMatchesCount(s105, "class '_ extends '_:[ref( \"class B {}\" )] {}")); - final String s107 = "interface IA {} interface IB extends IA { } interface IC extends IB {} interface ID extends IC {}" + - "class A implements IA {} class B extends A { } class C extends B implements IC {} class D extends C {}"; + final String s107 = "interface IA {}" + + "interface IB extends IA {}" + + "interface IC extends IB {} " + + "interface ID extends IC {}" + + "class A implements IA {}" + + "class B extends A {}" + + "class C extends B implements IC {}" + + "class D extends C {}"; assertEquals("extends navigation match", 2, findMatchesCount(s107, "class '_ extends 'Type:+A {}")); - assertEquals("implements navigation match", 3, findMatchesCount(s107, "class '_ implements 'Type:+IA {}")); + assertEquals("implements navigation match", 5, findMatchesCount(s107, "class '_ implements 'Type:+IA {}")); final String s109 = "interface I {}" + "interface I2 extends I {}" +