Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Generate a Java token kind enum with a mapping to the integer kinds.
- Loading branch information
Showing
5 changed files
with
419 additions
and
70 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
71 changes: 71 additions & 0 deletions
71
...nerators/src/main/java/com/github/javaparser/generator/core/other/TokenKindGenerator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
package com.github.javaparser.generator.core.other; | ||
|
||
import com.github.javaparser.ast.CompilationUnit; | ||
import com.github.javaparser.ast.Node; | ||
import com.github.javaparser.ast.NodeList; | ||
import com.github.javaparser.ast.body.BodyDeclaration; | ||
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; | ||
import com.github.javaparser.ast.body.EnumConstantDeclaration; | ||
import com.github.javaparser.ast.body.EnumDeclaration; | ||
import com.github.javaparser.ast.expr.IntegerLiteralExpr; | ||
import com.github.javaparser.ast.stmt.ReturnStmt; | ||
import com.github.javaparser.ast.stmt.SwitchEntryStmt; | ||
import com.github.javaparser.ast.stmt.SwitchStmt; | ||
import com.github.javaparser.generator.Generator; | ||
import com.github.javaparser.utils.Log; | ||
import com.github.javaparser.utils.SourceRoot; | ||
|
||
/** | ||
* Generates the TokenKind enum from {@link com.github.javaparser.GeneratedJavaParserConstants} | ||
*/ | ||
public class TokenKindGenerator extends Generator { | ||
private final SourceRoot generatedJavaCcSourceRoot; | ||
|
||
public TokenKindGenerator(SourceRoot sourceRoot, SourceRoot generatedJavaCcSourceRoot) { | ||
super(sourceRoot); | ||
this.generatedJavaCcSourceRoot = generatedJavaCcSourceRoot; | ||
} | ||
|
||
@Override | ||
public void generate() { | ||
Log.info("Running %s", getClass().getSimpleName()); | ||
|
||
final CompilationUnit javaTokenCu = sourceRoot.parse("com.github.javaparser", "JavaToken.java"); | ||
final ClassOrInterfaceDeclaration javaToken = javaTokenCu.getClassByName("JavaToken").orElseThrow(() -> new AssertionError("Can't find class in java file.")); | ||
final EnumDeclaration kindEnum = javaToken.findFirst(EnumDeclaration.class, e -> e.getNameAsString().equals("Kind")).orElseThrow(() -> new AssertionError("Can't find class in java file.")); | ||
|
||
kindEnum.getEntries().clear(); | ||
annotateGenerated(kindEnum); | ||
|
||
final SwitchStmt valueOfSwitch = kindEnum.findFirst(SwitchStmt.class).orElseThrow(() -> new AssertionError("Can't find valueOf switch.")); | ||
valueOfSwitch.findAll(SwitchEntryStmt.class).stream().filter(e -> e.getLabel().isPresent()).forEach(Node::remove); | ||
|
||
final CompilationUnit constantsCu = generatedJavaCcSourceRoot.parse("com.github.javaparser", "GeneratedJavaParserConstants.java"); | ||
final ClassOrInterfaceDeclaration constants = constantsCu.getInterfaceByName("GeneratedJavaParserConstants").orElseThrow(() -> new AssertionError("Can't find class in java file.")); | ||
for (BodyDeclaration<?> member : constants.getMembers()) { | ||
member.toFieldDeclaration() | ||
.filter(field -> { | ||
String javadoc = field.getJavadocComment().get().getContent(); | ||
return javadoc.contains("RegularExpression Id") || javadoc.contains("End of File"); | ||
}) | ||
.map(field -> field.getVariable(0)) | ||
.ifPresent(var -> { | ||
final String name = var.getNameAsString(); | ||
final IntegerLiteralExpr kind = var.getInitializer().get().asIntegerLiteralExpr(); | ||
generateEnumEntry(kindEnum, name, kind); | ||
generateValueOfEntry(valueOfSwitch, name, kind); | ||
}); | ||
} | ||
} | ||
|
||
private void generateValueOfEntry(SwitchStmt valueOfSwitch, String name, IntegerLiteralExpr kind) { | ||
final SwitchEntryStmt entry = new SwitchEntryStmt(kind, new NodeList<>(new ReturnStmt(name))); | ||
valueOfSwitch.getEntries().addFirst(entry); | ||
} | ||
|
||
private void generateEnumEntry(EnumDeclaration kindEnum, String name, IntegerLiteralExpr kind) { | ||
final EnumConstantDeclaration enumEntry = new EnumConstantDeclaration(name); | ||
enumEntry.getArguments().add(kind); | ||
kindEnum.addEntry(enumEntry); | ||
} | ||
} |
Oops, something went wrong.