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.expr;
47
48 import java.util.Collections;
49 import java.util.Iterator;
50 import java.util.List;
51
52 import org.codehaus.groovy.ast.ClassNode;
53 import org.codehaus.groovy.ast.GroovyCodeVisitor;
54
55 /***
56 * Represents an array object construction either using a fixed size
57 * or an initializer expression
58 *
59 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
60 * @version $Revision: 1.16 $
61 */
62 public class ArrayExpression extends Expression {
63 private List expressions;
64 private List sizeExpression;
65
66 private ClassNode elementType;
67
68 private static ClassNode makeArray(ClassNode base, List sizeExpression) {
69 ClassNode ret = base.makeArray();
70 if (sizeExpression==null) return ret;
71 int size = sizeExpression.size();
72 for (int i=1; i<size; i++) {
73 ret = ret.makeArray();
74 }
75 return ret;
76 }
77
78 public ArrayExpression(ClassNode elementType, List expressions, List sizeExpression) {
79
80 super.setType(makeArray(elementType,sizeExpression));
81 if (expressions==null) expressions=Collections.EMPTY_LIST;
82 this.elementType = elementType;
83 this.expressions = expressions;
84 this.sizeExpression = sizeExpression;
85
86 for (Iterator iter = expressions.iterator(); iter.hasNext();) {
87 Object item = iter.next();
88 if (item!=null && !(item instanceof Expression)) {
89 throw new ClassCastException("Item: " + item + " is not an Expression");
90 }
91 }
92 if (sizeExpression!=null) {
93 for (Iterator iter = sizeExpression.iterator(); iter.hasNext();) {
94 Object item = iter.next();
95 if (!(item instanceof Expression)) {
96 throw new ClassCastException("Item: " + item + " is not an Expression");
97 }
98 }
99 }
100 }
101
102
103 /***
104 * Creates an array using an initializer expression
105 */
106 public ArrayExpression(ClassNode elementType, List expressions) {
107 this(elementType,expressions,null);
108 }
109
110 public void addExpression(Expression expression) {
111 expressions.add(expression);
112 }
113
114 public List getExpressions() {
115 return expressions;
116 }
117
118 public void visit(GroovyCodeVisitor visitor) {
119 visitor.visitArrayExpression(this);
120 }
121
122 public boolean isDynamic() {
123 return false;
124 }
125
126 public Expression transformExpression(ExpressionTransformer transformer) {
127 List exprList = transformExpressions(expressions, transformer);
128 List sizes = null;
129 if (sizeExpression!=null) sizes = transformExpressions(sizeExpression,transformer);
130 Expression ret = new ArrayExpression(elementType, exprList, sizes);
131 ret.setSourcePosition(this);
132 return ret;
133 }
134
135 public Expression getExpression(int i) {
136 Object object = expressions.get(i);
137 return (Expression) object;
138 }
139
140 public ClassNode getElementType() {
141 return elementType;
142 }
143
144 public String getText() {
145 StringBuffer buffer = new StringBuffer("[");
146 boolean first = true;
147 for (Iterator iter = expressions.iterator(); iter.hasNext();) {
148 if (first) {
149 first = false;
150 }
151 else {
152 buffer.append(", ");
153 }
154
155 buffer.append(((Expression) iter.next()).getText());
156 }
157 buffer.append("]");
158 return buffer.toString();
159 }
160
161 public List getSizeExpression() {
162 return sizeExpression;
163 }
164
165 public String toString() {
166 return super.toString() + expressions;
167 }
168 }