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