001: /*
002: * Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025:
026: package com.sun.tools.javadoc;
027:
028: import com.sun.javadoc.*;
029:
030: import com.sun.tools.javac.code.Attribute;
031: import com.sun.tools.javac.code.Symbol.*;
032: import com.sun.tools.javac.code.Type;
033: import com.sun.tools.javac.code.TypeTags;
034:
035: /**
036: * Represents a value of an annotation type element.
037: *
038: * @author Scott Seligman
039: * @version 1.14 07/05/05
040: * @since 1.5
041: */
042:
043: public class AnnotationValueImpl implements AnnotationValue {
044:
045: private final DocEnv env;
046: private final Attribute attr;
047:
048: AnnotationValueImpl(DocEnv env, Attribute attr) {
049: this .env = env;
050: this .attr = attr;
051: }
052:
053: /**
054: * Returns the value.
055: * The type of the returned object is one of the following:
056: * <ul><li> a wrapper class for a primitive type
057: * <li> <code>String</code>
058: * <li> <code>Type</code> (representing a class literal)
059: * <li> <code>FieldDoc</code> (representing an enum constant)
060: * <li> <code>AnnotationDesc</code>
061: * <li> <code>AnnotationValue[]</code>
062: * </ul>
063: */
064: public Object value() {
065: ValueVisitor vv = new ValueVisitor();
066: attr.accept(vv);
067: return vv.value;
068: }
069:
070: private class ValueVisitor implements Attribute.Visitor {
071: public Object value;
072:
073: public void visitConstant(Attribute.Constant c) {
074: if (c.type.tag == TypeTags.BOOLEAN) {
075: // javac represents false and true as integers 0 and 1
076: value = Boolean
077: .valueOf(((Integer) c.value).intValue() != 0);
078: } else {
079: value = c.value;
080: }
081: }
082:
083: public void visitClass(Attribute.Class c) {
084: value = TypeMaker.getType(env, env.types.erasure(c.type));
085: }
086:
087: public void visitEnum(Attribute.Enum e) {
088: value = env.getFieldDoc(e.value);
089: }
090:
091: public void visitCompound(Attribute.Compound c) {
092: value = new AnnotationDescImpl(env, c);
093: }
094:
095: public void visitArray(Attribute.Array a) {
096: AnnotationValue vals[] = new AnnotationValue[a.values.length];
097: for (int i = 0; i < vals.length; i++) {
098: vals[i] = new AnnotationValueImpl(env, a.values[i]);
099: }
100: value = vals;
101: }
102:
103: public void visitError(Attribute.Error e) {
104: value = "<error>";
105: }
106: }
107:
108: /**
109: * Returns a string representation of the value.
110: *
111: * @return the text of a Java language annotation value expression
112: * whose value is the value of this annotation type element.
113: */
114: public String toString() {
115: ToStringVisitor tv = new ToStringVisitor();
116: attr.accept(tv);
117: return tv.toString();
118: }
119:
120: private class ToStringVisitor implements Attribute.Visitor {
121: private final StringBuffer sb = new StringBuffer();
122:
123: public String toString() {
124: return sb.toString();
125: }
126:
127: public void visitConstant(Attribute.Constant c) {
128: if (c.type.tag == TypeTags.BOOLEAN) {
129: // javac represents false and true as integers 0 and 1
130: sb.append(((Integer) c.value).intValue() != 0);
131: } else {
132: sb
133: .append(FieldDocImpl
134: .constantValueExpression(c.value));
135: }
136: }
137:
138: public void visitClass(Attribute.Class c) {
139: sb.append(c);
140: }
141:
142: public void visitEnum(Attribute.Enum e) {
143: sb.append(e);
144: }
145:
146: public void visitCompound(Attribute.Compound c) {
147: sb.append(new AnnotationDescImpl(env, c));
148: }
149:
150: public void visitArray(Attribute.Array a) {
151: // Omit braces from singleton.
152: if (a.values.length != 1)
153: sb.append('{');
154:
155: boolean first = true;
156: for (Attribute elem : a.values) {
157: if (first) {
158: first = false;
159: } else {
160: sb.append(", ");
161: }
162: elem.accept(this );
163: }
164: // Omit braces from singleton.
165: if (a.values.length != 1)
166: sb.append('}');
167: }
168:
169: public void visitError(Attribute.Error e) {
170: sb.append("<error>");
171: }
172: }
173: }
|