Main.java revision 3573:c4a18ee691c4
14Srgrimes/*
2549Srgrimes * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
34Srgrimes * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44Srgrimes *
54Srgrimes * This code is free software; you can redistribute it and/or modify it
64Srgrimes * under the terms of the GNU General Public License version 2 only, as
74Srgrimes * published by the Free Software Foundation.
84Srgrimes *
94Srgrimes * This code is distributed in the hope that it will be useful, but WITHOUT
104Srgrimes * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
114Srgrimes * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
124Srgrimes * version 2 for more details (a copy is included in the LICENSE file that
134Srgrimes * accompanied this code).
144Srgrimes *
154Srgrimes * You should have received a copy of the GNU General Public License version
164Srgrimes * 2 along with this work; if not, write to the Free Software Foundation,
174Srgrimes * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
184Srgrimes *
194Srgrimes * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
204Srgrimes * or visit www.oracle.com if you need additional information or have any
214Srgrimes * questions.
224Srgrimes */
234Srgrimes
244Srgrimes/**
254Srgrimes * @test
264Srgrimes * @bug     6374357 6308351 6707027
274Srgrimes * @summary PackageElement.getEnclosedElements() throws ClassReader$BadClassFileException
284Srgrimes * @author  Peter von der Ah\u00e9
294Srgrimes * @modules jdk.compiler/com.sun.tools.javac.model
304Srgrimes * @run main/othervm -Xmx256m Main
314Srgrimes */
324Srgrimes
334Srgrimesimport java.io.File;
344Srgrimesimport java.util.*;
354Srgrimesimport java.util.Map.Entry;
364Srgrimes
37549Srgrimesimport javax.lang.model.element.Element;
3850477Speterimport javax.lang.model.element.ElementKind;
394Srgrimesimport javax.lang.model.element.ModuleElement;
404Srgrimesimport javax.lang.model.element.PackageElement;
4126657Swollmanimport javax.lang.model.element.TypeElement;
4236605Sbdeimport javax.lang.model.util.Elements;
43556Srgrimesimport javax.tools.*;
4436605Sbde
4552150Smarcelimport com.sun.source.util.JavacTask;
4631544Sjmgimport com.sun.tools.javac.model.JavacElements;
4713228Swollman
4836605Sbdeimport static javax.tools.StandardLocation.CLASS_PATH;
4936605Sbdeimport static javax.tools.StandardLocation.PLATFORM_CLASS_PATH;
5028976Sbdeimport static javax.tools.JavaFileObject.Kind.CLASS;
5136179Sphk
5214825Swollman
5325164Speterpublic class Main {
5431544Sjmg
5532010Speter    public static PackageElement getPackage(TypeElement type) {
5618252Sphk        Element owner = type;
574Srgrimes        while (owner.getKind() != ElementKind.PACKAGE)
581549Srgrimes            owner = owner.getEnclosingElement();
591549Srgrimes        return (PackageElement)owner;
6011390Sbde    }
611549Srgrimes
621549Srgrimes    static int progress = 0;
6340089Smsmith    static JavaCompiler tool;
641549Srgrimes    static JavacTask javac;
651549Srgrimes    static Elements elements;
661549Srgrimes
671549Srgrimes    static List<String> addmods_ALL_SYSTEM = Arrays.asList("--add-modules", "ALL-SYSTEM");
681549Srgrimes
691549Srgrimes    public static void main(String[] args) throws Exception {
701549Srgrimes        JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
712254Ssos        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
721549Srgrimes            fm.setLocation(CLASS_PATH, Collections.<File>emptyList());
7312662Sdg            JavacTask javac = (JavacTask)tool.getTask(null, fm, null, addmods_ALL_SYSTEM, null, null);
7445720Speter            Elements elements = javac.getElements();
754Srgrimes
76556Srgrimes            final Map<String, Set<String>> packages = new LinkedHashMap<>();
772056Swollman
78556Srgrimes            int nestedClasses = 0;
79556Srgrimes            int classes = 0;
80990Sdg
812056Swollman            for (JavaFileObject file : fm.list(PLATFORM_CLASS_PATH, "", EnumSet.of(CLASS), true)) {
82990Sdg                String type = fm.inferBinaryName(PLATFORM_CLASS_PATH, file);
83990Sdg                if (type.endsWith("package-info"))
84990Sdg                    continue;
852056Swollman                if (type.endsWith("module-info"))
86990Sdg                    continue;
87990Sdg                String moduleName = fm.asPath(file).getName(1).toString();
882056Swollman                try {
8912662Sdg                    ModuleElement me = elements.getModuleElement(moduleName);
9012662Sdg                    me.getClass();
9122521Sdyson                    TypeElement elem = ((JavacElements) elements).getTypeElement(me, type);
922056Swollman                    if (elem == null && type.indexOf('$') > 0) {
9312662Sdg                        nestedClasses++;
942056Swollman                        type = null;
9512662Sdg                        continue;
969507Sdg                    }
9712662Sdg                    classes++;
984Srgrimes                    String pack = getPackage(elem).getQualifiedName().toString();
9912662Sdg                    packages.computeIfAbsent(me.getQualifiedName().toString(),
1002056Swollman                                             m -> new LinkedHashSet<>()).add(pack);
10149558Sphk                    elem.getKind(); // force completion
102556Srgrimes                    type = null;
1037090Sbde                } finally {
1047090Sbde                    if (type != null)
1052772Swollman                        System.err.println("Looking at " + type);
1062772Swollman                }
1072056Swollman            }
1082056Swollman            javac = null;
1094193Sbde            elements = null;
1102056Swollman
1114819Sphk            javac = (JavacTask)tool.getTask(null, fm, null, addmods_ALL_SYSTEM, null, null);
11231337Sbde            elements = javac.getElements();
1137090Sbde
11430275Speter            for (Entry<String, Set<String>> module2Packages : packages.entrySet()) {
11525164Speter                ModuleElement me = elements.getModuleElement(module2Packages.getKey());
11625164Speter                me.getClass();
11746129Sluoqi                for (String name : module2Packages.getValue()) {
11825164Speter                    PackageElement pe = ((JavacElements) elements).getPackageElement(me, name);
11914825Swollman                    for (Element e : pe.getEnclosedElements()) {
12014825Swollman                        e.getSimpleName().getClass();
12114825Swollman                    }
122556Srgrimes                }
12345720Speter            }
1244193Sbde            /*
12545720Speter             * A few sanity checks based on current values:
12626373Sdfr             *
12747642Sdfr             * packages: 775, classes: 12429 + 5917
12847678Sjlemon             *
12911875Smarkm             * As the platform evolves the numbers are likely to grow
13036168Stegge             * monotonically but in case somebody gets a clever idea for
13151792Smarcel             * limiting the number of packages exposed, this number might
1324Srgrimes             * drop.  So we test low values.
13311390Sbde             */
13412929Sdg            System.out.format("packages: %s, classes: %s + %s%n",
13510358Sjulian                              packages.size(), classes, nestedClasses);
13624112Skato            if (classes < 9000)
13717014Swollman                throw new AssertionError("Too few classes in PLATFORM_CLASS_PATH ;-)");
13824112Skato            if (packages.values().stream().flatMap(packs -> packs.stream()).count() < 530)
13924112Skato                throw new AssertionError("Too few packages in PLATFORM_CLASS_PATH ;-)");
14024112Skato            if (nestedClasses < 3000)
14113085Sdg                throw new AssertionError("Too few nested classes in PLATFORM_CLASS_PATH ;-)");
14210653Sdg        }
14310358Sjulian    }
14410358Sjulian}
14530354Sphk