JDK-8011026 : javac, com.sun.source.util.Trees fail to retrieve class trees at GENERATE event
  • Type: Bug
  • Component: tools
  • Sub-Component: javac
  • Affected Version: 8
  • Priority: P4
  • Status: Open
  • Resolution: Unresolved
  • Submitted: 2013-03-28
  • Updated: 2016-05-19
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
Other
tbd_majorUnresolved
Related Reports
Relates :  
Description
The following "jtreg" test:

/*
 * @test
 * @bug 8011026
 * @summary javac, com.sun.source.util.Trees fail to retrieve class trees at GENERATE 
 * event
 */

import com.sun.source.tree.ClassTree;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

import com.sun.source.util.JavacTask;
import com.sun.source.util.TaskEvent;
import com.sun.source.util.TaskListener;
import com.sun.source.util.Trees;

public class TreesIntfGivesNoInnerClassTreeAtGenerateEventTest {

    public static void main(String[] args) throws IOException {
        new TreesIntfGivesNoInnerClassTreeAtGenerateEventTest().run(args);
    }

    void run(String[] args) throws IOException {
        checkBridgeSymbol(TaskEvent.Kind.ANALYZE);
        checkBridgeSymbol(TaskEvent.Kind.GENERATE);
    }

    void checkBridgeSymbol(final TaskEvent.Kind kind) throws IOException {
        System.out.println("Waiting for events of kind " + kind.name());
        JavaCompiler c = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager fm = c.getStandardFileManager(null, null, null);
        Iterable<? extends JavaFileObject> fos =
                fm.getJavaFileObjectsFromFiles(
                Arrays.asList(new File(System.getProperty("test.src"),
                this.getClass().getSimpleName() + ".java")));
        JavacTask task = (JavacTask) c.getTask(null, fm, null,
                Arrays.asList("-d", System.getProperty("user.dir")), null, fos);
        final Trees trees = Trees.instance(task);

        task.addTaskListener(new TaskListener() {

            @Override
            public void started(TaskEvent e) {}

            @Override
            public void finished(TaskEvent e) {
                if (e.getKind() == kind) {
                    ClassTree classTree = trees.getTree(e.getTypeElement());
                    if (classTree == null) {
                        System.out.println("No tree for type element " + 
                                e.getTypeElement().toString());
                    } else {
                        System.out.println("We have tree for type element " + 
                                e.getTypeElement().toString());
                    }
                }
            }
        });
        
        task.call();
    }
    
    class Inner {}

}

Prints out:

Waiting for events of kind ANALYZE
We have tree for type element TreesIntfGivesNoInnerClassTreeAtGenerateEventTest
Waiting for events of kind GENERATE
No tree for type element <anonymous TreesIntfGivesNoInnerClassTreeAtGenerateEventTest$1>
No tree for type element TreesIntfGivesNoInnerClassTreeAtGenerateEventTest.Inner
No tree for type element TreesIntfGivesNoInnerClassTreeAtGenerateEventTest
Comments
In review
09-04-2013