I want to extract all method calls from java code. I have written following two regular expression but they are not able to extract all the method calls.
Reg1 : Pattern.compile("([a-zA-Z][0-9_a-zA-Z]*\\([a-zA-Z0-9_\\s,\\[\\]\\(\\)\\.]+\\))");
Reg2 : Pattern.compile("([a-zA-Z][0-9_a-zA-Z]*\\([\\s]*\\))")
Input:
"{
if ((war == null) && (config != null)) {
sb.append( &config= );
sb.append(URLEncoder.encode(config,getCharset()));
}
if ((war == null) && (localWar != null)) {
sb.append( &war= );
sb.append(URLEncoder.encode(localWar,getCharset()));
}
if (update) {
sb.append( &update=true );
}
if (tag != null) {
sb.append( &tag= );
sb.append(URLEncoder.encode(tag,getCharset()));
}
}"
output:
getCharset getCharset getCharset append append append
I am not able to extract "encode
".
Does anyone have any idea as an what should I add to regular expression?
You need a Java Code Parser for this task. Here is an example which uses Java Parser:
public class MethodCallPrinter
{
public static void main(String[] args) throws Exception
{
FileInputStream in = new FileInputStream("MethodCallPrinter.java");
CompilationUnit cu;
try
{
cu = JavaParser.parse(in);
}
finally
{
in.close();
}
new MethodVisitor().visit(cu, null);
}
private static class MethodVisitor extends VoidVisitorAdapter
{
@Override
public void visit(MethodCallExpr methodCall, Object arg)
{
System.out.print("Method call: " + methodCall.getName() + "\n");
List<Expression> args = methodCall.getArgs();
if (args != null)
handleExpressions(args);
}
private void handleExpressions(List<Expression> expressions)
{
for (Expression expr : expressions)
{
if (expr instanceof MethodCallExpr)
visit((MethodCallExpr) expr, null);
else if (expr instanceof BinaryExpr)
{
BinaryExpr binExpr = (BinaryExpr)expr;
handleExpressions(Arrays.asList(binExpr.getLeft(), binExpr.getRight()));
}
}
}
}
}
Output:
Method call: parse
Method call: close
Method call: visit
Method call: print
Method call: getName
Method call: getArgs
Method call: handleExpressions
Method call: visit
Method call: handleExpressions
Method call: asList
Method call: getLeft
Method call: getRight