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
19040992567205c3b6e4ee01bfb2893bceb915357cJoe Onoratoimport com.google.doclava.apicheck.ApiParseException;
20920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.clearsilver.jsilver.data.Data;
21920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.Comparator;
22d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.ArrayList;
23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpublic class FieldInfo extends MemberInfo {
25920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static final Comparator<FieldInfo> comparator = new Comparator<FieldInfo>() {
26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    public int compare(FieldInfo a, FieldInfo b) {
27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return a.name().compareTo(b.name());
28920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
29920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  };
30920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public FieldInfo(String name, ClassInfo containingClass, ClassInfo realContainingClass,
32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      boolean isPublic, boolean isProtected, boolean isPackagePrivate, boolean isPrivate,
33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      boolean isFinal, boolean isStatic, boolean isTransient, boolean isVolatile,
34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      boolean isSynthetic, TypeInfo type, String rawCommentText, Object constantValue,
35d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      SourcePositionInfo position, ArrayList<AnnotationInstanceInfo> annotations) {
36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    super(rawCommentText, name, null, containingClass, realContainingClass, isPublic, isProtected,
3762aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein          isPackagePrivate, isPrivate, isFinal, isStatic, isSynthetic, chooseKind(isFinal, isStatic, constantValue),
38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        position, annotations);
39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mIsTransient = isTransient;
40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mIsVolatile = isVolatile;
41920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mType = type;
42920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mConstantValue = constantValue;
43920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
44920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
45920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public FieldInfo cloneForClass(ClassInfo newContainingClass) {
46920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return new FieldInfo(name(), newContainingClass, realContainingClass(), isPublic(),
47920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        isProtected(), isPackagePrivate(), isPrivate(), isFinal(), isStatic(), isTransient(),
48920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        isVolatile(), isSynthetic(), mType, getRawCommentText(), mConstantValue, position(),
49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        annotations());
50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
5262aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein  static String chooseKind(boolean isFinal, boolean isStatic, Object constantValue)
5362aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein  {
5462aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein    return isConstant(isFinal, isStatic, constantValue) ? "constant" : "field";
55920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
56920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
57920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public String qualifiedName() {
58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String parentQName
59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        = (containingClass() != null) ? (containingClass().qualifiedName() + ".") : "";
60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return parentQName + name();
61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
62920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
63920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public TypeInfo type() {
64920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mType;
65920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
66920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
6762aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein  static boolean isConstant(boolean isFinal, boolean isStatic, Object constantValue)
6862aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein  {
6962aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein    /*
7062aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein     * Note: There is an ambiguity in the doc API that prevents us
7162aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein     * from distinguishing a constant-null from the lack of a
7262aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein     * constant at all. We err on the side of treating all null
7362aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein     * constantValues as meaning that the field is not a constant,
7462aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein     * since having a static final field assigned to null is both
7562aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein     * unusual and generally pretty useless.
7662aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein     */
7762aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein    return isFinal && isStatic && (constantValue != null);
7862aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein  }
7962aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein
80920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean isConstant() {
8162aaca829e5b443a3c1345c54c44293587929dd4Dan Bornstein    return isConstant(isFinal(), isStatic(), mConstantValue);
82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
84920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public TagInfo[] firstSentenceTags() {
85920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return comment().briefTags();
86920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
87920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
88920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public TagInfo[] inlineTags() {
89920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return comment().tags();
90920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
91920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
92920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public Object constantValue() {
93920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mConstantValue;
94920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
95920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
96920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public String constantLiteralValue() {
97920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return constantLiteralValue(mConstantValue);
98920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
99920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
100920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public void setDeprecated(boolean deprecated) {
101920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mDeprecatedKnown = true;
102920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mIsDeprecated = deprecated;
103920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
104920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
105920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean isDeprecated() {
106920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (!mDeprecatedKnown) {
107920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      boolean commentDeprecated = comment().isDeprecated();
108920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      boolean annotationDeprecated = false;
109920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      for (AnnotationInstanceInfo annotation : annotations()) {
110920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (annotation.type().qualifiedName().equals("java.lang.Deprecated")) {
111920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          annotationDeprecated = true;
112920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          break;
113920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
114920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
115920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
116920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (commentDeprecated != annotationDeprecated) {
117920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        Errors.error(Errors.DEPRECATION_MISMATCH, position(), "Field "
118920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            + mContainingClass.qualifiedName() + "." + name()
119920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            + ": @Deprecated annotation and @deprecated comment do not match");
120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
121920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
122920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      mIsDeprecated = commentDeprecated | annotationDeprecated;
123920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      mDeprecatedKnown = true;
124920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
125920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mIsDeprecated;
126920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
127920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
128920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String constantLiteralValue(Object val) {
129920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String str = null;
130920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (val != null) {
131920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (val instanceof Boolean || val instanceof Byte || val instanceof Short
132920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          || val instanceof Integer) {
133920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        str = val.toString();
134920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
135920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      // catch all special values
136920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      else if (val instanceof Double) {
137f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson        str = canonicalizeFloatingPoint(val.toString(), "");
138f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson      } else if (val instanceof Float) {
139f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson        str = canonicalizeFloatingPoint(val.toString(), "f");
140920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (val instanceof Long) {
141920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        str = val.toString() + "L";
142920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (val instanceof Character) {
143920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        str = String.format("\'\\u%04x\'", val);
144040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato        System.out.println("str=" + str);
145920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (val instanceof String) {
146920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        str = "\"" + javaEscapeString((String) val) + "\"";
147920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
148920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        str = "<<<<" + val.toString() + ">>>>";
149920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
150920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
151920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (str == null) {
152920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      str = "null";
153920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
154920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return str;
155920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
156920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
157f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson  /**
158f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson   * Returns a canonical string representation of a floating point
159f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson   * number. The representation is suitable for use as Java source
160f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson   * code. This method also addresses bug #4428022 in the Sun JDK.
161f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson   */
162f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson  private static String canonicalizeFloatingPoint(String val, String suffix) {
163f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    if (val.equals("Infinity")) {
164040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato      return "(1.0" + suffix + "/0.0" + suffix + ")";
165f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    } else if (val.equals("-Infinity")) {
166040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato      return "(-1.0" + suffix + "/0.0" + suffix + ")";
167f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    } else if (val.equals("NaN")) {
168040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato      return "(0.0" + suffix + "/0.0" + suffix + ")";
169f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    }
170f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson
171f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    String str = val.toString();
172f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    if (str.indexOf('E') != -1) {
173f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson      return str + suffix;
174f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    }
175f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson
176f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    // 1.0 is the only case where a trailing "0" is allowed.
177f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    // 1.00 is canonicalized as 1.0.
178f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    int i = str.length() - 1;
179f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    int d = str.indexOf('.');
180f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    while (i >= d + 2 && str.charAt(i) == '0') {
181f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson      str = str.substring(0, i--);
182f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    }
183f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    return str + suffix;
184f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson  }
185f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson
186920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String javaEscapeString(String str) {
187920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String result = "";
188920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    final int N = str.length();
189920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (int i = 0; i < N; i++) {
190920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      char c = str.charAt(i);
191920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (c == '\\') {
192920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result += "\\\\";
193920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (c == '\t') {
194920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result += "\\t";
195920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (c == '\b') {
196920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result += "\\b";
197920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (c == '\r') {
198920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result += "\\r";
199920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (c == '\n') {
200920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result += "\\n";
201920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (c == '\f') {
202920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result += "\\f";
203920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (c == '\'') {
204920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result += "\\'";
205920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (c == '\"') {
206920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result += "\\\"";
207920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (c >= ' ' && c <= '~') {
208920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result += c;
209920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
210920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        result += String.format("\\u%04x", new Integer((int) c));
211920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
212920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
213920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return result;
214920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
215920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
216040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato  public static String javaUnescapeString(String str) throws ApiParseException {
217040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    final int N = str.length();
218040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    check: {
219040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato      for (int i=0; i<N; i++) {
220040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato        final char c = str.charAt(i);
221040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato        if (c == '\\') {
222040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          break check;
223040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato        }
224040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato      }
225040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato      return str;
226040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    }
227040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato
228040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    final StringBuilder buf = new StringBuilder(str.length());
229040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    char escaped = 0;
230040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    final int START = 0;
231040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    final int CHAR1 = 1;
232040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    final int CHAR2 = 2;
233040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    final int CHAR3 = 3;
234040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    final int CHAR4 = 4;
235040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    final int ESCAPE = 5;
236040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    int state = START;
237040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato
238040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    for (int i=0; i<N; i++) {
239040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato      final char c = str.charAt(i);
240040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato      switch (state) {
241040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato        case START:
242040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          if (c == '\\') {
243040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            state = ESCAPE;
244040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          } else {
245040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            buf.append(c);
246040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          }
247040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          break;
248040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato        case ESCAPE:
249040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          switch (c) {
250040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            case '\\':
251040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              buf.append('\\');
252040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              state = START;
253040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              break;
254040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            case 't':
255040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              buf.append('\t');
256040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              state = START;
257040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              break;
258040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            case 'b':
259040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              buf.append('\b');
260040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              state = START;
261040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              break;
262040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            case 'r':
263040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              buf.append('\r');
264040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              state = START;
265040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              break;
266040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            case 'n':
267040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              buf.append('\n');
268040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              state = START;
269040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              break;
270040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            case 'f':
271040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              buf.append('\f');
272040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              state = START;
273040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              break;
274040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            case '\'':
275040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              buf.append('\'');
276040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              state = START;
277040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              break;
278040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            case '\"':
279040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              buf.append('\"');
280040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              state = START;
281040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              break;
282040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            case 'u':
283040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              state = CHAR1;
284040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              escaped = 0;
285040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato              break;
286040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          }
287040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          break;
288040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato        case CHAR1:
289040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato        case CHAR2:
290040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato        case CHAR3:
291040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato        case CHAR4:
292040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          escaped <<= 4;
293040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          if (c >= '0' && c <= '9') {
294040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            escaped |= c - '0';
295040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          } else if (c >= 'a' && c <= 'f') {
296040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            escaped |= 10 + (c - 'a');
297040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          } else if (c >= 'A' && c <= 'F') {
298040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            escaped |= 10 + (c - 'A');
299040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          } else {
300040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            throw new ApiParseException("bad escape sequence: '" + c + "' at pos " + i + " in: \""
301040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato                + str + "\"");
302040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          }
303040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          if (state == CHAR4) {
304040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            buf.append(escaped);
305040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            state = START;
306040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          } else {
307040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato            state++;
308040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          }
309040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato          break;
310040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato      }
311040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    }
312040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    if (state != START) {
313040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato      throw new ApiParseException("unfinished escape sequence: " + str);
314040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    }
315040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato    return buf.toString();
316040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato  }
317920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
318920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public void makeHDF(Data data, String base) {
319920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data.setValue(base + ".kind", kind());
320920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    type().makeHDF(data, base + ".type");
321920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data.setValue(base + ".name", name());
322920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data.setValue(base + ".href", htmlPage());
323920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data.setValue(base + ".anchor", anchor());
324920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    TagInfo.makeHDF(data, base + ".shortDescr", firstSentenceTags());
325920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    TagInfo.makeHDF(data, base + ".descr", inlineTags());
326920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    TagInfo.makeHDF(data, base + ".deprecated", comment().deprecatedTags());
327920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    TagInfo.makeHDF(data, base + ".seeAlso", comment().seeTags());
328920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data.setValue(base + ".since", getSince());
32940ad14799644f497483efe6d1350c856d46bc4daScott Main    if (isDeprecated()) {
33040ad14799644f497483efe6d1350c856d46bc4daScott Main      data.setValue(base + ".deprecatedsince", getDeprecatedSince());
33140ad14799644f497483efe6d1350c856d46bc4daScott Main    }
332920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data.setValue(base + ".final", isFinal() ? "final" : "");
333920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data.setValue(base + ".static", isStatic() ? "static" : "");
334920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (isPublic()) {
335920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue(base + ".scope", "public");
336920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (isProtected()) {
337920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue(base + ".scope", "protected");
338920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (isPackagePrivate()) {
339920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue(base + ".scope", "");
340920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (isPrivate()) {
341920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      data.setValue(base + ".scope", "private");
342920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
343920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Object val = mConstantValue;
344920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (val != null) {
345920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String dec = null;
346920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String hex = null;
347920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      String str = null;
348920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
349920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (val instanceof Boolean) {
350920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        str = ((Boolean) val).toString();
351920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (val instanceof Byte) {
352920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        dec = String.format("%d", val);
353920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        hex = String.format("0x%02x", val);
354920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (val instanceof Character) {
355920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        dec = String.format("\'%c\'", val);
356920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        hex = String.format("0x%04x", val);
357920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (val instanceof Double) {
358920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        str = ((Double) val).toString();
359920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (val instanceof Float) {
360920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        str = ((Float) val).toString();
361920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (val instanceof Integer) {
362920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        dec = String.format("%d", val);
363920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        hex = String.format("0x%08x", val);
364920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (val instanceof Long) {
365920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        dec = String.format("%d", val);
366920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        hex = String.format("0x%016x", val);
367920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (val instanceof Short) {
368920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        dec = String.format("%d", val);
369920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        hex = String.format("0x%04x", val);
370920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else if (val instanceof String) {
371920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        str = "\"" + ((String) val) + "\"";
372920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
373920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        str = "";
374920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
375920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
376920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (dec != null && hex != null) {
377920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        data.setValue(base + ".constantValue.dec", Doclava.escape(dec));
378920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        data.setValue(base + ".constantValue.hex", Doclava.escape(hex));
379920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      } else {
380920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        data.setValue(base + ".constantValue.str", Doclava.escape(str));
381920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        data.setValue(base + ".constantValue.isString", "1");
382920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
383920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
384920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
385920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    setFederatedReferences(data, base);
386920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
387920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
388920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  @Override
389920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean isExecutable() {
390920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return false;
391920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
392920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
393920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean isTransient() {
394920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mIsTransient;
395920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
396920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
397920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean isVolatile() {
398920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return mIsVolatile;
399920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
400920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
401920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  // Check the declared value with a typed comparison, not a string comparison,
402920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  // to accommodate toolchains with different fp -> string conversions.
403920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  private boolean valueEquals(FieldInfo other) {
404920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if ((mConstantValue == null) != (other.mConstantValue == null)) {
405920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return false;
406920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
407920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
408920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    // Null values are considered equal
409920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (mConstantValue == null) {
410920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      return true;
411920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
412040992567205c3b6e4ee01bfb2893bceb915357cJoe Onorato
413f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson    return mType.equals(other.mType)
414f22ba05c19de46e546ce9ae4783ac43e220e0425Ben Dodson        && mConstantValue.equals(other.mConstantValue);
415920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
416920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
417920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public boolean isConsistent(FieldInfo fInfo) {
418920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    boolean consistent = true;
419920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (!mType.equals(fInfo.mType)) {
420920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.CHANGED_TYPE, fInfo.position(), "Field " + fInfo.qualifiedName()
421920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          + " has changed type");
422920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
423920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    } else if (!this.valueEquals(fInfo)) {
424920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.CHANGED_VALUE, fInfo.position(), "Field " + fInfo.qualifiedName()
425920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          + " has changed value from " + mConstantValue + " to " + fInfo.mConstantValue);
426920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
427920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
428920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
429920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (!scope().equals(fInfo.scope())) {
430920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.CHANGED_SCOPE, fInfo.position(), "Method " + fInfo.qualifiedName()
431920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          + " changed scope from " + this.scope() + " to " + fInfo.scope());
432920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
433920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
434920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
435920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (mIsStatic != fInfo.mIsStatic) {
436920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.CHANGED_STATIC, fInfo.position(), "Field " + fInfo.qualifiedName()
437920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          + " has changed 'static' qualifier");
438920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
439920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
440920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
44143d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown    if (!mIsFinal && fInfo.mIsFinal) {
44243d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown      Errors.error(Errors.ADDED_FINAL, fInfo.position(), "Field " + fInfo.qualifiedName()
44343d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown          + " has added 'final' qualifier");
44443d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown      consistent = false;
44543d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown    } else if (mIsFinal && !fInfo.mIsFinal) {
44643d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown      Errors.error(Errors.REMOVED_FINAL, fInfo.position(), "Field " + fInfo.qualifiedName()
44743d2ac8017a651b5678c8a9753248663d8bfe9a7Jeff Brown          + " has removed 'final' qualifier");
448920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
449920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
450920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
451920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (mIsTransient != fInfo.mIsTransient) {
452920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.CHANGED_TRANSIENT, fInfo.position(), "Field " + fInfo.qualifiedName()
453920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          + " has changed 'transient' qualifier");
454920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
455920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
456920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
457920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (mIsVolatile != fInfo.mIsVolatile) {
458920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.CHANGED_VOLATILE, fInfo.position(), "Field " + fInfo.qualifiedName()
459920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          + " has changed 'volatile' qualifier");
460920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
461920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
462920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
463920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (isDeprecated() != fInfo.isDeprecated()) {
464920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      Errors.error(Errors.CHANGED_DEPRECATED, fInfo.position(), "Field " + fInfo.qualifiedName()
465920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson          + " has changed deprecation state");
466920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      consistent = false;
467920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
468920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
469920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return consistent;
470920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
471920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
472d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  public boolean hasValue() {
473d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return mHasValue;
474d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
475d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
476d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  public void setHasValue(boolean hasValue) {
477d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      mHasValue = hasValue;
478d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
479d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
480920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  boolean mIsTransient;
481920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  boolean mIsVolatile;
482920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  boolean mDeprecatedKnown;
483920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  boolean mIsDeprecated;
484d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  boolean mHasValue;
485920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  TypeInfo mType;
486920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  Object mConstantValue;
487920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson}
488