diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java index b90ef12355b2..45c38a57154f 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java @@ -286,10 +286,12 @@ class JavaPredefinedConfigurations { createSearchTemplateInfo(SSRBundle.message("predefined.configuration.fields.variables.read"),"'Symbol:[read]",INTERESTING_TYPE), createSearchTemplateInfo(SSRBundle.message("predefined.configuration.fields_variables.with.given.name.pattern.updated"),"'Symbol:[regex( name ) && write]",INTERESTING_TYPE), createSearchTemplateInfo(SSRBundle.message("predefined.configuration.usage.of.derived.type.in.cast"),"('CastType:*Base ) 'Expr",INTERESTING_TYPE), - createSearchTemplateInfo(SSRBundle.message("predefined.configuration.boxing.in.declarations"),"'_Type:Integer|Boolean|Long|Character|Short|Byte 'Var = '_Value:[formal( int|boolean|long|char|short|byte )]",INTERESTING_TYPE), - createSearchTemplateInfo(SSRBundle.message("predefined.configuration.unboxing.in.declarations"),"'_Type:int|boolean|long|char|short|byte 'Var = '_Value:[formal( Integer|Boolean|Long|Character|Short|Byte )]",INTERESTING_TYPE), - createSearchTemplateInfo(SSRBundle.message("predefined.configuration.boxing.in.method.calls"),"'_Instance?.'Call('_BeforeParam*,'_Param:[ exprtype( int|boolean|long|char|short|byte ) && formal( Integer|Boolean|Long|Character|Short|Byte )],'_AfterParam*)",INTERESTING_TYPE), + createSearchTemplateInfo(SSRBundle.message("predefined.configuration.boxing.in.declarations"),"'_Type:Object|Integer|Boolean|Long|Character|Short|Byte 'Var = '_Value:[exprtype( int|boolean|long|char|short|byte )]",INTERESTING_TYPE), + createSearchTemplateInfo(SSRBundle.message("predefined.configuration.unboxing.in.declarations"),"'_Type:int|boolean|long|char|short|byte 'Var = '_Value:[exprtype( Integer|Boolean|Long|Character|Short|Byte )]",INTERESTING_TYPE), + createSearchTemplateInfo(SSRBundle.message("predefined.configuration.boxing.in.method.calls"),"'_Instance?.'Call('_BeforeParam*,'_Param:[ exprtype( int|boolean|long|char|short|byte ) && formal( Object|Integer|Boolean|Long|Character|Short|Byte )],'_AfterParam*)",INTERESTING_TYPE), createSearchTemplateInfo(SSRBundle.message("predefined.configuration.unboxing.in.method.calls"), "'_Instance?.'Call('_BeforeParam*,'_Param:[ formal( int|boolean|long|char|short|byte ) && exprtype( Integer|Boolean|Long|Character|Short|Byte )],'_AfterParam*)",INTERESTING_TYPE), + createSearchTemplateInfo(SSRBundle.message("predefined.configuration.any.boxing"), "'_expression:[ exprtype( int|boolean|long|char|short|byte ) && formal( Object|Integer|Boolean|Long|Character|Short|Byte )]", INTERESTING_TYPE), + 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("methods called","'_?.'_:[ref('Method)] ('_*)", INTERESTING_TYPE), //createSearchTemplateInfo("fields selected","'_?.'_:[ref('Field)] ", INTERESTING_TYPE), //createSearchTemplateInfo("symbols used","'_:[ref('Symbol)] ", INTERESTING_TYPE), diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/FormalArgTypePredicate.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/FormalArgTypePredicate.java index 02f1ee7d08e0..08d015af7854 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/FormalArgTypePredicate.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/FormalArgTypePredicate.java @@ -1,8 +1,9 @@ package com.intellij.structuralsearch.impl.matcher.predicates; +import com.intellij.psi.PsiExpression; +import com.intellij.psi.PsiType; import com.intellij.structuralsearch.impl.matcher.MatchContext; -import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; +import com.siyeh.ig.psiutils.ExpectedTypeUtils; /** * Created by IntelliJ IDEA. @@ -13,26 +14,11 @@ import com.intellij.psi.util.PsiTreeUtil; */ public class FormalArgTypePredicate extends ExprTypePredicate { - public FormalArgTypePredicate(String type, String baseName, boolean _withinHierarchy, boolean caseSensitiveMatch,boolean target) { - super(type, baseName, _withinHierarchy, caseSensitiveMatch, target); + public FormalArgTypePredicate(String type, String baseName, boolean withinHierarchy, boolean caseSensitiveMatch, boolean target) { + super(type, baseName, withinHierarchy, caseSensitiveMatch, target); } protected PsiType evalType(PsiExpression match, MatchContext context) { - final PsiMethodCallExpression expr = PsiTreeUtil.getParentOfType(match,PsiMethodCallExpression.class); - if (expr == null) return null; - - // find our parent in parameters of the method - final PsiMethod psiMethod = expr.resolveMethod(); - if (psiMethod == null) return null; - final PsiParameter[] methodParameters = psiMethod.getParameterList().getParameters(); - final PsiExpression[] expressions = expr.getArgumentList().getExpressions(); - - for(int i = 0;i < methodParameters.length; ++i) { - if (expressions[i] == match) { - if (i < methodParameters.length) return methodParameters[i].getType(); - break; - } - } - return null; + return ExpectedTypeUtils.findExpectedType(match, true, true); } } diff --git a/platform/structuralsearch/source/messages/SSRBundle.properties b/platform/structuralsearch/source/messages/SSRBundle.properties index d65271e16c46..9ffc141b32b0 100644 --- a/platform/structuralsearch/source/messages/SSRBundle.properties +++ b/platform/structuralsearch/source/messages/SSRBundle.properties @@ -86,6 +86,8 @@ predefined.configuration.unboxing.in.method.calls=unboxing in method calls predefined.configuration.boxing.in.method.calls=boxing in method calls predefined.configuration.unboxing.in.declarations=unboxing in declarations predefined.configuration.boxing.in.declarations=boxing in declarations +predefined.configuration.any.unboxing=unboxed expressions +predefined.configuration.any.boxing=boxed expressions predefined.configuration.filters=filters predefined.configuration.session.ejb=session ejb predefined.configuration.fields.variables.read=fields/variables read @@ -158,8 +160,8 @@ editvarcontraints.maximum.count=Maximum count\: editvarcontraints.minimum.count=Minimum count\: editvarcontraints.apply.constraint.within.type.hierarchy=Apply constraint within type hierarchy editvarcontraints.invert.condition=Invert condition -editvarcontraints.text.regular.expression.for.formal.argument.type.of.the.method=Text/regexp for formal argument type of the method\: -editvarcontraints.text.regular.expression.for.java.expression.type=Text/regexp for java expression type\: +editvarcontraints.text.regular.expression.for.formal.argument.type.of.the.method=Expected type of expression (regexp)\: +editvarcontraints.text.regular.expression.for.java.expression.type=Expression type (regexp)\: editvarcontraints.value.is.written=Value is written editvarcontraints.value.is.read=Value is read editvarcontraints.whole.words.only=Whole words only diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java index 4503712bd3ac..002d0cea3aee 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java @@ -2464,12 +2464,20 @@ public class StructuralSearchTest extends StructuralSearchTestCase { "a.c(new Integer(2));\n" + "a.c(new Integer(3));\n" + "a.c2(new Integer(3));\n" + - "a.c(3);"; + "a.c(3);\n" + + "Integer i = 4;\n" + + "int j = Integer.valueOf(4);\n"; String s2 = "a.'b('_Params:[formal( Integer ) && exprtype( int ) ])"; String s2_2 = "a.c('_Params:[formal( int ) && exprtype( Integer ) ])"; assertEquals("Find boxing in method call",1,findMatchesCount(s1,s2,false)); assertEquals("Find unboxing in method call",2,findMatchesCount(s1,s2_2,false)); + + String pattern1 = "'_a:[formal( Integer ) && exprtype( int ) ]"; + assertEquals("Find any boxing", 2, findMatchesCount(s1, pattern1)); + + String pattern2 = "'_a:[formal( int ) && exprtype( Integer ) ]"; + assertEquals("Find any unboxing", 3, findMatchesCount(s1, pattern2)); } public void testCommentsInDclSearch() {