langtools/test/tools/javac/api/TestGetElement.java
author jjg
Mon, 06 Sep 2010 12:55:09 -0700
changeset 6590 f745e683da2c
child 30730 d3ce7619db2c
permissions -rw-r--r--
6930507: Symbols for anonymous and local classes made too late for use by java tree API Reviewed-by: mcimadamore
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6590
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
     1
/*
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
     2
 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
     4
 *
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
     7
 * published by the Free Software Foundation.
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
     8
 *
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    13
 * accompanied this code).
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    14
 *
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    18
 *
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    21
 * questions.
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    22
 */
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    23
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    24
/*
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    25
 * @test
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    26
 * @bug 6930507
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    27
 * @summary Symbols for anonymous and local classes made too late for use by java tree API
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    28
 */
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    29
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    30
import java.io.*;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    31
import java.util.*;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    32
import javax.annotation.processing.*;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    33
import javax.lang.model.SourceVersion;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    34
import javax.lang.model.element.*;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    35
import javax.tools.Diagnostic;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    36
import static javax.lang.model.util.ElementFilter.*;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    37
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    38
import com.sun.source.tree.*;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    39
import com.sun.source.util.*;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    40
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    41
@SupportedOptions({"test", "last"})
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    42
@SupportedAnnotationTypes("*")
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    43
public class TestGetElement extends AbstractProcessor {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    44
    public static void main(String... args) throws Exception {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    45
        new TestGetElement().run();
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    46
    }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    47
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    48
    public TestGetElement() { }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    49
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    50
    public void run() throws Exception {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    51
        final String testSrc = System.getProperty("test.src");
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    52
        final String testClasses = System.getProperty("test.classes");
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    53
        final String myClassName = getClass().getName();
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    54
        final String mySrc = new File(testSrc, myClassName + ".java").getPath();
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    55
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    56
        final int NUM_TESTS = 90; // #decls in this source file
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    57
        for (int i = 1; i <= NUM_TESTS; i++) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    58
            System.err.println("test " + i);
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    59
            File testDir = new File("test" + i);
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    60
            File classesDir = new File(testDir, "classes");
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    61
            classesDir.mkdirs();
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    62
            String[] args = {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    63
                "-d", classesDir.getPath(),
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    64
                "-processorpath", testClasses,
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    65
                "-processor", myClassName,
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    66
                "-proc:only",
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    67
                "-Atest=" + i,
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    68
                "-Alast=" + (i == NUM_TESTS),
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    69
                mySrc
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    70
            };
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    71
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    72
//            System.err.println("compile: " + Arrays.asList(args));
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    73
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    74
            StringWriter sw = new StringWriter();
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    75
            PrintWriter pw = new PrintWriter(sw);
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    76
            int rc = com.sun.tools.javac.Main.compile(args, pw);
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    77
            pw.close();
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    78
            String out = sw.toString();
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    79
            if (out != null)
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    80
                System.err.println(out);
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    81
            if (rc != 0) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    82
                System.err.println("compilation failed: rc=" + rc);
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    83
                errors++;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    84
            }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    85
        }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    86
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    87
        if (errors > 0)
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    88
            throw new Exception(errors + " errors occurred");
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    89
    }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    90
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    91
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    92
    int errors;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    93
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    94
    public boolean process(Set<? extends TypeElement> annotations,
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    95
                           RoundEnvironment roundEnvironment)
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    96
    {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    97
        if (roundEnvironment.processingOver())
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    98
            return true;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
    99
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   100
        Map<String,String> options = processingEnv.getOptions();
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   101
        int test = Integer.parseInt(options.get("test"));
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   102
        boolean _last = Boolean.parseBoolean(options.get("last"));
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   103
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   104
        Trees trees = Trees.instance(processingEnv);
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   105
        Scanner scanner = new Scanner(trees, _last);
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   106
        int nelems = 0;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   107
        for (TypeElement e : typesIn(roundEnvironment.getRootElements())) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   108
            nelems += scanner.scan(trees.getPath(e), test);
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   109
        }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   110
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   111
        Messager m = processingEnv.getMessager();
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   112
        int EXPECT = 1;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   113
        if (nelems != EXPECT) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   114
            m.printMessage(Diagnostic.Kind.ERROR,
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   115
                    "Unexpected number of elements found: " + nelems + " expected: " + EXPECT);
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   116
        }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   117
        return true;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   118
    }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   119
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   120
    @Override
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   121
    public SourceVersion getSupportedSourceVersion() {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   122
        return SourceVersion.latest();
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   123
    }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   124
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   125
    class Scanner extends TreePathScanner<Integer,Integer> {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   126
        final Trees trees;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   127
        final boolean last;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   128
        int count;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   129
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   130
        Scanner(Trees trees, boolean last) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   131
            this.trees = trees;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   132
            this.last = last;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   133
        }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   134
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   135
        @Override
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   136
        public Integer visitClass(ClassTree tree, Integer test) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   137
            return reduce(check(test), super.visitClass(tree, test));
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   138
        }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   139
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   140
        @Override
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   141
        public Integer visitMethod(MethodTree tree, Integer test) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   142
            return reduce(check(test), super.visitMethod(tree, test));
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   143
        }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   144
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   145
        @Override
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   146
        public Integer visitVariable(VariableTree tree, Integer test) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   147
            return reduce(check(test), super.visitVariable(tree, test));
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   148
        }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   149
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   150
        @Override
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   151
        public Integer reduce(Integer i1, Integer i2) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   152
            if (i1 == null || i1.intValue() == 0)
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   153
                return i2;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   154
            if (i2 == null || i2.intValue() == 0)
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   155
                return i1;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   156
            return (i1 + i2);
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   157
        }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   158
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   159
        int check(int test) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   160
            count++;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   161
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   162
            if (count != test)
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   163
                return 0;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   164
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   165
            TreePath p = getCurrentPath();
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   166
            Element e = trees.getElement(p);
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   167
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   168
            String text = p.getLeaf().toString().replaceAll("\\s+", " ").trim();
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   169
            int MAXLEN = 40;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   170
            if (text.length() > MAXLEN)
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   171
                text = text.substring(0, MAXLEN - 3) + "...";
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   172
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   173
            System.err.println(String.format("%3d: %-" + MAXLEN + "s -- %s",
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   174
                    count, text,
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   175
                    (e == null ? "null" : e.getKind() + " " + e)));
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   176
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   177
            Messager m = processingEnv.getMessager();
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   178
            if (e == null) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   179
                m.printMessage(Diagnostic.Kind.ERROR, "Null element found for " + text);
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   180
                return 0;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   181
            }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   182
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   183
            if (last && !e.getSimpleName().contentEquals("last")) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   184
                m.printMessage(Diagnostic.Kind.ERROR, "Unexpected name in last test: "
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   185
                        + e.getSimpleName() + ", expected: last");
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   186
            }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   187
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   188
            return 1;
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   189
        }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   190
    }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   191
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   192
    // following are all fodder for the test
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   193
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   194
    class MemberClass {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   195
        class NestedMemberClass { }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   196
    }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   197
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   198
    {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   199
        class InnerClassInInit { }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   200
        Object o = new Object() { };
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   201
    }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   202
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   203
    TestGetElement(TestGetElement unused) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   204
        class InnerClassInConstr { }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   205
        Object o = new Object() { };
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   206
    }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   207
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   208
    void m() {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   209
        class InnerClassInMethod { }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   210
        Object o = new Object() { };
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   211
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   212
        class C {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   213
            class MemberClass {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   214
                class NestedMemberClass { }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   215
            }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   216
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   217
            {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   218
                class InnerClassInInit { }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   219
                Object o = new Object() { };
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   220
            }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   221
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   222
            C(Object unused) {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   223
                class InnerClassInConstr { }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   224
                Object o = new Object() { };
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   225
            }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   226
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   227
            void m() {
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   228
                class InnerClassInMethod { }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   229
                Object o = new Object() { };
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   230
            }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   231
        }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   232
    }
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   233
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   234
    int last; // this name is verified by the test to make sure that all decls are checked
f745e683da2c 6930507: Symbols for anonymous and local classes made too late for use by java tree API
jjg
parents:
diff changeset
   235
}