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.ArrayList;
49 import java.util.Iterator;
50 import java.util.List;
51
52 import org.codehaus.groovy.ast.GroovyCodeVisitor;
53 import org.codehaus.groovy.classgen.AsmClassGenerator2;
54
55 /***
56 * Represents a list expression [1, 2, 3] which creates a mutable List
57 *
58 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
59 * @version $Revision: 1.3 $
60 */
61 public class ListExpression extends Expression {
62 private List expressions;
63
64 public ListExpression() {
65 this(new ArrayList());
66 }
67
68 public ListExpression(List expressions) {
69 this.expressions = expressions;
70
71 }
72
73 public void addExpression(Expression expression) {
74 expressions.add(expression);
75 }
76
77 public List getExpressions() {
78 return expressions;
79 }
80
81 public void visit(GroovyCodeVisitor visitor) {
82 visitor.visitListExpression(this);
83 }
84
85 public Expression transformExpression(ExpressionTransformer transformer) {
86 return new ListExpression(transformExpressions(getExpressions(), transformer));
87 }
88
89 protected void resolveType(AsmClassGenerator2 resolver) {
90 for (int i = 0; i < expressions.size(); i++) {
91 Expression expression = (Expression) expressions.get(i);
92 expression.resolve(resolver);
93 }
94 super.setTypeClass(List.class);
95 }
96
97 public Expression getExpression(int i) {
98 return (Expression) expressions.get(i);
99 }
100
101 public String getText() {
102 StringBuffer buffer = new StringBuffer("[");
103 boolean first = true;
104 for (Iterator iter = expressions.iterator(); iter.hasNext(); ) {
105 if (first) {
106 first = false;
107 }
108 else {
109 buffer.append(", ");
110 }
111
112 buffer.append(((Expression)iter.next()).getText());
113 }
114 buffer.append("]");
115 return buffer.toString();
116 }
117
118 public String toString() {
119 return super.toString() + expressions;
120 }
121
122 /***
123 * return the common element type of all the element
124 * @return
125 */
126 public Class getComponentTypeClass() {
127 boolean first = true;
128 Class cls = null;
129
130 for (Iterator iter = expressions.iterator(); iter.hasNext(); ) {
131 Expression exp = (Expression) iter.next();
132 if (cls == null) {
133 cls = exp.getTypeClass();
134 }
135 else {
136 if (cls != exp.getTypeClass()) {
137
138 return null;
139 }
140 }
141 }
142 return cls;
143 }
144
145
146 }