1920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/* 2920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Copyright (C) 2010 Google Inc. 3920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 4920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Licensed under the Apache License, Version 2.0 (the "License"); 5920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * you may not use this file except in compliance with the License. 6920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * You may obtain a copy of the License at 7920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 8920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * http://www.apache.org/licenses/LICENSE-2.0 9920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 10920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Unless required by applicable law or agreed to in writing, software 11920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * distributed under the License is distributed on an "AS IS" BASIS, 12920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * See the License for the specific language governing permissions and 14920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * limitations under the License. 15920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 16920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 17920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpackage com.google.doclava; 18920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 19920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.clearsilver.jsilver.data.Data; 20d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport com.sun.javadoc.ClassDoc; 21d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 22d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arnesonimport java.util.ArrayDeque; 23d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.ArrayList; 24d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.Arrays; 25d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.Collections; 26d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.Comparator; 27d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.HashMap; 28d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.HashSet; 29d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arnesonimport java.util.Iterator; 30d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.List; 31d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.Map; 32d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arnesonimport java.util.Queue; 33d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.Set; 34d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.TreeMap; 35920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 366ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinpublic class ClassInfo extends DocInfo implements ContainerInfo, Comparable, Scoped, Resolvable { 37d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 38d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson /** 39d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * Contains a ClassInfo and a TypeInfo. 40d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * <p> 41d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * This is used to match a ClassInfo, which doesn't keep track of its type parameters 42d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * and a type which does. 43d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson */ 44d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson private class ClassTypePair { 45d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson private final ClassInfo mClassInfo; 46d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson private final TypeInfo mTypeInfo; 47d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 48d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson public ClassTypePair(ClassInfo cl, TypeInfo t) { 49d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson mClassInfo = cl; 50d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson mTypeInfo = t; 51d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 52d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 53d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson public ClassInfo classInfo() { 54d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson return mClassInfo; 55d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 56d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 57d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson public TypeInfo typeInfo() { 58d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson return mTypeInfo; 59d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 60d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 61d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson public Map<String, TypeInfo> getTypeArgumentMapping() { 62d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson return TypeInfo.getTypeArgumentMapping(classInfo(), typeInfo()); 63d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 64d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 65d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 66920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static final Comparator<ClassInfo> comparator = new Comparator<ClassInfo>() { 67920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public int compare(ClassInfo a, ClassInfo b) { 68920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return a.name().compareTo(b.name()); 69920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 70920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson }; 71920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 72920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static final Comparator<ClassInfo> qualifiedComparator = new Comparator<ClassInfo>() { 73920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public int compare(ClassInfo a, ClassInfo b) { 74920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return a.qualifiedName().compareTo(b.qualifiedName()); 75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 76920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson }; 779b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty 78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /** 79920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Constructs a stub representation of a class. 80920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 81920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public ClassInfo(String qualifiedName) { 82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson super("", SourcePositionInfo.UNKNOWN); 83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mQualifiedName = qualifiedName; 84920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (qualifiedName.lastIndexOf('.') != -1) { 85920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mName = qualifiedName.substring(qualifiedName.lastIndexOf('.') + 1); 86920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 87920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mName = qualifiedName; 88920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 89920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 90920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 91920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public ClassInfo(ClassDoc cl, String rawCommentText, SourcePositionInfo position, 92d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein boolean isPublic, boolean isProtected, boolean isPackagePrivate, boolean isPrivate, 93d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein boolean isStatic, boolean isInterface, boolean isAbstract, boolean isOrdinaryClass, 94d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein boolean isException, boolean isError, boolean isEnum, boolean isAnnotation, boolean isFinal, 95d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein boolean isIncluded, String name, String qualifiedName, String qualifiedTypeName, 96d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein boolean isPrimitive) { 97d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein super(rawCommentText, position); 98d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 99d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein initialize(rawCommentText, position, 100d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein isPublic, isProtected, isPackagePrivate, isPrivate, 101d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein isStatic, isInterface, isAbstract, isOrdinaryClass, 102d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein isException, isError, isEnum, isAnnotation, isFinal, 103d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein isIncluded, qualifiedTypeName, isPrimitive, null); 104d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 105d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mName = name; 106d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mQualifiedName = qualifiedName; 107d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mNameParts = name.split("\\."); 108d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mClass = cl; 109d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 110d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 111d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void initialize(String rawCommentText, SourcePositionInfo position, 112d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein boolean isPublic, boolean isProtected, boolean isPackagePrivate, boolean isPrivate, 113d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein boolean isStatic, boolean isInterface, boolean isAbstract, boolean isOrdinaryClass, 114d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein boolean isException, boolean isError, boolean isEnum, boolean isAnnotation, boolean isFinal, 115d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein boolean isIncluded, String qualifiedTypeName, boolean isPrimitive, ArrayList<AnnotationInstanceInfo> annotations) { 116d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 117d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // calls 118d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein setPosition(position); 119d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein setRawCommentText(rawCommentText); 120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsPublic = isPublic; 121920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsProtected = isProtected; 122920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsPackagePrivate = isPackagePrivate; 123920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsPrivate = isPrivate; 124920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsStatic = isStatic; 125920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsInterface = isInterface; 126920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsAbstract = isAbstract; 127920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsOrdinaryClass = isOrdinaryClass; 128920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsException = isException; 129920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsError = isError; 130920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsEnum = isEnum; 131920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsAnnotation = isAnnotation; 132920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsFinal = isFinal; 133920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsIncluded = isIncluded; 134920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mQualifiedTypeName = qualifiedTypeName; 135920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsPrimitive = isPrimitive; 136d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mAnnotations = annotations; 137b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson mShowAnnotations = AnnotationInstanceInfo.getShowAnnotationsIntersection(annotations); 138920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 139920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 140d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void init(TypeInfo typeInfo, ArrayList<ClassInfo> interfaces, 141d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<TypeInfo> interfaceTypes, ArrayList<ClassInfo> innerClasses, 142d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<MethodInfo> constructors, ArrayList<MethodInfo> methods, 143d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<MethodInfo> annotationElements, ArrayList<FieldInfo> fields, 144d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<FieldInfo> enumConstants, PackageInfo containingPackage, 145d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ClassInfo containingClass, ClassInfo superclass, 146d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein TypeInfo superclassType, ArrayList<AnnotationInstanceInfo> annotations) { 147920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mTypeInfo = typeInfo; 148d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mRealInterfaces = new ArrayList<ClassInfo>(interfaces); 149920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mRealInterfaceTypes = interfaceTypes; 150920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mInnerClasses = innerClasses; 1515118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // mAllConstructors will not contain *all* constructors. Only the constructors that pass 1525118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // checkLevel. @see {@link Converter#convertMethods(ConstructorDoc[])} 153920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mAllConstructors = constructors; 1545118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // mAllSelfMethods will not contain *all* self methods. Only the methods that pass 1555118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // checkLevel. @see {@link Converter#convertMethods(MethodDoc[])} 156920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mAllSelfMethods = methods; 157920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mAnnotationElements = annotationElements; 1585118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // mAllSelfFields will not contain *all* self fields. Only the fields that pass 1595118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // checkLevel. @see {@link Converter#convetFields(FieldDoc[])} 160920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mAllSelfFields = fields; 1615118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // mEnumConstants will not contain *all* enum constants. Only the enums that pass 1625118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // checkLevel. @see {@link Converter#convetFields(FieldDoc[])} 163920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mEnumConstants = enumConstants; 164920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mContainingPackage = containingPackage; 165920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mContainingClass = containingClass; 166920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mRealSuperclass = superclass; 167920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mRealSuperclassType = superclassType; 168920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mAnnotations = annotations; 169b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson mShowAnnotations = AnnotationInstanceInfo.getShowAnnotationsIntersection(annotations); 170920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 171920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // after providing new methods and new superclass info,clear any cached 172920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // lists of self + superclass methods, ctors, etc. 173920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mSuperclassInit = false; 174920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mConstructors = null; 175920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mMethods = null; 176920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mSelfMethods = null; 177920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mFields = null; 178920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mSelfFields = null; 179920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mSelfAttributes = null; 180920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mDeprecatedKnown = false; 181d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson mSuperclassesWithTypes = null; 182d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson mInterfacesWithTypes = null; 183d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson mAllInterfacesWithTypes = null; 184920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 185d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Collections.sort(mEnumConstants, FieldInfo.comparator); 186d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Collections.sort(mInnerClasses, ClassInfo.comparator); 187920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 188920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 189920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void init2() { 190920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // calling this here forces the AttrTagInfo objects to be linked to the AttribtueInfo 191920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // objects 192920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson selfAttributes(); 193920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 194920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 195d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void init3(ArrayList<TypeInfo> types, ArrayList<ClassInfo> realInnerClasses) { 196920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mTypeParameters = types; 197920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mRealInnerClasses = realInnerClasses; 198920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 199920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 200d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<ClassInfo> getRealInnerClasses() { 201920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mRealInnerClasses; 202920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 203920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 204d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<TypeInfo> getTypeParameters() { 205920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mTypeParameters; 206920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 207920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2085118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 2095118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @return true if this class needs to be shown in api txt, based on the 2105118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * hidden/removed status of the class and the show level setting in doclava. 2115118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 212920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean checkLevel() { 2135118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if (mCheckLevel == null) { 2145118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu mCheckLevel = Doclava.checkLevel(mIsPublic, mIsProtected, mIsPackagePrivate, mIsPrivate, 2155118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu isHiddenOrRemoved()); 216920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2175118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 2185118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return mCheckLevel; 219920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 220920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 221920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public int compareTo(Object that) { 222920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (that instanceof ClassInfo) { 223920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mQualifiedName.compareTo(((ClassInfo) that).mQualifiedName); 224920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 225920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return this.hashCode() - that.hashCode(); 226920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 227920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 228920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 229920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson @Override 230920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public ContainerInfo parent() { 231920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return this; 232920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 233920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 234920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isPublic() { 235920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsPublic; 236920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 237920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 238920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isProtected() { 239920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsProtected; 240920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 241920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 242920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isPackagePrivate() { 243920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsPackagePrivate; 244920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 245920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 246920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isPrivate() { 247920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsPrivate; 248920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 249920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 250920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isStatic() { 251920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsStatic; 252920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 253920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 254920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isInterface() { 255920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsInterface; 256920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 257920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 258920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isAbstract() { 259920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsAbstract; 260920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 261920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 262920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public PackageInfo containingPackage() { 263920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mContainingPackage; 264920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 265920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 266920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public ClassInfo containingClass() { 267920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mContainingClass; 268920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 269920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 270920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isOrdinaryClass() { 271920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsOrdinaryClass; 272920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 273920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 274920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isException() { 275920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsException; 276920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 277920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 278920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isError() { 279920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsError; 280920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 281920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 282920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isEnum() { 283920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsEnum; 284920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 285920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 286920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isAnnotation() { 287920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsAnnotation; 288920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 289920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 290920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isFinal() { 291920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsFinal; 292920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 293920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 294722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown public boolean isEffectivelyFinal() { 295722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown return mIsFinal || mApiCheckConstructors.isEmpty(); 296722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown } 297722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown 298920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isIncluded() { 299920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsIncluded; 300920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 301920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 302920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public HashSet<String> typeVariables() { 303920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson HashSet<String> result = TypeInfo.typeVariables(mTypeInfo.typeArguments()); 304920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo cl = containingClass(); 305920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson while (cl != null) { 306d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<TypeInfo> types = cl.asTypeInfo().typeArguments(); 307920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (types != null) { 308920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TypeInfo.typeVariables(types, result); 309920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 310920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson cl = cl.containingClass(); 311920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 312920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return result; 313920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 314920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 315d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson /** 316d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * List of only direct interface's classes, without worrying about type param mapping. 317d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * This can't be lazy loaded, because its overloads depend on changing type parameters 318d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * passed in from the callers. 319d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson */ 320d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson private List<ClassTypePair> justMyInterfacesWithTypes() { 321d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson return justMyInterfacesWithTypes(Collections.<String, TypeInfo>emptyMap()); 322d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 323d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 324d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson /** 325d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * List of only direct interface's classes and their parameterized types. 326d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * This can't be lazy loaded, because of the passed in typeArgumentsMap. 327d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson */ 328d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson private List<ClassTypePair> justMyInterfacesWithTypes(Map<String, TypeInfo> typeArgumentsMap) { 329d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (mRealInterfaces == null || mRealInterfaceTypes == null) { 330d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson return Collections.<ClassTypePair>emptyList(); 331d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 332d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 333d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson List<ClassTypePair> list = new ArrayList<ClassTypePair>(); 334d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson for (int i = 0; i < mRealInterfaces.size(); i++) { 335d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson ClassInfo iface = mRealInterfaces.get(i); 336d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson TypeInfo type = mRealInterfaceTypes.get(i); 337d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (iface != null && type != null) { 338d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson type = type.getTypeWithArguments(typeArgumentsMap); 339d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (iface.checkLevel()) { 340d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson list.add(new ClassTypePair(iface, type)); 341d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } else { 342d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson // add the interface's interfaces 343d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson Map<String, TypeInfo> map = TypeInfo.getTypeArgumentMapping(iface.asTypeInfo(), type); 344d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson list.addAll(iface.justMyInterfacesWithTypes(map)); 345d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 346d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 347d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 348d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson return list; 349d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 350d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 351d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson /** 352d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * List of only direct interface's classes, and any hidden superclass's direct interfaces 353d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * between this class and the first visible superclass and those interface class's parameterized types. 354d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson */ 355d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson private ArrayList<ClassTypePair> interfacesWithTypes() { 356d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (mInterfacesWithTypes == null) { 357d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson mInterfacesWithTypes = new ArrayList<ClassTypePair>(); 358d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 359d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson Iterator<ClassTypePair> itr = superClassesWithTypes().iterator(); 360d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson // skip the first one, which is this class 361d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson itr.next(); 362d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson while (itr.hasNext()) { 363d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson ClassTypePair ctp = itr.next(); 364d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (ctp.classInfo().checkLevel()) { 365d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson break; 366d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } else { 367d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson // fill mInterfacesWithTypes from the hidden superclass 368d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson mInterfacesWithTypes.addAll( 369d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson ctp.classInfo().justMyInterfacesWithTypes(ctp.getTypeArgumentMapping())); 370d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 371d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 372d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson mInterfacesWithTypes.addAll( 373d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson justMyInterfacesWithTypes()); 374d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 375d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson return mInterfacesWithTypes; 376d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 377d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 378d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson /** 379d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * List of all interface's classes reachable in this class's inheritance hierarchy 380d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * and those interface class's parameterized types. 381d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson */ 382d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson private ArrayList<ClassTypePair> allInterfacesWithTypes() { 383d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (mAllInterfacesWithTypes == null) { 384d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson mAllInterfacesWithTypes = new ArrayList<ClassTypePair>(); 385d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson Queue<ClassTypePair> toParse = new ArrayDeque<ClassTypePair>(); 386d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson Set<String> visited = new HashSet<String>(); 387d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 388d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson Iterator<ClassTypePair> itr = superClassesWithTypes().iterator(); 389d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson // skip the first one, which is this class 390d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson itr.next(); 391d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson while (itr.hasNext()) { 392d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson ClassTypePair ctp = itr.next(); 393d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson toParse.addAll( 394d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson ctp.classInfo().justMyInterfacesWithTypes(ctp.getTypeArgumentMapping())); 395d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 396d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson toParse.addAll(justMyInterfacesWithTypes()); 397d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson while (!toParse.isEmpty()) { 398d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson ClassTypePair ctp = toParse.remove(); 399d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (!visited.contains(ctp.typeInfo().fullName())) { 400d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson mAllInterfacesWithTypes.add(ctp); 401d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson visited.add(ctp.typeInfo().fullName()); 402d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson toParse.addAll(ctp.classInfo().justMyInterfacesWithTypes(ctp.getTypeArgumentMapping())); 403d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 404d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 405d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 406d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson return mAllInterfacesWithTypes; 407d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 408d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 409d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson /** 410d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * A list of ClassTypePairs that contain all superclasses 411d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * and their corresponding types. The types will have type parameters 412d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * cascaded upwards so they match, if any classes along the way set them. 413d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * The list includes the current class, and is an ascending order up the 414d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * heirarchy tree. 415d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson * */ 416d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson private ArrayList<ClassTypePair> superClassesWithTypes() { 417d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (mSuperclassesWithTypes == null) { 418d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson mSuperclassesWithTypes = new ArrayList<ClassTypePair>(); 419d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 420d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson ClassTypePair lastCtp = new ClassTypePair(this, this.asTypeInfo()); 421d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson mSuperclassesWithTypes.add(lastCtp); 422d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 423d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson Map<String, TypeInfo> typeArgumentsMap; 424d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson ClassInfo superclass = mRealSuperclass; 425d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson TypeInfo supertype = mRealSuperclassType; 426d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson TypeInfo nextType; 427d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson while (superclass != null && supertype != null) { 428d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson typeArgumentsMap = lastCtp.getTypeArgumentMapping(); 429d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson lastCtp = new ClassTypePair(superclass, supertype.getTypeWithArguments(typeArgumentsMap)); 430d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson mSuperclassesWithTypes.add(lastCtp); 431d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 432d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson supertype = superclass.mRealSuperclassType; 433d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson superclass = superclass.mRealSuperclass; 434d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 435d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 436d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson return mSuperclassesWithTypes; 437d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 438d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson 439920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private static void gatherHiddenInterfaces(ClassInfo cl, HashSet<ClassInfo> interfaces) { 440920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo iface : cl.mRealInterfaces) { 441920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (iface.checkLevel()) { 442920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson interfaces.add(iface); 443920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 444920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson gatherHiddenInterfaces(iface, interfaces); 445920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 446920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 447920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 448920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 449d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<ClassInfo> interfaces() { 450920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mInterfaces == null) { 451920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (checkLevel()) { 452920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson HashSet<ClassInfo> interfaces = new HashSet<ClassInfo>(); 453920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo superclass = mRealSuperclass; 454920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson while (superclass != null && !superclass.checkLevel()) { 455920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson gatherHiddenInterfaces(superclass, interfaces); 456920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson superclass = superclass.mRealSuperclass; 457920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 458920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson gatherHiddenInterfaces(this, interfaces); 459d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mInterfaces = new ArrayList<ClassInfo>(interfaces); 460920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 461920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // put something here in case someone uses it 462d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mInterfaces = new ArrayList<ClassInfo>(mRealInterfaces); 463920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 464d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Collections.sort(mInterfaces, ClassInfo.qualifiedComparator); 465920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 466920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mInterfaces; 467920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 468920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 469d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<ClassInfo> realInterfaces() { 470d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return mRealInterfaces; 471920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 472920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 473d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<TypeInfo> realInterfaceTypes() { 474920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mRealInterfaceTypes; 475920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 476920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 477d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void addInterfaceType(TypeInfo type) { 478d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (mRealInterfaceTypes == null) { 479d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mRealInterfaceTypes = new ArrayList<TypeInfo>(); 480d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 481d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 482d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mRealInterfaceTypes.add(type); 483d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 484d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 485920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String name() { 486920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mName; 487920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 488920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 489920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String[] nameParts() { 490920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mNameParts; 491920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 492920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 493920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String leafName() { 494920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mNameParts[mNameParts.length - 1]; 495920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 496920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 497920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String qualifiedName() { 498920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mQualifiedName; 499920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 500920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 501920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String qualifiedTypeName() { 502920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mQualifiedTypeName; 503920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 504920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 505920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isPrimitive() { 506920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsPrimitive; 507920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 508920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 509d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<MethodInfo> allConstructors() { 510920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mAllConstructors; 511920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 512920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 513d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<MethodInfo> constructors() { 514920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mConstructors == null) { 515d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (mAllConstructors == null) { 516d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return new ArrayList<MethodInfo>(); 517040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato } 518d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 519d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mConstructors = new ArrayList<MethodInfo>(); 520d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (MethodInfo m : mAllConstructors) { 5215118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if (!m.isHiddenOrRemoved()) { 522d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mConstructors.add(m); 523920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 524920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 525d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 526d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Collections.sort(mConstructors, MethodInfo.comparator); 527920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 528920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mConstructors; 529920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 530920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 531d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<ClassInfo> innerClasses() { 532920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mInnerClasses; 533920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 534920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 535920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public TagInfo[] inlineTags() { 536920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return comment().tags(); 537920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 538920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 539920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public TagInfo[] firstSentenceTags() { 540920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return comment().briefTags(); 541920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 542920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 543040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato public void setDeprecated(boolean deprecated) { 544040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato mDeprecatedKnown = true; 545040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato mIsDeprecated = deprecated; 546040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato } 547040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato 548920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isDeprecated() { 549920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!mDeprecatedKnown) { 550920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean commentDeprecated = comment().isDeprecated(); 551920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean annotationDeprecated = false; 552920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (AnnotationInstanceInfo annotation : annotations()) { 553920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (annotation.type().qualifiedName().equals("java.lang.Deprecated")) { 554920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson annotationDeprecated = true; 555920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson break; 556920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 557920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 558920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 559920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (commentDeprecated != annotationDeprecated) { 560920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.DEPRECATION_MISMATCH, position(), "Class " + qualifiedName() 561920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + ": @Deprecated annotation and @deprecated comment do not match"); 562920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 563920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 564920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsDeprecated = commentDeprecated | annotationDeprecated; 565920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mDeprecatedKnown = true; 566920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 567920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsDeprecated; 568920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 569920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 570920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public TagInfo[] deprecatedTags() { 571920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Should we also do the interfaces? 572920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return comment().deprecatedTags(); 573920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 574920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 575d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<MethodInfo> methods() { 576d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (mMethods == null) { 577d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein TreeMap<String, MethodInfo> all = new TreeMap<String, MethodInfo>(); 578920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 579d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<ClassInfo> interfaces = interfaces(); 580d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (ClassInfo iface : interfaces) { 581d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (iface != null) { 582d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (MethodInfo method : iface.methods()) { 583d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein all.put(method.getHashableName(), method); 584d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 585d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 586920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 587920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 588d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ClassInfo superclass = superclass(); 589d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (superclass != null) { 590d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (MethodInfo method : superclass.methods()) { 591d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein all.put(method.getHashableName(), method); 592d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 593d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 594920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 595d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (MethodInfo method : selfMethods()) { 596d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein all.put(method.getHashableName(), method); 597d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 598920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 599d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mMethods = new ArrayList<MethodInfo>(all.values()); 600d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Collections.sort(mMethods, MethodInfo.comparator); 601d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 602920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mMethods; 603920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 604920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 605d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<MethodInfo> annotationElements() { 606920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mAnnotationElements; 607920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 608920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 609d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<AnnotationInstanceInfo> annotations() { 610920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mAnnotations; 611920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 612920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 613920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private static void addFields(ClassInfo cl, TreeMap<String, FieldInfo> all) { 614d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (FieldInfo field : cl.fields()) { 615d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein all.put(field.name(), field); 616920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 617920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 618920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 619d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<FieldInfo> fields() { 620920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mFields == null) { 621920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TreeMap<String, FieldInfo> all = new TreeMap<String, FieldInfo>(); 622920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 623d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (ClassInfo iface : interfaces()) { 624d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein addFields(iface, all); 625920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 626920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 627920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo superclass = superclass(); 628920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (superclass != null) { 629920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson addFields(superclass, all); 630920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 631920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 632d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (FieldInfo field : selfFields()) { 6335118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if (!field.isHiddenOrRemoved()) { 634d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein all.put(field.name(), field); 635920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 636920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 637920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 638189048062a7df2d2fba4ff075c6416bfbf05a094Scott Main for (FieldInfo enumConst : mEnumConstants) { 6395118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if (!enumConst.isHiddenOrRemoved()) { 640189048062a7df2d2fba4ff075c6416bfbf05a094Scott Main all.put(enumConst.name(), enumConst); 641189048062a7df2d2fba4ff075c6416bfbf05a094Scott Main } 642189048062a7df2d2fba4ff075c6416bfbf05a094Scott Main } 643189048062a7df2d2fba4ff075c6416bfbf05a094Scott Main 644d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mFields = new ArrayList<FieldInfo>(all.values()); 645920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 646920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mFields; 647920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 648920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 649920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void gatherFields(ClassInfo owner, ClassInfo cl, HashMap<String, FieldInfo> fields) { 650d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (FieldInfo f : cl.selfFields()) { 651920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (f.checkLevel()) { 652920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson fields.put(f.name(), f.cloneForClass(owner)); 653920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 654920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 655920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 656920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 657d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<FieldInfo> selfFields() { 658920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mSelfFields == null) { 659d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein HashMap<String, FieldInfo> fields = new HashMap<String, FieldInfo>(); 660920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // our hidden parents 661920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mRealSuperclass != null && !mRealSuperclass.checkLevel()) { 662920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson gatherFields(this, mRealSuperclass, fields); 663920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 664920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo iface : mRealInterfaces) { 665920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!iface.checkLevel()) { 666920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson gatherFields(this, iface, fields); 667920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 668920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 669d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 670d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (FieldInfo f : mAllSelfFields) { 6715118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if (!f.isHiddenOrRemoved()) { 672d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein fields.put(f.name(), f); 673d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 674920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 675d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 676d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mSelfFields = new ArrayList<FieldInfo>(fields.values()); 677d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Collections.sort(mSelfFields, FieldInfo.comparator); 678920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 679920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mSelfFields; 680920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 681920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 682d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<FieldInfo> allSelfFields() { 683920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mAllSelfFields; 684920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 685920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 686d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson private void gatherMethods(ClassInfo owner, ClassTypePair ctp, HashMap<String, MethodInfo> methods) { 687d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson for (MethodInfo m : ctp.classInfo().selfMethods()) { 688920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m.checkLevel()) { 689d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson methods.put(m.name() + m.signature(), m.cloneForClass(owner, ctp.getTypeArgumentMapping())); 690920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 691920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 692920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 693920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 694d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<MethodInfo> selfMethods() { 695920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mSelfMethods == null) { 696d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein HashMap<String, MethodInfo> methods = new HashMap<String, MethodInfo>(); 697920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // our hidden parents 698d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson for (ClassTypePair ctp : superClassesWithTypes()) { 699d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson // this class is included in this list, so skip it! 700d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (ctp.classInfo() != this) { 701d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (ctp.classInfo().checkLevel()) { 702d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson break; 703d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 704d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson gatherMethods(this, ctp, methods); 705d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 706920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 707d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson for (ClassTypePair ctp : justMyInterfacesWithTypes(Collections.<String, TypeInfo>emptyMap())) { 708d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (!ctp.classInfo().checkLevel()) { 709d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson gatherMethods(this, ctp, methods); 710920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 711920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 712920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // mine 713920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mAllSelfMethods != null) { 714d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (MethodInfo m : mAllSelfMethods) { 715920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m.checkLevel()) { 7165118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu methods.put(m.name() + m.signature(), m); 717920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 718920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 719920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 720d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 721d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // sort it 722d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mSelfMethods = new ArrayList<MethodInfo>(methods.values()); 723d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Collections.sort(mSelfMethods, MethodInfo.comparator); 724920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 725920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mSelfMethods; 726920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 727920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 728d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<MethodInfo> allSelfMethods() { 729920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mAllSelfMethods; 730920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 731920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 7325118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 7335118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @param removedMethods the removed methods regardless of access levels. 7345118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 7355118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public void setRemovedMethods(List<MethodInfo> removedMethods) { 7365118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu Collections.sort(removedMethods, MethodInfo.comparator); 7375118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu mRemovedMethods = Collections.unmodifiableList(removedMethods); 7385118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 7395118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 7405118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 7415118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @param allMethods all methods regardless of access levels. Selects the 7425118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * removed, public/protected ones and store them. If a class is removed, all its members 7435118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * are removed, even if the member may not have a @removed tag. 7445118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 7455118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public void setRemovedSelfMethods(List<MethodInfo> allMethods) { 7465118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu List<MethodInfo> removedSelfMethods = new ArrayList<MethodInfo>(); 7475118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu for (MethodInfo method : allMethods) { 7485118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if ((this.isRemoved() || method.isRemoved()) && (method.isPublic() || method.isProtected()) && 7495118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu (this.isPublic() || this.isProtected()) && 7505118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu (method.findOverriddenMethod(method.name(), method.signature()) == null)) { 7515118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu removedSelfMethods.add(method); 7525118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 7535118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 7545118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 7555118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu Collections.sort(removedSelfMethods, MethodInfo.comparator); 7565118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu mRemovedSelfMethods = Collections.unmodifiableList(removedSelfMethods); 7575118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 7585118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 7595118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 7605118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @param allCtors all constructors regardless of access levels. 7615118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * But only the public/protected removed constructors will be stored by the method. 7625118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * Removed constructors should never be deleted from source code because 7635118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * they were once public API. 7645118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 7655118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public void setRemovedConstructors(List<MethodInfo> allCtors) { 7665118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu List<MethodInfo> ctors = new ArrayList<MethodInfo>(); 7675118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu for (MethodInfo ctor : allCtors) { 7685118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if ((this.isRemoved() || ctor.isRemoved()) && (ctor.isPublic() || ctor.isProtected()) && 7695118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu (this.isPublic() || this.isProtected())) { 7705118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu ctors.add(ctor); 7715118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 7725118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 7735118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 7745118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu Collections.sort(ctors, MethodInfo.comparator); 7755118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu mRemovedConstructors = Collections.unmodifiableList(ctors); 7765118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 7775118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 7785118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 7795118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @param allFields all fields regardless of access levels. Selects the 7805118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * removed, public/protected ones and store them. If a class is removed, all its members 7815118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * are removed, even if the member may not have a @removed tag. 7825118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 7835118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public void setRemovedSelfFields(List<FieldInfo> allFields) { 7845118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu List<FieldInfo> fields = new ArrayList<FieldInfo>(); 7855118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu for (FieldInfo field : allFields) { 7865118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if ((this.isRemoved() || field.isRemoved()) && (field.isPublic() || field.isProtected()) && 7875118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu (this.isPublic() || this.isProtected())) { 7885118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu fields.add(field); 7895118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 7905118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 7915118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 7925118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu Collections.sort(fields, FieldInfo.comparator); 7935118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu mRemovedSelfFields = Collections.unmodifiableList(fields); 7945118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 7955118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 7965118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 7975118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @param allEnumConstants all enum constants regardless of access levels. Selects the 7985118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * removed, public/protected ones and store them. If a class is removed, all its members 7995118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * are removed, even if the member may not have a @removed tag. 8005118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 8015118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public void setRemovedEnumConstants(List<FieldInfo> allEnumConstants) { 8025118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu List<FieldInfo> enums = new ArrayList<FieldInfo>(); 8035118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu for (FieldInfo field : allEnumConstants) { 8045118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if ((this.isRemoved() || field.isRemoved()) && (field.isPublic() || field.isProtected()) && 8055118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu (this.isPublic() || this.isProtected())) { 8065118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu enums.add(field); 8075118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 8085118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 8095118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 8105118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu Collections.sort(enums, FieldInfo.comparator); 8115118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu mRemovedEnumConstants = Collections.unmodifiableList(enums); 8125118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 8135118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 8145118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 8155118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @return all methods that are marked as removed, regardless of access levels. 8165118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * The returned list is sorted and unmodifiable. 8175118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 8185118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public List<MethodInfo> getRemovedMethods() { 8195118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return mRemovedMethods; 8205118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 8215118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 8225118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 8235118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @return all public/protected methods that are removed. @removed methods should never be 8245118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * deleted from source code because they were once public API. Methods that override 8255118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * a parent method will not be included, because deleting them does not break the API. 8265118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 8275118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public List<MethodInfo> getRemovedSelfMethods() { 8285118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return mRemovedSelfMethods; 8295118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 8305118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 8315118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 8325118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @return all public constructors that are removed. 8335118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * removed constructors should never be deleted from source code because they 8345118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * were once public API. 8355118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * The returned list is sorted and unmodifiable. 8365118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 8375118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public List<MethodInfo> getRemovedConstructors() { 8385118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return mRemovedConstructors; 8395118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 8405118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 8415118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 8425118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @return all public/protected fields that are removed. 8435118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * removed members should never be deleted from source code because they were once public API. 8445118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * The returned list is sorted and unmodifiable. 8455118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 8465118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public List<FieldInfo> getRemovedSelfFields() { 8475118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return mRemovedSelfFields; 8485118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 8495118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 8505118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 8515118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @return all public/protected enumConstants that are removed. 8525118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * removed members should never be deleted from source code 8535118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * because they were once public API. 8545118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * The returned list is sorted and unmodifiable. 8555118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 8565118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public List<FieldInfo> getRemovedSelfEnumConstants() { 8575118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return mRemovedEnumConstants; 8585118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 8595118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 8605118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 8615118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @return true if this class contains any self members that are removed 8625118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 8635118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public boolean hasRemovedSelfMembers() { 8645118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu List<FieldInfo> removedSelfFields = getRemovedSelfFields(); 8655118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu List<FieldInfo> removedSelfEnumConstants = getRemovedSelfEnumConstants(); 8665118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu List<MethodInfo> removedSelfMethods = getRemovedSelfMethods(); 8675118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu List<MethodInfo> removedConstructors = getRemovedConstructors(); 8685118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if (removedSelfFields.size() + removedSelfEnumConstants.size() 8695118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu + removedSelfMethods.size() + removedConstructors.size() == 0) { 8705118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return false; 8715118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } else { 8725118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return true; 8735118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 8745118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 8755118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 876920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void addMethod(MethodInfo method) { 877920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mApiCheckMethods.put(method.getHashableName(), method); 878040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato 879d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mAllSelfMethods.add(method); 880040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato mSelfMethods = null; // flush this, hopefully it hasn't been used yet. 881920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 882d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 883d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void addAnnotationElement(MethodInfo method) { 88411b179627c411772f1eac023d915ab8532e55211Mathieu mAnnotationElements.add(method); 88511b179627c411772f1eac023d915ab8532e55211Mathieu } 88611b179627c411772f1eac023d915ab8532e55211Mathieu 88711b179627c411772f1eac023d915ab8532e55211Mathieu // Called by PackageInfo when a ClassInfo is added to a package. 88811b179627c411772f1eac023d915ab8532e55211Mathieu // This is needed because ApiCheck uses PackageInfo.addClass 88911b179627c411772f1eac023d915ab8532e55211Mathieu // rather than using setContainingPackage to dispatch to the 89011b179627c411772f1eac023d915ab8532e55211Mathieu // appropriate method. TODO: move ApiCheck away from addClass. 89111b179627c411772f1eac023d915ab8532e55211Mathieu void setPackage(PackageInfo pkg) { 89211b179627c411772f1eac023d915ab8532e55211Mathieu mContainingPackage = pkg; 893d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 894d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 895920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void setContainingPackage(PackageInfo pkg) { 896920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mContainingPackage = pkg; 897d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 898d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (mContainingPackage != null) { 899d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (mIsEnum) { 900d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mContainingPackage.addEnum(this); 901d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (mIsInterface) { 902d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mContainingPackage.addInterface(this); 903d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 904d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mContainingPackage.addOrdinaryClass(this); 905d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 906d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 907920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 908920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 909d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<AttributeInfo> selfAttributes() { 910920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mSelfAttributes == null) { 911920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TreeMap<FieldInfo, AttributeInfo> attrs = new TreeMap<FieldInfo, AttributeInfo>(); 912920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 913920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // the ones in the class comment won't have any methods 914920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (AttrTagInfo tag : comment().attrTags()) { 915920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson FieldInfo field = tag.reference(); 916920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (field != null) { 917920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson AttributeInfo attr = attrs.get(field); 918920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (attr == null) { 919920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson attr = new AttributeInfo(this, field); 920920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson attrs.put(field, attr); 921920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 922920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson tag.setAttribute(attr); 923920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 924920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 925920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 926920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // in the methods 927920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo m : selfMethods()) { 928920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (AttrTagInfo tag : m.comment().attrTags()) { 929920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson FieldInfo field = tag.reference(); 930920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (field != null) { 931920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson AttributeInfo attr = attrs.get(field); 932920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (attr == null) { 933920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson attr = new AttributeInfo(this, field); 934920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson attrs.put(field, attr); 935920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 936920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson tag.setAttribute(attr); 937920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson attr.methods.add(m); 938920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 939920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 940920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 941920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 942920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // constructors too 943920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo m : constructors()) { 944920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (AttrTagInfo tag : m.comment().attrTags()) { 945920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson FieldInfo field = tag.reference(); 946920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (field != null) { 947920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson AttributeInfo attr = attrs.get(field); 948920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (attr == null) { 949920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson attr = new AttributeInfo(this, field); 950920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson attrs.put(field, attr); 951920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 952920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson tag.setAttribute(attr); 953920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson attr.methods.add(m); 954920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 955920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 956920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 957920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 958d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mSelfAttributes = new ArrayList<AttributeInfo>(attrs.values()); 959d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Collections.sort(mSelfAttributes, AttributeInfo.comparator); 960920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 961920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mSelfAttributes; 962920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 963920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 964d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<FieldInfo> enumConstants() { 965920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mEnumConstants; 966920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 967920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 968920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public ClassInfo superclass() { 969920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!mSuperclassInit) { 970920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (this.checkLevel()) { 971920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // rearrange our little inheritance hierarchy, because we need to hide classes that 972920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // don't pass checkLevel 973920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo superclass = mRealSuperclass; 974920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson while (superclass != null && !superclass.checkLevel()) { 975920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson superclass = superclass.mRealSuperclass; 976920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 977920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mSuperclass = superclass; 978920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 979920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mSuperclass = mRealSuperclass; 980920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 981920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 982920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mSuperclass; 983920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 984920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 985920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public ClassInfo realSuperclass() { 986920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mRealSuperclass; 987920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 988920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 989920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /** 990920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * always the real superclass, not the collapsed one we get through superclass(), also has the 991920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * type parameter info if it's generic. 992920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 993920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public TypeInfo superclassType() { 994920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mRealSuperclassType; 995920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 996920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 997920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public TypeInfo asTypeInfo() { 998920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mTypeInfo; 999920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1000920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1001d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<TypeInfo> interfaceTypes() { 1002d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<TypeInfo> types = new ArrayList<TypeInfo>(); 1003d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (ClassInfo iface : interfaces()) { 1004d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein types.add(iface.asTypeInfo()); 1005d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1006d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return types; 1007920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1008920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1009920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String htmlPage() { 1010920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String s = containingPackage().name(); 1011920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson s = s.replace('.', '/'); 1012920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson s += '/'; 1013920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson s += name(); 1014920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson s += ".html"; 1015920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson s = Doclava.javadocDir + s; 1016920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return s; 1017920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1018920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1019920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /** Even indirectly */ 1020920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isDerivedFrom(ClassInfo cl) { 10215935135f7cffb7a730d978a8ea25ae5951a7f6baJoe Onorato return isDerivedFrom(cl.qualifiedName()); 10225935135f7cffb7a730d978a8ea25ae5951a7f6baJoe Onorato } 10235935135f7cffb7a730d978a8ea25ae5951a7f6baJoe Onorato 10245935135f7cffb7a730d978a8ea25ae5951a7f6baJoe Onorato /** Even indirectly */ 10255935135f7cffb7a730d978a8ea25ae5951a7f6baJoe Onorato public boolean isDerivedFrom(String qualifiedName) { 1026920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo dad = this.superclass(); 1027920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (dad != null) { 10285935135f7cffb7a730d978a8ea25ae5951a7f6baJoe Onorato if (dad.mQualifiedName.equals(qualifiedName)) { 1029920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 1030920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 10315935135f7cffb7a730d978a8ea25ae5951a7f6baJoe Onorato if (dad.isDerivedFrom(qualifiedName)) { 1032920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 1033920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1034920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1035920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1036920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo iface : interfaces()) { 10375935135f7cffb7a730d978a8ea25ae5951a7f6baJoe Onorato if (iface.mQualifiedName.equals(qualifiedName)) { 1038920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 1039920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 10405935135f7cffb7a730d978a8ea25ae5951a7f6baJoe Onorato if (iface.isDerivedFrom(qualifiedName)) { 1041920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 1042920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1043920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1044920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1045920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 1046920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1047920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1048920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void makeKeywordEntries(List<KeywordEntry> keywords) { 1049920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!checkLevel()) { 1050920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return; 1051920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1052920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1053920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String htmlPage = htmlPage(); 1054920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String qualifiedName = qualifiedName(); 1055920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1056920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson keywords.add(new KeywordEntry(name(), htmlPage, "class in " + containingPackage().name())); 1057920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1058d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<FieldInfo> fields = selfFields(); 1059d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein //ArrayList<FieldInfo> enumConstants = enumConstants(); 1060d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<MethodInfo> ctors = constructors(); 1061d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<MethodInfo> methods = selfMethods(); 1062920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1063920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // enum constants 1064920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (FieldInfo field : enumConstants()) { 1065920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (field.checkLevel()) { 1066920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson keywords.add(new KeywordEntry(field.name(), htmlPage + "#" + field.anchor(), 1067920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson "enum constant in " + qualifiedName)); 1068920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1069920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1070920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1071920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // constants 1072920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (FieldInfo field : fields) { 1073920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (field.isConstant() && field.checkLevel()) { 1074920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson keywords.add(new KeywordEntry(field.name(), htmlPage + "#" + field.anchor(), "constant in " 1075920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + qualifiedName)); 1076920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1077920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1078920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1079920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // fields 1080920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (FieldInfo field : fields) { 1081920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!field.isConstant() && field.checkLevel()) { 1082920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson keywords.add(new KeywordEntry(field.name(), htmlPage + "#" + field.anchor(), "field in " 1083920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + qualifiedName)); 1084920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1085920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1086920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1087920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // public constructors 1088920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo m : ctors) { 1089920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m.isPublic() && m.checkLevel()) { 1090920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson keywords.add(new KeywordEntry(m.prettySignature(), htmlPage + "#" + m.anchor(), 1091920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson "constructor in " + qualifiedName)); 1092920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1093920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1094920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1095920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // protected constructors 1096920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (Doclava.checkLevel(Doclava.SHOW_PROTECTED)) { 1097920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo m : ctors) { 1098920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m.isProtected() && m.checkLevel()) { 1099920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson keywords.add(new KeywordEntry(m.prettySignature(), 1100920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson htmlPage + "#" + m.anchor(), "constructor in " + qualifiedName)); 1101920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1102920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1103920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1104920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1105920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // package private constructors 1106920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (Doclava.checkLevel(Doclava.SHOW_PACKAGE)) { 1107920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo m : ctors) { 1108920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m.isPackagePrivate() && m.checkLevel()) { 1109920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson keywords.add(new KeywordEntry(m.prettySignature(), 1110920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson htmlPage + "#" + m.anchor(), "constructor in " + qualifiedName)); 1111920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1112920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1113920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1114920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1115920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // private constructors 1116920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (Doclava.checkLevel(Doclava.SHOW_PRIVATE)) { 1117920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo m : ctors) { 1118920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m.isPrivate() && m.checkLevel()) { 1119920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson keywords.add(new KeywordEntry(m.name() + m.prettySignature(), 1120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson htmlPage + "#" + m.anchor(), "constructor in " + qualifiedName)); 1121920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1122920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1123920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1124920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1125920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // public methods 1126920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo m : methods) { 1127920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m.isPublic() && m.checkLevel()) { 1128920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson keywords.add(new KeywordEntry(m.name() + m.prettySignature(), htmlPage + "#" + m.anchor(), 1129920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson "method in " + qualifiedName)); 1130920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1131920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1132920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1133920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // protected methods 1134920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (Doclava.checkLevel(Doclava.SHOW_PROTECTED)) { 1135920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo m : methods) { 1136920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m.isProtected() && m.checkLevel()) { 1137920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson keywords.add(new KeywordEntry(m.name() + m.prettySignature(), 1138920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson htmlPage + "#" + m.anchor(), "method in " + qualifiedName)); 1139920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1140920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1141920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1142920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1143920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // package private methods 1144920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (Doclava.checkLevel(Doclava.SHOW_PACKAGE)) { 1145920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo m : methods) { 1146920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m.isPackagePrivate() && m.checkLevel()) { 1147920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson keywords.add(new KeywordEntry(m.name() + m.prettySignature(), 1148920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson htmlPage + "#" + m.anchor(), "method in " + qualifiedName)); 1149920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1150920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1151920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1152920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1153920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // private methods 1154920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (Doclava.checkLevel(Doclava.SHOW_PRIVATE)) { 1155920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo m : methods) { 1156920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m.isPrivate() && m.checkLevel()) { 1157920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson keywords.add(new KeywordEntry(m.name() + m.prettySignature(), 1158920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson htmlPage + "#" + m.anchor(), "method in " + qualifiedName)); 1159920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1160920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1161920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1162920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1163920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1164920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void makeLink(Data data, String base) { 1165920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".label", this.name()); 1166920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!this.isPrimitive() && this.isIncluded() && this.checkLevel()) { 1167920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".link", this.htmlPage()); 1168920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1169920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1170920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1171920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static void makeLinkListHDF(Data data, String base, ClassInfo[] classes) { 1172920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson final int N = classes.length; 1173920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (int i = 0; i < N; i++) { 1174920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo cl = classes[i]; 1175920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (cl.checkLevel()) { 1176920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson cl.asTypeInfo().makeHDF(data, base + "." + i); 1177920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1178920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1179920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1180920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1181920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /** 1182920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Used in lists of this class (packages, nested classes, known subclasses) 1183920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 1184920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void makeShortDescrHDF(Data data, String base) { 1185920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mTypeInfo.makeHDF(data, base + ".type"); 1186920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".kind", this.kind()); 1187920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TagInfo.makeHDF(data, base + ".shortDescr", this.firstSentenceTags()); 1188920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TagInfo.makeHDF(data, base + ".deprecated", deprecatedTags()); 1189920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".since", getSince()); 119040ad14799644f497483efe6d1350c856d46bc4daScott Main if (isDeprecated()) { 119140ad14799644f497483efe6d1350c856d46bc4daScott Main data.setValue(base + ".deprecatedsince", getDeprecatedSince()); 119240ad14799644f497483efe6d1350c856d46bc4daScott Main } 1193b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson 11949ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson ArrayList<AnnotationInstanceInfo> showAnnos = getShowAnnotationsIncludeOuters(); 1195b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson AnnotationInstanceInfo.makeLinkListHDF( 1196b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson data, 1197b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson base + ".showAnnotations", 11989ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson showAnnos.toArray(new AnnotationInstanceInfo[showAnnos.size()])); 1199b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson 1200920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson setFederatedReferences(data, base); 1201920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1202920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1203920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /** 1204920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Turns into the main class page 1205920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 1206920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void makeHDF(Data data) { 1207920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int i, j, n; 1208920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String name = name(); 1209920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String qualified = qualifiedName(); 1210d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<AttributeInfo> selfAttributes = selfAttributes(); 1211d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<MethodInfo> methods = selfMethods(); 1212d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<FieldInfo> fields = selfFields(); 1213d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<FieldInfo> enumConstants = enumConstants(); 1214d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<MethodInfo> ctors = constructors(); 1215d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<ClassInfo> inners = innerClasses(); 1216920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1217920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // class name 1218920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mTypeInfo.makeHDF(data, "class.type"); 1219920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mTypeInfo.makeQualifiedHDF(data, "class.qualifiedType"); 1220920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("class.name", name); 1221920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("class.qualified", qualified); 1222920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (isProtected()) { 1223920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("class.scope", "protected"); 1224920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else if (isPublic()) { 1225920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("class.scope", "public"); 1226920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1227920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (isStatic()) { 1228920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("class.static", "static"); 1229920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1230920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (isFinal()) { 1231920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("class.final", "final"); 1232920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1233920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (isAbstract() && !isInterface()) { 1234920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("class.abstract", "abstract"); 1235920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1236920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1237b2a6c0413706468ba1dc6bcdd4e29d8eee20fffeJeff Arneson int numAnnotationDocumentation = 0; 1238b2a6c0413706468ba1dc6bcdd4e29d8eee20fffeJeff Arneson for (AnnotationInstanceInfo aii : annotations()) { 1239b2a6c0413706468ba1dc6bcdd4e29d8eee20fffeJeff Arneson String annotationDocumentation = Doclava.getDocumentationStringForAnnotation( 1240b2a6c0413706468ba1dc6bcdd4e29d8eee20fffeJeff Arneson aii.type().qualifiedName()); 1241b2a6c0413706468ba1dc6bcdd4e29d8eee20fffeJeff Arneson if (annotationDocumentation != null) { 1242b2a6c0413706468ba1dc6bcdd4e29d8eee20fffeJeff Arneson data.setValue("class.annotationdocumentation." + numAnnotationDocumentation + ".text", 1243b2a6c0413706468ba1dc6bcdd4e29d8eee20fffeJeff Arneson annotationDocumentation); 1244b2a6c0413706468ba1dc6bcdd4e29d8eee20fffeJeff Arneson numAnnotationDocumentation++; 1245b2a6c0413706468ba1dc6bcdd4e29d8eee20fffeJeff Arneson } 1246b2a6c0413706468ba1dc6bcdd4e29d8eee20fffeJeff Arneson } 1247b2a6c0413706468ba1dc6bcdd4e29d8eee20fffeJeff Arneson 12489ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson ArrayList<AnnotationInstanceInfo> showAnnos = getShowAnnotationsIncludeOuters(); 1249b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson AnnotationInstanceInfo.makeLinkListHDF( 1250b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson data, 1251b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson "class.showAnnotations", 12529ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson showAnnos.toArray(new AnnotationInstanceInfo[showAnnos.size()])); 1253b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson 1254920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // class info 1255920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String kind = kind(); 1256920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (kind != null) { 1257920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("class.kind", kind); 1258920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1259920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("class.since", getSince()); 126040ad14799644f497483efe6d1350c856d46bc4daScott Main if (isDeprecated()) { 126140ad14799644f497483efe6d1350c856d46bc4daScott Main data.setValue("class.deprecatedsince", getDeprecatedSince()); 126240ad14799644f497483efe6d1350c856d46bc4daScott Main } 1263920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson setFederatedReferences(data, "class"); 1264920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1265920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // the containing package -- note that this can be passed to type_link, 1266920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // but it also contains the list of all of the packages 1267920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson containingPackage().makeClassLinkListHDF(data, "class.package"); 1268920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1269920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // inheritance hierarchy 1270d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson List<ClassTypePair> ctplist = superClassesWithTypes(); 1271d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson n = ctplist.size(); 1272d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson for (i = 0; i < ctplist.size(); i++) { 1273d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson // go in reverse order 1274d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson ClassTypePair ctp = ctplist.get(n - i - 1); 1275d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (ctp.classInfo().checkLevel()) { 1276d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson ctp.typeInfo().makeQualifiedHDF(data, "class.inheritance." + i + ".class"); 1277d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson ctp.typeInfo().makeHDF(data, "class.inheritance." + i + ".short_class"); 1278d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson j = 0; 1279d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson for (ClassTypePair t : ctp.classInfo().interfacesWithTypes()) { 1280d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson t.typeInfo().makeHDF(data, "class.inheritance." + i + ".interfaces." + j); 1281d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson j++; 1282d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 1283920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1284920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1285920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1286920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // class description 1287920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TagInfo.makeHDF(data, "class.descr", inlineTags()); 1288920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TagInfo.makeHDF(data, "class.seeAlso", comment().seeTags()); 1289920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TagInfo.makeHDF(data, "class.deprecated", deprecatedTags()); 1290920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1291920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // known subclasses 1292920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TreeMap<String, ClassInfo> direct = new TreeMap<String, ClassInfo>(); 1293920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TreeMap<String, ClassInfo> indirect = new TreeMap<String, ClassInfo>(); 1294920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo[] all = Converter.rootClasses(); 1295920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo cl : all) { 1296920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (cl.superclass() != null && cl.superclass().equals(this)) { 1297920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson direct.put(cl.name(), cl); 1298920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else if (cl.isDerivedFrom(this)) { 1299920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson indirect.put(cl.name(), cl); 1300920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1301920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1302920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // direct 1303920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1304920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo cl : direct.values()) { 1305920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (cl.checkLevel()) { 1306920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson cl.makeShortDescrHDF(data, "class.subclasses.direct." + i); 1307920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1308920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1309920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1310920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // indirect 1311920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1312920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo cl : indirect.values()) { 1313920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (cl.checkLevel()) { 1314920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson cl.makeShortDescrHDF(data, "class.subclasses.indirect." + i); 1315920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1316920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1317920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1318920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1319920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // hide special cases 1320920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if ("java.lang.Object".equals(qualified) || "java.io.Serializable".equals(qualified)) { 1321920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("class.subclasses.hidden", "1"); 1322920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 1323920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue("class.subclasses.hidden", "0"); 1324920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1325920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1326920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // nested classes 1327920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1328920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo inner : inners) { 1329920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (inner.checkLevel()) { 1330920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson inner.makeShortDescrHDF(data, "class.inners." + i); 1331920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1332920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1333920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1334920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1335920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // enum constants 1336920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1337920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (FieldInfo field : enumConstants) { 1338331b8a2511bb860ab6b96f159748c35a01080f65Jesse Wilson field.makeHDF(data, "class.enumConstants." + i); 1339331b8a2511bb860ab6b96f159748c35a01080f65Jesse Wilson i++; 1340920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1341920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1342920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // constants 1343920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1344920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (FieldInfo field : fields) { 1345920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (field.isConstant()) { 1346920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson field.makeHDF(data, "class.constants." + i); 1347920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1348920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1349920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1350920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1351920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // fields 1352920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1353920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (FieldInfo field : fields) { 1354920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!field.isConstant()) { 1355920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson field.makeHDF(data, "class.fields." + i); 1356920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1357920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1358920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1359920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1360920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // public constructors 1361920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1362920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo ctor : ctors) { 1363920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (ctor.isPublic()) { 1364920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ctor.makeHDF(data, "class.ctors.public." + i); 1365920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1366920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1367920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1368920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1369920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // protected constructors 1370920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (Doclava.checkLevel(Doclava.SHOW_PROTECTED)) { 1371920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1372920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo ctor : ctors) { 1373920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (ctor.isProtected()) { 1374920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ctor.makeHDF(data, "class.ctors.protected." + i); 1375920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1376920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1377920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1378920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1379920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1380920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // package private constructors 1381920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (Doclava.checkLevel(Doclava.SHOW_PACKAGE)) { 1382920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1383920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo ctor : ctors) { 1384920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (ctor.isPackagePrivate()) { 1385920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ctor.makeHDF(data, "class.ctors.package." + i); 1386920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1387920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1388920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1389920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1390920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1391920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // private constructors 1392920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (Doclava.checkLevel(Doclava.SHOW_PRIVATE)) { 1393920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1394920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo ctor : ctors) { 1395920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (ctor.isPrivate()) { 1396920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ctor.makeHDF(data, "class.ctors.private." + i); 1397920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1398920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1399920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1400920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1401920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1402920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // public methods 1403920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1404920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo method : methods) { 1405920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (method.isPublic()) { 1406920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson method.makeHDF(data, "class.methods.public." + i); 1407920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1408920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1409920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1410920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1411920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // protected methods 1412920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (Doclava.checkLevel(Doclava.SHOW_PROTECTED)) { 1413920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1414920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo method : methods) { 1415920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (method.isProtected()) { 1416920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson method.makeHDF(data, "class.methods.protected." + i); 1417920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1418920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1419920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1420920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1421920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1422920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // package private methods 1423920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (Doclava.checkLevel(Doclava.SHOW_PACKAGE)) { 1424920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1425920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo method : methods) { 1426920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (method.isPackagePrivate()) { 1427920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson method.makeHDF(data, "class.methods.package." + i); 1428920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1429920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1430920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1431920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1432920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1433920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // private methods 1434920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (Doclava.checkLevel(Doclava.SHOW_PRIVATE)) { 1435920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1436920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo method : methods) { 1437920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (method.isPrivate()) { 1438920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson method.makeHDF(data, "class.methods.private." + i); 1439920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1440920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1441920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1442920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1443920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1444920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // xml attributes 1445920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1446920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (AttributeInfo attr : selfAttributes) { 1447920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (attr.checkLevel()) { 1448920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson attr.makeHDF(data, "class.attrs." + i); 1449920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1450920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1451920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1452920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1453920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // inherited methods 1454d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson Iterator<ClassTypePair> superclassesItr = superClassesWithTypes().iterator(); 1455d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson superclassesItr.next(); // skip the first one, which is the current class 1456d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson ClassTypePair superCtp; 1457920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1458d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson while (superclassesItr.hasNext()) { 1459d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson superCtp = superclassesItr.next(); 1460d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (superCtp.classInfo().checkLevel()) { 1461d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson makeInheritedHDF(data, i, superCtp); 1462d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson i++; 1463d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 1464920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1465d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson Iterator<ClassTypePair> interfacesItr = allInterfacesWithTypes().iterator(); 1466d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson while (interfacesItr.hasNext()) { 1467d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson superCtp = interfacesItr.next(); 1468d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (superCtp.classInfo().checkLevel()) { 1469d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson makeInheritedHDF(data, i, superCtp); 1470d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson i++; 1471d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson } 1472920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1473920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1474920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1475d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson private static void makeInheritedHDF(Data data, int index, ClassTypePair ctp) { 1476920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int i; 1477920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1478920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String base = "class.inherited." + index; 1479d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson data.setValue(base + ".qualified", ctp.classInfo().qualifiedName()); 1480d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (ctp.classInfo().checkLevel()) { 1481d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson data.setValue(base + ".link", ctp.classInfo().htmlPage()); 1482920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1483d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson String kind = ctp.classInfo().kind(); 1484920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (kind != null) { 1485920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".kind", kind); 1486920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1487920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1488d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (ctp.classInfo().mIsIncluded) { 1489920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".included", "true"); 1490920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 1491d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson Doclava.federationTagger.tagAll(new ClassInfo[] {ctp.classInfo()}); 1492d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson if (!ctp.classInfo().getFederatedReferences().isEmpty()) { 1493d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson FederatedSite site = ctp.classInfo().getFederatedReferences().iterator().next(); 1494d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson data.setValue(base + ".link", site.linkFor(ctp.classInfo().htmlPage())); 1495920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".federated", site.name()); 1496920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1497920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1498920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1499920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // xml attributes 1500920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1501d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson for (AttributeInfo attr : ctp.classInfo().selfAttributes()) { 1502920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson attr.makeHDF(data, base + ".attrs." + i); 1503920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1504920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1505920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1506920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // methods 1507920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1508d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson for (MethodInfo method : ctp.classInfo().selfMethods()) { 1509d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson method.makeHDF(data, base + ".methods." + i, ctp.getTypeArgumentMapping()); 1510920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1511920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1512920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1513920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // fields 1514920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1515d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson for (FieldInfo field : ctp.classInfo().selfFields()) { 1516920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!field.isConstant()) { 1517920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson field.makeHDF(data, base + ".fields." + i); 1518920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1519920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1520920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1521920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1522920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // constants 1523920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i = 0; 1524d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson for (FieldInfo field : ctp.classInfo().selfFields()) { 1525920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (field.isConstant()) { 1526920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson field.makeHDF(data, base + ".constants." + i); 1527920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson i++; 1528920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1529920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1530920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1531920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1532920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson @Override 1533920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isHidden() { 15345118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if (mHidden == null) { 15355118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu mHidden = isHiddenImpl(); 1536920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 15375118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 15385118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return mHidden; 1539920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1540920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 15415118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 15425118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @return true if the containing package has @hide comment, or an ancestor 15435118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * class of this class is hidden, or this class has @hide comment. 15445118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 1545920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isHiddenImpl() { 1546920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo cl = this; 1547920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson while (cl != null) { 1548f2d2e93f552d699dc3dc58fb450b7e7a50128da0Adam Metcalf if (cl.hasShowAnnotation()) { 15493acc9d1825a2ed73954d10e0a11f2a0de9dd76e5Tim Murray return false; 1550f2d2e93f552d699dc3dc58fb450b7e7a50128da0Adam Metcalf } 15513acc9d1825a2ed73954d10e0a11f2a0de9dd76e5Tim Murray PackageInfo pkg = cl.containingPackage(); 1552f2d2e93f552d699dc3dc58fb450b7e7a50128da0Adam Metcalf if (pkg != null && pkg.hasHideComment()) { 1553920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 1554920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1555920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (cl.comment().isHidden()) { 1556920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 1557920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1558920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson cl = cl.containingClass(); 1559920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1560920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 1561920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1562920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 15635118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu @Override 15645118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public boolean isRemoved() { 15655118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if (mRemoved == null) { 15665118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu mRemoved = isRemovedImpl(); 15675118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 15685118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 15695118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return mRemoved; 15705118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 15715118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 15725118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu /** 15735118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * @return true if the containing package has @removed comment, or an ancestor 15745118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu * class of this class is removed, or this class has @removed comment. 15755118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu */ 15765118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public boolean isRemovedImpl() { 15775118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu ClassInfo cl = this; 15785118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu while (cl != null) { 15795118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if (cl.hasShowAnnotation()) { 15805118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return false; 15815118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 15825118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu PackageInfo pkg = cl.containingPackage(); 15835118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if (pkg != null && pkg.hasRemovedComment()) { 15845118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return true; 15855118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 15865118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu if (cl.comment().isRemoved()) { 15875118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return true; 15885118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 15895118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu cl = cl.containingClass(); 15905118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 15915118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return false; 15925118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 15935118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 15945118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu @Override 15955118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu public boolean isHiddenOrRemoved() { 15965118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu return isHidden() || isRemoved(); 15975118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu } 15985118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 1599f2d2e93f552d699dc3dc58fb450b7e7a50128da0Adam Metcalf public boolean hasShowAnnotation() { 1600a2769edc45485149708af8eaa08156623ba72313Brett Chabot return mShowAnnotations != null && mShowAnnotations.size() > 0; 1601b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson } 1602b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson 1603b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson public ArrayList<AnnotationInstanceInfo> showAnnotations() { 1604b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson return mShowAnnotations; 1605f2d2e93f552d699dc3dc58fb450b7e7a50128da0Adam Metcalf } 1606f2d2e93f552d699dc3dc58fb450b7e7a50128da0Adam Metcalf 16079ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson public ArrayList<AnnotationInstanceInfo> getShowAnnotationsIncludeOuters() { 16089ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson ArrayList<AnnotationInstanceInfo> allAnnotations = new ArrayList<AnnotationInstanceInfo>(); 16099ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson ClassInfo cl = this; 16109ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson while (cl != null) { 16119ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson if (cl.showAnnotations() != null) { 16129ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson // Don't allow duplicates into the merged list 16139ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson for (AnnotationInstanceInfo newAii : cl.showAnnotations()) { 16149ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson boolean addIt = true; 16159ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson for (AnnotationInstanceInfo existingAii : allAnnotations) { 16169ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson if (existingAii.type().name() == newAii.type().name()) { 16179ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson addIt = false; 16189ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson break; 16199ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson } 16209ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson } 16219ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson if (addIt) { 16229ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson allAnnotations.add(newAii); 16239ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson } 16249ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson } 16259ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson } 16269ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson cl = cl.containingClass(); 16279ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson } 16289ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson return allAnnotations; 16299ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson } 16309ee73fde5ad41d815ddfdc4e058cc5e49c81fe51Jeff Arneson 1631d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private MethodInfo matchMethod(ArrayList<MethodInfo> methods, String name, String[] params, 1632920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String[] dimensions, boolean varargs) { 1633d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (MethodInfo method : methods) { 1634920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (method.name().equals(name)) { 1635920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (params == null) { 1636920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return method; 1637920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 1638920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (method.matchesParams(params, dimensions, varargs)) { 1639920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return method; 1640920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1641920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1642920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1643920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1644920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 1645920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1646920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1647920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public MethodInfo findMethod(String name, String[] params, String[] dimensions, boolean varargs) { 1648920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // first look on our class, and our superclasses 1649920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1650920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // for methods 1651920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson MethodInfo rv; 1652920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson rv = matchMethod(methods(), name, params, dimensions, varargs); 1653920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1654920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (rv != null) { 1655920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return rv; 1656920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1657920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1658920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // for constructors 1659920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson rv = matchMethod(constructors(), name, params, dimensions, varargs); 1660920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (rv != null) { 1661920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return rv; 1662920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1663920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1664920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // then recursively look at our containing class 1665920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo containing = containingClass(); 1666920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (containing != null) { 1667920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return containing.findMethod(name, params, dimensions, varargs); 1668920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1669920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1670920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 1671920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 16729b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty 1673920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean supportsMethod(MethodInfo method) { 1674920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo m : methods()) { 1675920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m.getHashableName().equals(method.getHashableName())) { 1676920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 1677920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1678920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1679920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 1680920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1681920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1682920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private ClassInfo searchInnerClasses(String[] nameParts, int index) { 1683920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String part = nameParts[index]; 1684920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1685d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<ClassInfo> inners = mInnerClasses; 1686920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo in : inners) { 1687920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String[] innerParts = in.nameParts(); 1688920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (part.equals(innerParts[innerParts.length - 1])) { 1689920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (index == nameParts.length - 1) { 1690920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return in; 1691920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 1692920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return in.searchInnerClasses(nameParts, index + 1); 1693920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1694920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1695920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1696920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 1697920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1698920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1699920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public ClassInfo extendedFindClass(String className) { 1700920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // ClassDoc.findClass has this bug that we're working around here: 1701920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // If you have a class PackageManager with an inner class PackageInfo 1702920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // and you call it with "PackageInfo" it doesn't find it. 1703920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return searchInnerClasses(className.split("\\."), 0); 1704920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1705920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1706920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public ClassInfo findClass(String className) { 1707920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return Converter.obtainClass(mClass.findClass(className)); 1708920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1709920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1710920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public ClassInfo findInnerClass(String className) { 1711920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // ClassDoc.findClass won't find inner classes. To deal with that, 1712920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // we try what they gave us first, but if that didn't work, then 1713920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // we see if there are any periods in className, and start searching 1714920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // from there. 1715920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String[] nodes = className.split("\\."); 1716920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassDoc cl = mClass; 1717b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath 1718b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath int N = nodes.length; 1719b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath for (int i = 0; i < N; ++i) { 1720b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath final String n = nodes[i]; 1721b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath if (n.isEmpty() && i == 0) { 1722b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath // We skip over an empty classname component if it's at location 0. This is 1723b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath // to deal with names like ".Inner". java7 will return a bogus ClassInfo when 1724b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath // we call "findClass("") and the next iteration of the loop will throw a 1725b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath // runtime exception. 1726b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath continue; 1727b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath } 1728b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath 1729920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson cl = cl.findClass(n); 1730920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (cl == null) { 1731920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 1732920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1733920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1734b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath 1735920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return Converter.obtainClass(cl); 1736920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1737920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1738920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public FieldInfo findField(String name) { 1739920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // first look on our class, and our superclasses 1740920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (FieldInfo f : fields()) { 1741920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (f.name().equals(name)) { 1742920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return f; 1743920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1744920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1745920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1746920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // then look at our enum constants (these are really fields, maybe 1747920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // they should be mixed into fields(). not sure) 1748920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (FieldInfo f : enumConstants()) { 1749920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (f.name().equals(name)) { 1750920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return f; 1751920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1752920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1753920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1754920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // then recursively look at our containing class 1755920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo containing = containingClass(); 1756920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (containing != null) { 1757920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return containing.findField(name); 1758920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1759920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1760920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 1761920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1762920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1763920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static ClassInfo[] sortByName(ClassInfo[] classes) { 1764920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int i; 1765920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Sorter[] sorted = new Sorter[classes.length]; 1766920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (i = 0; i < sorted.length; i++) { 1767920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo cl = classes[i]; 1768920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson sorted[i] = new Sorter(cl.name(), cl); 1769920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1770920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1771920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Arrays.sort(sorted); 1772920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1773920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo[] rv = new ClassInfo[classes.length]; 1774920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (i = 0; i < rv.length; i++) { 1775920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson rv[i] = (ClassInfo) sorted[i].data; 1776920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1777920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1778920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return rv; 1779920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1780920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1781920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean equals(ClassInfo that) { 1782920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (that != null) { 1783920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return this.qualifiedName().equals(that.qualifiedName()); 1784920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 1785920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 1786920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1787920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1788920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1789d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void setNonWrittenConstructors(ArrayList<MethodInfo> nonWritten) { 1790920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mNonWrittenConstructors = nonWritten; 1791920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1792920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1793d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<MethodInfo> getNonWrittenConstructors() { 1794920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mNonWrittenConstructors; 1795920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1796920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1797920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String kind() { 1798920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (isOrdinaryClass()) { 1799920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return "class"; 1800920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else if (isInterface()) { 1801920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return "interface"; 1802920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else if (isEnum()) { 1803920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return "enum"; 1804920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else if (isError()) { 1805920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return "class"; 1806920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else if (isException()) { 1807920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return "class"; 1808920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else if (isAnnotation()) { 1809920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return "@interface"; 1810920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1811920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 1812920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 18139b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty 1814920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String scope() { 1815920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (isPublic()) { 1816920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return "public"; 1817920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else if (isProtected()) { 1818920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return "protected"; 1819920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else if (isPackagePrivate()) { 1820920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return ""; 1821920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else if (isPrivate()) { 1822920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return "private"; 1823920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 1824920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson throw new RuntimeException("invalid scope for object " + this); 1825920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1826920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1827920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1828d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void setHiddenMethods(ArrayList<MethodInfo> mInfo) { 1829920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mHiddenMethods = mInfo; 1830920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1831920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1832d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<MethodInfo> getHiddenMethods() { 1833920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mHiddenMethods; 1834920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1835920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1836920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson @Override 1837920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String toString() { 1838920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return this.qualifiedName(); 1839920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1840920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1841920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void setReasonIncluded(String reason) { 1842920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mReasonIncluded = reason; 1843920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1844920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1845920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String getReasonIncluded() { 1846920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mReasonIncluded; 1847920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1848920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1849920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private ClassDoc mClass; 1850920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1851920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // ctor 1852920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsPublic; 1853920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsProtected; 1854920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsPackagePrivate; 1855920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsPrivate; 1856920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsStatic; 1857920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsInterface; 1858920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsAbstract; 1859920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsOrdinaryClass; 1860920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsException; 1861920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsError; 1862920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsEnum; 1863920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsAnnotation; 1864920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsFinal; 1865920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsIncluded; 1866920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private String mName; 1867920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private String mQualifiedName; 1868920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private String mQualifiedTypeName; 1869920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsPrimitive; 1870920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private TypeInfo mTypeInfo; 1871920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private String[] mNameParts; 1872920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1873920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // init 1874d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<ClassInfo> mRealInterfaces = new ArrayList<ClassInfo>(); 1875d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<ClassInfo> mInterfaces; 1876d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<TypeInfo> mRealInterfaceTypes; 1877d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<ClassInfo> mInnerClasses; 18785118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // mAllConstructors will not contain *all* constructors. Only the constructors that pass 18795118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // checkLevel. @see {@link Converter#convertMethods(ConstructorDoc[])} 1880d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<MethodInfo> mAllConstructors = new ArrayList<MethodInfo>(); 18815118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // mAllSelfMethods will not contain *all* self methods. Only the methods that pass 18825118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // checkLevel. @see {@link Converter#convertMethods(MethodDoc[])} 1883d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<MethodInfo> mAllSelfMethods = new ArrayList<MethodInfo>(); 1884d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<MethodInfo> mAnnotationElements = new ArrayList<MethodInfo>(); // if this class is an annotation 1885d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<FieldInfo> mAllSelfFields = new ArrayList<FieldInfo>(); 1886d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<FieldInfo> mEnumConstants = new ArrayList<FieldInfo>(); 1887920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private PackageInfo mContainingPackage; 1888920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private ClassInfo mContainingClass; 1889920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private ClassInfo mRealSuperclass; 1890920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private TypeInfo mRealSuperclassType; 1891920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private ClassInfo mSuperclass; 1892d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<AnnotationInstanceInfo> mAnnotations; 1893b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson private ArrayList<AnnotationInstanceInfo> mShowAnnotations; 1894920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mSuperclassInit; 1895920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mDeprecatedKnown; 1896920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1897920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // lazy 1898d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson private ArrayList<ClassTypePair> mSuperclassesWithTypes; 1899d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson private ArrayList<ClassTypePair> mInterfacesWithTypes; 1900d6570b0b7f66519ba50c18d9e08db423bdf1341eJeff Arneson private ArrayList<ClassTypePair> mAllInterfacesWithTypes; 1901d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<MethodInfo> mConstructors; 1902d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<ClassInfo> mRealInnerClasses; 1903d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<MethodInfo> mSelfMethods; 1904d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<FieldInfo> mSelfFields; 1905d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<AttributeInfo> mSelfAttributes; 1906d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<MethodInfo> mMethods; 1907d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<FieldInfo> mFields; 1908d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<TypeInfo> mTypeParameters; 1909d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<MethodInfo> mHiddenMethods; 19105118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu private Boolean mHidden = null; 19115118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu private Boolean mRemoved = null; 19125118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu private Boolean mCheckLevel = null; 1913920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private String mReasonIncluded; 1914d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<MethodInfo> mNonWrittenConstructors; 1915920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsDeprecated; 19169b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty 1917920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // TODO: Temporary members from apicheck migration. 1918040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato private HashMap<String, MethodInfo> mApiCheckConstructors = new HashMap<String, MethodInfo>(); 1919920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private HashMap<String, MethodInfo> mApiCheckMethods = new HashMap<String, MethodInfo>(); 1920920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private HashMap<String, FieldInfo> mApiCheckFields = new HashMap<String, FieldInfo>(); 1921132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato private HashMap<String, FieldInfo> mApiCheckEnumConstants = new HashMap<String, FieldInfo>(); 19226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 19236ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Resolutions 19246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein private ArrayList<Resolution> mResolutions; 19259b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty 19265118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu private List<MethodInfo> mRemovedConstructors; // immutable after you set its value. 19275118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // @removed self methods that do not override any parent methods 19285118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu private List<MethodInfo> mRemovedSelfMethods; // immutable after you set its value. 19295118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu private List<MethodInfo> mRemovedMethods; // immutable after you set its value. 19305118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu private List<FieldInfo> mRemovedSelfFields; // immutable after you set its value. 19315118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu private List<FieldInfo> mRemovedEnumConstants; // immutable after you set its value. 19325118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu 1933920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /** 1934920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Returns true if {@code cl} implements the interface {@code iface} either by either being that 1935920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * interface, implementing that interface or extending a type that implements the interface. 1936920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 193711b179627c411772f1eac023d915ab8532e55211Mathieu public boolean implementsInterface(String iface) { 193811b179627c411772f1eac023d915ab8532e55211Mathieu if (qualifiedName().equals(iface)) { 1939920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 1940920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 194153d13be6dc155a3d7ae0607f3eafc2c3b98a909fFlorian Uunk for (ClassInfo clImplements : realInterfaces()) { 194211b179627c411772f1eac023d915ab8532e55211Mathieu if (clImplements.implementsInterface(iface)) { 1943920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 1944920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1945920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 194611b179627c411772f1eac023d915ab8532e55211Mathieu if (mSuperclass != null && mSuperclass.implementsInterface(iface)) { 1947920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 1948920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1949920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 1950920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1951920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1952ffecf3c5c207d0275d480970fd025cb9526b1905Mathieu /** 195311b179627c411772f1eac023d915ab8532e55211Mathieu * Returns true if {@code this} extends the class {@code ext}. 1954ffecf3c5c207d0275d480970fd025cb9526b1905Mathieu */ 195511b179627c411772f1eac023d915ab8532e55211Mathieu public boolean extendsClass(String cl) { 195611b179627c411772f1eac023d915ab8532e55211Mathieu if (qualifiedName().equals(cl)) { 1957ffecf3c5c207d0275d480970fd025cb9526b1905Mathieu return true; 1958ffecf3c5c207d0275d480970fd025cb9526b1905Mathieu } 195911b179627c411772f1eac023d915ab8532e55211Mathieu if (mSuperclass != null && mSuperclass.extendsClass(cl)) { 1960ffecf3c5c207d0275d480970fd025cb9526b1905Mathieu return true; 1961ffecf3c5c207d0275d480970fd025cb9526b1905Mathieu } 1962ffecf3c5c207d0275d480970fd025cb9526b1905Mathieu return false; 1963ffecf3c5c207d0275d480970fd025cb9526b1905Mathieu } 1964ffecf3c5c207d0275d480970fd025cb9526b1905Mathieu 196511b179627c411772f1eac023d915ab8532e55211Mathieu /** 196611b179627c411772f1eac023d915ab8532e55211Mathieu * Returns true if {@code this} is assignable to cl 196711b179627c411772f1eac023d915ab8532e55211Mathieu */ 196811b179627c411772f1eac023d915ab8532e55211Mathieu public boolean isAssignableTo(String cl) { 196911b179627c411772f1eac023d915ab8532e55211Mathieu return implementsInterface(cl) || extendsClass(cl); 197011b179627c411772f1eac023d915ab8532e55211Mathieu } 197111b179627c411772f1eac023d915ab8532e55211Mathieu 1972920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void addInterface(ClassInfo iface) { 1973920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mRealInterfaces.add(iface); 1974920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1975920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1976040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato public void addConstructor(MethodInfo ctor) { 1977040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato mApiCheckConstructors.put(ctor.getHashableName(), ctor); 1978920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1979d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mAllConstructors.add(ctor); 1980040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato mConstructors = null; // flush this, hopefully it hasn't been used yet. 1981920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1982920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1983040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato public void addField(FieldInfo field) { 1984040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato mApiCheckFields.put(field.name(), field); 1985920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1986d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mAllSelfFields.add(field); 1987d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1988040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato mSelfFields = null; // flush this, hopefully it hasn't been used yet. 1989920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 1990920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 1991132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato public void addEnumConstant(FieldInfo field) { 1992132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato mApiCheckEnumConstants.put(field.name(), field); 1993132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato 1994d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mEnumConstants.add(field); 1995132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato } 1996132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato 1997920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void setSuperClass(ClassInfo superclass) { 1998040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato mRealSuperclass = superclass; 1999920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mSuperclass = superclass; 2000920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2001920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2002040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato public Map<String, MethodInfo> allConstructorsMap() { 2003920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mApiCheckConstructors; 2004920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2005920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2006920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public Map<String, FieldInfo> allFields() { 2007920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mApiCheckFields; 2008920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2009920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2010189048062a7df2d2fba4ff075c6416bfbf05a094Scott Main public Map<String, FieldInfo> allEnums() { 2011189048062a7df2d2fba4ff075c6416bfbf05a094Scott Main return mApiCheckEnumConstants; 2012189048062a7df2d2fba4ff075c6416bfbf05a094Scott Main } 2013189048062a7df2d2fba4ff075c6416bfbf05a094Scott Main 2014920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /** 2015920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Returns all methods defined directly in this class. For a list of all 2016920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * methods supported by this class, see {@link #methods()}. 2017920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 2018920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public Map<String, MethodInfo> allMethods() { 2019920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mApiCheckMethods; 2020920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2021920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2022920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /** 2023920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Returns the class hierarchy for this class, starting with this class. 2024920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 2025920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public Iterable<ClassInfo> hierarchy() { 2026920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson List<ClassInfo> result = new ArrayList<ClassInfo>(4); 2027920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo c = this; c != null; c = c.mSuperclass) { 2028920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson result.add(c); 2029920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2030920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return result; 2031920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 20329b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty 2033920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String superclassName() { 2034920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mSuperclass == null) { 2035920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mQualifiedName.equals("java.lang.Object")) { 2036920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 2037920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2038920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson throw new UnsupportedOperationException("Superclass not set for " + qualifiedName()); 2039920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2040920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mSuperclass.mQualifiedName; 2041920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 20429b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty 2043d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void setAnnotations(ArrayList<AnnotationInstanceInfo> annotations) { 2044920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mAnnotations = annotations; 2045920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 20469b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty 2047920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isConsistent(ClassInfo cl) { 2048f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu return isConsistent(cl, null, null); 2049f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu } 2050f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu 2051f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu public boolean isConsistent(ClassInfo cl, List<MethodInfo> newCtors, List<MethodInfo> newMethods) { 2052920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean consistent = true; 2053f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu boolean diffMode = (newCtors != null) && (newMethods != null); 2054920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2055920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (isInterface() != cl.isInterface()) { 2056920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_CLASS, cl.position(), "Class " + cl.qualifiedName() 2057920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " changed class/interface declaration"); 2058920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2059920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2060920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo iface : mRealInterfaces) { 206111b179627c411772f1eac023d915ab8532e55211Mathieu if (!cl.implementsInterface(iface.mQualifiedName)) { 2062920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.REMOVED_INTERFACE, cl.position(), "Class " + qualifiedName() 2063920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " no longer implements " + iface); 2064920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2065920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2066920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo iface : cl.mRealInterfaces) { 206711b179627c411772f1eac023d915ab8532e55211Mathieu if (!implementsInterface(iface.mQualifiedName)) { 2068920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.ADDED_INTERFACE, cl.position(), "Added interface " + iface 2069920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " to class " + qualifiedName()); 2070920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2071920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2072920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2073920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2074920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo mInfo : mApiCheckMethods.values()) { 2075920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (cl.mApiCheckMethods.containsKey(mInfo.getHashableName())) { 2076920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!mInfo.isConsistent(cl.mApiCheckMethods.get(mInfo.getHashableName()))) { 2077920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2078920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2079920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 2080920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /* 2081920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * This class formerly provided this method directly, and now does not. Check our ancestry 2082920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * to see if there's an inherited version that still fulfills the API requirement. 2083920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 2084920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson MethodInfo mi = ClassInfo.overriddenMethod(mInfo, cl); 2085920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mi == null) { 2086920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mi = ClassInfo.interfaceMethod(mInfo, cl); 2087920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2088920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mi == null) { 2089920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.REMOVED_METHOD, mInfo.position(), "Removed public method " 2090a7e5c7e9b5250e738ff36521c03f6a3b76bc1c08C. Sean Young + mInfo.prettyQualifiedSignature()); 2091920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2092920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2093920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2094920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2095920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo mInfo : cl.mApiCheckMethods.values()) { 2096920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!mApiCheckMethods.containsKey(mInfo.getHashableName())) { 2097920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /* 2098920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Similarly to the above, do not fail if this "new" method is really an override of an 2099920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * existing superclass method. 210067e440be60f3547e3280c9840af9547f521c28b3Ying Wang * But we should fail if this is overriding an abstract method, because method's 210167e440be60f3547e3280c9840af9547f521c28b3Ying Wang * abstractness affects how users use it. See also Stubs.methodIsOverride(). 2102920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 2103920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson MethodInfo mi = ClassInfo.overriddenMethod(mInfo, this); 210467e440be60f3547e3280c9840af9547f521c28b3Ying Wang if (mi == null || 210567e440be60f3547e3280c9840af9547f521c28b3Ying Wang mi.isAbstract() != mInfo.isAbstract()) { 2106920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.ADDED_METHOD, mInfo.position(), "Added public method " 2107a7e5c7e9b5250e738ff36521c03f6a3b76bc1c08C. Sean Young + mInfo.prettyQualifiedSignature()); 2108f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu if (diffMode) { 2109f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu newMethods.add(mInfo); 2110f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu } 2111920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2112920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2113920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2114920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2115f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu if (diffMode) { 2116f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu Collections.sort(newMethods, MethodInfo.comparator); 2117f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu } 2118920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2119040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato for (MethodInfo mInfo : mApiCheckConstructors.values()) { 2120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (cl.mApiCheckConstructors.containsKey(mInfo.getHashableName())) { 2121920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!mInfo.isConsistent(cl.mApiCheckConstructors.get(mInfo.getHashableName()))) { 2122920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2123920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2124920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 2125920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.REMOVED_METHOD, mInfo.position(), "Removed public constructor " 2126a7e5c7e9b5250e738ff36521c03f6a3b76bc1c08C. Sean Young + mInfo.prettyQualifiedSignature()); 2127920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2128920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2129920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2130040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato for (MethodInfo mInfo : cl.mApiCheckConstructors.values()) { 2131920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!mApiCheckConstructors.containsKey(mInfo.getHashableName())) { 2132920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.ADDED_METHOD, mInfo.position(), "Added public constructor " 2133a7e5c7e9b5250e738ff36521c03f6a3b76bc1c08C. Sean Young + mInfo.prettyQualifiedSignature()); 2134f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu if (diffMode) { 2135f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu newCtors.add(mInfo); 2136f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu } 2137920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2138920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2139920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2140f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu if (diffMode) { 2141f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu Collections.sort(newCtors, MethodInfo.comparator); 2142f9b7c1bf84c3d4eeb7b99af30e4ffe159c9fdaeeGuang Zhu } 2143920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2144920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (FieldInfo mInfo : mApiCheckFields.values()) { 2145920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (cl.mApiCheckFields.containsKey(mInfo.name())) { 2146920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!mInfo.isConsistent(cl.mApiCheckFields.get(mInfo.name()))) { 2147920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2148920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2149920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 2150920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.REMOVED_FIELD, mInfo.position(), "Removed field " 2151920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + mInfo.qualifiedName()); 2152920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2153920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2154920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2155920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (FieldInfo mInfo : cl.mApiCheckFields.values()) { 2156920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!mApiCheckFields.containsKey(mInfo.name())) { 2157920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.ADDED_FIELD, mInfo.position(), "Added public field " 2158920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + mInfo.qualifiedName()); 2159132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato consistent = false; 2160132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato } 2161132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato } 2162132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato 2163132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato for (FieldInfo info : mApiCheckEnumConstants.values()) { 2164132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato if (cl.mApiCheckEnumConstants.containsKey(info.name())) { 2165132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato if (!info.isConsistent(cl.mApiCheckEnumConstants.get(info.name()))) { 2166132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato consistent = false; 2167132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato } 2168132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato } else { 2169132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato Errors.error(Errors.REMOVED_FIELD, info.position(), "Removed enum constant " 2170132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato + info.qualifiedName()); 2171132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato consistent = false; 2172132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato } 2173132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato } 2174132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato for (FieldInfo info : cl.mApiCheckEnumConstants.values()) { 2175132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato if (!mApiCheckEnumConstants.containsKey(info.name())) { 2176132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato Errors.error(Errors.ADDED_FIELD, info.position(), "Added enum constant " 2177132afe44b3b7963e47d4c32948b2667ddc00062cJoe Onorato + info.qualifiedName()); 2178920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2179920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2180920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2181920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2182920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mIsAbstract != cl.mIsAbstract) { 2183920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2184920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_ABSTRACT, cl.position(), "Class " + cl.qualifiedName() 2185920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " changed abstract qualifier"); 2186920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2187920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 218843d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown if (!mIsFinal && cl.mIsFinal) { 218943d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown /* 219043d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown * It is safe to make a class final if it did not previously have any public 219143d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown * constructors because it was impossible for an application to create a subclass. 219243d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown */ 219343d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown if (mApiCheckConstructors.isEmpty()) { 219443d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown consistent = false; 219543d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown Errors.error(Errors.ADDED_FINAL_UNINSTANTIABLE, cl.position(), 219643d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown "Class " + cl.qualifiedName() + " added final qualifier but " 219743d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown + "was previously uninstantiable and therefore could not be subclassed"); 219843d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown } else { 219943d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown consistent = false; 220043d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown Errors.error(Errors.ADDED_FINAL, cl.position(), "Class " + cl.qualifiedName() 220143d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown + " added final qualifier"); 220243d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown } 220343d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown } else if (mIsFinal && !cl.mIsFinal) { 2204920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 220543d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown Errors.error(Errors.REMOVED_FINAL, cl.position(), "Class " + cl.qualifiedName() 220643d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown + " removed final qualifier"); 2207920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2208920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2209920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mIsStatic != cl.mIsStatic) { 2210920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2211920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_STATIC, cl.position(), "Class " + cl.qualifiedName() 2212920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " changed static qualifier"); 2213920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2214920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2215920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!scope().equals(cl.scope())) { 2216920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2217920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_SCOPE, cl.position(), "Class " + cl.qualifiedName() 2218920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " scope changed from " + scope() + " to " + cl.scope()); 2219920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2220920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2221920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!isDeprecated() == cl.isDeprecated()) { 2222920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2223920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_DEPRECATED, cl.position(), "Class " + cl.qualifiedName() 2224a7e5c7e9b5250e738ff36521c03f6a3b76bc1c08C. Sean Young + " has changed deprecation state " + isDeprecated() + " --> " + cl.isDeprecated()); 2225920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2226920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2227ffecf3c5c207d0275d480970fd025cb9526b1905Mathieu if (superclassName() != null) { // java.lang.Object can't have a superclass. 222811b179627c411772f1eac023d915ab8532e55211Mathieu if (!cl.extendsClass(superclassName())) { 2229920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 2230920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_SUPERCLASS, cl.position(), "Class " + qualifiedName() 2231920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " superclass changed from " + superclassName() + " to " + cl.superclassName()); 2232920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2233920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2234920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2235920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return consistent; 2236920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 22379b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty 22385118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu // Find a superclass implementation of the given method based on the methods in mApiCheckMethods. 2239920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static MethodInfo overriddenMethod(MethodInfo candidate, ClassInfo newClassObj) { 2240920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (newClassObj == null) { 2241920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 2242920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2243920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo mi : newClassObj.mApiCheckMethods.values()) { 2244920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mi.matches(candidate)) { 2245920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // found it 2246920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mi; 2247920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2248920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2249920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2250920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // not found here. recursively search ancestors 2251920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return ClassInfo.overriddenMethod(candidate, newClassObj.mSuperclass); 2252920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2253920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 2254920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Find a superinterface declaration of the given method. 2255920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static MethodInfo interfaceMethod(MethodInfo candidate, ClassInfo newClassObj) { 2256920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (newClassObj == null) { 2257920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 2258920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2259920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo interfaceInfo : newClassObj.interfaces()) { 2260920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo mi : interfaceInfo.mApiCheckMethods.values()) { 2261920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mi.matches(candidate)) { 2262920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mi; 2263920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2264920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2265920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2266920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return ClassInfo.interfaceMethod(candidate, newClassObj.mSuperclass); 2267920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 22689b316c84e2e15268db79772d9cef60da1df488ecDirk Dougherty 2269920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean hasConstructor(MethodInfo constructor) { 2270920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String name = constructor.getHashableName(); 2271040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato for (MethodInfo ctor : mApiCheckConstructors.values()) { 2272920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (name.equals(ctor.getHashableName())) { 2273920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 2274920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2275920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2276920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 2277920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2278d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2279920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void setTypeInfo(TypeInfo typeInfo) { 2280920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mTypeInfo = typeInfo; 2281920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 2282d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2283d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public TypeInfo type() { 2284d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return mTypeInfo; 2285d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2286d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2287d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void addInnerClass(ClassInfo innerClass) { 2288d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (mInnerClasses == null) { 2289d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mInnerClasses = new ArrayList<ClassInfo>(); 2290d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2291d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2292d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mInnerClasses.add(innerClass); 2293d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2294d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2295d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void setContainingClass(ClassInfo containingClass) { 2296d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mContainingClass = containingClass; 2297d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2298d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2299d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void setSuperclassType(TypeInfo superclassType) { 2300d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mRealSuperclassType = superclassType; 2301d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2302d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2303d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void printResolutions() { 23046ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (mResolutions == null || mResolutions.isEmpty()) { 23056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein return; 23066ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 23076ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 2308d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein System.out.println("Resolutions for Class " + mName + ":"); 2309d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 23106ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein for (Resolution r : mResolutions) { 23116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein System.out.println(r); 23126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 23136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 23146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 23156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein public void addResolution(Resolution resolution) { 23166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (mResolutions == null) { 23176ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein mResolutions = new ArrayList<Resolution>(); 23186ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 23196ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 23206ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein mResolutions.add(resolution); 23216ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 23226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 23236ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein public boolean resolveResolutions() { 23246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein ArrayList<Resolution> resolutions = mResolutions; 23256ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein mResolutions = new ArrayList<Resolution>(); 23266ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 23276ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein boolean allResolved = true; 23286ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein for (Resolution resolution : resolutions) { 23296ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein StringBuilder qualifiedClassName = new StringBuilder(); 23306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein InfoBuilder.resolveQualifiedName(resolution.getValue(), qualifiedClassName, 23316ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein resolution.getInfoBuilder()); 23326ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 23336ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // if we still couldn't resolve it, save it for the next pass 23346ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if ("".equals(qualifiedClassName.toString())) { 23356ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein mResolutions.add(resolution); 23366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein allResolved = false; 23376ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } else if ("superclassQualifiedName".equals(resolution.getVariable())) { 23386ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein setSuperClass(InfoBuilder.Caches.obtainClass(qualifiedClassName.toString())); 23396ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } else if ("interfaceQualifiedName".equals(resolution.getVariable())) { 23406ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein addInterface(InfoBuilder.Caches.obtainClass(qualifiedClassName.toString())); 23416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 23426ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 23436ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 23446ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein return allResolved; 2345d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2346920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson} 2347