langtools/test/tools/javac/7003595/T7003595.java
author jjg
Wed, 29 Oct 2014 17:25:23 -0700
changeset 27319 030080f03e4f
parent 10627 d8e900b62e02
child 30730 d3ce7619db2c
permissions -rw-r--r--
8062348: langtools tests should close file manager (group 1) Reviewed-by: darcy
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10627
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
     1
/*
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
     2
 * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
10627
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
     4
 *
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
     7
 * published by the Free Software Foundation.
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
     8
 *
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    13
 * accompanied this code).
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    14
 *
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    18
 *
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    21
 * questions.
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    22
 */
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    23
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    24
/*
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    25
 * @test
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    26
 * @bug 7003595
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    27
 * @summary IncompatibleClassChangeError with unreferenced local class with subclass
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    28
 */
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    29
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    30
import com.sun.source.util.JavacTask;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    31
import com.sun.tools.classfile.Attribute;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    32
import com.sun.tools.classfile.ClassFile;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    33
import com.sun.tools.classfile.InnerClasses_attribute;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    34
import com.sun.tools.classfile.ConstantPool.*;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    35
import com.sun.tools.javac.api.JavacTool;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    36
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    37
import java.io.File;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    38
import java.net.URI;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    39
import java.util.Arrays;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    40
import java.util.ArrayList;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    41
import javax.tools.JavaCompiler;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    42
import javax.tools.JavaFileObject;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    43
import javax.tools.SimpleJavaFileObject;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    44
import javax.tools.StandardJavaFileManager;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    45
import javax.tools.ToolProvider;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    46
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    47
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    48
public class T7003595 {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    49
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    50
    /** global decls ***/
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    51
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    52
    //statistics
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    53
    static int checkCount = 0;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    54
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    55
    enum ClassKind {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    56
        NESTED("static class #N { #B }", "$", true),
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    57
        INNER("class #N { #B }", "$", false),
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    58
        LOCAL_REF("void test() { class #N { #B }; new #N(); }", "$1", false),
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    59
        LOCAL_NOREF("void test() { class #N { #B }; }", "$1", false),
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    60
        ANON("void test() { new Object() { #B }; }", "$1", false),
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    61
        NONE("", "", false);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    62
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    63
        String memberInnerStr;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    64
        String sep;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    65
        boolean staticAllowed;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    66
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    67
        private ClassKind(String memberInnerStr, String sep, boolean staticAllowed) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    68
            this.memberInnerStr = memberInnerStr;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    69
            this.sep = sep;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    70
            this.staticAllowed = staticAllowed;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    71
        }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    72
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    73
        String getSource(String className, String outerName, String nested) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    74
            return memberInnerStr.replaceAll("#O", outerName).
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    75
                    replaceAll("#N", className).replaceAll("#B", nested);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    76
        }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    77
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    78
        static String getClassfileName(String[] names, ClassKind[] outerKinds, int pos) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    79
            System.out.println(" pos = " + pos + " kind = " + outerKinds[pos] + " sep = " + outerKinds[pos].sep);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    80
            String name = outerKinds[pos] != ANON ?
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    81
                    names[pos] : "";
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    82
            if (pos == 0) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    83
                return "Test" + outerKinds[pos].sep + name;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    84
            } else {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    85
                String outerStr = getClassfileName(names, outerKinds, pos - 1);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    86
                return outerStr + outerKinds[pos].sep + name;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    87
            }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    88
        }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    89
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    90
        boolean isAllowed(ClassKind nestedKind) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    91
            return nestedKind != NESTED ||
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    92
                    staticAllowed;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    93
        }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    94
    }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    95
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    96
    enum LocalInnerClass {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    97
        LOCAL_REF("class L {}; new L();", "Test$1L"),
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    98
        LOCAL_NOREF("class L {};", "Test$1L"),
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
    99
        ANON("new Object() {};", "Test$1"),
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   100
        NONE("", "");
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   101
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   102
        String localInnerStr;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   103
        String canonicalInnerStr;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   104
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   105
        private LocalInnerClass(String localInnerStr, String canonicalInnerStr) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   106
            this.localInnerStr = localInnerStr;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   107
            this.canonicalInnerStr = canonicalInnerStr;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   108
        }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   109
    }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   110
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   111
    public static void main(String... args) throws Exception {
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   112
        // Create a single file manager and reuse it for each compile to save time.
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   113
        try (StandardJavaFileManager fm = JavacTool.create().getStandardFileManager(null, null, null)) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   114
            for (ClassKind ck1 : ClassKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   115
                String cname1 = "C1";
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   116
                for (ClassKind ck2 : ClassKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   117
                    if (!ck1.isAllowed(ck2)) continue;
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   118
                    String cname2 = "C2";
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   119
                    for (ClassKind ck3 : ClassKind.values()) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   120
                        if (!ck2.isAllowed(ck3)) continue;
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   121
                        String cname3 = "C3";
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   122
                        new T7003595(fm, new ClassKind[] {ck1, ck2, ck3}, new String[] { cname1, cname2, cname3 }).compileAndCheck();
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   123
                    }
10627
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   124
                }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   125
            }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   126
        }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   127
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   128
        System.out.println("Total checks made: " + checkCount);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   129
    }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   130
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   131
    /** instance decls **/
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   132
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   133
    ClassKind[] cks;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   134
    String[] cnames;
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   135
    StandardJavaFileManager fm;
10627
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   136
27319
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   137
    T7003595(StandardJavaFileManager fm, ClassKind[] cks, String[] cnames) {
030080f03e4f 8062348: langtools tests should close file manager (group 1)
jjg
parents: 10627
diff changeset
   138
        this.fm = fm;
10627
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   139
        this.cks = cks;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   140
        this.cnames = cnames;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   141
    }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   142
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   143
    void compileAndCheck() throws Exception {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   144
        final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   145
        JavaSource source = new JavaSource();
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   146
        JavacTask ct = (JavacTask)tool.getTask(null, fm, null,
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   147
                null, null, Arrays.asList(source));
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   148
        ct.call();
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   149
        verifyBytecode(source);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   150
    }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   151
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   152
    void verifyBytecode(JavaSource source) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   153
        for (int i = 0; i < 3 ; i ++) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   154
            if (cks[i] == ClassKind.NONE) break;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   155
            checkCount++;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   156
            String filename = cks[i].getClassfileName(cnames, cks, i);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   157
            File compiledTest = new File(filename + ".class");
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   158
            try {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   159
                ClassFile cf = ClassFile.read(compiledTest);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   160
                if (cf == null) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   161
                    throw new Error("Classfile not found: " + filename);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   162
                }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   163
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   164
                InnerClasses_attribute innerClasses = (InnerClasses_attribute)cf.getAttribute(Attribute.InnerClasses);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   165
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   166
                ArrayList<String> foundInnerSig = new ArrayList<>();
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   167
                if (innerClasses != null) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   168
                    for (InnerClasses_attribute.Info info : innerClasses.classes) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   169
                        String foundSig = info.getInnerClassInfo(cf.constant_pool).getName();
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   170
                        foundInnerSig.add(foundSig);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   171
                    }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   172
                }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   173
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   174
                ArrayList<String> expectedInnerSig = new ArrayList<>();
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   175
                //add inner class (if any)
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   176
                if (i < 2 && cks[i + 1] != ClassKind.NONE) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   177
                    expectedInnerSig.add(cks[i + 1].getClassfileName(cnames, cks, i + 1));
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   178
                }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   179
                //add inner classes
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   180
                for (int j = 0 ; j != i + 1 && j < 3; j++) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   181
                    expectedInnerSig.add(cks[j].getClassfileName(cnames, cks, j));
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   182
                }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   183
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   184
                if (expectedInnerSig.size() != foundInnerSig.size()) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   185
                    throw new Error("InnerClasses attribute for " + cnames[i] + " has wrong size\n" +
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   186
                                    "expected " + expectedInnerSig.size() + "\n" +
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   187
                                    "found " + innerClasses.number_of_classes + "\n" +
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   188
                                    source);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   189
                }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   190
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   191
                for (String foundSig : foundInnerSig) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   192
                    if (!expectedInnerSig.contains(foundSig)) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   193
                        throw new Error("InnerClasses attribute for " + cnames[i] + " has unexpected signature: " +
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   194
                                foundSig + "\n" + source + "\n" + expectedInnerSig);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   195
                    }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   196
                }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   197
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   198
                for (String expectedSig : expectedInnerSig) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   199
                    if (!foundInnerSig.contains(expectedSig)) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   200
                        throw new Error("InnerClasses attribute for " + cnames[i] + " does not contain expected signature: " +
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   201
                                    expectedSig + "\n" + source);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   202
                    }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   203
                }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   204
            } catch (Exception e) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   205
                e.printStackTrace();
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   206
                throw new Error("error reading " + compiledTest +": " + e);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   207
            }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   208
        }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   209
    }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   210
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   211
    class JavaSource extends SimpleJavaFileObject {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   212
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   213
        static final String source_template = "class Test { #C }";
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   214
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   215
        String source;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   216
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   217
        public JavaSource() {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   218
            super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   219
            String c3 = cks[2].getSource(cnames[2], cnames[1], "");
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   220
            String c2 = cks[1].getSource(cnames[1], cnames[0], c3);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   221
            String c1 = cks[0].getSource(cnames[0], "Test", c2);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   222
            source = source_template.replace("#C", c1);
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   223
        }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   224
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   225
        @Override
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   226
        public String toString() {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   227
            return source;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   228
        }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   229
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   230
        @Override
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   231
        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   232
            return source;
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   233
        }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   234
    }
d8e900b62e02 7003595: IncompatibleClassChangeError with unreferenced local class with subclass
mcimadamore
parents:
diff changeset
   235
}