/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.devtools.j2objc.docs; import com.google.common.collect.Sets; import com.google.common.collect.SortedSetMultimap; import com.google.common.collect.TreeMultimap; import com.google.common.reflect.ClassPath; import com.google.common.reflect.ClassPath.ClassInfo; import com.google.devtools.j2objc.util.ErrorUtil; import java.io.IOException; import java.util.Set; import junit.framework.TestCase; /** * Prints a markdown compliant list of our AST nodes by ancestry, with Objects not in the Eclipse * AST bolded. Provides a quick visual of inheritance and J2ObjC AST nodes for project docs. * * @author Seth Kirby */ public class ASTClassInfoPrinter { private static Set<String> astLookup; private static SortedSetMultimap<String, String> tree; private static void walkSuperclassHierarchy(Class<?> node) { if (node.getSuperclass() == null || tree.containsKey(node.getSimpleName())) { return; } else { walkSuperclassHierarchy(node.getSuperclass()); tree.put(node.getSuperclass().getSimpleName(), node.getSimpleName()); } } private static void printClassHierarchy(String node, String indent) { if (astLookup.contains(node)) { System.out.println(indent + "- " + node); } else { System.out.println(indent + "- **" + node + "**"); } for (String childNode : tree.get(node)) { printClassHierarchy(childNode, " " + indent); } } public static void main(String... args) { // Clear saved state for new calls. tree = TreeMultimap.create(); astLookup = Sets.newHashSet(); ClassPath cp = null; try { cp = ClassPath.from(ClassLoader.getSystemClassLoader()); } catch (IOException e) { ErrorUtil.error(e.getMessage()); System.exit(1); } for (ClassInfo c : cp.getTopLevelClasses("org.eclipse.jdt.core.dom")){ astLookup.add(c.getSimpleName()); } for (ClassInfo ci : cp.getTopLevelClasses("com.google.devtools.j2objc.ast")) { // Ignore package-info and JUnit tests. if (ci.getSimpleName().equals("package-info") || TestCase.class.isAssignableFrom(ci.load())) { continue; } walkSuperclassHierarchy(ci.load()); } // Print hierarchy descending from Object. printClassHierarchy("Object", ""); } }