1920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/* 2920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Copyright (C) 2010 Google Inc. 3920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 4920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Licensed under the Apache License, Version 2.0 (the "License"); 5920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * you may not use this file except in compliance with the License. 6920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * You may obtain a copy of the License at 7920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 8920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * http://www.apache.org/licenses/LICENSE-2.0 9920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 10920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Unless required by applicable law or agreed to in writing, software 11920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * distributed under the License is distributed on an "AS IS" BASIS, 12920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * See the License for the specific language governing permissions and 14920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * limitations under the License. 15920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 16920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 17920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpackage com.google.doclava; 18920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 19920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.clearsilver.jsilver.data.Data; 20920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.doclava.apicheck.AbstractMethodInfo; 2111b179627c411772f1eac023d915ab8532e55211Mathieuimport com.google.doclava.apicheck.ApiInfo; 22920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.*; 24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 256ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinpublic class MethodInfo extends MemberInfo implements AbstractMethodInfo, Resolvable { 26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static final Comparator<MethodInfo> comparator = new Comparator<MethodInfo>() { 27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public int compare(MethodInfo a, MethodInfo b) { 28d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return a.name().compareTo(b.name()); 29920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 30920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson }; 31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private class InlineTags implements InheritedTags { 33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public TagInfo[] tags() { 34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return comment().tags(); 35920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 37920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public InheritedTags inherited() { 38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson MethodInfo m = findOverriddenMethod(name(), signature()); 39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m != null) { 40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return m.inlineTags(); 41920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 42920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 43920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 44920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 45920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 46920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 47d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private static void addInterfaces(ArrayList<ClassInfo> ifaces, ArrayList<ClassInfo> queue) { 48920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo i : ifaces) { 49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson queue.add(i); 50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo i : ifaces) { 52920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson addInterfaces(i.interfaces(), queue); 53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 54920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 55920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 56920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // first looks for a superclass, and then does a breadth first search to 57920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // find the least far away match 58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public MethodInfo findOverriddenMethod(String name, String signature) { 59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mReturnType == null) { 60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // ctor 61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 62920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 63920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mOverriddenMethod != null) { 64920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mOverriddenMethod; 65920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 66920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 67920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ArrayList<ClassInfo> queue = new ArrayList<ClassInfo>(); 68920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson addInterfaces(containingClass().interfaces(), queue); 69920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo iface : queue) { 70920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo me : iface.methods()) { 71920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (me.name().equals(name) && me.signature().equals(signature) 72920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson && me.inlineTags().tags() != null && me.inlineTags().tags().length > 0) { 73920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return me; 74920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 76920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 79920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 80d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private static void addRealInterfaces(ArrayList<ClassInfo> ifaces, ArrayList<ClassInfo> queue) { 81920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo i : ifaces) { 82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson queue.add(i); 83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (i.realSuperclass() != null && i.realSuperclass().isAbstract()) { 84920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson queue.add(i.superclass()); 85920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 86920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 87920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo i : ifaces) { 88920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson addInterfaces(i.realInterfaces(), queue); 89920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 90920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 91920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 92920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public MethodInfo findRealOverriddenMethod(String name, String signature, HashSet notStrippable) { 93920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mReturnType == null) { 94920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // ctor 95920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 96920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 97920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mOverriddenMethod != null) { 98920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mOverriddenMethod; 99920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 100920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 101920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ArrayList<ClassInfo> queue = new ArrayList<ClassInfo>(); 102920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (containingClass().realSuperclass() != null 103920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson && containingClass().realSuperclass().isAbstract()) { 104920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson queue.add(containingClass()); 105920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 106920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson addInterfaces(containingClass().realInterfaces(), queue); 107920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo iface : queue) { 108920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo me : iface.methods()) { 109920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (me.name().equals(name) && me.signature().equals(signature) 110920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson && me.inlineTags().tags() != null && me.inlineTags().tags().length > 0 111920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson && notStrippable.contains(me.containingClass())) { 112920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return me; 113920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 114920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 115920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 116920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 117920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 118920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 119920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public MethodInfo findSuperclassImplementation(HashSet notStrippable) { 120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mReturnType == null) { 121920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // ctor 122920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 123920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 124920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mOverriddenMethod != null) { 125920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Even if we're told outright that this was the overridden method, we want to 126920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // be conservative and ignore mismatches of parameter types -- they arise from 127920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // extending generic specializations, and we want to consider the derived-class 128920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // method to be a non-override. 129920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (this.signature().equals(mOverriddenMethod.signature())) { 130920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mOverriddenMethod; 131920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 132920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 133920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 134920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ArrayList<ClassInfo> queue = new ArrayList<ClassInfo>(); 135920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (containingClass().realSuperclass() != null 136920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson && containingClass().realSuperclass().isAbstract()) { 137920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson queue.add(containingClass()); 138920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 139920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson addInterfaces(containingClass().realInterfaces(), queue); 140920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo iface : queue) { 141920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo me : iface.methods()) { 142920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (me.name().equals(this.name()) && me.signature().equals(this.signature()) 143920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson && notStrippable.contains(me.containingClass())) { 144920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return me; 145920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 146920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 147920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 148920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 149920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 150920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 151920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public ClassInfo findRealOverriddenClass(String name, String signature) { 152920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mReturnType == null) { 153920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // ctor 154920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 155920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 156920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mOverriddenMethod != null) { 157920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mOverriddenMethod.mRealContainingClass; 158920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 159920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 160920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ArrayList<ClassInfo> queue = new ArrayList<ClassInfo>(); 161920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (containingClass().realSuperclass() != null 162920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson && containingClass().realSuperclass().isAbstract()) { 163920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson queue.add(containingClass()); 164920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 165920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson addInterfaces(containingClass().realInterfaces(), queue); 166920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo iface : queue) { 167920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (MethodInfo me : iface.methods()) { 168920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (me.name().equals(name) && me.signature().equals(signature) 169920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson && me.inlineTags().tags() != null && me.inlineTags().tags().length > 0) { 170920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return iface; 171920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 172920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 173920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 174920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 175920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 176920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 177920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private class FirstSentenceTags implements InheritedTags { 178920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public TagInfo[] tags() { 179920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return comment().briefTags(); 180920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 181920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 182920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public InheritedTags inherited() { 183920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson MethodInfo m = findOverriddenMethod(name(), signature()); 184920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m != null) { 185920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return m.firstSentenceTags(); 186920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 187920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 188920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 189920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 190920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 191920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 192920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private class ReturnTags implements InheritedTags { 193920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public TagInfo[] tags() { 194920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return comment().returnTags(); 195920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 196920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 197920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public InheritedTags inherited() { 198920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson MethodInfo m = findOverriddenMethod(name(), signature()); 199920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (m != null) { 200920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return m.returnTags(); 201920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 202920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 203920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 204920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 205920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 206920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 207920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isDeprecated() { 208920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean deprecated = false; 209920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!mDeprecatedKnown) { 210920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean commentDeprecated = comment().isDeprecated(); 211920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean annotationDeprecated = false; 212920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (AnnotationInstanceInfo annotation : annotations()) { 213920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (annotation.type().qualifiedName().equals("java.lang.Deprecated")) { 214920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson annotationDeprecated = true; 215920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson break; 216920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 217920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 218920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 219920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (commentDeprecated != annotationDeprecated) { 220920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.DEPRECATION_MISMATCH, position(), "Method " 221920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + mContainingClass.qualifiedName() + "." + name() 222920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + ": @Deprecated annotation and @deprecated doc tag do not match"); 223920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 224920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 225920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsDeprecated = commentDeprecated | annotationDeprecated; 226920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mDeprecatedKnown = true; 227920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 228920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsDeprecated; 229920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 230920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 231920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void setDeprecated(boolean deprecated) { 232920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mDeprecatedKnown = true; 233920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsDeprecated = deprecated; 234920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 235920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 236d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<TypeInfo> getTypeParameters() { 237920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mTypeParameters; 238920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 239920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 240920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public MethodInfo cloneForClass(ClassInfo newContainingClass) { 241920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson MethodInfo result = 242920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson new MethodInfo(getRawCommentText(), mTypeParameters, name(), signature(), 243920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson newContainingClass, realContainingClass(), isPublic(), isProtected(), 244920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson isPackagePrivate(), isPrivate(), isFinal(), isStatic(), isSynthetic(), mIsAbstract, 245920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsSynchronized, mIsNative, mIsAnnotationElement, kind(), mFlatSignature, 246920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mOverriddenMethod, mReturnType, mParameters, mThrownExceptions, position(), 247920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson annotations()); 248920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson result.init(mDefaultAnnotationElementValue); 249920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return result; 250920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 251920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 252d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public MethodInfo(String rawCommentText, ArrayList<TypeInfo> typeParameters, String name, 253920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String signature, ClassInfo containingClass, ClassInfo realContainingClass, boolean isPublic, 254920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean isProtected, boolean isPackagePrivate, boolean isPrivate, boolean isFinal, 255920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean isStatic, boolean isSynthetic, boolean isAbstract, boolean isSynchronized, 256920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean isNative, boolean isAnnotationElement, String kind, String flatSignature, 257d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein MethodInfo overriddenMethod, TypeInfo returnType, ArrayList<ParameterInfo> parameters, 258d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<ClassInfo> thrownExceptions, SourcePositionInfo position, 259d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<AnnotationInstanceInfo> annotations) { 260920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Explicitly coerce 'final' state of Java6-compiled enum values() method, to match 261920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // the Java5-emitted base API description. 262920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson super(rawCommentText, name, signature, containingClass, realContainingClass, isPublic, 263040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato isProtected, isPackagePrivate, isPrivate, 264040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato ((name.equals("values") && containingClass.isEnum()) ? true : isFinal), 265040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato isStatic, isSynthetic, kind, position, annotations); 266920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 267920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // The underlying MethodDoc for an interface's declared methods winds up being marked 268920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // non-abstract. Correct that here by looking at the immediate-parent class, and marking 269920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // this method abstract if it is an unimplemented interface method. 270920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (containingClass.isInterface()) { 271920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson isAbstract = true; 272920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 273920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 274920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mReasonOpened = "0:0"; 275920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsAnnotationElement = isAnnotationElement; 276920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mTypeParameters = typeParameters; 277920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsAbstract = isAbstract; 278920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsSynchronized = isSynchronized; 279920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsNative = isNative; 280920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mFlatSignature = flatSignature; 281920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mOverriddenMethod = overriddenMethod; 282920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mReturnType = returnType; 283920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mParameters = parameters; 284920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mThrownExceptions = thrownExceptions; 285920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 286920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 287920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void init(AnnotationValueInfo defaultAnnotationElementValue) { 288920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mDefaultAnnotationElementValue = defaultAnnotationElementValue; 289920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 290920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 291920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isAbstract() { 292920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsAbstract; 293920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 294920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 295920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isSynchronized() { 296920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsSynchronized; 297920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 298920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 299920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isNative() { 300920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsNative; 301920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 302920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 303920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String flatSignature() { 304920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mFlatSignature; 305920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 306920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 307920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public InheritedTags inlineTags() { 308920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return new InlineTags(); 309920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 310920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 311920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public InheritedTags firstSentenceTags() { 312920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return new FirstSentenceTags(); 313920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 314920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 315920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public InheritedTags returnTags() { 316920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return new ReturnTags(); 317920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 318920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 319920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public TypeInfo returnType() { 320920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mReturnType; 321920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 322920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 323920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String prettySignature() { 324920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return name() + prettyParameters(); 325920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 326920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 327920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /** 328920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Returns a printable version of the parameters of this method's signature. 329920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 330920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String prettyParameters() { 331920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson StringBuilder params = new StringBuilder("("); 332920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ParameterInfo pInfo : mParameters) { 333920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (params.length() > 1) { 334920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson params.append(","); 335920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 336920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson params.append(pInfo.type().simpleTypeName()); 337920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 338920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 339920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson params.append(")"); 340920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return params.toString(); 341920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 342920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 343920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /** 344920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Returns a name consistent with the {@link com.google.doclava.MethodInfo#getHashableName()}. 345920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 346920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String getHashableName() { 347920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson StringBuilder result = new StringBuilder(); 348920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson result.append(name()); 349d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 350d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (mParameters == null) { 351d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return result.toString(); 352d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 353d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 354d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein int i = 0; 355d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (ParameterInfo param : mParameters) { 356920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson result.append(":"); 357d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (i == (mParameters.size()-1) && isVarArgs()) { 358920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // TODO: note that this does not attempt to handle hypothetical 359920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // vararg methods whose last parameter is a list of arrays, e.g. 360920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // "Object[]...". 361d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein result.append(param.type().fullNameNoDimension(typeVariables())).append("..."); 362920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 363d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein result.append(param.type().fullName(typeVariables())); 364920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 365d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein i++; 366920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 367920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return result.toString(); 368920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 369920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 370920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean inList(ClassInfo item, ThrowsTagInfo[] list) { 371920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int len = list.length; 372920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String qn = item.qualifiedName(); 373920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (int i = 0; i < len; i++) { 374920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo ex = list[i].exception(); 375920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (ex != null && ex.qualifiedName().equals(qn)) { 376920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 377920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 378920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 379920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 380920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 381920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 382920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public ThrowsTagInfo[] throwsTags() { 383920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mThrowsTags == null) { 384920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ThrowsTagInfo[] documented = comment().throwsTags(); 385920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ArrayList<ThrowsTagInfo> rv = new ArrayList<ThrowsTagInfo>(); 386920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 387920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int len = documented.length; 388920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (int i = 0; i < len; i++) { 389920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson rv.add(documented[i]); 390920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 391920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 392d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (ClassInfo cl : mThrownExceptions) { 393920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (documented == null || !inList(cl, documented)) { 394920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson rv.add(new ThrowsTagInfo("@throws", "@throws", cl.qualifiedName(), cl, "", 395920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson containingClass(), position())); 396920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 397920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 398920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mThrowsTags = rv.toArray(new ThrowsTagInfo[rv.size()]); 399920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 400920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mThrowsTags; 401920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 402920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 403920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private static int indexOfParam(String name, String[] list) { 404920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson final int N = list.length; 405920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (int i = 0; i < N; i++) { 406920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (name.equals(list[i])) { 407920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return i; 408920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 409920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 410920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return -1; 411920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 412920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 413920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public ParamTagInfo[] paramTags() { 414920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mParamTags == null) { 415d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein final int N = mParameters.size(); 416920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 417920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String[] names = new String[N]; 418920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String[] comments = new String[N]; 419920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson SourcePositionInfo[] positions = new SourcePositionInfo[N]; 420920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 421920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // get the right names so we can handle our names being different from 422920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // our parent's names. 423d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein int i = 0; 424d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (ParameterInfo param : mParameters) { 425d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein names[i] = param.name(); 426920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson comments[i] = ""; 427d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein positions[i] = param.position(); 428d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein i++; 429920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 430920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 431920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // gather our comments, and complain about misnamed @param tags 432920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ParamTagInfo tag : comment().paramTags()) { 433920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int index = indexOfParam(tag.parameterName(), names); 434920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (index >= 0) { 435920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson comments[index] = tag.parameterComment(); 436920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson positions[index] = tag.position(); 437920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 438920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.UNKNOWN_PARAM_TAG_NAME, tag.position(), 439920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson "@param tag with name that doesn't match the parameter list: '" + tag.parameterName() 440920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + "'"); 441920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 442920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 443920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 444920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // get our parent's tags to fill in the blanks 445920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson MethodInfo overridden = this.findOverriddenMethod(name(), signature()); 446920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (overridden != null) { 447920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ParamTagInfo[] maternal = overridden.paramTags(); 448d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (i = 0; i < N; i++) { 449920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (comments[i].equals("")) { 450920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson comments[i] = maternal[i].parameterComment(); 451920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson positions[i] = maternal[i].position(); 452920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 453920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 454920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 455920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 456920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // construct the results, and cache them for next time 457920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mParamTags = new ParamTagInfo[N]; 458d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (i = 0; i < N; i++) { 459920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mParamTags[i] = 460920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson new ParamTagInfo("@param", "@param", names[i] + " " + comments[i], parent(), 461920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson positions[i]); 462920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 463920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // while we're here, if we find any parameters that are still undocumented at this 464920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // point, complain. (this warning is off by default, because it's really, really 465920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // common; but, it's good to be able to enforce it) 466920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (comments[i].equals("")) { 467920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.UNDOCUMENTED_PARAMETER, positions[i], "Undocumented parameter '" 468920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + names[i] + "' on method '" + name() + "'"); 469920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 470920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 471920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 472920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mParamTags; 473920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 474920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 475920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public SeeTagInfo[] seeTags() { 476920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson SeeTagInfo[] result = comment().seeTags(); 477920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (result == null) { 478920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mOverriddenMethod != null) { 479920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson result = mOverriddenMethod.seeTags(); 480920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 481920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 482920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return result; 483920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 484920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 485920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public TagInfo[] deprecatedTags() { 486920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TagInfo[] result = comment().deprecatedTags(); 487920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (result.length == 0) { 488920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (comment().undeprecateTags().length == 0) { 489920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mOverriddenMethod != null) { 490920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson result = mOverriddenMethod.deprecatedTags(); 491920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 492920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 493920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 494920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return result; 495920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 496920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 497d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<ParameterInfo> parameters() { 498920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mParameters; 499920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 500920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 501920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 502920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean matchesParams(String[] params, String[] dimensions, boolean varargs) { 503920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mParamStrings == null) { 504d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (mParameters.size() != params.length) { 505920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 506920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 507d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein int i = 0; 508d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (ParameterInfo mine : mParameters) { 509d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!mine.matchesDimension(dimensions[i], varargs)) { 510920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 511920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 512d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein TypeInfo myType = mine.type(); 513920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String qualifiedName = myType.qualifiedTypeName(); 514920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String realType = myType.isPrimitive() ? "" : myType.asClassInfo().qualifiedName(); 515920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String s = params[i]; 516920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int slen = s.length(); 517920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int qnlen = qualifiedName.length(); 518920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 519920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Check for a matching generic name or best known type 520920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!matchesType(qualifiedName, s) && !matchesType(realType, s)) { 521920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 522920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 523d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein i++; 524920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 525920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 526920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 527920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 528920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 529920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /** 530920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Checks to see if a parameter from a method signature is 531920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * compatible with a parameter given in a {@code @link} tag. 532920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 533920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean matchesType(String signatureParam, String callerParam) { 534920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int signatureLength = signatureParam.length(); 535920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int callerLength = callerParam.length(); 536920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return ((signatureParam.equals(callerParam) || ((callerLength + 1) < signatureLength 537920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson && signatureParam.charAt(signatureLength - callerLength - 1) == '.' 538920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson && signatureParam.endsWith(callerParam)))); 539920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 540920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 541920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void makeHDF(Data data, String base) { 542920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".kind", kind()); 543920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".name", name()); 544920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".href", htmlPage()); 545920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".anchor", anchor()); 546920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 547920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mReturnType != null) { 548920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson returnType().makeHDF(data, base + ".returnType", false, typeVariables()); 549920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".abstract", mIsAbstract ? "abstract" : ""); 550920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 551920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 552920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".synchronized", mIsSynchronized ? "synchronized" : ""); 553920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".final", isFinal() ? "final" : ""); 554920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".static", isStatic() ? "static" : ""); 555920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 556920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TagInfo.makeHDF(data, base + ".shortDescr", firstSentenceTags()); 557920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TagInfo.makeHDF(data, base + ".descr", inlineTags()); 558920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TagInfo.makeHDF(data, base + ".deprecated", deprecatedTags()); 559920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TagInfo.makeHDF(data, base + ".seeAlso", seeTags()); 560920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".since", getSince()); 56140ad14799644f497483efe6d1350c856d46bc4daScott Main if (isDeprecated()) { 56240ad14799644f497483efe6d1350c856d46bc4daScott Main data.setValue(base + ".deprecatedsince", getDeprecatedSince()); 56340ad14799644f497483efe6d1350c856d46bc4daScott Main } 564920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ParamTagInfo.makeHDF(data, base + ".paramTags", paramTags()); 565920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson AttrTagInfo.makeReferenceHDF(data, base + ".attrRefs", comment().attrTags()); 566920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ThrowsTagInfo.makeHDF(data, base + ".throws", throwsTags()); 567d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ParameterInfo.makeHDF(data, base + ".params", mParameters.toArray(new ParameterInfo[mParameters.size()]), isVarArgs(), typeVariables()); 568920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (isProtected()) { 569920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".scope", "protected"); 570920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else if (isPublic()) { 571920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson data.setValue(base + ".scope", "public"); 572920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 573920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TagInfo.makeHDF(data, base + ".returns", returnTags()); 574920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 575920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mTypeParameters != null) { 576920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TypeInfo.makeHDF(data, base + ".generic.typeArguments", mTypeParameters, false); 577920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 578b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson 579b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson AnnotationInstanceInfo.makeLinkListHDF( 580b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson data, 581b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson base + ".showAnnotations", 582b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson showAnnotations().toArray(new AnnotationInstanceInfo[showAnnotations().size()])); 583b84c41b0cd0531aa83f51a791d7457b4819bee7aJeff Arneson 584920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson setFederatedReferences(data, base); 585920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 586920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 587920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public HashSet<String> typeVariables() { 588920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson HashSet<String> result = TypeInfo.typeVariables(mTypeParameters); 589920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo cl = containingClass(); 590920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson while (cl != null) { 591d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<TypeInfo> types = cl.asTypeInfo().typeArguments(); 592920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (types != null) { 593920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson TypeInfo.typeVariables(types, result); 594920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 595920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson cl = cl.containingClass(); 596920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 597920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return result; 598920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 599920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 600920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson @Override 601920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isExecutable() { 602920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 603920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 604920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 605d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public ArrayList<ClassInfo> thrownExceptions() { 606920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mThrownExceptions; 607920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 608920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 609920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String typeArgumentsName(HashSet<String> typeVars) { 610d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (mTypeParameters == null || mTypeParameters.isEmpty()) { 611920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return ""; 612920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 613920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return TypeInfo.typeArgumentsName(mTypeParameters, typeVars); 614920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 615920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 616920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 617920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isAnnotationElement() { 618920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsAnnotationElement; 619920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 620920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 621920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public AnnotationValueInfo defaultAnnotationElementValue() { 622920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mDefaultAnnotationElementValue; 623920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 624920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 625920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void setVarargs(boolean set) { 626920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mIsVarargs = set; 627920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 628920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 629920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isVarArgs() { 630920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mIsVarargs; 631920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 632920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 633722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown public boolean isEffectivelyFinal() { 634722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown if (mIsFinal) { 635722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown return true; 636722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown } 637722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown ClassInfo containingClass = containingClass(); 638722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown if (containingClass != null && containingClass.isEffectivelyFinal()) { 639722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown return true; 640722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown } 641722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown return false; 64243d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown } 64343d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown 644920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson @Override 645920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String toString() { 646920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return this.name(); 647920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 648920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 649920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void setReason(String reason) { 650920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mReasonOpened = reason; 651920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 652920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 653920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String getReason() { 654920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mReasonOpened; 655920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 656920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 657920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void addException(String exec) { 658920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo exceptionClass = new ClassInfo(exec); 659d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 660d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mThrownExceptions.add(exceptionClass); 661920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 662920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 663920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public void addParameter(ParameterInfo p) { 664920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // Name information 665920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mParameters == null) { 666d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mParameters = new ArrayList<ParameterInfo>(); 667920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 668d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 669d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mParameters.add(p); 670920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 671920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 672920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private String mFlatSignature; 673920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private MethodInfo mOverriddenMethod; 674920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private TypeInfo mReturnType; 675920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsAnnotationElement; 676920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsAbstract; 677920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsSynchronized; 678920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsNative; 679920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsVarargs; 680920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mDeprecatedKnown; 681920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private boolean mIsDeprecated; 682d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<ParameterInfo> mParameters; 683d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<ClassInfo> mThrownExceptions; 684920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private String[] mParamStrings; 685d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ThrowsTagInfo[] mThrowsTags; 686920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private ParamTagInfo[] mParamTags; 687d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<TypeInfo> mTypeParameters; 688920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private AnnotationValueInfo mDefaultAnnotationElementValue; 689920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private String mReasonOpened; 6906ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein private ArrayList<Resolution> mResolutions; 691920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 692920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // TODO: merge with droiddoc version (above) 693920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String qualifiedName() { 694920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson String parentQName = (containingClass() != null) 695920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ? (containingClass().qualifiedName() + ".") : ""; 696920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return parentQName + name(); 697920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 698920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 699920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson @Override 700920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String signature() { 701920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mSignature == null) { 702920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson StringBuilder params = new StringBuilder("("); 703920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ParameterInfo pInfo : mParameters) { 704920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (params.length() > 1) { 705920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson params.append(", "); 706920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 707920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson params.append(pInfo.type().fullName()); 708920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 709920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 710920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson params.append(")"); 711920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mSignature = params.toString(); 712920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 713920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mSignature; 714920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 715920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 716920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean matches(MethodInfo other) { 717beef1457a4e56e88001bc68bd0d4742baf2adf18Ben Dodson return prettySignature().equals(other.prettySignature()); 718920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 719920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 720920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean throwsException(ClassInfo exception) { 721920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo e : mThrownExceptions) { 722920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (e.qualifiedName().equals(exception.qualifiedName())) { 723920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return true; 724920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 725920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 726920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return false; 727920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 72811b179627c411772f1eac023d915ab8532e55211Mathieu 729920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public boolean isConsistent(MethodInfo mInfo) { 730920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson boolean consistent = true; 731040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato if (this.mReturnType != mInfo.mReturnType && !this.mReturnType.equals(mInfo.mReturnType)) { 73211b179627c411772f1eac023d915ab8532e55211Mathieu if (!mReturnType.isPrimitive() && !mInfo.mReturnType.isPrimitive()) { 73311b179627c411772f1eac023d915ab8532e55211Mathieu // Check to see if our class extends the old class. 73411b179627c411772f1eac023d915ab8532e55211Mathieu ApiInfo infoApi = mInfo.containingClass().containingPackage().containingApi(); 73511b179627c411772f1eac023d915ab8532e55211Mathieu ClassInfo infoReturnClass = infoApi.findClass(mInfo.mReturnType.qualifiedTypeName()); 73611b179627c411772f1eac023d915ab8532e55211Mathieu // Find the classes. 73711b179627c411772f1eac023d915ab8532e55211Mathieu consistent = infoReturnClass != null && 73811b179627c411772f1eac023d915ab8532e55211Mathieu infoReturnClass.isAssignableTo(mReturnType.qualifiedTypeName()); 73911b179627c411772f1eac023d915ab8532e55211Mathieu } else { 74011b179627c411772f1eac023d915ab8532e55211Mathieu consistent = false; 74111b179627c411772f1eac023d915ab8532e55211Mathieu } 74211b179627c411772f1eac023d915ab8532e55211Mathieu 74311b179627c411772f1eac023d915ab8532e55211Mathieu if (!consistent) { 74411b179627c411772f1eac023d915ab8532e55211Mathieu Errors.error(Errors.CHANGED_TYPE, mInfo.position(), "Method " + mInfo.qualifiedName() 74511b179627c411772f1eac023d915ab8532e55211Mathieu + " has changed return type from " + mReturnType + " to " + mInfo.mReturnType); 74611b179627c411772f1eac023d915ab8532e55211Mathieu } 747920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 748920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 749920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mIsAbstract != mInfo.mIsAbstract) { 750920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 751920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_ABSTRACT, mInfo.position(), "Method " + mInfo.qualifiedName() 752920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " has changed 'abstract' qualifier"); 753920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 754920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 755920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mIsNative != mInfo.mIsNative) { 756920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 757920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_NATIVE, mInfo.position(), "Method " + mInfo.qualifiedName() 758920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " has changed 'native' qualifier"); 759920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 760920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 76143d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown if (!mIsStatic) { 76243d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown // Compiler-generated methods vary in their 'final' qualifier between versions of 763920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // the compiler, so this check needs to be quite narrow. A change in 'final' 764920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // status of a method is only relevant if (a) the method is not declared 'static' 76543d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown // and (b) the method is not already inferred to be 'final' by virtue of its class. 766722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown if (!isEffectivelyFinal() && mInfo.isEffectivelyFinal()) { 76743d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown consistent = false; 76843d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown Errors.error(Errors.ADDED_FINAL, mInfo.position(), "Method " + mInfo.qualifiedName() 76943d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown + " has added 'final' qualifier"); 770722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown } else if (isEffectivelyFinal() && !mInfo.isEffectivelyFinal()) { 77143d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown consistent = false; 77243d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown Errors.error(Errors.REMOVED_FINAL, mInfo.position(), "Method " + mInfo.qualifiedName() 77343d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown + " has removed 'final' qualifier"); 774920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 775920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 776920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 777920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mIsStatic != mInfo.mIsStatic) { 778920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 779920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_STATIC, mInfo.position(), "Method " + mInfo.qualifiedName() 780920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " has changed 'static' qualifier"); 781920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 782920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 783920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!scope().equals(mInfo.scope())) { 784920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 785920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_SCOPE, mInfo.position(), "Method " + mInfo.qualifiedName() 786920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " changed scope from " + scope() + " to " + mInfo.scope()); 787920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 788920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 789920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!isDeprecated() == mInfo.isDeprecated()) { 790920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_DEPRECATED, mInfo.position(), "Method " + mInfo.qualifiedName() 791040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato + " has changed deprecation state " + isDeprecated() + " --> " + mInfo.isDeprecated()); 792920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 793920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 794920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 795cd020c30a870477480261fbb1463afae4cddd42eGlenn Kasten // see JLS 3 13.4.20 "Adding or deleting a synchronized modifier of a method does not break " 796cd020c30a870477480261fbb1463afae4cddd42eGlenn Kasten // "compatibility with existing binaries." 797cd020c30a870477480261fbb1463afae4cddd42eGlenn Kasten /* 798920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (mIsSynchronized != mInfo.mIsSynchronized) { 799920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_SYNCHRONIZED, mInfo.position(), "Method " + mInfo.qualifiedName() 800920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " has changed 'synchronized' qualifier from " + mIsSynchronized + " to " 801920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + mInfo.mIsSynchronized); 802920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 803920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 804cd020c30a870477480261fbb1463afae4cddd42eGlenn Kasten */ 805920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 806920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo exception : thrownExceptions()) { 807920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!mInfo.throwsException(exception)) { 808920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // exclude 'throws' changes to finalize() overrides with no arguments 809d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!name().equals("finalize") || (!mParameters.isEmpty())) { 810920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_THROWS, mInfo.position(), "Method " + mInfo.qualifiedName() 811920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " no longer throws exception " + exception.qualifiedName()); 812920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 813920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 814920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 815920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 816920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 817920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (ClassInfo exec : mInfo.thrownExceptions()) { 818920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson // exclude 'throws' changes to finalize() overrides with no arguments 819920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!throwsException(exec)) { 820d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!name().equals("finalize") || (!mParameters.isEmpty())) { 821920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson Errors.error(Errors.CHANGED_THROWS, mInfo.position(), "Method " + mInfo.qualifiedName() 822920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson + " added thrown exception " + exec.qualifiedName()); 823920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson consistent = false; 824920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 825920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 826920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 827920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 828920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return consistent; 829920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 830d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 831d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void printResolutions() { 8326ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (mResolutions == null || mResolutions.isEmpty()) { 8336ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein return; 8346ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 8356ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 836d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein System.out.println("Resolutions for Method " + mName + mFlatSignature + ":"); 837d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 8386ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein for (Resolution r : mResolutions) { 8396ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein System.out.println(r); 8406ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 8416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 8426ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 8436ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein public void addResolution(Resolution resolution) { 8446ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (mResolutions == null) { 8456ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein mResolutions = new ArrayList<Resolution>(); 8466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 8476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 8486ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein mResolutions.add(resolution); 8496ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 8506ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 8516ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein public boolean resolveResolutions() { 8526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein ArrayList<Resolution> resolutions = mResolutions; 8536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein mResolutions = new ArrayList<Resolution>(); 8546ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 8556ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein boolean allResolved = true; 8566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein for (Resolution resolution : resolutions) { 8576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein StringBuilder qualifiedClassName = new StringBuilder(); 8586ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein InfoBuilder.resolveQualifiedName(resolution.getValue(), qualifiedClassName, 8596ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein resolution.getInfoBuilder()); 8606ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 8616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // if we still couldn't resolve it, save it for the next pass 8626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if ("".equals(qualifiedClassName.toString())) { 8636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein mResolutions.add(resolution); 8646ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein allResolved = false; 8656ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } else if ("thrownException".equals(resolution.getVariable())) { 8666ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein mThrownExceptions.add(InfoBuilder.Caches.obtainClass(qualifiedClassName.toString())); 8676ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 8686ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 8696ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 8706ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein return allResolved; 871d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 872920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson} 873