View Javadoc

1   /*
2    * ASTASClassType.java
3    * 
4    * Copyright (c) 2006-2007 David Holroyd
5    *
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
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  			// hack a space in at the right point,
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 					// no interfaces left, so remove the
139 					// 'implements' clause completely,
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 }