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    }
578920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
579920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    setFederatedReferences(data, base);
580920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
581920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
582920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public HashSet<String> typeVariables() {
583920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    HashSet<String> result = TypeInfo.typeVariables(mTypeParameters);
584920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo cl = containingClass();
585920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    while (cl != null) {
586d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        ArrayList<TypeInfo> types = cl.asTypeInfo().typeArguments();
587920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (types != null) {
588920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        TypeInfo.typeVariables(types, result);
589920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
590920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      cl = cl.containingClass();
591920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
592920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return result;
593920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
594920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
595920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  @Override
596920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean isExecutable() {
597920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return true;
598920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
599920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
600d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  public ArrayList<ClassInfo> thrownExceptions() {
601920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mThrownExceptions;
602920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
603920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
604920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public String typeArgumentsName(HashSet<String> typeVars) {
605d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (mTypeParameters == null || mTypeParameters.isEmpty()) {
606920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return "";
607920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else {
608920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return TypeInfo.typeArgumentsName(mTypeParameters, typeVars);
609920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
610920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
611920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
612920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean isAnnotationElement() {
613920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mIsAnnotationElement;
614920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
615920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
616920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public AnnotationValueInfo defaultAnnotationElementValue() {
617920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mDefaultAnnotationElementValue;
618920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
619920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
620920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public void setVarargs(boolean set) {
621920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mIsVarargs = set;
622920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
623920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
624920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean isVarArgs() {
625920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mIsVarargs;
626920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
627920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
628722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown  public boolean isEffectivelyFinal() {
629722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown      if (mIsFinal) {
630722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown          return true;
631722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown      }
632722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown      ClassInfo containingClass = containingClass();
633722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown      if (containingClass != null && containingClass.isEffectivelyFinal()) {
634722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown          return true;
635722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown      }
636722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown      return false;
63743d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown  }
63843d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown
639920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  @Override
640920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public String toString() {
641920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return this.name();
642920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
643920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
644920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public void setReason(String reason) {
645920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mReasonOpened = reason;
646920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
647920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
648920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public String getReason() {
649920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mReasonOpened;
650920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
651920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
652920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public void addException(String exec) {
653920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo exceptionClass = new ClassInfo(exec);
654d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
655d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    mThrownExceptions.add(exceptionClass);
656920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
657920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
658920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public void addParameter(ParameterInfo p) {
659920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // Name information
660920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (mParameters == null) {
661d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        mParameters = new ArrayList<ParameterInfo>();
662920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
663d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
664d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    mParameters.add(p);
665920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
666920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
667920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private String mFlatSignature;
668920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private MethodInfo mOverriddenMethod;
669920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private TypeInfo mReturnType;
670920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private boolean mIsAnnotationElement;
671920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private boolean mIsAbstract;
672920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private boolean mIsSynchronized;
673920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private boolean mIsNative;
674920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private boolean mIsVarargs;
675920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private boolean mDeprecatedKnown;
676920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private boolean mIsDeprecated;
677d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  private ArrayList<ParameterInfo> mParameters;
678d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  private ArrayList<ClassInfo> mThrownExceptions;
679920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private String[] mParamStrings;
680d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  private ThrowsTagInfo[] mThrowsTags;
681920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private ParamTagInfo[] mParamTags;
682d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  private ArrayList<TypeInfo> mTypeParameters;
683920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private AnnotationValueInfo mDefaultAnnotationElementValue;
684920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private String mReasonOpened;
6856ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  private ArrayList<Resolution> mResolutions;
686920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
687920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  // TODO: merge with droiddoc version (above)
688920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public String qualifiedName() {
689920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String parentQName = (containingClass() != null)
690920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        ? (containingClass().qualifiedName() + ".") : "";
691920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return parentQName + name();
692920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
693920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
694920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  @Override
695920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public String signature() {
696920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (mSignature == null) {
697920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      StringBuilder params = new StringBuilder("(");
698920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (ParameterInfo pInfo : mParameters) {
699920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (params.length() > 1) {
700920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          params.append(", ");
701920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
702920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        params.append(pInfo.type().fullName());
703920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
704920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
705920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      params.append(")");
706920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      mSignature = params.toString();
707920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
708920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mSignature;
709920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
710920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
711920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean matches(MethodInfo other) {
712beef1457a4e56e88001bc68bd0d4742baf2adf18Ben Dodson    return prettySignature().equals(other.prettySignature());
713920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
714920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
715920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean throwsException(ClassInfo exception) {
716920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo e : mThrownExceptions) {
717920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (e.qualifiedName().equals(exception.qualifiedName())) {
718920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return true;
719920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
720920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
721920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return false;
722920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
72311b179627c411772f1eac023d915ab8532e55211Mathieu
724920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean isConsistent(MethodInfo mInfo) {
725920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    boolean consistent = true;
726040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    if (this.mReturnType != mInfo.mReturnType && !this.mReturnType.equals(mInfo.mReturnType)) {
72711b179627c411772f1eac023d915ab8532e55211Mathieu      if (!mReturnType.isPrimitive() && !mInfo.mReturnType.isPrimitive()) {
72811b179627c411772f1eac023d915ab8532e55211Mathieu        // Check to see if our class extends the old class.
72911b179627c411772f1eac023d915ab8532e55211Mathieu        ApiInfo infoApi = mInfo.containingClass().containingPackage().containingApi();
73011b179627c411772f1eac023d915ab8532e55211Mathieu        ClassInfo infoReturnClass = infoApi.findClass(mInfo.mReturnType.qualifiedTypeName());
73111b179627c411772f1eac023d915ab8532e55211Mathieu        // Find the classes.
73211b179627c411772f1eac023d915ab8532e55211Mathieu        consistent = infoReturnClass != null &&
73311b179627c411772f1eac023d915ab8532e55211Mathieu                     infoReturnClass.isAssignableTo(mReturnType.qualifiedTypeName());
73411b179627c411772f1eac023d915ab8532e55211Mathieu      } else {
73511b179627c411772f1eac023d915ab8532e55211Mathieu        consistent = false;
73611b179627c411772f1eac023d915ab8532e55211Mathieu      }
73711b179627c411772f1eac023d915ab8532e55211Mathieu
73811b179627c411772f1eac023d915ab8532e55211Mathieu      if (!consistent) {
73911b179627c411772f1eac023d915ab8532e55211Mathieu        Errors.error(Errors.CHANGED_TYPE, mInfo.position(), "Method " + mInfo.qualifiedName()
74011b179627c411772f1eac023d915ab8532e55211Mathieu            + " has changed return type from " + mReturnType + " to " + mInfo.mReturnType);
74111b179627c411772f1eac023d915ab8532e55211Mathieu      }
742920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
743920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
744920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (mIsAbstract != mInfo.mIsAbstract) {
745920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
746920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.CHANGED_ABSTRACT, mInfo.position(), "Method " + mInfo.qualifiedName()
747920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          + " has changed 'abstract' qualifier");
748920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
749920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
750920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (mIsNative != mInfo.mIsNative) {
751920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
752920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.CHANGED_NATIVE, mInfo.position(), "Method " + mInfo.qualifiedName()
753920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          + " has changed 'native' qualifier");
754920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
755920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
75643d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown    if (!mIsStatic) {
75743d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown      // Compiler-generated methods vary in their 'final' qualifier between versions of
758920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // the compiler, so this check needs to be quite narrow. A change in 'final'
759920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // status of a method is only relevant if (a) the method is not declared 'static'
76043d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown      // and (b) the method is not already inferred to be 'final' by virtue of its class.
761722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown      if (!isEffectivelyFinal() && mInfo.isEffectivelyFinal()) {
76243d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown        consistent = false;
76343d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown        Errors.error(Errors.ADDED_FINAL, mInfo.position(), "Method " + mInfo.qualifiedName()
76443d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown            + " has added 'final' qualifier");
765722ac6ad427cab1d8d6daba6bd100afa9dd94fb7Jeff Brown      } else if (isEffectivelyFinal() && !mInfo.isEffectivelyFinal()) {
76643d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown        consistent = false;
76743d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown        Errors.error(Errors.REMOVED_FINAL, mInfo.position(), "Method " + mInfo.qualifiedName()
76843d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown            + " has removed 'final' qualifier");
769920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
770920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
771920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
772920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (mIsStatic != mInfo.mIsStatic) {
773920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
774920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.CHANGED_STATIC, mInfo.position(), "Method " + mInfo.qualifiedName()
775920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          + " has changed 'static' qualifier");
776920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
777920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
778920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (!scope().equals(mInfo.scope())) {
779920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
780920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.CHANGED_SCOPE, mInfo.position(), "Method " + mInfo.qualifiedName()
781920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          + " changed scope from " + scope() + " to " + mInfo.scope());
782920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
783920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
784920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (!isDeprecated() == mInfo.isDeprecated()) {
785920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.CHANGED_DEPRECATED, mInfo.position(), "Method " + mInfo.qualifiedName()
786040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          + " has changed deprecation state " + isDeprecated() + " --> " + mInfo.isDeprecated());
787920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
788920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
789920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
790cd020c30a870477480261fbb1463afae4cddd42eGlenn Kasten    // see JLS 3 13.4.20 "Adding or deleting a synchronized modifier of a method does not break "
791cd020c30a870477480261fbb1463afae4cddd42eGlenn Kasten    // "compatibility with existing binaries."
792cd020c30a870477480261fbb1463afae4cddd42eGlenn Kasten    /*
793920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (mIsSynchronized != mInfo.mIsSynchronized) {
794920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.CHANGED_SYNCHRONIZED, mInfo.position(), "Method " + mInfo.qualifiedName()
795920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          + " has changed 'synchronized' qualifier from " + mIsSynchronized + " to "
796920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          + mInfo.mIsSynchronized);
797920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
798920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
799cd020c30a870477480261fbb1463afae4cddd42eGlenn Kasten    */
800920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
801920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo exception : thrownExceptions()) {
802920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (!mInfo.throwsException(exception)) {
803920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        // exclude 'throws' changes to finalize() overrides with no arguments
804d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        if (!name().equals("finalize") || (!mParameters.isEmpty())) {
805920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          Errors.error(Errors.CHANGED_THROWS, mInfo.position(), "Method " + mInfo.qualifiedName()
806920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              + " no longer throws exception " + exception.qualifiedName());
807920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          consistent = false;
808920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
809920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
810920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
811920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
812920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (ClassInfo exec : mInfo.thrownExceptions()) {
813920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // exclude 'throws' changes to finalize() overrides with no arguments
814920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (!throwsException(exec)) {
815d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        if (!name().equals("finalize") || (!mParameters.isEmpty())) {
816920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          Errors.error(Errors.CHANGED_THROWS, mInfo.position(), "Method " + mInfo.qualifiedName()
817920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              + " added thrown exception " + exec.qualifiedName());
818920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          consistent = false;
819920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
820920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
821920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
822920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
823920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return consistent;
824920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
825d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
826d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  public void printResolutions() {
8276ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      if (mResolutions == null || mResolutions.isEmpty()) {
8286ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          return;
8296ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      }
8306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
831d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      System.out.println("Resolutions for Method " + mName + mFlatSignature + ":");
832d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
8336ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      for (Resolution r : mResolutions) {
8346ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          System.out.println(r);
8356ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      }
8366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
8376ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
8386ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  public void addResolution(Resolution resolution) {
8396ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      if (mResolutions == null) {
8406ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          mResolutions = new ArrayList<Resolution>();
8416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      }
8426ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
8436ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      mResolutions.add(resolution);
8446ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
8456ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
8466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  public boolean resolveResolutions() {
8476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      ArrayList<Resolution> resolutions = mResolutions;
8486ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      mResolutions = new ArrayList<Resolution>();
8496ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
8506ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      boolean allResolved = true;
8516ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      for (Resolution resolution : resolutions) {
8526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          StringBuilder qualifiedClassName = new StringBuilder();
8536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          InfoBuilder.resolveQualifiedName(resolution.getValue(), qualifiedClassName,
8546ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                  resolution.getInfoBuilder());
8556ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
8566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          // if we still couldn't resolve it, save it for the next pass
8576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          if ("".equals(qualifiedClassName.toString())) {
8586ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein              mResolutions.add(resolution);
8596ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein              allResolved = false;
8606ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          } else if ("thrownException".equals(resolution.getVariable())) {
8616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein              mThrownExceptions.add(InfoBuilder.Caches.obtainClass(qualifiedClassName.toString()));
8626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein          }
8636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      }
8646ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
8656ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      return allResolved;
866d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
867920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson}
868