From 7754aa912e58d5db1830bdc4bd9dd122f6cf51d7 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 16 May 2018 13:43:48 +0200 Subject: [PATCH] SSR: add some existing templates demonstrating features --- .../JavaPredefinedConfigurations.java | 5 ++- .../source/messages/SSRBundle.properties | 5 ++- .../JavaPredefinedConfigurationsTest.java | 38 ++++++++++++++++++- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java index 382f702c61bc..50cbd7b31f5b 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java @@ -36,7 +36,7 @@ class JavaPredefinedConfigurations { createSearchTemplateInfo(SSRBundle.message("predefined.configuration.all.expressions.of.some.type"),"'_Expression:[exprtype( SomeType )]",EXPRESSION_TYPE), createSearchTemplateInfo(SSRBundle.message("predefined.configuration.sample.method.invokation.with.constant.argument"),"Integer.parseInt('_a:[script( \"com.intellij.psi.util.PsiUtil.isConstantExpression(__context__)\" )])",EXPRESSION_TYPE), createSearchTemplateInfo(SSRBundle.message("predefined.configuration.method.references"), "'_Qualifier::'Method", EXPRESSION_TYPE), - createSearchTemplateInfo(SSRBundle.message("predefined.configuration.string.concatenations"), "[exprtype( java\\.lang\\.String )]'_a + '_b+", EXPRESSION_TYPE), + createSearchTemplateInfo(SSRBundle.message("predefined.configuration.string.concatenations"), "[exprtype( java\\.lang\\.String )]'_a + '_b{10,}", EXPRESSION_TYPE), createSearchTemplateInfo(SSRBundle.message("predefined.configuration.deprecated.method.calls"), "'_Instance?.'MethodCall:[ref( deprecated methods )]('_Parameter*)", EXPRESSION_TYPE), // Operators @@ -47,6 +47,7 @@ class JavaPredefinedConfigurations { createSearchTemplateInfo(SSRBundle.message("predefined.configuration.foreaches"), "for ('_Type '_Variable : '_Expression) {\n '_Statement*;\n}", OPERATOR_TYPE), createSearchTemplateInfo(SSRBundle.message("predefined.configuration.logging.without.if"), "[!within( statement in if )]LOG.debug('_Argument*);", OPERATOR_TYPE), createSearchTemplateInfo("statement in if", "if('_condition) { 'statement*; }", OPERATOR_TYPE), + createSearchTemplateInfo(SSRBundle.message("predefined.configuration.assert.without.description"), "assert '_condition : '_description{0};", OPERATOR_TYPE), // Class based createSearchTemplateInfo( @@ -182,6 +183,7 @@ class JavaPredefinedConfigurations { createSearchTemplateInfo(SSRBundle.message("predefined.configuration.type.var.substitutions.in.intanceof.with.generic.types"),"'_Expr instanceof '_Type <'Substitutions+> ", GENERICS_TYPE), createSearchTemplateInfo(SSRBundle.message("predefined.configuration.variables.of.generic.types"),"'_Type <'_GenericArgument+> 'Var = '_Init?;", GENERICS_TYPE), createSearchTemplateInfo(SSRBundle.message("predefined.configuration.diamond.operators"), "new 'Class<>('_Argument*)", GENERICS_TYPE), + createSearchTemplateInfo(SSRBundle.message("predefined.configuration.method.returns.bounded.wildcard"), "[script( \"!Method.hasModifierProperty(com.intellij.psi.PsiModifier.ABSTRACT)\" )]'_Type 'Method('_ParameterType '_Parameter*);", GENERICS_TYPE), // Add comments and metadata createSearchTemplateInfo(SSRBundle.message("predefined.configuration.comments"),"/* 'CommentContent */", METADATA_TYPE), @@ -312,6 +314,7 @@ class JavaPredefinedConfigurations { createSearchTemplateInfo(SSRBundle.message("predefined.configuration.any.unboxing"), "'_expression:[ formal( int|boolean|long|char|short|byte ) && exprtype( Integer|Boolean|Long|Character|Short|Byte )]", INTERESTING_TYPE), createSearchTemplateInfo(SSRBundle.message("predefined.configuration.try.without.resources"), "try ('_ResourceType '_resource{0,0} = '_init; '_expression{0,0}) {\n '_TryStatement*;\n} catch('_ExceptionType '_Exception{0,0}) {\n '_CatchStatement*;\n}", INTERESTING_TYPE), createSearchTemplateInfo(SSRBundle.message("predefined.configuration.switch.with.branches"), "switch ('_expression) {\n case '_value{0,4}\\: '_statement*;\n}", INTERESTING_TYPE), + createSearchTemplateInfo(SSRBundle.message("predefined.configuration.labeled.break"), "break '_label;", INTERESTING_TYPE), //createSearchTemplateInfo("methods called","'_?.'_:[ref('Method)] ('_*)", INTERESTING_TYPE), //createSearchTemplateInfo("fields selected","'_?.'_:[ref('Field)] ", INTERESTING_TYPE), //createSearchTemplateInfo("symbols used","'_:[ref('Symbol)] ", INTERESTING_TYPE), diff --git a/platform/structuralsearch/source/messages/SSRBundle.properties b/platform/structuralsearch/source/messages/SSRBundle.properties index fcb763f91fe1..62112dc80d78 100644 --- a/platform/structuralsearch/source/messages/SSRBundle.properties +++ b/platform/structuralsearch/source/messages/SSRBundle.properties @@ -102,11 +102,13 @@ predefined.configuration.bean.info.classes=Bean info classes predefined.configuration.all.expressions.of.some.type=all expressions of some type predefined.configuration.variables.of.generic.types=variables of generic types predefined.configuration.diamond.operators=diamond operators +predefined.configuration.method.returns.bounded.wildcard=method returns bounded wildcard predefined.configuration.comments=comments predefined.configuration.fields_variables.with.given.name.pattern.updated=fields/variables with given name pattern updated predefined.configuration.trys=try's predefined.configuration.try.without.resources=try statements without resources and catch blocks predefined.configuration.switch.with.branches=switch statements with few branches +predefined.configuration.labeled.break=labeled break statements predefined.configuration.block.dcls=block dcls predefined.configuration.methods.of.the.class=methods of the class predefined.configuration.deprecated.methods=deprecated methods @@ -152,7 +154,7 @@ predefined.configuration.classes.interfaces.enums=classes, interfaces \\& enums predefined.configuration.new.expressions=new expressions predefined.configuration.lambdas=lambdas predefined.configuration.method.references=method references -predefined.configuration.string.concatenations=string concatenations +predefined.configuration.string.concatenations=string concatenations with many operands predefined.configuration.deprecated.method.calls=method calls to deprecated methods # edit variable constraint dialog options @@ -240,6 +242,7 @@ predefined.configuration.class.static.blocks=static blocks in class predefined.configuration.class.instance.initialization.blocks=instance initialization blocks predefined.configuration.class.any.initialization.blocks=any class initialization block predefined.configuration.logging.without.if=logging without if +predefined.configuration.assert.without.description=assert statement without description predefined.configuration.class.with.parameterless.constructors=classes with parameterless constructors predefined.configuration.static.fields.without.final=static fields that are not final inspection.script.problem={0}\n In Structural Search inspection template ''{1}'' diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/JavaPredefinedConfigurationsTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/JavaPredefinedConfigurationsTest.java index a35d7fde0829..3867f56bbbc2 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/JavaPredefinedConfigurationsTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/JavaPredefinedConfigurationsTest.java @@ -115,6 +115,42 @@ public class JavaPredefinedConfigurationsTest extends StructuralSearchTestCase { " case 3:" + " default:" + " }"))); + testCases.put(SSRBundle.message("predefined.configuration.string.concatenations"), + pair("class X {{" + + " String s = \"1\" + \"2\" + \"3\" + \"4\" + \"5\" + \"6\" + \"7\" + \"8\" + \"9\" + \"10\" + \"11\";" + + " String t = \"1\" + \"2\" + \"3\" + \"4\" + \"5\" + \"6\" + \"7\" + \"8\" + \"9\"+ \"10\";", + asList("\"1\" + \"2\" + \"3\" + \"4\" + \"5\" + \"6\" + \"7\" + \"8\" + \"9\" + \"10\" + \"11\""))); + testCases.put(SSRBundle.message("predefined.configuration.assert.without.description"), + pair("class X {{" + + " assert true;" + + " assert false : false;" + + " assert false : \"reason\";" + + "}}", + asList("assert true;"))); + testCases.put(SSRBundle.message("predefined.configuration.labeled.break"), + pair("class X {{" + + " break one;" + + " break;" + + " continue;" + + " continue here;" + + "}}", + asList("break one;"))); + testCases.put(SSRBundle.message("predefined.configuration.method.returns.bounded.wildcard"), + pair("abstract class X {" + + " List one() {" + + " return null;" + + " }" + + " abstract List ignore();" + + " List two() {" + + " return null;" + + " }" + + " T three() {" + + " return null;" + + " }" + + "}", + asList("List one() {" + + " return null;" + + " }"))); } public void testPredefinedConfigurations() { @@ -125,7 +161,7 @@ public class JavaPredefinedConfigurationsTest extends StructuralSearchTestCase { final SearchConfiguration searchConfiguration = (SearchConfiguration)template; options = searchConfiguration.getMatchOptions(); final List matches = testMatcher.testFindMatches(testCase.first, options, true, StdFileTypes.JAVA, null, false); - assertEquals(testCase.second.size(), matches.size()); + assertEquals(template.getName(), testCase.second.size(), matches.size()); for (int i = 0; i < matches.size(); i++) { final String matchText = StructuralSearchUtil.getPresentableElement(matches.get(i).getMatch()).getText(); assertEquals(template.getName(), testCase.second.get(i), matchText);