1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 package org.codehaus.groovy.ast;
47
48 import java.util.ArrayList;
49 import java.util.HashMap;
50 import java.util.Iterator;
51 import java.util.List;
52 import java.util.Map;
53
54
55 /***
56 * Base class for any AST node which is capable of being annotationed
57 *
58 * @author <a href="mailto:jstrachan@protique.com">James Strachan</a>
59 * @version $Revision: 1.2 $
60 */
61 public class AnnotatedNode extends ASTNode {
62 private Map annotations = new HashMap();
63 private boolean synthetic;
64 ClassNode declaringClass;
65
66 public AnnotatedNode() {
67 }
68
69 public Map getAnnotations() {
70 return annotations;
71 }
72
73 public AnnotationNode getAnnotations(String name) {
74 return (AnnotationNode) annotations.get(name);
75 }
76
77 public void addAnnotation(String name, AnnotationNode value) {
78 AnnotationNode oldValue = (AnnotationNode) annotations.get(name);
79
80
81 if (oldValue == null) {
82 annotations.put(name, value);
83 }
84 else {
85 List list = null;
86 if (oldValue instanceof List) {
87 list = (List) oldValue;
88 }
89 else {
90 list = new ArrayList();
91 list.add(oldValue);
92 annotations.put(name, list);
93 }
94 list.add(value);
95 }
96 }
97
98 public void addAnnotations(List annotations) {
99 for (Iterator iter = annotations.iterator(); iter.hasNext();) {
100 AnnotationNode node = (AnnotationNode) iter.next();
101 addAnnotation(node.getName(), node);
102 }
103
104 }
105
106 public boolean isSynthetic() {
107 return synthetic;
108 }
109
110 public void setSynthetic(boolean synthetic) {
111 this.synthetic = synthetic;
112 }
113
114 protected void addFieldsToVisitor(VariableScope scope) {
115 for (Iterator iter = getDeclaringClass().getFields().iterator(); iter.hasNext();) {
116 FieldNode field = (FieldNode) iter.next();
117 String name = field.getName();
118
119 scope.getDeclaredVariables().add(name);
120 scope.getReferencedVariables().add(name);
121 }
122 }
123
124 public ClassNode getDeclaringClass() {
125 return declaringClass;
126 }
127
128 /***
129 * @param declaringClass The declaringClass to set.
130 */
131 public void setDeclaringClass(ClassNode declaringClass) {
132 this.declaringClass = declaringClass;
133 }
134 }