summaryrefslogtreecommitdiffstats
path: root/tools/droiddoc/src/FieldInfo.java
diff options
context:
space:
mode:
Diffstat (limited to 'tools/droiddoc/src/FieldInfo.java')
-rw-r--r--tools/droiddoc/src/FieldInfo.java315
1 files changed, 315 insertions, 0 deletions
diff --git a/tools/droiddoc/src/FieldInfo.java b/tools/droiddoc/src/FieldInfo.java
new file mode 100644
index 0000000..536d798
--- /dev/null
+++ b/tools/droiddoc/src/FieldInfo.java
@@ -0,0 +1,315 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.clearsilver.HDF;
+import org.clearsilver.CS;
+
+import java.util.Comparator;
+
+public class FieldInfo extends MemberInfo
+{
+ public static final Comparator<FieldInfo> comparator = new Comparator<FieldInfo>() {
+ public int compare(FieldInfo a, FieldInfo b) {
+ return a.name().compareTo(b.name());
+ }
+ };
+
+ public FieldInfo(String name, ClassInfo containingClass, ClassInfo realContainingClass,
+ boolean isPublic, boolean isProtected,
+ boolean isPackagePrivate, boolean isPrivate,
+ boolean isFinal, boolean isStatic, boolean isTransient, boolean isVolatile,
+ boolean isSynthetic, TypeInfo type, String rawCommentText,
+ Object constantValue,
+ SourcePositionInfo position,
+ AnnotationInstanceInfo[] annotations)
+ {
+ super(rawCommentText, name, null, containingClass, realContainingClass,
+ isPublic, isProtected, isPackagePrivate, isPrivate,
+ isFinal, isStatic, isSynthetic, chooseKind(isFinal, isStatic), position,
+ annotations);
+ mIsTransient = isTransient;
+ mIsVolatile = isVolatile;
+ mType = type;
+ mConstantValue = constantValue;
+ }
+
+ public FieldInfo cloneForClass(ClassInfo newContainingClass) {
+ return new FieldInfo(name(), newContainingClass, realContainingClass(),
+ isPublic(), isProtected(), isPackagePrivate(),
+ isPrivate(), isFinal(), isStatic(), isTransient(), isVolatile(),
+ isSynthetic(), mType, getRawCommentText(), mConstantValue, position(),
+ annotations());
+ }
+
+ static String chooseKind(boolean isFinal, boolean isStatic)
+ {
+ if (isStatic && isFinal) {
+ return "constant";
+ } else {
+ return "field";
+ }
+ }
+
+ public TypeInfo type()
+ {
+ return mType;
+ }
+
+ public boolean isConstant()
+ {
+ return isStatic() && isFinal();
+ }
+
+ public TagInfo[] firstSentenceTags()
+ {
+ return comment().briefTags();
+ }
+
+ public TagInfo[] inlineTags()
+ {
+ return comment().tags();
+ }
+
+ public Object constantValue()
+ {
+ return mConstantValue;
+ }
+
+ public String constantLiteralValue()
+ {
+ return constantLiteralValue(mConstantValue);
+ }
+
+ public boolean isDeprecated() {
+ boolean deprecated = false;
+ if (!mDeprecatedKnown) {
+ boolean commentDeprecated = (comment().deprecatedTags().length > 0);
+ boolean annotationDeprecated = false;
+ for (AnnotationInstanceInfo annotation : annotations()) {
+ if (annotation.type().qualifiedName().equals("java.lang.Deprecated")) {
+ annotationDeprecated = true;
+ break;
+ }
+ }
+
+ if (commentDeprecated != annotationDeprecated) {
+ Errors.error(Errors.DEPRECATION_MISMATCH, position(),
+ "Field " + mContainingClass.qualifiedName() + "." + name()
+ + ": @Deprecated annotation and @deprecated comment do not match");
+ }
+
+ mIsDeprecated = commentDeprecated | annotationDeprecated;
+ mDeprecatedKnown = true;
+ }
+ return mIsDeprecated;
+ }
+
+ public static String constantLiteralValue(Object val)
+ {
+ String str = null;
+ if (val != null) {
+ if (val instanceof Boolean
+ || val instanceof Byte
+ || val instanceof Short
+ || val instanceof Integer)
+ {
+ str = val.toString();
+ }
+ //catch all special values
+ else if (val instanceof Double){
+ Double dbl = (Double) val;
+ if (dbl.toString().equals("Infinity")){
+ str = "(1.0 / 0.0)";
+ } else if (dbl.toString().equals("-Infinity")) {
+ str = "(-1.0 / 0.0)";
+ } else if (dbl.isNaN()) {
+ str = "(0.0 / 0.0)";
+ } else {
+ str = dbl.toString();
+ }
+ }
+ else if (val instanceof Long) {
+ str = val.toString() + "L";
+ }
+ else if (val instanceof Float) {
+ Float fl = (Float) val;
+ if (fl.toString().equals("Infinity")) {
+ str = "(1.0f / 0.0f)";
+ } else if (fl.toString().equals("-Infinity")) {
+ str = "(-1.0f / 0.0f)";
+ } else if (fl.isNaN()) {
+ str = "(0.0f / 0.0f)";
+ } else {
+ str = val.toString() + "f";
+ }
+ }
+ else if (val instanceof Character) {
+ str = String.format("\'\\u%04x\'", val);
+ }
+ else if (val instanceof String) {
+ str = "\"" + javaEscapeString((String)val) + "\"";
+ }
+ else {
+ str = "<<<<" +val.toString() + ">>>>";
+ }
+ }
+ if (str == null) {
+ str = "null";
+ }
+ return str;
+ }
+
+ public static String javaEscapeString(String str) {
+ String result = "";
+ final int N = str.length();
+ for (int i=0; i<N; i++) {
+ char c = str.charAt(i);
+ if (c == '\\') {
+ result += "\\\\";
+ }
+ else if (c == '\t') {
+ result += "\\t";
+ }
+ else if (c == '\b') {
+ result += "\\b";
+ }
+ else if (c == '\r') {
+ result += "\\r";
+ }
+ else if (c == '\n') {
+ result += "\\n";
+ }
+ else if (c == '\f') {
+ result += "\\f";
+ }
+ else if (c == '\'') {
+ result += "\\'";
+ }
+ else if (c == '\"') {
+ result += "\\\"";
+ }
+ else if (c >= ' ' && c <= '~') {
+ result += c;
+ }
+ else {
+ result += String.format("\\u%04x", new Integer((int)c));
+ }
+ }
+ return result;
+ }
+
+
+ public void makeHDF(HDF data, String base)
+ {
+ data.setValue(base + ".kind", kind());
+ type().makeHDF(data, base + ".type");
+ data.setValue(base + ".name", name());
+ data.setValue(base + ".href", htmlPage());
+ data.setValue(base + ".anchor", anchor());
+ TagInfo.makeHDF(data, base + ".shortDescr", firstSentenceTags());
+ TagInfo.makeHDF(data, base + ".descr", inlineTags());
+ TagInfo.makeHDF(data, base + ".deprecated", comment().deprecatedTags());
+ TagInfo.makeHDF(data, base + ".seeAlso", comment().seeTags());
+ data.setValue(base + ".final", isFinal() ? "final" : "");
+ data.setValue(base + ".static", isStatic() ? "static" : "");
+ if (isPublic()) {
+ data.setValue(base + ".scope", "public");
+ }
+ else if (isProtected()) {
+ data.setValue(base + ".scope", "protected");
+ }
+ else if (isPackagePrivate()) {
+ data.setValue(base + ".scope", "");
+ }
+ else if (isPrivate()) {
+ data.setValue(base + ".scope", "private");
+ }
+ Object val = mConstantValue;
+ if (val != null) {
+ String dec = null;
+ String hex = null;
+ String str = null;
+
+ if (val instanceof Boolean) {
+ str = ((Boolean)val).toString();
+ }
+ else if (val instanceof Byte) {
+ dec = String.format("%d", val);
+ hex = String.format("0x%02x", val);
+ }
+ else if (val instanceof Character) {
+ dec = String.format("\'%c\'", val);
+ hex = String.format("0x%04x", val);
+ }
+ else if (val instanceof Double) {
+ str = ((Double)val).toString();
+ }
+ else if (val instanceof Float) {
+ str = ((Float)val).toString();
+ }
+ else if (val instanceof Integer) {
+ dec = String.format("%d", val);
+ hex = String.format("0x%08x", val);
+ }
+ else if (val instanceof Long) {
+ dec = String.format("%d", val);
+ hex = String.format("0x%016x", val);
+ }
+ else if (val instanceof Short) {
+ dec = String.format("%d", val);
+ hex = String.format("0x%04x", val);
+ }
+ else if (val instanceof String) {
+ str = "\"" + ((String)val) + "\"";
+ }
+ else {
+ str = "";
+ }
+
+ if (dec != null && hex != null) {
+ data.setValue(base + ".constantValue.dec", DroidDoc.escape(dec));
+ data.setValue(base + ".constantValue.hex", DroidDoc.escape(hex));
+ }
+ else {
+ data.setValue(base + ".constantValue.str", DroidDoc.escape(str));
+ data.setValue(base + ".constantValue.isString", "1");
+ }
+ }
+ }
+
+ public boolean isExecutable()
+ {
+ return false;
+ }
+
+ public boolean isTransient()
+ {
+ return mIsTransient;
+ }
+
+ public boolean isVolatile()
+ {
+ return mIsVolatile;
+ }
+
+ boolean mIsTransient;
+ boolean mIsVolatile;
+ boolean mDeprecatedKnown;
+ boolean mIsDeprecated;
+ TypeInfo mType;
+ Object mConstantValue;
+}
+