package com.highway2urhell.utils;
import com.github.javaparser.JavaParser;
import com.github.javaparser.ParseException;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.ImportDeclaration;
import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.visitor.GenericVisitorAdapter;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class ParsingUtil {
public static String[] extractPackages(String in) throws ParseException, FileNotFoundException {
List<String> classes = extractImports(in);
Set<String> ret = new TreeSet<String>();
for (String aClass : classes) {
ret.add(aClass.substring(0, aClass.lastIndexOf(".")));
}
return ret.toArray(new String[]{});
}
public static List<String> extractImports(String in) throws ParseException, FileNotFoundException {
CompilationUnit parse = JavaParser.parse(new FileInputStream(in));
ImportVisitor importVisitor = new ImportVisitor();
importVisitor.visit(parse, "");
return importVisitor.impDec;
}
private static class ImportVisitor extends VoidVisitorAdapter<String> {
public final List<String> impDec = new ArrayList<String>();
@Override
public void visit(ImportDeclaration n, String a) {
impDec.add("" + n.getName());
}
}
public static String extractBody(String in, String methodName) throws ParseException, FileNotFoundException {
return extractMethod(JavaParser.parse(new FileInputStream(in)), methodName);
}
public static String extractBody(InputStream in, String methodName) throws ParseException {
return extractMethod(JavaParser.parse(in), methodName);
}
private static String extractMethod(CompilationUnit cu, String methodName) {
return new MethodBodyVisitor().visit(cu, methodName).replaceAll("\\r\\n", "\n");
}
private static class MethodBodyVisitor extends GenericVisitorAdapter<String, String> {
@Override
public String visit(MethodDeclaration n, String arg) {
return arg.equals(n.getName()) ? "" + n.getBody() : null;
}
}
}