javac pretty printer probable bugs

Jonathan Gibbons jonathan.gibbons at oracle.com
Sun Jan 29 08:25:06 PST 2012


Martin,

The pretty printer is primarily a debugging aid, to accurately show the 
contents of the syntax tree. To assist in that task, a more recent 
development has been to try and make the output be compilable as well.

The difficulty is that, despite first appearances, the AST is not a 
direct, literal representation of the source text and some 
transformations on the tree have already occurred by the time the pretty 
printer gets invoked.

The use of comments has been introduced as a way of showing the parts of 
the AST which are present but which prevent compilation.   It would seem 
you have found a couple of corner cases that need to be fixed.

-- Jon


On 01/29/2012 06:07 AM, Crazy Java wrote:
> It looks like the Enum problem should alreadz be fixed according to 
> bug 6902720 
> (http://hg.openjdk.java.net/jdk7/tl/langtools/rev/b1bb8164a9bd, 
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6902720), but it is 
> not.
>
> 2012/1/29 Rémi Forax <forax at univ-mlv.fr <mailto:forax at univ-mlv.fr>>
>
>     On 01/29/2012 01:40 PM, Crazy Java wrote:
>
>         Hi,
>         as part of the javac AST Visualizer project, I have some
>         difficulties with javac's pretty printer. The problem is the
>         fact, that I am doing double compilation (after first
>         compilation I get the textual representation of produced AST
>         and that is in fact used for visualization purposes). Double
>         compilation is needed because I want to visualize all the
>         compiler sugar (default constructor, effectively final
>         variables in ARM, code generated for enum, ...).
>         The problem is that javac's pretty printer (I guess it is
>         pretty printer) after calling CompilationUnitTree.toString()
>         produces in some specific situations code that is not able to
>         compile:
>         1.) it transforms
>         public class FullClassUsage {
>            {
>                new <Object> ArrayList<String>(10) {
>                    {
>                        add("123");
>                    }
>                };
>            }
>         }
>         into
>         public class FullClassUsage {
>
>            public FullClassUsage() {
>                super();
>            }
>            {
>                new <Object>ArrayList<String>(10){
>
>                    (int x0) {
>                        super(x0);
>                    }
>                    {
>                        add("123");
>                    }
>                };
>            }
>         }
>         the (int x0) is the problem.
>         2.) when using together with enum types it transforms:
>         public enum SimpleEnum {
>            ENUM_CONSTANT_1,
>            ENUM_CONSTANT_2
>         }
>         into
>         public enum SimpleEnum {
>            /*public static final*/ ENUM_CONSTANT_1 /* = new
>         SimpleEnum() */,
>            /*public static final*/ ENUM_CONSTANT_2 /* = new
>         SimpleEnum() */;
>
>            private SimpleEnum() {
>                super();
>            }
>         }
>         that is really weird. Not only it generates comments ??? but
>         also a super call causing the code not to compile. I would
>         also assume that it will generate all the enum type code
>         (constructors with n+2 arguments, valueOf() factory method,
>         extending java.lang.Enum, ...).
>         Is there any reason why it produces that weird code?
>
>
>     Java language != bytecode,
>     at the end javac will generate bytecodes and there are a lot of
>     things that are allowed
>     in bytecode that are not allowed in Java.
>
>     The pretty printer is something used to debug and not something
>     that will generate fully compatible Java code
>     because some de-sugared code are only valid in bytecode but not in
>     Java.
>
>
>         Is there any better way to get the Textual representation of
>         CompilationUnitTree (using pretty printer) that will compile
>         in both of these examples ?
>
>
>     write your own :)
>
>         //Martin
>
>
>     Rémi
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20120129/8cb4cbfc/attachment.html 


More information about the compiler-dev mailing list