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 java.util.regex.Pattern;
20920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.regex.Matcher;
21920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.ArrayList;
22920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/**
24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Class that represents what you see in an link or see tag. This is factored out of SeeTagInfo so
25920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * it can be used elsewhere (like AttrTagInfo).
26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */
27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpublic class LinkReference {
28920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
2972ce82e8e05446aa3b7e163c84d4c23e58552ad6Jeff Hamilton  private static final boolean DBG = false;
301e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton
31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /** The original text. */
32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public String text;
33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /** The kind of this tag, if we have a new suggestion after parsing. */
35920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public String kind;
36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
37920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /** The user visible text. */
38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public String label;
39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /** The link. */
41920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public String href;
42920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
439c584846aff32976d94246c7682a980346d12f44Jeff Hamilton  /** Non-null for federated links */
449c584846aff32976d94246c7682a980346d12f44Jeff Hamilton  public String federatedSite;
459c584846aff32976d94246c7682a980346d12f44Jeff Hamilton
46920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /** The {@link PackageInfo} if any. */
47920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public PackageInfo packageInfo;
48920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /** The {@link ClassInfo} if any. */
50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public ClassInfo classInfo;
51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
52920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /** The {@link MemberInfo} if any. */
53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public MemberInfo memberInfo;
54920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
55920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /** The name of the referenced member PackageInfo} if any. */
56920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public String referencedMemberName;
57920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /** Set to true if everything is a-ok */
59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean good;
60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
62c770a6e2d78cacd7ad0290d8ff43fce8f8e5f000Dirk Dougherty   * regex pattern to use when matching explicit 'a href' reference text
63920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
64920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final Pattern HREF_PATTERN =
65920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Pattern.compile("^<a href=\"([^\"]*)\">([^<]*)</a>[ \n\r\t]*$", Pattern.CASE_INSENSITIVE);
66920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
67920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
68920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * regex pattern to use when matching double-quoted reference text
69920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
70920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private static final Pattern QUOTE_PATTERN = Pattern.compile("^\"([^\"]*)\"[ \n\r\t]*$");
71920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
72920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /**
73920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * Parse and resolve a link string.
74920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   *
75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param text the original text
76920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param base the class or whatever that this link is on
77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @param pos the original position in the source document
78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   * @return a new link reference. It always returns something. If there was an error, it logs it
79920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   *         and fills in href and label with error text.
80920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson   */
81920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static LinkReference parse(String text, ContainerInfo base, SourcePositionInfo pos,
82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      boolean printOnErrors) {
83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    LinkReference result = new LinkReference();
84920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    result.text = text;
85920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
86920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int index;
87920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int len = text.length();
88920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int pairs = 0;
89920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int pound = -1;
90920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // split the string
91920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    done: {
92920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (index = 0; index < len; index++) {
93920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        char c = text.charAt(index);
94920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        switch (c) {
95920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case '(':
96920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            pairs++;
97920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
98920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case '[':
99920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            pairs++;
100920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
101920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case ')':
102920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            pairs--;
103920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
104920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case ']':
105920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            pairs--;
106920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
107920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case ' ':
108920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case '\t':
109920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case '\r':
110920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case '\n':
111920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            if (pairs == 0) {
112920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              break done;
113920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            }
114920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
115920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          case '#':
116920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            if (pound < 0) {
117920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              pound = index;
118920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            }
119920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            break;
120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
121920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
122920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
123920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (index == len && pairs != 0) {
124920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.UNRESOLVED_LINK, pos, "unable to parse link/see tag: " + text.trim());
125920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return result;
126920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
127920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
128920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    int linkend = index;
129920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
130920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (; index < len; index++) {
131920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      char c = text.charAt(index);
132920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (!(c == ' ' || c == '\t' || c == '\r' || c == '\n')) {
133920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        break;
134920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
135920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
136920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
137920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    result.label = text.substring(index);
138920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
139920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String ref;
140920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String mem;
141920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (pound == 0) {
142920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ref = null;
143920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      mem = text.substring(1, linkend);
144920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (pound > 0) {
145920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ref = text.substring(0, pound);
146920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      mem = text.substring(pound + 1, linkend);
147920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else {
148920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ref = text.substring(0, linkend);
149920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      mem = null;
150920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
151920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
152920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // parse parameters, if any
153920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String[] params = null;
154920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String[] paramDimensions = null;
155920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    boolean varargs = false;
156920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (mem != null) {
157920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      index = mem.indexOf('(');
158920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (index > 0) {
159920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        ArrayList<String> paramList = new ArrayList<String>();
160920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        ArrayList<String> paramDimensionList = new ArrayList<String>();
161920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        len = mem.length();
162920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        int start = index + 1;
163920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        final int START = 0;
164920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        final int TYPE = 1;
165920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        final int NAME = 2;
166920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        int dimension = 0;
167920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        int arraypair = 0;
168920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        int state = START;
169920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        int typestart = 0;
170920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        int typeend = -1;
171920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        for (int i = start; i < len; i++) {
172920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          char c = mem.charAt(i);
173920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          switch (state) {
174920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            case START:
175920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              if (c != ' ' && c != '\t' && c != '\r' && c != '\n') {
176920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                state = TYPE;
177920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                typestart = i;
178920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              }
179920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              break;
180920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            case TYPE:
181920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              if (c == '.') {
182920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                if (mem.length() > i+2 && mem.charAt(i+1) == '.' && mem.charAt(i+2) == '.') {
183920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  if (typeend < 0) {
184920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                    typeend = i;
185920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  }
186920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  varargs = true;
187920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                }
188920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              } else if (c == '[') {
189920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                if (typeend < 0) {
190920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  typeend = i;
191920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                }
192920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                dimension++;
193920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                arraypair++;
194920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              } else if (c == ']') {
195920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                arraypair--;
196920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              } else if (c == ' ' || c == '\t' || c == '\r' || c == '\n') {
197920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                if (typeend < 0) {
198920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  typeend = i;
199920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                }
200920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              } else {
201920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                if (typeend >= 0 || c == ')' || c == ',') {
202920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  if (typeend < 0) {
203920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                    typeend = i;
204920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  }
205920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  String s = mem.substring(typestart, typeend);
206920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  paramList.add(s);
207920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  s = "";
208920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  for (int j = 0; j < dimension; j++) {
209920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                    s += "[]";
210920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  }
211920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  paramDimensionList.add(s);
212920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  state = START;
213920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  typeend = -1;
214920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  dimension = 0;
215920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  if (c == ',' || c == ')') {
216920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                    state = START;
217920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  } else {
218920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                    state = NAME;
219920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                  }
220920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                }
221920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              }
222920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              break;
223920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            case NAME:
224920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              if (c == ',' || c == ')') {
225920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                state = START;
226920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              }
227920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              break;
228920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          }
229920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
230920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
231920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        params = paramList.toArray(new String[paramList.size()]);
232920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        paramDimensions = paramDimensionList.toArray(new String[paramList.size()]);
233920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        mem = mem.substring(0, index);
234920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
235920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
236920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
237920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClassInfo cl = null;
238920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (base instanceof ClassInfo) {
239920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      cl = (ClassInfo) base;
2409c584846aff32976d94246c7682a980346d12f44Jeff Hamilton      if (DBG) System.out.println("-- chose base as classinfo");
241920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
242920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
243920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (ref == null) {
2449c584846aff32976d94246c7682a980346d12f44Jeff Hamilton      if (DBG) System.out.println("-- ref == null");
245920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // no class or package was provided, assume it's this class
246920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (cl != null) {
2479c584846aff32976d94246c7682a980346d12f44Jeff Hamilton        if (DBG) System.out.println("-- assumed to be cl");
248920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.classInfo = cl;
249920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
250920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else {
2519c584846aff32976d94246c7682a980346d12f44Jeff Hamilton      if (DBG) System.out.println("-- they provided ref = " + ref);
252920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // they provided something, maybe it's a class or a package
253920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (cl != null) {
2549c584846aff32976d94246c7682a980346d12f44Jeff Hamilton        if (DBG) System.out.println("-- cl non-null");
255920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.classInfo = cl.extendedFindClass(ref);
256920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (result.classInfo == null) {
2579c584846aff32976d94246c7682a980346d12f44Jeff Hamilton          if (DBG) System.out.println("-- cl.extendedFindClass was null");
258920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          result.classInfo = cl.findClass(ref);
259920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
260920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (result.classInfo == null) {
2619c584846aff32976d94246c7682a980346d12f44Jeff Hamilton          if (DBG) System.out.println("-- cl.findClass was null");
262920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          result.classInfo = cl.findInnerClass(ref);
2639c584846aff32976d94246c7682a980346d12f44Jeff Hamilton          if (DBG) if (result.classInfo == null) System.out.println("-- cl.findInnerClass was null");
264920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
265920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
266920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (result.classInfo == null) {
2679c584846aff32976d94246c7682a980346d12f44Jeff Hamilton        if (DBG) System.out.println("-- hitting up the Converter.obtainclass");
268920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.classInfo = Converter.obtainClass(ref);
269920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
270920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (result.classInfo == null) {
2719c584846aff32976d94246c7682a980346d12f44Jeff Hamilton        if (DBG) System.out.println("-- Converter.obtainClass was null");
272920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.packageInfo = Converter.obtainPackage(ref);
273920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
274920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
275920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
2769c584846aff32976d94246c7682a980346d12f44Jeff Hamilton    if (result.classInfo == null) {
2779c584846aff32976d94246c7682a980346d12f44Jeff Hamilton        if (DBG) System.out.println("-- NO CLASS INFO");
2789c584846aff32976d94246c7682a980346d12f44Jeff Hamilton    } else {
2799c584846aff32976d94246c7682a980346d12f44Jeff Hamilton        Doclava.federationTagger.tag(result.classInfo);
2809c584846aff32976d94246c7682a980346d12f44Jeff Hamilton        for (FederatedSite site : result.classInfo.getFederatedReferences()) {
28172ce82e8e05446aa3b7e163c84d4c23e58552ad6Jeff Hamilton          if (DBG) System.out.println("-- reg link = " + result.classInfo.htmlPage());
28272ce82e8e05446aa3b7e163c84d4c23e58552ad6Jeff Hamilton          if (DBG) System.out.println("-- fed link = " +
28372ce82e8e05446aa3b7e163c84d4c23e58552ad6Jeff Hamilton              site.linkFor(result.classInfo.htmlPage()));
2849c584846aff32976d94246c7682a980346d12f44Jeff Hamilton        }
2859c584846aff32976d94246c7682a980346d12f44Jeff Hamilton    }
2869c584846aff32976d94246c7682a980346d12f44Jeff Hamilton
287920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (result.classInfo != null && mem != null) {
288920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // it's either a field or a method, prefer a field
289920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (params == null) {
290920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        FieldInfo field = result.classInfo.findField(mem);
291920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        // findField looks in containing classes, so it might actually
292920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        // be somewhere else; link to where it really is, not what they
293920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        // typed.
294920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (field != null) {
295920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          result.classInfo = field.containingClass();
296920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          result.memberInfo = field;
297920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
298920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
299920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (result.memberInfo == null) {
300920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        MethodInfo method = result.classInfo.findMethod(mem, params, paramDimensions, varargs);
301920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (method != null) {
302920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          result.classInfo = method.containingClass();
303920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          result.memberInfo = method;
304920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
305920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
306920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
307920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
308920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    result.referencedMemberName = mem;
309920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (params != null) {
310920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.referencedMemberName = result.referencedMemberName + '(';
311920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      len = params.length;
312920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (len > 0) {
313920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        len--;
314920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        for (int i = 0; i < len; i++) {
315920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          result.referencedMemberName =
316920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              result.referencedMemberName + params[i] + paramDimensions[i] + ", ";
317920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
318920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.referencedMemberName =
319920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            result.referencedMemberName + params[len] + paramDimensions[len];
320920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
321920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.referencedMemberName = result.referencedMemberName + ")";
322920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
323920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
324920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // debugging spew
3259c584846aff32976d94246c7682a980346d12f44Jeff Hamilton    if (false) {
326920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.label = result.label + "/" + ref + "/" + mem + '/';
327920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (params != null) {
328920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        for (int i = 0; i < params.length; i++) {
329920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          result.label += params[i] + "|";
330920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
331920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
332920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
333920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      FieldInfo f = (result.memberInfo instanceof FieldInfo) ? (FieldInfo) result.memberInfo : null;
334920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      MethodInfo m =
335920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          (result.memberInfo instanceof MethodInfo) ? (MethodInfo) result.memberInfo : null;
336920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.label =
337920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          result.label + "/package="
338920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              + (result.packageInfo != null ? result.packageInfo.name() : "") + "/class="
339920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              + (result.classInfo != null ? result.classInfo.qualifiedName() : "") + "/field="
340920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              + (f != null ? f.name() : "") + "/method=" + (m != null ? m.name() : "");
341920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
342920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
343920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
344920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    MethodInfo method = null;
345920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    boolean skipHref = false;
346920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
347920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (result.memberInfo != null && result.memberInfo.isExecutable()) {
348920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      method = (MethodInfo) result.memberInfo;
349920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
350920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
3511e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton    if (DBG) System.out.println("----- label = " + result.label + ", text = '" + text + "'");
352920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (text.startsWith("\"")) {
353920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // literal quoted reference (e.g., a book title)
354920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Matcher matcher = QUOTE_PATTERN.matcher(text);
355920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (!matcher.matches()) {
356920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        Errors.error(Errors.UNRESOLVED_LINK, pos, "unbalanced quoted link/see tag: " + text.trim());
357920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.makeError();
358920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return result;
359920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
360920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      skipHref = true;
361920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.label = matcher.group(1);
362920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.kind = "@seeJustLabel";
3631e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton      if (DBG) System.out.println(" ---- literal quoted reference");
364920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (text.startsWith("<")) {
365920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // explicit "<a href" form
366920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Matcher matcher = HREF_PATTERN.matcher(text);
367920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (!matcher.matches()) {
368920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        Errors.error(Errors.UNRESOLVED_LINK, pos, "invalid <a> link/see tag: " + text.trim());
369920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.makeError();
370920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return result;
371920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
372920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.href = matcher.group(1);
373920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.label = matcher.group(2);
374920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.kind = "@seeHref";
3751e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton      if (DBG) System.out.println(" ---- explicit href reference");
376920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (result.packageInfo != null) {
377920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.href = result.packageInfo.htmlPage();
378920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (result.label.length() == 0) {
379920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.href = result.packageInfo.htmlPage();
380920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.label = result.packageInfo.name();
381920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
3821e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton      if (DBG) System.out.println(" ---- packge reference");
383920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (result.classInfo != null && result.referencedMemberName == null) {
384920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // class reference
385920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (result.label.length() == 0) {
386920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.label = result.classInfo.name();
387920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
3889c584846aff32976d94246c7682a980346d12f44Jeff Hamilton      setHref(result, result.classInfo, null);
3891e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton      if (DBG) System.out.println(" ---- class reference");
390920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (result.memberInfo != null) {
391920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // member reference
392920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      ClassInfo containing = result.memberInfo.containingClass();
393920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (result.memberInfo.isExecutable()) {
394920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (result.referencedMemberName.indexOf('(') < 0) {
395920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          result.referencedMemberName += method.flatSignature();
396920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
397920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
398920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (result.label.length() == 0) {
399920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.label = result.referencedMemberName;
400920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
4019c584846aff32976d94246c7682a980346d12f44Jeff Hamilton      setHref(result, containing, result.memberInfo.anchor());
4021e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton      if (DBG) System.out.println(" ---- member reference");
403920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
4041e0d370c6a4c165cb8c74f53cb035e5521e0cd87Jeff Hamilton    if (DBG) System.out.println("  --- href = '" + result.href + "'");
405920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
406920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (result.href == null && !skipHref) {
407920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (printOnErrors && (base == null || base.checkLevel())) {
408920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        Errors.error(Errors.UNRESOLVED_LINK, pos, "Unresolved link/see tag \"" + text.trim()
409920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            + "\" in " + ((base != null) ? base.qualifiedName() : "[null]"));
410920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
411920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.makeError();
412920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (result.memberInfo != null && !result.memberInfo.checkLevel()) {
413920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (printOnErrors && (base == null || base.checkLevel())) {
414920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        Errors.error(Errors.HIDDEN_LINK, pos, "Link to hidden member: " + text.trim());
415920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.href = null;
416920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
417920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.kind = "@seeJustLabel";
418920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (result.classInfo != null && !result.classInfo.checkLevel()) {
419920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (printOnErrors && (base == null || base.checkLevel())) {
420920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        Errors.error(Errors.HIDDEN_LINK, pos, "Link to hidden class: " + text.trim() + " label="
421920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            + result.label);
422920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.href = null;
423920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
424920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.kind = "@seeJustLabel";
425920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (result.packageInfo != null && !result.packageInfo.checkLevel()) {
426920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (printOnErrors && (base == null || base.checkLevel())) {
427920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        Errors.error(Errors.HIDDEN_LINK, pos, "Link to hidden package: " + text.trim());
428920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result.href = null;
429920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
430920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      result.kind = "@seeJustLabel";
431920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
432920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
433920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    result.good = true;
434920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
435920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return result;
436920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
437920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
438920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean checkLevel() {
439920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (memberInfo != null) {
440920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return memberInfo.checkLevel();
441920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
442920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (classInfo != null) {
443920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return classInfo.checkLevel();
444920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
445920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (packageInfo != null) {
446920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return packageInfo.checkLevel();
447920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
448920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return false;
449920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
450920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
451920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /** turn this LinkReference into one with an error message */
452920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private void makeError() {
453920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // this.href = "ERROR(" + this.text.trim() + ")";
454920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    this.href = null;
455920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (this.label == null) {
456920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      this.label = "";
457920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
458920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    this.label = "ERROR(" + this.label + "/" + text.trim() + ")";
459920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
460920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
4619c584846aff32976d94246c7682a980346d12f44Jeff Hamilton  static private void setHref(LinkReference reference, ClassInfo info, String member) {
4629c584846aff32976d94246c7682a980346d12f44Jeff Hamilton    String htmlPage = info.htmlPage();
4639c584846aff32976d94246c7682a980346d12f44Jeff Hamilton    if (member != null) {
4649c584846aff32976d94246c7682a980346d12f44Jeff Hamilton      htmlPage = htmlPage + "#" + member;
4659c584846aff32976d94246c7682a980346d12f44Jeff Hamilton    }
4669c584846aff32976d94246c7682a980346d12f44Jeff Hamilton
4679c584846aff32976d94246c7682a980346d12f44Jeff Hamilton    Doclava.federationTagger.tag(info);
4689c584846aff32976d94246c7682a980346d12f44Jeff Hamilton    if (!info.getFederatedReferences().isEmpty()) {
4699c584846aff32976d94246c7682a980346d12f44Jeff Hamilton      FederatedSite site = info.getFederatedReferences().iterator().next();
4709c584846aff32976d94246c7682a980346d12f44Jeff Hamilton      reference.href = site.linkFor(htmlPage);
4719c584846aff32976d94246c7682a980346d12f44Jeff Hamilton      reference.federatedSite = site.name();
4729c584846aff32976d94246c7682a980346d12f44Jeff Hamilton    } else {
4739c584846aff32976d94246c7682a980346d12f44Jeff Hamilton      reference.href = htmlPage;
4749c584846aff32976d94246c7682a980346d12f44Jeff Hamilton    }
4759c584846aff32976d94246c7682a980346d12f44Jeff Hamilton  }
4769c584846aff32976d94246c7682a980346d12f44Jeff Hamilton
477920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  /** private. **/
478920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private LinkReference() {}
479920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson}
480