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
19b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath
20b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.AnnotationDesc;
21b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.AnnotationTypeDoc;
22b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.AnnotationTypeElementDoc;
23b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.AnnotationValue;
24b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.ClassDoc;
25b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.ConstructorDoc;
26b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.ExecutableMemberDoc;
27b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.FieldDoc;
28b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.MemberDoc;
29b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.MethodDoc;
30b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.PackageDoc;
31b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.ParamTag;
32b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.Parameter;
33b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.RootDoc;
34b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.SeeTag;
35b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.SourcePosition;
36b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.Tag;
37b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.ThrowsTag;
38b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamathimport com.sun.javadoc.Type;
39b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath
40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.ArrayList;
41d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.Arrays;
42920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.HashMap;
43920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.HashSet;
445118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shuimport java.util.List;
45920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
46920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpublic class Converter {
47920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static RootDoc root;
48920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static void makeInfo(RootDoc r) {
50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    root = r;
51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
52920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // create the objects
53b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath    ClassDoc[] classes = getClasses(r);
54b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath    for (ClassDoc c : classes) {
55b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath      Converter.obtainClass(c);
56920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
57b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath
58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ArrayList<ClassInfo> classesNeedingInit2 = new ArrayList<ClassInfo>();
59b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath
60b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath    int i;
61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // fill in the fields that reference other classes
62920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    while (mClassesNeedingInit.size() > 0) {
63920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      i = mClassesNeedingInit.size() - 1;
64920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassNeedingInit clni = mClassesNeedingInit.get(i);
65920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      mClassesNeedingInit.remove(i);
66920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
67920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      initClass(clni.c, clni.cl);
68920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      classesNeedingInit2.add(clni.cl);
69920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
70920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mClassesNeedingInit = null;
71920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo cl : classesNeedingInit2) {
72920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      cl.init2();
73920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
74920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    finishAnnotationValueInit();
76920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // fill in the "root" stuff
78b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath    mRootClasses = Converter.convertClasses(classes);
79b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath  }
80b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath
81b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath  private static ClassDoc[] getClasses(RootDoc r) {
82b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath    ClassDoc[] classDocs = r.classes();
83b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath    ArrayList<ClassDoc> filtered = new ArrayList<ClassDoc>(classDocs.length);
84b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath    for (ClassDoc c : classDocs) {
85b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath      if (c.position() != null) {
86b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath        // Work around a javadoc bug in Java 7: We sometimes spuriously
87b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath        // receive duplicate top level ClassDocs with null positions and no type
88b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath        // information. Ignore them, since every ClassDoc must have a non null
89b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath        // position.
90b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath
91b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath        filtered.add(c);
92b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath      }
93b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath    }
94b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath
95b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath    ClassDoc[] filteredArray = new ClassDoc[filtered.size()];
96b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath    filtered.toArray(filteredArray);
97b1b0ee7431822a163552601a529e4db7cb3114c8Narayan Kamath    return filteredArray;
98920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
99920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
100920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static ClassInfo[] mRootClasses;
101920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
102920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static ClassInfo[] rootClasses() {
103920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mRootClasses;
104920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
105920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
106920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static ClassInfo[] allClasses() {
107920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return (ClassInfo[]) mClasses.all();
108920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
109920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
110da4b2e21af0d8efcfe73ff060839c97a2d4b8b03C. Sean Young  private static final MethodDoc[] EMPTY_METHOD_DOC = new MethodDoc[0];
111da4b2e21af0d8efcfe73ff060839c97a2d4b8b03C. Sean Young
112920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static void initClass(ClassDoc c, ClassInfo cl) {
113920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    MethodDoc[] annotationElements;
114920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (c instanceof AnnotationTypeDoc) {
115920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      annotationElements = ((AnnotationTypeDoc) c).elements();
116920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else {
117da4b2e21af0d8efcfe73ff060839c97a2d4b8b03C. Sean Young      annotationElements = EMPTY_METHOD_DOC;
118920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
119d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    cl.init(Converter.obtainType(c),
120d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new ArrayList<ClassInfo>(Arrays.asList(Converter.convertClasses(c.interfaces()))),
121d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new ArrayList<TypeInfo>(Arrays.asList(Converter.convertTypes(c.interfaceTypes()))),
122d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new ArrayList<ClassInfo>(Arrays.asList(Converter.convertClasses(c.innerClasses()))),
123d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new ArrayList<MethodInfo>(Arrays.asList(
124d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    Converter.convertMethods(c.constructors(false)))),
125d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new ArrayList<MethodInfo>(Arrays.asList(Converter.convertMethods(c.methods(false)))),
126d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new ArrayList<MethodInfo>(Arrays.asList(Converter.convertMethods(annotationElements))),
127d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new ArrayList<FieldInfo>(Arrays.asList(Converter.convertFields(c.fields(false)))),
128d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new ArrayList<FieldInfo>(Arrays.asList(Converter.convertFields(c.enumConstants()))),
129d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            Converter.obtainPackage(c.containingPackage()),
130d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            Converter.obtainClass(c.containingClass()),
131d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            Converter.obtainClass(c.superclass()), Converter.obtainType(c.superclassType()),
132d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new ArrayList<AnnotationInstanceInfo>(Arrays.asList(
133d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    Converter.convertAnnotationInstances(c.annotations()))));
134d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
135d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    cl.setHiddenMethods(
136d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new ArrayList<MethodInfo>(Arrays.asList(Converter.getHiddenMethods(c.methods(false)))));
1375118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    cl.setRemovedMethods(
1385118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu            new ArrayList<MethodInfo>(Arrays.asList(Converter.getRemovedMethods(c.methods(false)))));
1395118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu
1405118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    cl.setRemovedSelfMethods(
1415118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu        new ArrayList<MethodInfo>(Converter.convertAllMethods(c.methods(false))));
1425118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    cl.setRemovedConstructors(
1435118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu        new ArrayList<MethodInfo>(Converter.convertAllMethods(c.constructors(false))));
1445118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    cl.setRemovedSelfFields(
1455118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu        new ArrayList<FieldInfo>(Converter.convertAllFields(c.fields(false))));
1465118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    cl.setRemovedEnumConstants(
1475118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu        new ArrayList<FieldInfo>(Converter.convertAllFields(c.enumConstants())));
1485118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu
149d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    cl.setNonWrittenConstructors(
150d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new ArrayList<MethodInfo>(Arrays.asList(Converter.convertNonWrittenConstructors(
151d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    c.constructors(false)))));
152d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    cl.init3(
153d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new ArrayList<TypeInfo>(Arrays.asList(Converter.convertTypes(c.typeParameters()))),
154d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new ArrayList<ClassInfo>(Arrays.asList(
155d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    Converter.convertClasses(c.innerClasses(false)))));
156920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
157920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
158920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static ClassInfo obtainClass(String className) {
159920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return Converter.obtainClass(root.classNamed(className));
160920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
161920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
162920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static PackageInfo obtainPackage(String packageName) {
163920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return Converter.obtainPackage(root.packageNamed(packageName));
164920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
165920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
166920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static TagInfo convertTag(Tag tag) {
167d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return new TextTagInfo(tag.name(), tag.kind(), tag.text(),
168d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            Converter.convertSourcePosition(tag.position()));
169920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
170920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
171920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static ThrowsTagInfo convertThrowsTag(ThrowsTag tag, ContainerInfo base) {
172920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return new ThrowsTagInfo(tag.name(), tag.text(), tag.kind(), Converter.obtainClass(tag
173920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        .exception()), tag.exceptionComment(), base, Converter
174920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        .convertSourcePosition(tag.position()));
175920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
176920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
177920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static ParamTagInfo convertParamTag(ParamTag tag, ContainerInfo base) {
178920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return new ParamTagInfo(tag.name(), tag.kind(), tag.text(), tag.isTypeParameter(), tag
179920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        .parameterComment(), tag.parameterName(), base, Converter.convertSourcePosition(tag
180920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        .position()));
181920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
182920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
183920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static SeeTagInfo convertSeeTag(SeeTag tag, ContainerInfo base) {
184920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return new SeeTagInfo(tag.name(), tag.kind(), tag.text(), base, Converter
185920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        .convertSourcePosition(tag.position()));
186920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
187920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
188920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static SourcePositionInfo convertSourcePosition(SourcePosition sp) {
189920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (sp == null) {
190920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return null;
191920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
192920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return new SourcePositionInfo(sp.file().toString(), sp.line(), sp.column());
193920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
194920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
195920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static TagInfo[] convertTags(Tag[] tags, ContainerInfo base) {
196920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int len = tags.length;
197da4b2e21af0d8efcfe73ff060839c97a2d4b8b03C. Sean Young    TagInfo[] out = TagInfo.getArray(len);
198920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (int i = 0; i < len; i++) {
199920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Tag t = tags[i];
200920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      /*
201920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson       * System.out.println("Tag name='" + t.name() + "' kind='" + t.kind() + "'");
202920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson       */
203920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (t instanceof SeeTag) {
204920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        out[i] = Converter.convertSeeTag((SeeTag) t, base);
205920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (t instanceof ThrowsTag) {
206920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        out[i] = Converter.convertThrowsTag((ThrowsTag) t, base);
207920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (t instanceof ParamTag) {
208920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        out[i] = Converter.convertParamTag((ParamTag) t, base);
209920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
210920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        out[i] = Converter.convertTag(t);
211920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
212920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
213920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return out;
214920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
215920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
216920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static ClassInfo[] convertClasses(ClassDoc[] classes) {
217920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (classes == null) return null;
218920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int N = classes.length;
219920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo[] result = new ClassInfo[N];
220920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (int i = 0; i < N; i++) {
221920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result[i] = Converter.obtainClass(classes[i]);
222920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
223920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return result;
224920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
225920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
226920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static ParameterInfo convertParameter(Parameter p, SourcePosition pos, boolean isVarArg) {
227920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (p == null) return null;
228920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ParameterInfo pi =
229920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        new ParameterInfo(p.name(), p.typeName(), Converter.obtainType(p.type()), isVarArg,
230920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          Converter.convertSourcePosition(pos));
231920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return pi;
232920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
233920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
234920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static ParameterInfo[] convertParameters(Parameter[] p, ExecutableMemberDoc m) {
235920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    SourcePosition pos = m.position();
236920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int len = p.length;
237920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ParameterInfo[] q = new ParameterInfo[len];
238920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (int i = 0; i < len; i++) {
239920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      boolean isVarArg = (m.isVarArgs() && i == len - 1);
240920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      q[i] = Converter.convertParameter(p[i], pos, isVarArg);
241920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
242920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return q;
243920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
244920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
245920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static TypeInfo[] convertTypes(Type[] p) {
246920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (p == null) return null;
247920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int len = p.length;
248920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    TypeInfo[] q = new TypeInfo[len];
249920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (int i = 0; i < len; i++) {
250920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      q[i] = Converter.obtainType(p[i]);
251920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
252920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return q;
253920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
254920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
255920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private Converter() {}
256920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
257920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static class ClassNeedingInit {
258920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassNeedingInit(ClassDoc c, ClassInfo cl) {
259920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      this.c = c;
260920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      this.cl = cl;
261920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
262920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
263920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassDoc c;
264920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo cl;
265920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
266920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
267920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static ArrayList<ClassNeedingInit> mClassesNeedingInit =
268920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      new ArrayList<ClassNeedingInit>();
269920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
270920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  static ClassInfo obtainClass(ClassDoc o) {
271920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return (ClassInfo) mClasses.obtain(o);
272920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
273920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
274920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static Cache mClasses = new Cache() {
275920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
276920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected Object make(Object o) {
277920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassDoc c = (ClassDoc) o;
278920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassInfo cl =
279920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          new ClassInfo(c, c.getRawCommentText(), Converter.convertSourcePosition(c.position()), c
280920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              .isPublic(), c.isProtected(), c.isPackagePrivate(), c.isPrivate(), c.isStatic(), c
281920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              .isInterface(), c.isAbstract(), c.isOrdinaryClass(), c.isException(), c.isError(), c
282920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              .isEnum(), (c instanceof AnnotationTypeDoc), c.isFinal(), c.isIncluded(), c.name(), c
283920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              .qualifiedName(), c.qualifiedTypeName(), c.isPrimitive());
284920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (mClassesNeedingInit != null) {
285920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        mClassesNeedingInit.add(new ClassNeedingInit(c, cl));
286920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
287920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return cl;
288920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
289920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
290920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
291920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected void made(Object o, Object r) {
292920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (mClassesNeedingInit == null) {
293920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        initClass((ClassDoc) o, (ClassInfo) r);
294920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        ((ClassInfo) r).init2();
295920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
296920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
297920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
298920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
299920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo[] all() {
300920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return mCache.values().toArray(new ClassInfo[mCache.size()]);
301920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
302920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  };
303920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
304920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static MethodInfo[] getHiddenMethods(MethodDoc[] methods) {
305920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (methods == null) return null;
3065118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    ArrayList<MethodInfo> hiddenMethods = new ArrayList<MethodInfo>();
3075118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    for (MethodDoc method : methods) {
3085118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu      MethodInfo methodInfo = Converter.obtainMethod(method);
3095118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu      if (methodInfo.isHidden()) {
3105118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu        hiddenMethods.add(methodInfo);
3115118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu      }
3125118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    }
3135118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu
3145118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    return hiddenMethods.toArray(new MethodInfo[hiddenMethods.size()]);
3155118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu  }
3165118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu
3175118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu  // Gets the removed methods regardless of access levels
3185118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu  private static MethodInfo[] getRemovedMethods(MethodDoc[] methods) {
3195118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    if (methods == null) return null;
3205118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    ArrayList<MethodInfo> removedMethods = new ArrayList<MethodInfo>();
3215118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    for (MethodDoc method : methods) {
3225118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu      MethodInfo methodInfo = Converter.obtainMethod(method);
3235118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu      if (methodInfo.isRemoved()) {
3245118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu        removedMethods.add(methodInfo);
325920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
326920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
3275118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu
3285118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    return removedMethods.toArray(new MethodInfo[removedMethods.size()]);
329920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
330920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
331920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
3325118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu   * Converts FieldDoc[] into List<FieldInfo>. No filtering is done.
333920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
3345118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu  private static List<FieldInfo> convertAllFields(FieldDoc[] fields) {
3355118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    if (fields == null) return null;
3365118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    List<FieldInfo> allFields = new ArrayList<FieldInfo>();
3375118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu
3385118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    for (FieldDoc field : fields) {
3395118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu      FieldInfo fieldInfo = Converter.obtainField(field);
3405118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu      allFields.add(fieldInfo);
3415118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    }
3425118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu
3435118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    return allFields;
3445118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu  }
3455118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu
3465118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu  /**
3475118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu   * Converts ExecutableMemberDoc[] into List<MethodInfo>. No filtering is done.
3485118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu   */
3495118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu  private static List<MethodInfo> convertAllMethods(ExecutableMemberDoc[] methods) {
350920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (methods == null) return null;
3515118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    List<MethodInfo> allMethods = new ArrayList<MethodInfo>();
3525118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    for (ExecutableMemberDoc method : methods) {
3535118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu      MethodInfo methodInfo = Converter.obtainMethod(method);
3545118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu      allMethods.add(methodInfo);
355920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
3565118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    return allMethods;
357920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
358920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
3595118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu  /**
3605118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu   * Convert MethodDoc[] or ConstructorDoc[] into MethodInfo[].
3615118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu   * Also filters according to the -private, -public option,
3625118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu   * because the filtering doesn't seem to be working in the ClassDoc.constructors(boolean) call.
3635118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu   */
3645118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu  private static MethodInfo[] convertMethods(ExecutableMemberDoc[] methods) {
365920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (methods == null) return null;
3665118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    List<MethodInfo> filteredMethods = new ArrayList<MethodInfo>();
3675118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    for (ExecutableMemberDoc method : methods) {
3685118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu      MethodInfo methodInfo = Converter.obtainMethod(method);
3695118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu      if (methodInfo.checkLevel()) {
3705118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu        filteredMethods.add(methodInfo);
371920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
372920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
3735118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu
3745118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    return filteredMethods.toArray(new MethodInfo[filteredMethods.size()]);
375920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
376920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
377920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static MethodInfo[] convertNonWrittenConstructors(ConstructorDoc[] methods) {
378920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (methods == null) return null;
3795118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    ArrayList<MethodInfo> ctors = new ArrayList<MethodInfo>();
3805118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    for (ConstructorDoc method : methods) {
3815118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu      MethodInfo methodInfo = Converter.obtainMethod(method);
3825118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu      if (!methodInfo.checkLevel()) {
3835118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu        ctors.add(methodInfo);
384920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
385920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
386920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
3875118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu    return ctors.toArray(new MethodInfo[ctors.size()]);
388920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
389920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
3905118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu  private static <E extends ExecutableMemberDoc> MethodInfo obtainMethod(E o) {
391920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return (MethodInfo) mMethods.obtain(o);
392920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
393920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
394920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static Cache mMethods = new Cache() {
395920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
396920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected Object make(Object o) {
397920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (o instanceof AnnotationTypeElementDoc) {
398920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        AnnotationTypeElementDoc m = (AnnotationTypeElementDoc) o;
399920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        MethodInfo result =
400d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new MethodInfo(m.getRawCommentText(),
401d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    new ArrayList<TypeInfo>(Arrays.asList(
402d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                            Converter.convertTypes(m.typeParameters()))),
403d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    m.name(), m.signature(), Converter.obtainClass(m.containingClass()),
404d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    Converter.obtainClass(m.containingClass()), m.isPublic(), m.isProtected(), m
405d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    .isPackagePrivate(), m.isPrivate(), m.isFinal(), m.isStatic(), m.isSynthetic(),
406d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    m.isAbstract(), m.isSynchronized(), m.isNative(), true, "annotationElement",
407d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    m.flatSignature(), Converter.obtainMethod(m.overriddenMethod()),
408d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    Converter.obtainType(m.returnType()),
409d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    new ArrayList<ParameterInfo>(Arrays.asList(
410d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                            Converter.convertParameters(m.parameters(), m))),
411d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    new ArrayList<ClassInfo>(Arrays.asList(Converter.convertClasses(
412d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                            m.thrownExceptions()))), Converter.convertSourcePosition(m.position()),
413d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    new ArrayList<AnnotationInstanceInfo>(Arrays.asList(
414d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                            Converter.convertAnnotationInstances(m.annotations()))));
415920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.setVarargs(m.isVarArgs());
416920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.init(Converter.obtainAnnotationValue(m.defaultValue(), result));
417920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return result;
418920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (o instanceof MethodDoc) {
419920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        MethodDoc m = (MethodDoc) o;
420920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        MethodInfo result =
421d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new MethodInfo(m.getRawCommentText(),
422d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    new ArrayList<TypeInfo>(Arrays.asList(
423d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                            Converter.convertTypes(m.typeParameters()))), m.name(), m.signature(),
424d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    Converter.obtainClass(m.containingClass()),
425d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    Converter.obtainClass(m.containingClass()), m.isPublic(), m.isProtected(),
426d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    m.isPackagePrivate(), m.isPrivate(), m.isFinal(), m.isStatic(), m.isSynthetic(),
427d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    m.isAbstract(), m.isSynchronized(), m.isNative(), false, "method",
428d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    m.flatSignature(), Converter.obtainMethod(m.overriddenMethod()),
429d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    Converter.obtainType(m.returnType()),
430d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    new ArrayList<ParameterInfo>(Arrays.asList(
431d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                            Converter.convertParameters(m.parameters(), m))),
432d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    new ArrayList<ClassInfo>(Arrays.asList(
433d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                            Converter.convertClasses(m.thrownExceptions()))),
434d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    Converter.convertSourcePosition(m.position()),
435d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    new ArrayList<AnnotationInstanceInfo>(Arrays.asList(
436d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                            Converter.convertAnnotationInstances(m.annotations()))));
437920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.setVarargs(m.isVarArgs());
438920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.init(null);
439920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return result;
440920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
441920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        ConstructorDoc m = (ConstructorDoc) o;
442920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        MethodInfo result =
443d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            new MethodInfo(m.getRawCommentText(), new ArrayList<TypeInfo>(Arrays.asList(Converter.convertTypes(m.typeParameters()))), m
444920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                .name(), m.signature(), Converter.obtainClass(m.containingClass()), Converter
445920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                .obtainClass(m.containingClass()), m.isPublic(), m.isProtected(), m
446920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                .isPackagePrivate(), m.isPrivate(), m.isFinal(), m.isStatic(), m.isSynthetic(),
447920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                false, m.isSynchronized(), m.isNative(), false, "constructor", m.flatSignature(),
448d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                null, null, new ArrayList<ParameterInfo>(Arrays.asList(Converter.convertParameters(m.parameters(), m))),
449d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                new ArrayList<ClassInfo>(Arrays.asList(Converter.convertClasses(m.thrownExceptions()))), Converter.convertSourcePosition(m
450d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    .position()), new ArrayList<AnnotationInstanceInfo>(Arrays.asList(Converter.convertAnnotationInstances(m.annotations()))));
451920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.setVarargs(m.isVarArgs());
452920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.init(null);
453920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return result;
454920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
455920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
456920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  };
457920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
458920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
459920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static FieldInfo[] convertFields(FieldDoc[] fields) {
460920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (fields == null) return null;
461920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ArrayList<FieldInfo> out = new ArrayList<FieldInfo>();
462920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int N = fields.length;
463920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (int i = 0; i < N; i++) {
464920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      FieldInfo f = Converter.obtainField(fields[i]);
465920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (f.checkLevel()) {
466920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        out.add(f);
467920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
468920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
469920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return out.toArray(new FieldInfo[out.size()]);
470920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
471920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
472920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static FieldInfo obtainField(FieldDoc o) {
473920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return (FieldInfo) mFields.obtain(o);
474920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
475920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
476920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static FieldInfo obtainField(ConstructorDoc o) {
477920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return (FieldInfo) mFields.obtain(o);
478920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
479920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
480920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static Cache mFields = new Cache() {
481920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
482920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected Object make(Object o) {
483920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      FieldDoc f = (FieldDoc) o;
484920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return new FieldInfo(f.name(), Converter.obtainClass(f.containingClass()), Converter
485920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          .obtainClass(f.containingClass()), f.isPublic(), f.isProtected(), f.isPackagePrivate(), f
486920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          .isPrivate(), f.isFinal(), f.isStatic(), f.isTransient(), f.isVolatile(),
487920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          f.isSynthetic(), Converter.obtainType(f.type()), f.getRawCommentText(),
488d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          f.constantValue(), Converter.convertSourcePosition(f.position()),
489d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          new ArrayList<AnnotationInstanceInfo>(Arrays.asList(Converter
490d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein              .convertAnnotationInstances(f.annotations()))));
491920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
492920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  };
493920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
494920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static PackageInfo obtainPackage(PackageDoc o) {
495920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return (PackageInfo) mPackagees.obtain(o);
496920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
497920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
498920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static Cache mPackagees = new Cache() {
499920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
500920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected Object make(Object o) {
501920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      PackageDoc p = (PackageDoc) o;
502920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return new PackageInfo(p, p.name(), Converter.convertSourcePosition(p.position()));
503920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
504920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  };
505920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
506920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static TypeInfo obtainType(Type o) {
507920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return (TypeInfo) mTypes.obtain(o);
508920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
509920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
510920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static Cache mTypes = new Cache() {
511920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
512920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected Object make(Object o) {
513920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Type t = (Type) o;
514920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String simpleTypeName;
515920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (t instanceof ClassDoc) {
516920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        simpleTypeName = ((ClassDoc) t).name();
517920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
518920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        simpleTypeName = t.simpleTypeName();
519920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
520920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      TypeInfo ti =
521920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          new TypeInfo(t.isPrimitive(), t.dimension(), simpleTypeName, t.qualifiedTypeName(),
522920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              Converter.obtainClass(t.asClassDoc()));
523920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return ti;
524920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
525920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
526920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
527920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected void made(Object o, Object r) {
528920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Type t = (Type) o;
529920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      TypeInfo ti = (TypeInfo) r;
530920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (t.asParameterizedType() != null) {
531d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        ti.setTypeArguments(new ArrayList<TypeInfo>(Arrays.asList(Converter.convertTypes(t.asParameterizedType().typeArguments()))));
532920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (t instanceof ClassDoc) {
533d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        ti.setTypeArguments(new ArrayList<TypeInfo>(Arrays.asList(Converter.convertTypes(((ClassDoc) t).typeParameters()))));
534920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (t.asTypeVariable() != null) {
535d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        ti.setBounds(null, new ArrayList<TypeInfo>(Arrays.asList(Converter.convertTypes((t.asTypeVariable().bounds())))));
536920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        ti.setIsTypeVariable(true);
537920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (t.asWildcardType() != null) {
538920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        ti.setIsWildcard(true);
539d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        ti.setBounds(new ArrayList<TypeInfo>(Arrays.asList(Converter.convertTypes(t.asWildcardType().superBounds()))),
540d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                new ArrayList<TypeInfo>(Arrays.asList(Converter.convertTypes(t.asWildcardType().extendsBounds()))));
541920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
542920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
543920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
544920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
545920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected Object keyFor(Object o) {
546920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Type t = (Type) o;
547920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String keyString = o.getClass().getName() + "/" + o.toString() + "/";
548920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (t.asParameterizedType() != null) {
549920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        keyString += t.asParameterizedType().toString() + "/";
550920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (t.asParameterizedType().typeArguments() != null) {
551920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          for (Type ty : t.asParameterizedType().typeArguments()) {
552920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            keyString += ty.toString() + "/";
553920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          }
554920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
555920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
556920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        keyString += "NoParameterizedType//";
557920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
558920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (t.asTypeVariable() != null) {
559920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        keyString += t.asTypeVariable().toString() + "/";
560920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (t.asTypeVariable().bounds() != null) {
561920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          for (Type ty : t.asTypeVariable().bounds()) {
562920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            keyString += ty.toString() + "/";
563920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          }
564920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
565920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
566920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        keyString += "NoTypeVariable//";
567920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
568920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (t.asWildcardType() != null) {
569920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        keyString += t.asWildcardType().toString() + "/";
570920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (t.asWildcardType().superBounds() != null) {
571920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          for (Type ty : t.asWildcardType().superBounds()) {
572920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            keyString += ty.toString() + "/";
573920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          }
574920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
575920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (t.asWildcardType().extendsBounds() != null) {
576920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          for (Type ty : t.asWildcardType().extendsBounds()) {
577920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            keyString += ty.toString() + "/";
578920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          }
579920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
580920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
581920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        keyString += "NoWildCardType//";
582920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
583920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
584920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return keyString;
585920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
586920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  };
5875118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu
588920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static TypeInfo obtainTypeFromString(String type) {
589920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return (TypeInfo) mTypesFromString.obtain(type);
590920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
5915118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu
592920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final Cache mTypesFromString = new Cache() {
593920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
594920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected Object make(Object o) {
595920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String name = (String) o;
596920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return new TypeInfo(name);
597920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
598920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
599920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
600920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected void made(Object o, Object r) {
6015118ffe3bf77ec4efa070f36a7a62fd5d1bf16bfHui Shu
602920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
603920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
604920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
605920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected Object keyFor(Object o) {
606920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return o;
607920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
608920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  };
609920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
610920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static MemberInfo obtainMember(MemberDoc o) {
611920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return (MemberInfo) mMembers.obtain(o);
612920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
613920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
614920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static Cache mMembers = new Cache() {
615920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
616920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected Object make(Object o) {
617920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (o instanceof MethodDoc) {
618920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return Converter.obtainMethod((MethodDoc) o);
619920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (o instanceof ConstructorDoc) {
620920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return Converter.obtainMethod((ConstructorDoc) o);
621920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (o instanceof FieldDoc) {
622920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return Converter.obtainField((FieldDoc) o);
623920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
624920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return null;
625920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
626920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
627920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  };
628920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
629920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static AnnotationInstanceInfo[] convertAnnotationInstances(AnnotationDesc[] orig) {
630920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int len = orig.length;
631920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    AnnotationInstanceInfo[] out = new AnnotationInstanceInfo[len];
632920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (int i = 0; i < len; i++) {
633920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      out[i] = Converter.obtainAnnotationInstance(orig[i]);
634920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
635920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return out;
636920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
637920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
638920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
639920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static AnnotationInstanceInfo obtainAnnotationInstance(AnnotationDesc o) {
640920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return (AnnotationInstanceInfo) mAnnotationInstances.obtain(o);
641920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
642920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
643920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static Cache mAnnotationInstances = new Cache() {
644920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    @Override
645920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected Object make(Object o) {
646920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      AnnotationDesc a = (AnnotationDesc) o;
647920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassInfo annotationType = Converter.obtainClass(a.annotationType());
648920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      AnnotationDesc.ElementValuePair[] ev = a.elementValues();
649920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      AnnotationValueInfo[] elementValues = new AnnotationValueInfo[ev.length];
650920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (int i = 0; i < ev.length; i++) {
651920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        elementValues[i] =
652920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            obtainAnnotationValue(ev[i].value(), Converter.obtainMethod(ev[i].element()));
653920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
654920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return new AnnotationInstanceInfo(annotationType, elementValues);
655920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
656920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  };
657920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
658920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
659920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private abstract static class Cache {
660920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    void put(Object key, Object value) {
661920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      mCache.put(key, value);
662920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
663920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
664920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Object obtain(Object o) {
665920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (o == null) {
666920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return null;
667920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
668920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Object k = keyFor(o);
669920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Object r = mCache.get(k);
670920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (r == null) {
671920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        r = make(o);
672920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        mCache.put(k, r);
673920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        made(o, r);
674920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
675920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return r;
676920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
677920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
678920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected HashMap<Object, Object> mCache = new HashMap<Object, Object>();
679920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
680920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected abstract Object make(Object o);
681920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
682920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected void made(Object o, Object r) {}
683920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
684920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    protected Object keyFor(Object o) {
685920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return o;
686920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
687920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
688920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Object[] all() {
689920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return null;
690920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
691920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
692920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
693920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  // annotation values
694920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static HashMap<AnnotationValue, AnnotationValueInfo> mAnnotationValues =
695920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      new HashMap<AnnotationValue, AnnotationValueInfo>();
696920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static HashSet<AnnotationValue> mAnnotationValuesNeedingInit =
697920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      new HashSet<AnnotationValue>();
698920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
699920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static AnnotationValueInfo obtainAnnotationValue(AnnotationValue o, MethodInfo element) {
700920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (o == null) {
701920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return null;
702920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
703920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    AnnotationValueInfo v = mAnnotationValues.get(o);
704920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (v != null) return v;
705920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    v = new AnnotationValueInfo(element);
706920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mAnnotationValues.put(o, v);
707920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (mAnnotationValuesNeedingInit != null) {
708920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      mAnnotationValuesNeedingInit.add(o);
709920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else {
710920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      initAnnotationValue(o, v);
711920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
712920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return v;
713920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
714920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
715920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static void initAnnotationValue(AnnotationValue o, AnnotationValueInfo v) {
716920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Object orig = o.value();
717920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Object converted;
718920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (orig instanceof Type) {
719920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // class literal
720920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      converted = Converter.obtainType((Type) orig);
721920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (orig instanceof FieldDoc) {
722920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // enum constant
723920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      converted = Converter.obtainField((FieldDoc) orig);
724920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (orig instanceof AnnotationDesc) {
725920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // annotation instance
726920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      converted = Converter.obtainAnnotationInstance((AnnotationDesc) orig);
727920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (orig instanceof AnnotationValue[]) {
728920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      AnnotationValue[] old = (AnnotationValue[]) orig;
729d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      ArrayList<AnnotationValueInfo> values = new ArrayList<AnnotationValueInfo>();
730d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      for (int i = 0; i < old.length; i++) {
731d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        values.add(Converter.obtainAnnotationValue(old[i], null));
732920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
733d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      converted = values;
734920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else {
735920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      converted = orig;
736920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
737920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    v.init(converted);
738920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
739920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
740920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static void finishAnnotationValueInit() {
741920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int depth = 0;
742920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    while (mAnnotationValuesNeedingInit.size() > 0) {
743920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      HashSet<AnnotationValue> set = mAnnotationValuesNeedingInit;
744920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      mAnnotationValuesNeedingInit = new HashSet<AnnotationValue>();
745920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (AnnotationValue o : set) {
746920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        AnnotationValueInfo v = mAnnotationValues.get(o);
747920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        initAnnotationValue(o, v);
748920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
749920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      depth++;
750920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
751920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mAnnotationValuesNeedingInit = null;
752920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
753920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson}
754