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