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