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