SSR: allow to match classes, interfaces and enums with a single query

This commit is contained in:
Bas Leijdekkers
2017-10-15 11:40:59 +02:00
parent 5cb86d17d3
commit 61b27afb44
4 changed files with 17 additions and 5 deletions
@@ -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(
@@ -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;
@@ -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
@@ -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 {}" +