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