# HG changeset patch # User jlahoda # Date 1554216685 -7200 # Node ID c79e191854e4d40e040a109c904ee850af1e4797 # Parent 72d5f7163f126cc6af40fe5311199e8fcbfcda86 Adding support for modifiers. diff -r 72d5f7163f12 -r c79e191854e4 src/jdk.compiler/share/classes/com/sun/source/util/TreeBuilder.java --- a/src/jdk.compiler/share/classes/com/sun/source/util/TreeBuilder.java Mon Apr 01 14:46:17 2019 +0200 +++ b/src/jdk.compiler/share/classes/com/sun/source/util/TreeBuilder.java Tue Apr 02 16:51:25 2019 +0200 @@ -151,13 +151,6 @@ } } -// interface TypeArgs { //??? -// TypeArgs type(Consumer t); -// TypeArgs _extends(Consumer t); -// TypeArgs _super(Consumer t); -// TypeArgs unbound(); -// } -// interface Expression { void equal_to(Consumer lhs, Consumer rhs); void minusminus(Consumer expr); diff -r 72d5f7163f12 -r c79e191854e4 src/jdk.compiler/share/classes/com/sun/tools/javac/api/TreeBuilderImpl.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/TreeBuilderImpl.java Mon Apr 01 14:46:17 2019 +0200 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/TreeBuilderImpl.java Tue Apr 02 16:51:25 2019 +0200 @@ -27,11 +27,13 @@ import java.util.function.Consumer; import java.util.function.Function; +import javax.lang.model.element.Modifier; import javax.tools.JavaFileObject; import com.sun.source.doctree.DocTree; import com.sun.source.tree.CompilationUnitTree; import com.sun.source.util.TreeBuilder; +import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.TypeTag; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.JCClassDecl; @@ -47,6 +49,7 @@ import com.sun.tools.javac.parser.Parser; import com.sun.tools.javac.parser.ParserFactory; import com.sun.tools.javac.tree.JCTree.JCBlock; +import com.sun.tools.javac.tree.JCTree.JCModifiers; import com.sun.tools.javac.tree.JCTree.JCStatement; import com.sun.tools.javac.util.JCDiagnostic; import com.sun.tools.javac.util.Log.DiagnosticHandler; @@ -159,7 +162,8 @@ @Override public Class modifiers(Consumer modifiers) { - throw new UnsupportedOperationException("Not supported yet."); + modifiers.accept(new ModifiersImpl(result.mods)); + return this; } @Override @@ -240,7 +244,8 @@ @Override public Variable modifiers(Consumer modifiers) { - throw new UnsupportedOperationException("Not supported yet."); + modifiers.accept(new ModifiersImpl(result.mods)); + return this; } @Override @@ -291,7 +296,8 @@ @Override public Method modifiers(Consumer modifiers) { - throw new UnsupportedOperationException("Not supported yet."); + modifiers.accept(new ModifiersImpl(result.mods)); + return this; } @Override @@ -481,6 +487,44 @@ } + private final class ModifiersImpl implements Modifiers { + + private final JCModifiers mods; + + public ModifiersImpl(JCModifiers mods) { + this.mods = mods; + } + + @Override + public Modifiers modifier(Modifier modifier) { + long flag; + switch (modifier) { + case PUBLIC: flag = Flags.PUBLIC; break; + case PROTECTED: flag = Flags.PROTECTED; break; + case PRIVATE: flag = Flags.PRIVATE; break; + case ABSTRACT: flag = Flags.ABSTRACT; break; + case STATIC: flag = Flags.STATIC; break; + case FINAL: flag = Flags.FINAL; break; + case TRANSIENT: flag = Flags.TRANSIENT; break; + case VOLATILE: flag = Flags.VOLATILE; break; + case SYNCHRONIZED: flag = Flags.SYNCHRONIZED; break; + case NATIVE: flag = Flags.NATIVE; break; + case STRICTFP: flag = Flags.STRICTFP; break; + case DEFAULT: flag = Flags.DEFAULT; break; + default: + throw new IllegalArgumentException("Unknown modifier: " + modifier); + } + mods.flags |= flag; + return this; + } + + @Override + public Modifiers annotation(Consumer annotation) { + throw new UnsupportedOperationException("Not supported yet."); + } + + } + private JCExpression visitExpression(Consumer c) { ExpressionImpl expr = new ExpressionImpl(); diff -r 72d5f7163f12 -r c79e191854e4 test/langtools/tools/javac/api/ast/ASTBuilder.java --- a/test/langtools/tools/javac/api/ast/ASTBuilder.java Mon Apr 01 14:46:17 2019 +0200 +++ b/test/langtools/tools/javac/api/ast/ASTBuilder.java Tue Apr 02 16:51:25 2019 +0200 @@ -35,8 +35,10 @@ import java.net.URI; import java.util.Arrays; +import java.util.EnumSet; import java.util.function.Consumer; +import javax.lang.model.element.Modifier; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.SimpleJavaFileObject; @@ -57,16 +59,27 @@ import com.sun.source.tree.MemberReferenceTree; import com.sun.source.tree.MemberSelectTree; import com.sun.source.tree.MethodTree; +import com.sun.source.tree.ModifiersTree; import com.sun.source.tree.VariableTree; import toolbox.ToolBox.MemoryFileManager; public class ASTBuilder { public static void main(String[] args) throws Exception { - runTest("class Test {" + - " int x;" + + runTest("public class Test {" + + " public static volatile int x;" + "}", - U -> U._class("Test", C -> C.field("x", Type::_int))); + U -> U._class("Test", + C -> C.modifiers(M -> M.modifier(Modifier.PUBLIC)) + .field("x", + Type::_int, + F -> F.modifiers(M -> M.modifier(Modifier.PUBLIC) + .modifier(Modifier.STATIC) + .modifier(Modifier.VOLATILE) + ) + ) + ) + ); runTest("class Test extends Exception implements java.util.List>, CharSequence {" + " int x1 = 2;" + " int x2 = 2 + x1;" + @@ -239,6 +252,11 @@ result.append(node.getName()); return super.visitVariable(node, p); } + @Override + public Void visitModifiers(ModifiersTree node, Void p) { + result.append(node.getFlags()); + return super.visitModifiers(node, p); + } }.scan(t, null); return result.toString(); } diff -r 72d5f7163f12 -r c79e191854e4 test/langtools/tools/javac/api/ast/CodeBuilder.java --- a/test/langtools/tools/javac/api/ast/CodeBuilder.java Mon Apr 01 14:46:17 2019 +0200 +++ b/test/langtools/tools/javac/api/ast/CodeBuilder.java Tue Apr 02 16:51:25 2019 +0200 @@ -187,14 +187,6 @@ return null; } -// @Override -// public Void visitBlock(BlockTree node, Void p) { -//// for (StatementTree st : node.getStatements()) { -//// result.append(curr) -//// } -// return super.visitBlock(node, p); -// } - @Override public Void visitIf(IfTree node, Void p) { result.append(currentBuilder() + "._if(");