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.10 $
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 this.elementType = type;
101 this.sizeExpression = sizeExpression;
102 this.expressions = Collections.EMPTY_LIST;
103 }
104
105 public void addExpression(Expression expression) {
106 expressions.add(expression);
107 }
108
109 public List getExpressions() {
110 return expressions;
111 }
112
113 public void visit(GroovyCodeVisitor visitor) {
114 visitor.visitArrayExpression(this);
115 }
116
117 public boolean isDynamic() {
118 return false;
119 }
120
121 public Expression transformExpression(ExpressionTransformer transformer) {
122 return new ArrayExpression(type, transformExpressions(expressions, transformer));
123 }
124
125 public Expression getExpression(int i) {
126 Object object = expressions.get(i);
127 return (Expression) object;
128 }
129
130 public String getElementType() {
131 return elementType;
132 }
133
134 public String getText() {
135 StringBuffer buffer = new StringBuffer("[");
136 boolean first = true;
137 for (Iterator iter = expressions.iterator(); iter.hasNext();) {
138 if (first) {
139 first = false;
140 }
141 else {
142 buffer.append(", ");
143 }
144
145 buffer.append(((Expression) iter.next()).getText());
146 }
147 buffer.append("]");
148 return buffer.toString();
149 }
150
151 public Expression getSizeExpression() {
152 return sizeExpression;
153 }
154
155 public String toString() {
156 return super.toString() + expressions;
157 }
158
159 protected void resolveType(AsmClassGenerator resolver) {
160
161 }
162 }