forked from javaparser/javaparser
-
Notifications
You must be signed in to change notification settings - Fork 0
Manual
Danny van Bruggen edited this page Jul 21, 2016
·
11 revisions
If you have questions of how to use this parser, post a comment here, the answer can help other people.
To use JavaParser from a Maven project, add the dependency as follows:
<dependency>
<groupId>com.github.javaparser</groupId>
<artifactId>javaparser-core</artifactId>
<version>2.5.1</version>
</dependency>
public class CuPrinter {
public static void main(String[] args) throws Exception {
// creates an input stream for the file to be parsed
FileInputStream in = new FileInputStream("test.java");
CompilationUnit cu;
try {
// parse the file
cu = JavaParser.parse(in);
} finally {
in.close();
}
// prints the resulting compilation unit to default system output
System.out.println(cu.toString());
}
}
public class MethodPrinter {
public static void main(String[] args) throws Exception {
// creates an input stream for the file to be parsed
FileInputStream in = new FileInputStream("test.java");
CompilationUnit cu;
try {
// parse the file
cu = JavaParser.parse(in);
} finally {
in.close();
}
// visit and print the methods names
new MethodVisitor().visit(cu, null);
}
/**
* Simple visitor implementation for visiting MethodDeclaration nodes.
*/
private static class MethodVisitor extends VoidVisitorAdapter {
@Override
public void visit(MethodDeclaration n, Object arg) {
// here you can access the attributes of the method.
// this method will be called for all methods in this
// CompilationUnit, including inner class methods
System.out.println(n.getName());
super.visit(n, arg);
}
}
}
public class MethodChanger {
public static void main(String[] args) throws Exception {
// creates an input stream for the file to be parsed
FileInputStream in = new FileInputStream("test.java");
CompilationUnit cu;
try {
// parse the file
cu = JavaParser.parse(in);
} finally {
in.close();
}
// visit and change the methods names and parameters
new MethodChangerVisitor().visit(cu, null);
// prints the changed compilation unit
System.out.println(cu.toString());
}
/**
* Simple visitor implementation for visiting MethodDeclaration nodes.
*/
private static class MethodChangerVisitor extends VoidVisitorAdapter {
@Override
public void visit(MethodDeclaration n, Object arg) {
// change the name of the method to upper case
n.setName(n.getName().toUpperCase());
// create the new parameter
Parameter newArg = ASTHelper.createParameter(ASTHelper.INT_TYPE, "value");
// add the parameter to the method
ASTHelper.addParameter(n, newArg);
}
}
}
public class MethodChanger {
public static void main(String[] args) throws Exception {
// creates an input stream for the file to be parsed
FileInputStream in = new FileInputStream("test.java");
CompilationUnit cu;
try {
// parse the file
cu = JavaParser.parse(in);
} finally {
in.close();
}
// change the methods names and parameters
changeMethods(cu);
// prints the changed compilation unit
System.out.println(cu.toString());
}
private static void changeMethods(CompilationUnit cu) {
List<TypeDeclaration> types = cu.getTypes();
for (TypeDeclaration type : types) {
List<BodyDeclaration> members = type.getMembers();
for (BodyDeclaration member : members) {
if (member instanceof MethodDeclaration) {
MethodDeclaration method = (MethodDeclaration) member;
changeMethod(method);
}
}
}
}
private static void changeMethod(MethodDeclaration n) {
// change the name of the method to upper case
n.setName(n.getName().toUpperCase());
// create the new parameter
Parameter newArg = ASTHelper.createParameter(ASTHelper.INT_TYPE, "value");
// add the parameter to the method
ASTHelper.addParameter(n, newArg);
}
}
public class ClassCreator {
public static void main(String[] args) throws Exception {
// creates the compilation unit
CompilationUnit cu = createCU();
// prints the created compilation unit
System.out.println(cu.toString());
}
/**
* creates the compilation unit
*/
private static CompilationUnit createCU() {
CompilationUnit cu = new CompilationUnit();
// set the package
cu.setPackage(new PackageDeclaration(ASTHelper.createNameExpr("java.parser.test")));
// create the type declaration
ClassOrInterfaceDeclaration type = new ClassOrInterfaceDeclaration(ModifierSet.PUBLIC, false, "GeneratedClass");
ASTHelper.addTypeDeclaration(cu, type);
// create a method
MethodDeclaration method = new MethodDeclaration(ModifierSet.PUBLIC, ASTHelper.VOID_TYPE, "main");
method.setModifiers(ModifierSet.addModifier(method.getModifiers(), ModifierSet.STATIC));
ASTHelper.addMember(type, method);
// add a parameter to the method
Parameter param = ASTHelper.createParameter(ASTHelper.createReferenceType("String", 0), "args");
param.setVarArgs(true);
ASTHelper.addParameter(method, param);
// add a body to the method
BlockStmt block = new BlockStmt();
method.setBody(block);
// add a statement do the method body
NameExpr clazz = new NameExpr("System");
FieldAccessExpr field = new FieldAccessExpr(clazz, "out");
MethodCallExpr call = new MethodCallExpr(field, "println");
ASTHelper.addArgument(call, new StringLiteralExpr("Hello World!"));
ASTHelper.addStmt(block, call);
return cu;
}
}
Task is delete a=20 from here:
class D {
public int foo(int e) {
int a = 20;
}
}
How to do:
class MyVisitor extends ModifierVisitorAdapter
{
@Override
public Node visit(VariableDeclarator declarator, Object args)
{
if (declarator.getId().getName().equals("a") && declarator.getInit().toString().equals("20"))
{
return null;
}
return declarator;
}
}
In result you'll receive this:
class D {
public int foo(int e) {
int ;
}
}
To avoid empty "int ;" the actions are bit harder - you have to start visits from Parent of Declarator and of parent of parent of Declarator ... The magic comand here is
super.visit(declarationExpr, args);
It means that visitor will go to inners Nodes
all code:
public class GitHubTest {
public static void main(String...args) throws Exception {
FileInputStream file1 = new FileInputStream("forGitHubTest.java");
CompilationUnit cu = getCompilationUnit(file1);
String result = cu.toString();
new MyVisitor().visit(cu, null);
System.out.println(cu.toString());
}
public static CompilationUnit getCompilationUnit(InputStream in) {
try {
CompilationUnit cu;
try {
// parse the file
cu = JavaParser.parse(in);
return cu;
} finally {
in.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
class MyVisitor extends ModifierVisitorAdapter
{
@Override
public Node visit (ExpressionStmt stmt, Object args)
{
super.visit(stmt,args);
if (stmt.getExpression()==null)
{
return null;
}
return stmt;
}
@Override
public Node visit (VariableDeclarationExpr declarationExpr, Object args)
{
super.visit(declarationExpr, args);
if (declarationExpr.getVars().isEmpty()) {
return null;
}
return declarationExpr;
}
@Override
public Node visit(VariableDeclarator declarator, Object args)
{
if (declarator.getId().getName().equals("a") && declarator.getInit().toString().equals("20"))
{
return null;
}
return declarator;
}
}