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