GitHub - forge/roaster: A Java Parser library that allows easy parsing and formatting of Java source files (original) (raw)

Roaster - The only Java source parser library you’ll ever need

Actions Status License Maven Central Supported JVM Versions

Roaster (formerly known as java-parser) is a library that allows easy parsing and formatting of java source files. Roaster introduces a fluent interface to manipulate Java source files, like adding fields, methods, annotations and so on.

Installation

2.30.3.Final org.jboss.forge.roaster roaster-api ${version.roaster} org.jboss.forge.roaster roaster-jdt ${version.roaster} runtime

Usage

CLI

Execute roaster by running the following script (add these to your $PATH for convenience):

bin/roaster     (Unix/Linux/OSX)
bin/roaster.bat (Windows)

Options described here:

$ roaster -h

Usage: roaster [OPTION]... FILES ... The fastest way to build applications, share your software, and enjoy doing it.

-c, --config [CONFIG_FILE] specify the path to the Eclipse code format profile (usually found at '$PROJECT/.settings/org.eclipse.jdt.core.prefs')

-r, --recursive format files in found sub-directories recursively

FILES... specify one or more space-separated files or directories to format

-h, --help display this help and exit

Example:

Roaster.parse(JavaClassSource.class, "public class HelloWorld {}");

Java Source Code Generation API

Roaster provides a fluent API to generate java classes. Here an example:

final JavaClassSource javaClass = Roaster.create(JavaClassSource.class); javaClass.setPackage("com.company.example").setName("Person");

javaClass.addInterface(Serializable.class); javaClass.addField() .setName("serialVersionUID") .setType("long") .setLiteralInitializer("1L") .setPrivate() .setStatic(true) .setFinal(true);

javaClass.addProperty(Integer.class, "id").setMutable(false); javaClass.addProperty(String.class, "firstName"); javaClass.addProperty("String", "lastName");

javaClass.addMethod() .setConstructor(true) .setPublic() .setBody("this.id = id;") .addParameter(Integer.class, "id");

Will produce:

package com.company.example;

import java.io.Serializable;

public class Person implements Serializable {

private static final long serialVersionUID = 1L; private final Integer id; private String firstName; private String lastName;

public Integer getId() { return id; }

public String getFirstName() { return firstName; }

public void setFirstName(String firstName) { this.firstName = firstName; }

public String getLastName() { return lastName; }

public void setLastName(String lastName) { this.lastName = lastName; }

public Person(Integer id) { this.id = id; } }

Java Source Code Modification API

Of course it is possible to mix both approaches (parser and writer) to modify Java code programmatically:

JavaClassSource javaClass = Roaster.parse(JavaClassSource.class, "public class SomeClass {}"); javaClass.addMethod() .setPublic() .setStatic(true) .setName("main") .setReturnTypeVoid() .setBody("System.out.println("Hello World");") .addParameter("java.lang.String[]", "args"); System.out.println(javaClass);

JavaDoc creation and parsing

Here is an example on how to add JavaDoc to a class:

JavaClassSource javaClass = Roaster.parse(JavaClassSource.class, "public class SomeClass {}"); JavaDocSource javaDoc = javaClass.getJavaDoc();

javaDoc.setFullText("Full class documentation"); // or javaDoc.setText("Class documentation text"); javaDoc.addTagValue("@author","George Gastaldi");

System.out.println(javaClass);

Formatting the Java Source Code

Roaster formats the Java Source Code by calling the format() method:

String javaCode = "public class MyClass{ private String field;}"; String formattedCode = Roaster.format(javaCode); System.out.println(formattedCode);

Parsing the java unit

The Java Language Specification allows you to define multiple classes in the same .java file. Roaster supports parsing the entire unit by calling the parseUnit() method:

String javaCode = "public class MyClass{ private String field;} public class AnotherClass {}";

JavaUnit unit = Roaster.parseUnit(javaCode);

JavaClassSource myClass = unit.getGoverningType(); JavaClassSource anotherClass = (JavaClassSource) unit.getTopLevelTypes().get(1);

Validate Code Snippets

Roaster validates Java snippets and reports as Problem objects by calling the validateSnippet() method:

Example:

List problem = Roaster.validateSnippet("public class HelloWorld {}"); // problem.size() == 0

List problem = Roaster.validateSnippet("public class MyClass {"); // problem.size() == 1 containing a new Problem("Syntax error, insert "}" to complete ClassBody", 21, 21, 1)

Building from sources

Just run mvn clean install to build the sources

Issue tracker

Get in touch

For the writer part:

License