1/*
2 * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @bug 6392782
27 * @summary TreeScanner.visitImport returns null, not result of nested scan
28 * @modules jdk.compiler/com.sun.tools.javac.api
29 *          jdk.compiler/com.sun.tools.javac.file
30 */
31
32import java.io.*;
33import java.util.*;
34import javax.tools.*;
35import com.sun.source.tree.*;
36import com.sun.source.util.*;
37import com.sun.tools.javac.api.*;
38
39public class T6392782 {
40    public static void main(String... args) throws IOException {
41        String testSrc = System.getProperty("test.src", ".");
42        JavacTool tool = JavacTool.create();
43        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
44            Iterable<? extends JavaFileObject> files =
45                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6392782.class.getName()+".java")));
46            JavacTask task = tool.getTask(null, fm, null, null, null, files);
47            Iterable<? extends Tree> trees = task.parse();
48            TreeScanner<Integer,Void> scanner = new MyScanner();
49            check(scanner, 6, scanner.scan(trees, null));
50
51            CountNodes nodeCounter = new CountNodes();
52            // 359 nodes with the regular parser; 360 nodes with EndPosParser
53            // We automatically switch to EndPosParser when calling JavacTask.parse()
54            check(nodeCounter, 362, nodeCounter.scan(trees, null));
55
56            CountIdentifiers idCounter = new CountIdentifiers();
57            check(idCounter, 107, idCounter.scan(trees, null));
58        }
59    }
60
61    private static void check(TreeScanner<?,?> scanner, int expect, int found) {
62        if (found != expect)
63            throw new AssertionError(scanner.getClass().getName() + ": expected: " + expect + " found: " + found);
64    }
65
66    static class MyScanner extends TreeScanner<Integer,Void> {
67        @Override
68        public Integer visitImport(ImportTree tree, Void ignore) {
69            //System.err.println(tree);
70            return 1;
71        }
72
73        @Override
74        public Integer reduce(Integer i1, Integer i2) {
75            return (i1 == null ? 0 : i1) + (i2 == null ? 0 : i2);
76        }
77    }
78
79    static class CountNodes extends TreeScanner<Integer,Void> {
80        @Override
81        public Integer scan(Tree node, Void p) {
82            if (node == null)
83                return 0;
84            Integer n = super.scan(node, p);
85            return (n == null ? 0 : n) + 1;
86        }
87        @Override
88        public Integer reduce(Integer r1, Integer r2) {
89            return (r1 == null ? 0 : r1) + (r2 == null ? 0 : r2);
90        }
91    }
92
93    // example from TreeScanner javadoc
94    static class CountIdentifiers extends TreeScanner<Integer,Void> {
95        @Override
96        public Integer visitIdentifier(IdentifierTree node, Void p) {
97            return 1;
98        }
99        @Override
100        public Integer reduce(Integer r1, Integer r2) {
101            return (r1 == null ? 0 : r1) + (r2 == null ? 0 : r2);
102        }
103    }
104}
105