Search code examples
javaparsingjavaparser

Extract methods calls from java code


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?


Solution

  • 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