aboutsummaryrefslogtreecommitdiffstats
path: root/javaparser-core-generators
diff options
context:
space:
mode:
authorDanny van Bruggen <hexagonaal@gmail.com>2018-01-07 14:57:17 +0100
committerDanny van Bruggen <hexagonaal@gmail.com>2018-01-07 14:57:17 +0100
commit73fcc27d049a401ac87cc945bff7c0ebd8a2c9cd (patch)
treec429f0a4ccd86faf01b8b537e003f3af57fd826a /javaparser-core-generators
parenta64a944ea65cc2dfbf28e850c121bf584d2c3ece (diff)
downloadplatform_external_javaparser-73fcc27d049a401ac87cc945bff7c0ebd8a2c9cd.tar.gz
platform_external_javaparser-73fcc27d049a401ac87cc945bff7c0ebd8a2c9cd.tar.bz2
platform_external_javaparser-73fcc27d049a401ac87cc945bff7c0ebd8a2c9cd.zip
Generate a Java token kind enum with a mapping to the integer kinds.
Diffstat (limited to 'javaparser-core-generators')
-rw-r--r--javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java4
-rw-r--r--javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/CoreGenerator.java27
-rw-r--r--javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/other/TokenKindGenerator.java71
3 files changed, 92 insertions, 10 deletions
diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java
index 673990df2..18ab60d99 100644
--- a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java
+++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/NodeGenerator.java
@@ -32,9 +32,9 @@ public abstract class NodeGenerator extends Generator {
after();
}
- protected Pair<CompilationUnit, ClassOrInterfaceDeclaration> parseNode(BaseNodeMetaModel nodeMetaModel) throws IOException {
+ protected Pair<CompilationUnit, ClassOrInterfaceDeclaration> parseNode(BaseNodeMetaModel nodeMetaModel) {
CompilationUnit nodeCu = sourceRoot.parse(nodeMetaModel.getPackageName(), nodeMetaModel.getTypeName() + ".java");
- ClassOrInterfaceDeclaration nodeCoid = nodeCu.getClassByName(nodeMetaModel.getTypeName()).orElseThrow(() -> new IOException("Can't find class"));
+ ClassOrInterfaceDeclaration nodeCoid = nodeCu.getClassByName(nodeMetaModel.getTypeName()).orElseThrow(() -> new AssertionError("Can't find class"));
return new Pair<>(nodeCu, nodeCoid);
}
diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/CoreGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/CoreGenerator.java
index 2618b0f17..c1aa5f9fb 100644
--- a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/CoreGenerator.java
+++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/CoreGenerator.java
@@ -2,6 +2,7 @@ package com.github.javaparser.generator.core;
import com.github.javaparser.ParserConfiguration;
import com.github.javaparser.generator.core.node.*;
+import com.github.javaparser.generator.core.other.TokenKindGenerator;
import com.github.javaparser.generator.core.visitor.*;
import com.github.javaparser.utils.Log;
import com.github.javaparser.utils.SourceRoot;
@@ -11,28 +12,37 @@ import java.nio.file.Paths;
/**
* Generates all generated visitors in the javaparser-core module.
+ * Suggested usage is by running the run_core_generators.sh script.
+ * You may want to run_metamodel_generator.sh before that.
*/
public class CoreGenerator {
+ private static final ParserConfiguration parserConfiguration = new ParserConfiguration()
+// .setStoreTokens(false)
+// .setAttributeComments(false)
+// .setLexicalPreservationEnabled(true)
+ ;
+
public static void main(String[] args) throws Exception {
if (args.length != 1) {
throw new RuntimeException("Need 1 parameter: the JavaParser source checkout root directory.");
}
Log.setAdapter(new Log.StandardOutStandardErrorAdapter());
final Path root = Paths.get(args[0], "..", "javaparser-core", "src", "main", "java");
- final SourceRoot sourceRoot = new SourceRoot(root)
+ final SourceRoot sourceRoot = new SourceRoot(root, parserConfiguration)
// .setPrinter(LexicalPreservingPrinter::print)
- .setParserConfiguration(new ParserConfiguration()
-// .setStoreTokens(false)
-// .setAttributeComments(false)
-// .setLexicalPreservationEnabled(true)
- );
+ ;
+
+ final Path generatedJavaCcRoot = Paths.get(args[0], "..", "javaparser-core", "target", "generated-sources", "javacc");
+ final SourceRoot generatedJavaCcSourceRoot = new SourceRoot(generatedJavaCcRoot, parserConfiguration)
+// .setPrinter(LexicalPreservingPrinter::print)
+ ;
- new CoreGenerator().run(sourceRoot);
+ new CoreGenerator().run(sourceRoot, generatedJavaCcSourceRoot);
sourceRoot.saveAll();
}
- private void run(SourceRoot sourceRoot) throws Exception {
+ private void run(SourceRoot sourceRoot, SourceRoot generatedJavaCcSourceRoot) throws Exception {
new TypeCastingGenerator(sourceRoot).generate();
new GenericListVisitorAdapterGenerator(sourceRoot).generate();
new GenericVisitorAdapterGenerator(sourceRoot).generate();
@@ -58,5 +68,6 @@ public class CoreGenerator {
new MainConstructorGenerator(sourceRoot).generate();
new FinalGenerator(sourceRoot).generate();
new AcceptGenerator(sourceRoot).generate();
+ new TokenKindGenerator(sourceRoot, generatedJavaCcSourceRoot).generate();
}
}
diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/other/TokenKindGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/other/TokenKindGenerator.java
new file mode 100644
index 000000000..5088bc353
--- /dev/null
+++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/other/TokenKindGenerator.java
@@ -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);
+ }
+}