1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package uk.co.badgersinfoil.metaas.impl;
20
21 import java.util.Collections;
22 import java.util.LinkedList;
23 import java.util.List;
24 import org.asdt.core.internal.antlr.AS3Parser;
25 import uk.co.badgersinfoil.metaas.dom.ASClassType;
26 import uk.co.badgersinfoil.metaas.dom.ASField;
27 import uk.co.badgersinfoil.metaas.dom.ASMethod;
28 import uk.co.badgersinfoil.metaas.dom.Visibility;
29 import uk.co.badgersinfoil.metaas.impl.antlr.LinkedListToken;
30 import uk.co.badgersinfoil.metaas.impl.antlr.LinkedListTree;
31
32 public class ASTASClassType extends ASTASType implements ASClassType {
33
34 private static final int EXTENDS_INDEX = 3;
35
36 public ASTASClassType(LinkedListTree clazz) {
37 super(clazz);
38 }
39
40 public ASMethod newMethod(String name, Visibility visibility, String returnType) {
41 ASTASMethod method = ASTBuilder.newClassMethod(name, visibility, returnType);
42 addMethod(method);
43 return method;
44 }
45
46 public void addMethod(ASTASMethod method) {
47 ASTUtils.addChildWithIndentation(findTypeBlock(), method.getAST());
48 }
49
50 private LinkedListTree findModifiers() {
51 return ASTUtils.findChildByType(ast, AS3Parser.MODIFIERS);
52 }
53
54 public String getSuperclass() {
55 LinkedListTree ext = ASTUtils.findChildByType(ast, AS3Parser.EXTENDS);
56 if (ext == null) return null;
57 return ASTUtils.identText(ext.getFirstChild());
58 }
59
60 public boolean isDynamic() {
61 return ModifierUtils.isDynamic(findModifiers());
62 }
63
64 public boolean isFinal() {
65 return ModifierUtils.isFinal(findModifiers());
66 }
67
68 public void setSuperclass(String superclassName) {
69 if (superclassName == null) {
70 removeExtendsClause();
71 return;
72 }
73 LinkedListTree ext = ASTUtils.findChildByType(ast, AS3Parser.EXTENDS);
74 LinkedListTree superIdent = AS3FragmentParser.parseIdent(superclassName);
75 if (ext == null) {
76 ext = ASTUtils.newAST(AS3Parser.EXTENDS, "extends");
77 ext.appendToken(TokenBuilder.newSpace());
78
79 LinkedListToken sp = TokenBuilder.newSpace();
80 ext.getStartToken().beforeInsert(sp);
81 ext.setStartToken(sp);
82 ast.addChildWithTokens(EXTENDS_INDEX, ext);
83 ext.addChildWithTokens(superIdent);
84 ext.appendToken(TokenBuilder.newSpace());
85 } else {
86 ext.setChildWithTokens(0, superIdent);
87 }
88 }
89
90 private void removeExtendsClause() {
91 for (ASTIterator i=new ASTIterator(ast); i.hasNext(); ) {
92 LinkedListTree node = i.next();
93 if (node.getType() == AS3Parser.EXTENDS) {
94 i.remove();
95 break;
96 }
97 }
98 }
99
100 public List getImplementedInterfaces() {
101 List results = new LinkedList();
102 LinkedListTree impls = ASTUtils.findChildByType(ast, AS3Parser.IMPLEMENTS);
103 if (impls != null) {
104 for (ASTIterator i=new ASTIterator(impls); i.hasNext(); ) {
105 results.add(ASTUtils.identText(i.next()));
106 }
107 }
108 return Collections.unmodifiableList(results);
109 }
110
111 public void addImplementedInterface(String interfaceName) {
112 LinkedListTree iface = AS3FragmentParser.parseIdent(interfaceName);
113 LinkedListTree impls = ASTUtils.findChildByType(ast, AS3Parser.IMPLEMENTS);
114 if (impls == null) {
115 ASTIterator i = new ASTIterator(ast);
116 i.find(AS3Parser.TYPE_BLOCK);
117 impls = ASTUtils.newAST(AS3Parser.IMPLEMENTS, "implements");
118 i.insertBeforeCurrent(impls);
119 LinkedListToken sp = TokenBuilder.newSpace();
120 impls.getStartToken().beforeInsert(sp);
121 } else {
122 impls.appendToken(TokenBuilder.newComma());
123 }
124 impls.appendToken(TokenBuilder.newSpace());
125 impls.addChildWithTokens(iface);
126 }
127
128 public void removeImplementedInterface(String interfaceName) {
129 LinkedListTree impls = ASTUtils.findChildByType(ast, AS3Parser.IMPLEMENTS);
130 int count = 0;
131 for (ASTIterator i=new ASTIterator(impls); i.hasNext(); ) {
132 LinkedListTree iface = i.next();
133 String name = ASTUtils.identText(iface);
134 if (name.equals(interfaceName)) {
135 if (i.hasNext()) {
136 ASTUtils.removeTrailingWhitespaceAndComma(iface.getStopToken());
137 } else if (count == 0) {
138
139
140 ast.deleteChild(ast.getIndexOfChild(impls));
141 break;
142 }
143 i.remove();
144 if (i.hasNext()) {
145 count++;
146 }
147 break;
148 }
149 count++;
150 }
151 }
152
153 public ASField newField(String name, Visibility visibility, String type) {
154 ASTASField field = ASTBuilder.newField(name, visibility, type);
155 addField(field);
156 return field;
157 }
158
159 public void addField(ASTASField field) {
160 ASTUtils.addChildWithIndentation(findTypeBlock(), field.getAST());
161 }
162
163 public ASField getField(String name) {
164 for (ASTIterator i=blockIter(); i.hasNext(); ) {
165 LinkedListTree member = i.next();
166 if (member.getType() == AS3Parser.VAR_DEF) {
167 ASField field = new ASTASField(member);
168 if (field.getName().equals(name)) {
169 return field;
170 }
171 }
172 }
173 return null;
174 }
175
176 public List getFields() {
177 List results = new LinkedList();
178 for (ASTIterator i=blockIter(); i.hasNext(); ) {
179 LinkedListTree member = i.next();
180 if (member.getType() == AS3Parser.VAR_DEF) {
181 results.add(new ASTASField(member));
182 }
183 }
184 return Collections.unmodifiableList(results);
185 }
186
187 public void removeField(String name) {
188 for (ASTIterator i=blockIter(); i.hasNext(); ) {
189 LinkedListTree member = i.next();
190 if (member.getType() == AS3Parser.VAR_DEF) {
191 ASField field = new ASTASField(member);
192 if (field.getName().equals(name)) {
193 i.remove();
194 return;
195 }
196 }
197 }
198 }
199
200 public void setDynamic(boolean value) {
201 ModifierUtils.setDynamic(findModifiers(), value);
202 }
203
204 public void setFinal(boolean value) {
205 ModifierUtils.setFinal(findModifiers(), value);
206 }
207
208 }