| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of tree; | 5 part of tree; |
| 6 | 6 |
| 7 String unparse(Node node) { | 7 String unparse(Node node) { |
| 8 Unparser unparser = new Unparser(); | 8 Unparser unparser = new Unparser(); |
| 9 unparser.unparse(node); | 9 unparser.unparse(node); |
| 10 return unparser.result; | 10 return unparser.result; |
| 11 } | 11 } |
| 12 | 12 |
| 13 class Unparser implements Visitor { | 13 class Unparser implements Visitor { |
| 14 final StringBuffer sb; | 14 final StringBuffer sb; |
| 15 | 15 |
| 16 String get result => sb.toString(); | 16 String get result => sb.toString(); |
| 17 | 17 |
| 18 Unparser() : sb = new StringBuffer(); | 18 Unparser() : sb = new StringBuffer(); |
| 19 | 19 |
| 20 void add(SourceString string) { | 20 void add(SourceString string) { |
| 21 string.printOn(sb); | 21 string.printOn(sb); |
| 22 } | 22 } |
| 23 | 23 |
| 24 void addToken(Token token) { | 24 void addToken(Token token) { |
| 25 if (token == null) return; | 25 if (token == null) return; |
| 26 add(token.value); | 26 add(token.value); |
| 27 if (identical(token.kind, KEYWORD_TOKEN) | 27 if (identical(token.kind, KEYWORD_TOKEN) |
| 28 || identical(token.kind, IDENTIFIER_TOKEN)) { | 28 || identical(token.kind, IDENTIFIER_TOKEN)) { |
| 29 sb.add(' '); | 29 sb.write(' '); |
| 30 } | 30 } |
| 31 } | 31 } |
| 32 | 32 |
| 33 unparse(Node node) { visit(node); } | 33 unparse(Node node) { visit(node); } |
| 34 | 34 |
| 35 visit(Node node) { | 35 visit(Node node) { |
| 36 if (node != null) node.accept(this); | 36 if (node != null) node.accept(this); |
| 37 } | 37 } |
| 38 | 38 |
| 39 visitBlock(Block node) { | 39 visitBlock(Block node) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 51 unparseClassWithBody(ClassNode node, Iterable<Node> members) { | 51 unparseClassWithBody(ClassNode node, Iterable<Node> members) { |
| 52 addToken(node.beginToken); | 52 addToken(node.beginToken); |
| 53 if (node.beginToken.stringValue == 'abstract') { | 53 if (node.beginToken.stringValue == 'abstract') { |
| 54 addToken(node.beginToken.next); | 54 addToken(node.beginToken.next); |
| 55 } | 55 } |
| 56 visit(node.name); | 56 visit(node.name); |
| 57 if (node.typeParameters != null) { | 57 if (node.typeParameters != null) { |
| 58 visit(node.typeParameters); | 58 visit(node.typeParameters); |
| 59 } | 59 } |
| 60 if (node.extendsKeyword != null) { | 60 if (node.extendsKeyword != null) { |
| 61 sb.add(' '); | 61 sb.write(' '); |
| 62 addToken(node.extendsKeyword); | 62 addToken(node.extendsKeyword); |
| 63 visit(node.superclass); | 63 visit(node.superclass); |
| 64 } | 64 } |
| 65 if (!node.interfaces.isEmpty) { | 65 if (!node.interfaces.isEmpty) { |
| 66 sb.add(' '); | 66 sb.write(' '); |
| 67 visit(node.interfaces); | 67 visit(node.interfaces); |
| 68 } | 68 } |
| 69 if (node.defaultClause != null) { | 69 if (node.defaultClause != null) { |
| 70 sb.add(' default '); | 70 sb.write(' default '); |
| 71 visit(node.defaultClause); | 71 visit(node.defaultClause); |
| 72 } | 72 } |
| 73 sb.add('{'); | 73 sb.write('{'); |
| 74 for (final member in members) { | 74 for (final member in members) { |
| 75 visit(member); | 75 visit(member); |
| 76 } | 76 } |
| 77 sb.add('}'); | 77 sb.write('}'); |
| 78 } | 78 } |
| 79 | 79 |
| 80 visitClassNode(ClassNode node) { | 80 visitClassNode(ClassNode node) { |
| 81 unparseClassWithBody(node, node.body.nodes); | 81 unparseClassWithBody(node, node.body.nodes); |
| 82 } | 82 } |
| 83 | 83 |
| 84 visitMixinApplication(MixinApplication node) { | 84 visitMixinApplication(MixinApplication node) { |
| 85 visit(node.superclass); | 85 visit(node.superclass); |
| 86 sb.add(' with '); | 86 sb.write(' with '); |
| 87 visit(node.mixins); | 87 visit(node.mixins); |
| 88 } | 88 } |
| 89 | 89 |
| 90 visitNamedMixinApplication(NamedMixinApplication node) { | 90 visitNamedMixinApplication(NamedMixinApplication node) { |
| 91 sb.add('typedef '); | 91 sb.write('typedef '); |
| 92 visit(node.name); | 92 visit(node.name); |
| 93 if (node.typeParameters != null) { | 93 if (node.typeParameters != null) { |
| 94 visit(node.typeParameters); | 94 visit(node.typeParameters); |
| 95 } | 95 } |
| 96 sb.add(' = '); | 96 sb.write(' = '); |
| 97 if (!node.modifiers.nodes.isEmpty) { | 97 if (!node.modifiers.nodes.isEmpty) { |
| 98 visit(node.modifiers); | 98 visit(node.modifiers); |
| 99 sb.add(' '); | 99 sb.write(' '); |
| 100 } | 100 } |
| 101 visit(node.mixinApplication); | 101 visit(node.mixinApplication); |
| 102 if (node.interfaces != null) { | 102 if (node.interfaces != null) { |
| 103 sb.add(' implements '); | 103 sb.write(' implements '); |
| 104 visit(node.interfaces); | 104 visit(node.interfaces); |
| 105 } | 105 } |
| 106 sb.add(';'); | 106 sb.write(';'); |
| 107 } | 107 } |
| 108 | 108 |
| 109 visitConditional(Conditional node) { | 109 visitConditional(Conditional node) { |
| 110 visit(node.condition); | 110 visit(node.condition); |
| 111 add(node.questionToken.value); | 111 add(node.questionToken.value); |
| 112 visit(node.thenExpression); | 112 visit(node.thenExpression); |
| 113 add(node.colonToken.value); | 113 add(node.colonToken.value); |
| 114 visit(node.elseExpression); | 114 visit(node.elseExpression); |
| 115 } | 115 } |
| 116 | 116 |
| 117 visitExpressionStatement(ExpressionStatement node) { | 117 visitExpressionStatement(ExpressionStatement node) { |
| 118 visit(node.expression); | 118 visit(node.expression); |
| 119 add(node.endToken.value); | 119 add(node.endToken.value); |
| 120 } | 120 } |
| 121 | 121 |
| 122 visitFor(For node) { | 122 visitFor(For node) { |
| 123 add(node.forToken.value); | 123 add(node.forToken.value); |
| 124 sb.add('('); | 124 sb.write('('); |
| 125 visit(node.initializer); | 125 visit(node.initializer); |
| 126 sb.add(';'); | 126 sb.write(';'); |
| 127 visit(node.conditionStatement); | 127 visit(node.conditionStatement); |
| 128 visit(node.update); | 128 visit(node.update); |
| 129 sb.add(')'); | 129 sb.write(')'); |
| 130 visit(node.body); | 130 visit(node.body); |
| 131 } | 131 } |
| 132 | 132 |
| 133 visitFunctionDeclaration(FunctionDeclaration node) { | 133 visitFunctionDeclaration(FunctionDeclaration node) { |
| 134 visit(node.function); | 134 visit(node.function); |
| 135 } | 135 } |
| 136 | 136 |
| 137 void unparseFunctionName(Node name) { | 137 void unparseFunctionName(Node name) { |
| 138 // TODO(antonm): that's a workaround as currently FunctionExpression | 138 // TODO(antonm): that's a workaround as currently FunctionExpression |
| 139 // names are modelled with Send and it emits operator[] as only | 139 // names are modelled with Send and it emits operator[] as only |
| 140 // operator, without [] which are expected to be emitted with | 140 // operator, without [] which are expected to be emitted with |
| 141 // arguments. | 141 // arguments. |
| 142 if (name is Send) { | 142 if (name is Send) { |
| 143 Send send = name; | 143 Send send = name; |
| 144 assert(send is !SendSet); | 144 assert(send is !SendSet); |
| 145 if (!send.isOperator) { | 145 if (!send.isOperator) { |
| 146 // Looks like a factory method. | 146 // Looks like a factory method. |
| 147 visit(send.receiver); | 147 visit(send.receiver); |
| 148 sb.add('.'); | 148 sb.write('.'); |
| 149 } else { | 149 } else { |
| 150 visit(send.receiver); | 150 visit(send.receiver); |
| 151 Identifier identifier = send.selector.asIdentifier(); | 151 Identifier identifier = send.selector.asIdentifier(); |
| 152 if (identical(identifier.token.kind, KEYWORD_TOKEN)) { | 152 if (identical(identifier.token.kind, KEYWORD_TOKEN)) { |
| 153 sb.add(' '); | 153 sb.write(' '); |
| 154 } else if (identifier.source == const SourceString('negate')) { | 154 } else if (identifier.source == const SourceString('negate')) { |
| 155 // TODO(ahe): Remove special case for negate. | 155 // TODO(ahe): Remove special case for negate. |
| 156 sb.add(' '); | 156 sb.write(' '); |
| 157 } | 157 } |
| 158 } | 158 } |
| 159 visit(send.selector); | 159 visit(send.selector); |
| 160 } else { | 160 } else { |
| 161 visit(name); | 161 visit(name); |
| 162 } | 162 } |
| 163 } | 163 } |
| 164 | 164 |
| 165 visitFunctionExpression(FunctionExpression node) { | 165 visitFunctionExpression(FunctionExpression node) { |
| 166 if (!node.modifiers.nodes.isEmpty) { | 166 if (!node.modifiers.nodes.isEmpty) { |
| 167 visit(node.modifiers); | 167 visit(node.modifiers); |
| 168 sb.add(' '); | 168 sb.write(' '); |
| 169 } | 169 } |
| 170 if (node.returnType != null) { | 170 if (node.returnType != null) { |
| 171 visit(node.returnType); | 171 visit(node.returnType); |
| 172 sb.add(' '); | 172 sb.write(' '); |
| 173 } | 173 } |
| 174 if (node.getOrSet != null) { | 174 if (node.getOrSet != null) { |
| 175 add(node.getOrSet.value); | 175 add(node.getOrSet.value); |
| 176 sb.add(' '); | 176 sb.write(' '); |
| 177 } | 177 } |
| 178 unparseFunctionName(node.name); | 178 unparseFunctionName(node.name); |
| 179 visit(node.parameters); | 179 visit(node.parameters); |
| 180 visit(node.initializers); | 180 visit(node.initializers); |
| 181 visit(node.body); | 181 visit(node.body); |
| 182 } | 182 } |
| 183 | 183 |
| 184 visitIdentifier(Identifier node) { | 184 visitIdentifier(Identifier node) { |
| 185 add(node.token.value); | 185 add(node.token.value); |
| 186 } | 186 } |
| 187 | 187 |
| 188 visitIf(If node) { | 188 visitIf(If node) { |
| 189 add(node.ifToken.value); | 189 add(node.ifToken.value); |
| 190 visit(node.condition); | 190 visit(node.condition); |
| 191 visit(node.thenPart); | 191 visit(node.thenPart); |
| 192 if (node.hasElsePart) { | 192 if (node.hasElsePart) { |
| 193 add(node.elseToken.value); | 193 add(node.elseToken.value); |
| 194 if (node.elsePart is !Block) sb.add(' '); | 194 if (node.elsePart is !Block) sb.write(' '); |
| 195 visit(node.elsePart); | 195 visit(node.elsePart); |
| 196 } | 196 } |
| 197 } | 197 } |
| 198 | 198 |
| 199 visitLiteralBool(LiteralBool node) { | 199 visitLiteralBool(LiteralBool node) { |
| 200 add(node.token.value); | 200 add(node.token.value); |
| 201 } | 201 } |
| 202 | 202 |
| 203 visitLiteralDouble(LiteralDouble node) { | 203 visitLiteralDouble(LiteralDouble node) { |
| 204 add(node.token.value); | 204 add(node.token.value); |
| 205 // -Lit is represented as a send. | 205 // -Lit is represented as a send. |
| 206 if (node.token.kind == PLUS_TOKEN) add(node.token.next.value); | 206 if (node.token.kind == PLUS_TOKEN) add(node.token.next.value); |
| 207 } | 207 } |
| 208 | 208 |
| 209 visitLiteralInt(LiteralInt node) { | 209 visitLiteralInt(LiteralInt node) { |
| 210 add(node.token.value); | 210 add(node.token.value); |
| 211 // -Lit is represented as a send. | 211 // -Lit is represented as a send. |
| 212 if (node.token.kind == PLUS_TOKEN) add(node.token.next.value); | 212 if (node.token.kind == PLUS_TOKEN) add(node.token.next.value); |
| 213 } | 213 } |
| 214 | 214 |
| 215 visitLiteralString(LiteralString node) { | 215 visitLiteralString(LiteralString node) { |
| 216 add(node.token.value); | 216 add(node.token.value); |
| 217 } | 217 } |
| 218 | 218 |
| 219 visitStringJuxtaposition(StringJuxtaposition node) { | 219 visitStringJuxtaposition(StringJuxtaposition node) { |
| 220 visit(node.first); | 220 visit(node.first); |
| 221 sb.add(" "); | 221 sb.write(" "); |
| 222 visit(node.second); | 222 visit(node.second); |
| 223 } | 223 } |
| 224 | 224 |
| 225 visitLiteralNull(LiteralNull node) { | 225 visitLiteralNull(LiteralNull node) { |
| 226 add(node.token.value); | 226 add(node.token.value); |
| 227 } | 227 } |
| 228 | 228 |
| 229 visitNewExpression(NewExpression node) { | 229 visitNewExpression(NewExpression node) { |
| 230 addToken(node.newToken); | 230 addToken(node.newToken); |
| 231 visit(node.send); | 231 visit(node.send); |
| 232 } | 232 } |
| 233 | 233 |
| 234 visitLiteralList(LiteralList node) { | 234 visitLiteralList(LiteralList node) { |
| 235 if (node.constKeyword != null) add(node.constKeyword.value); | 235 if (node.constKeyword != null) add(node.constKeyword.value); |
| 236 visit(node.typeArguments); | 236 visit(node.typeArguments); |
| 237 visit(node.elements); | 237 visit(node.elements); |
| 238 // If list is empty, emit space after [] to disambiguate cases like []==[]. | 238 // If list is empty, emit space after [] to disambiguate cases like []==[]. |
| 239 if (node.elements.isEmpty) sb.add(' '); | 239 if (node.elements.isEmpty) sb.write(' '); |
| 240 } | 240 } |
| 241 | 241 |
| 242 visitModifiers(Modifiers node) => node.visitChildren(this); | 242 visitModifiers(Modifiers node) => node.visitChildren(this); |
| 243 | 243 |
| 244 /** | 244 /** |
| 245 * Unparses given NodeList starting from specific node. | 245 * Unparses given NodeList starting from specific node. |
| 246 */ | 246 */ |
| 247 unparseNodeListFrom(NodeList node, Link<Node> from) { | 247 unparseNodeListFrom(NodeList node, Link<Node> from) { |
| 248 if (from.isEmpty) return; | 248 if (from.isEmpty) return; |
| 249 String delimiter = (node.delimiter == null) ? "" : "${node.delimiter}"; | 249 String delimiter = (node.delimiter == null) ? "" : "${node.delimiter}"; |
| 250 visit(from.head); | 250 visit(from.head); |
| 251 for (Link link = from.tail; !link.isEmpty; link = link.tail) { | 251 for (Link link = from.tail; !link.isEmpty; link = link.tail) { |
| 252 sb.add(delimiter); | 252 sb.write(delimiter); |
| 253 visit(link.head); | 253 visit(link.head); |
| 254 } | 254 } |
| 255 } | 255 } |
| 256 | 256 |
| 257 visitNodeList(NodeList node) { | 257 visitNodeList(NodeList node) { |
| 258 addToken(node.beginToken); | 258 addToken(node.beginToken); |
| 259 if (node.nodes != null) { | 259 if (node.nodes != null) { |
| 260 unparseNodeListFrom(node, node.nodes); | 260 unparseNodeListFrom(node, node.nodes); |
| 261 } | 261 } |
| 262 if (node.endToken != null) add(node.endToken.value); | 262 if (node.endToken != null) add(node.endToken.value); |
| 263 } | 263 } |
| 264 | 264 |
| 265 visitOperator(Operator node) { | 265 visitOperator(Operator node) { |
| 266 visitIdentifier(node); | 266 visitIdentifier(node); |
| 267 } | 267 } |
| 268 | 268 |
| 269 visitReturn(Return node) { | 269 visitReturn(Return node) { |
| 270 if (node.isRedirectingFactoryBody) { | 270 if (node.isRedirectingFactoryBody) { |
| 271 sb.add(' '); | 271 sb.write(' '); |
| 272 } | 272 } |
| 273 add(node.beginToken.value); | 273 add(node.beginToken.value); |
| 274 if (node.hasExpression && node.beginToken.stringValue != '=>') { | 274 if (node.hasExpression && node.beginToken.stringValue != '=>') { |
| 275 sb.add(' '); | 275 sb.write(' '); |
| 276 } | 276 } |
| 277 visit(node.expression); | 277 visit(node.expression); |
| 278 if (node.endToken != null) add(node.endToken.value); | 278 if (node.endToken != null) add(node.endToken.value); |
| 279 } | 279 } |
| 280 | 280 |
| 281 unparseSendReceiver(Send node, {bool spacesNeeded: false}) { | 281 unparseSendReceiver(Send node, {bool spacesNeeded: false}) { |
| 282 if (node.receiver == null) return; | 282 if (node.receiver == null) return; |
| 283 visit(node.receiver); | 283 visit(node.receiver); |
| 284 CascadeReceiver asCascadeReceiver = node.receiver.asCascadeReceiver(); | 284 CascadeReceiver asCascadeReceiver = node.receiver.asCascadeReceiver(); |
| 285 if (asCascadeReceiver != null) { | 285 if (asCascadeReceiver != null) { |
| 286 add(asCascadeReceiver.cascadeOperator.value); | 286 add(asCascadeReceiver.cascadeOperator.value); |
| 287 } else if (node.selector.asOperator() == null) { | 287 } else if (node.selector.asOperator() == null) { |
| 288 sb.add('.'); | 288 sb.write('.'); |
| 289 } else if (spacesNeeded) { | 289 } else if (spacesNeeded) { |
| 290 sb.add(' '); | 290 sb.write(' '); |
| 291 } | 291 } |
| 292 } | 292 } |
| 293 | 293 |
| 294 visitSend(Send node) { | 294 visitSend(Send node) { |
| 295 Operator op = node.selector.asOperator(); | 295 Operator op = node.selector.asOperator(); |
| 296 String opString = op != null ? op.source.stringValue : null; | 296 String opString = op != null ? op.source.stringValue : null; |
| 297 bool spacesNeeded = identical(opString, 'is') || identical(opString, 'as'); | 297 bool spacesNeeded = identical(opString, 'is') || identical(opString, 'as'); |
| 298 | 298 |
| 299 if (node.isPrefix) visit(node.selector); | 299 if (node.isPrefix) visit(node.selector); |
| 300 unparseSendReceiver(node, spacesNeeded: spacesNeeded); | 300 unparseSendReceiver(node, spacesNeeded: spacesNeeded); |
| 301 if (!node.isPrefix && !node.isIndex) visit(node.selector); | 301 if (!node.isPrefix && !node.isIndex) visit(node.selector); |
| 302 if (spacesNeeded) sb.add(' '); | 302 if (spacesNeeded) sb.write(' '); |
| 303 // Also add a space for sequences like x + +1 and y - -y. | 303 // Also add a space for sequences like x + +1 and y - -y. |
| 304 // TODO(ahe): remove case for '+' when we drop the support for it. | 304 // TODO(ahe): remove case for '+' when we drop the support for it. |
| 305 if (node.argumentsNode != null && (identical(opString, '-') | 305 if (node.argumentsNode != null && (identical(opString, '-') |
| 306 || identical(opString, '+'))) { | 306 || identical(opString, '+'))) { |
| 307 Token beginToken = node.argumentsNode.getBeginToken(); | 307 Token beginToken = node.argumentsNode.getBeginToken(); |
| 308 if (beginToken != null && identical(beginToken.stringValue, opString)) { | 308 if (beginToken != null && identical(beginToken.stringValue, opString)) { |
| 309 sb.add(' '); | 309 sb.write(' '); |
| 310 } | 310 } |
| 311 } | 311 } |
| 312 visit(node.argumentsNode); | 312 visit(node.argumentsNode); |
| 313 } | 313 } |
| 314 | 314 |
| 315 visitSendSet(SendSet node) { | 315 visitSendSet(SendSet node) { |
| 316 if (node.isPrefix) { | 316 if (node.isPrefix) { |
| 317 sb.add(' '); | 317 sb.write(' '); |
| 318 visit(node.assignmentOperator); | 318 visit(node.assignmentOperator); |
| 319 } | 319 } |
| 320 unparseSendReceiver(node); | 320 unparseSendReceiver(node); |
| 321 if (node.isIndex) { | 321 if (node.isIndex) { |
| 322 sb.add('['); | 322 sb.write('['); |
| 323 visit(node.arguments.head); | 323 visit(node.arguments.head); |
| 324 sb.add(']'); | 324 sb.write(']'); |
| 325 if (!node.isPrefix) visit(node.assignmentOperator); | 325 if (!node.isPrefix) visit(node.assignmentOperator); |
| 326 unparseNodeListFrom(node.argumentsNode, node.argumentsNode.nodes.tail); | 326 unparseNodeListFrom(node.argumentsNode, node.argumentsNode.nodes.tail); |
| 327 } else { | 327 } else { |
| 328 visit(node.selector); | 328 visit(node.selector); |
| 329 if (!node.isPrefix) { | 329 if (!node.isPrefix) { |
| 330 visit(node.assignmentOperator); | 330 visit(node.assignmentOperator); |
| 331 if (node.assignmentOperator.source.slowToString() != '=') sb.add(' '); | 331 if (node.assignmentOperator.source.slowToString() != '=') sb.write(' '); |
| 332 } | 332 } |
| 333 visit(node.argumentsNode); | 333 visit(node.argumentsNode); |
| 334 } | 334 } |
| 335 } | 335 } |
| 336 | 336 |
| 337 visitThrow(Throw node) { | 337 visitThrow(Throw node) { |
| 338 add(node.throwToken.value); | 338 add(node.throwToken.value); |
| 339 if (node.expression != null) { | 339 if (node.expression != null) { |
| 340 sb.add(' '); | 340 sb.write(' '); |
| 341 visit(node.expression); | 341 visit(node.expression); |
| 342 } | 342 } |
| 343 node.endToken.value.printOn(sb); | 343 node.endToken.value.printOn(sb); |
| 344 } | 344 } |
| 345 | 345 |
| 346 visitTypeAnnotation(TypeAnnotation node) { | 346 visitTypeAnnotation(TypeAnnotation node) { |
| 347 visit(node.typeName); | 347 visit(node.typeName); |
| 348 visit(node.typeArguments); | 348 visit(node.typeArguments); |
| 349 } | 349 } |
| 350 | 350 |
| 351 visitTypeVariable(TypeVariable node) { | 351 visitTypeVariable(TypeVariable node) { |
| 352 visit(node.name); | 352 visit(node.name); |
| 353 if (node.bound != null) { | 353 if (node.bound != null) { |
| 354 sb.add(' extends '); | 354 sb.write(' extends '); |
| 355 visit(node.bound); | 355 visit(node.bound); |
| 356 } | 356 } |
| 357 } | 357 } |
| 358 | 358 |
| 359 visitVariableDefinitions(VariableDefinitions node) { | 359 visitVariableDefinitions(VariableDefinitions node) { |
| 360 visit(node.modifiers); | 360 visit(node.modifiers); |
| 361 if (!node.modifiers.nodes.isEmpty) { | 361 if (!node.modifiers.nodes.isEmpty) { |
| 362 sb.add(' '); | 362 sb.write(' '); |
| 363 } | 363 } |
| 364 if (node.type != null) { | 364 if (node.type != null) { |
| 365 visit(node.type); | 365 visit(node.type); |
| 366 sb.add(' '); | 366 sb.write(' '); |
| 367 } | 367 } |
| 368 visit(node.definitions); | 368 visit(node.definitions); |
| 369 } | 369 } |
| 370 | 370 |
| 371 visitDoWhile(DoWhile node) { | 371 visitDoWhile(DoWhile node) { |
| 372 add(node.doKeyword.value); | 372 add(node.doKeyword.value); |
| 373 if (node.body is !Block) sb.add(' '); | 373 if (node.body is !Block) sb.write(' '); |
| 374 visit(node.body); | 374 visit(node.body); |
| 375 add(node.whileKeyword.value); | 375 add(node.whileKeyword.value); |
| 376 visit(node.condition); | 376 visit(node.condition); |
| 377 sb.add(node.endToken.value); | 377 sb.write(node.endToken.value); |
| 378 } | 378 } |
| 379 | 379 |
| 380 visitWhile(While node) { | 380 visitWhile(While node) { |
| 381 addToken(node.whileKeyword); | 381 addToken(node.whileKeyword); |
| 382 visit(node.condition); | 382 visit(node.condition); |
| 383 visit(node.body); | 383 visit(node.body); |
| 384 } | 384 } |
| 385 | 385 |
| 386 visitParenthesizedExpression(ParenthesizedExpression node) { | 386 visitParenthesizedExpression(ParenthesizedExpression node) { |
| 387 add(node.getBeginToken().value); | 387 add(node.getBeginToken().value); |
| 388 visit(node.expression); | 388 visit(node.expression); |
| 389 add(node.getEndToken().value); | 389 add(node.getEndToken().value); |
| 390 } | 390 } |
| 391 | 391 |
| 392 visitStringInterpolation(StringInterpolation node) { | 392 visitStringInterpolation(StringInterpolation node) { |
| 393 visit(node.string); | 393 visit(node.string); |
| 394 visit(node.parts); | 394 visit(node.parts); |
| 395 } | 395 } |
| 396 | 396 |
| 397 visitStringInterpolationPart(StringInterpolationPart node) { | 397 visitStringInterpolationPart(StringInterpolationPart node) { |
| 398 sb.add('\${'); // TODO(ahe): Preserve the real tokens. | 398 sb.write('\${'); // TODO(ahe): Preserve the real tokens. |
| 399 visit(node.expression); | 399 visit(node.expression); |
| 400 sb.add('}'); | 400 sb.write('}'); |
| 401 visit(node.string); | 401 visit(node.string); |
| 402 } | 402 } |
| 403 | 403 |
| 404 visitEmptyStatement(EmptyStatement node) { | 404 visitEmptyStatement(EmptyStatement node) { |
| 405 add(node.semicolonToken.value); | 405 add(node.semicolonToken.value); |
| 406 } | 406 } |
| 407 | 407 |
| 408 visitGotoStatement(GotoStatement node) { | 408 visitGotoStatement(GotoStatement node) { |
| 409 add(node.keywordToken.value); | 409 add(node.keywordToken.value); |
| 410 if (node.target != null) { | 410 if (node.target != null) { |
| 411 sb.add(' '); | 411 sb.write(' '); |
| 412 visit(node.target); | 412 visit(node.target); |
| 413 } | 413 } |
| 414 add(node.semicolonToken.value); | 414 add(node.semicolonToken.value); |
| 415 } | 415 } |
| 416 | 416 |
| 417 visitBreakStatement(BreakStatement node) { | 417 visitBreakStatement(BreakStatement node) { |
| 418 visitGotoStatement(node); | 418 visitGotoStatement(node); |
| 419 } | 419 } |
| 420 | 420 |
| 421 visitContinueStatement(ContinueStatement node) { | 421 visitContinueStatement(ContinueStatement node) { |
| 422 visitGotoStatement(node); | 422 visitGotoStatement(node); |
| 423 } | 423 } |
| 424 | 424 |
| 425 visitForIn(ForIn node) { | 425 visitForIn(ForIn node) { |
| 426 add(node.forToken.value); | 426 add(node.forToken.value); |
| 427 sb.add('('); | 427 sb.write('('); |
| 428 visit(node.declaredIdentifier); | 428 visit(node.declaredIdentifier); |
| 429 sb.add(' '); | 429 sb.write(' '); |
| 430 addToken(node.inToken); | 430 addToken(node.inToken); |
| 431 visit(node.expression); | 431 visit(node.expression); |
| 432 sb.add(')'); | 432 sb.write(')'); |
| 433 visit(node.body); | 433 visit(node.body); |
| 434 } | 434 } |
| 435 | 435 |
| 436 visitLabel(Label node) { | 436 visitLabel(Label node) { |
| 437 visit(node.identifier); | 437 visit(node.identifier); |
| 438 add(node.colonToken.value); | 438 add(node.colonToken.value); |
| 439 } | 439 } |
| 440 | 440 |
| 441 visitLabeledStatement(LabeledStatement node) { | 441 visitLabeledStatement(LabeledStatement node) { |
| 442 visit(node.labels); | 442 visit(node.labels); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 463 | 463 |
| 464 visitSwitchStatement(SwitchStatement node) { | 464 visitSwitchStatement(SwitchStatement node) { |
| 465 addToken(node.switchKeyword); | 465 addToken(node.switchKeyword); |
| 466 visit(node.parenthesizedExpression); | 466 visit(node.parenthesizedExpression); |
| 467 visit(node.cases); | 467 visit(node.cases); |
| 468 } | 468 } |
| 469 | 469 |
| 470 visitSwitchCase(SwitchCase node) { | 470 visitSwitchCase(SwitchCase node) { |
| 471 visit(node.labelsAndCases); | 471 visit(node.labelsAndCases); |
| 472 if (node.isDefaultCase) { | 472 if (node.isDefaultCase) { |
| 473 sb.add('default:'); | 473 sb.write('default:'); |
| 474 } | 474 } |
| 475 visit(node.statements); | 475 visit(node.statements); |
| 476 } | 476 } |
| 477 | 477 |
| 478 unparseImportTag(String uri, [String prefix]) { | 478 unparseImportTag(String uri, [String prefix]) { |
| 479 final suffix = prefix == null ? '' : ' as $prefix'; | 479 final suffix = prefix == null ? '' : ' as $prefix'; |
| 480 sb.add('import "$uri"$suffix;'); | 480 sb.write('import "$uri"$suffix;'); |
| 481 } | 481 } |
| 482 | 482 |
| 483 visitScriptTag(ScriptTag node) { | 483 visitScriptTag(ScriptTag node) { |
| 484 add(node.beginToken.value); | 484 add(node.beginToken.value); |
| 485 visit(node.tag); | 485 visit(node.tag); |
| 486 sb.add('('); | 486 sb.write('('); |
| 487 visit(node.argument); | 487 visit(node.argument); |
| 488 if (node.prefixIdentifier != null) { | 488 if (node.prefixIdentifier != null) { |
| 489 visit(node.prefixIdentifier); | 489 visit(node.prefixIdentifier); |
| 490 sb.add(':'); | 490 sb.write(':'); |
| 491 visit(node.prefix); | 491 visit(node.prefix); |
| 492 } | 492 } |
| 493 sb.add(')'); | 493 sb.write(')'); |
| 494 add(node.endToken.value); | 494 add(node.endToken.value); |
| 495 } | 495 } |
| 496 | 496 |
| 497 visitTryStatement(TryStatement node) { | 497 visitTryStatement(TryStatement node) { |
| 498 addToken(node.tryKeyword); | 498 addToken(node.tryKeyword); |
| 499 visit(node.tryBlock); | 499 visit(node.tryBlock); |
| 500 visit(node.catchBlocks); | 500 visit(node.catchBlocks); |
| 501 if (node.finallyKeyword != null) { | 501 if (node.finallyKeyword != null) { |
| 502 addToken(node.finallyKeyword); | 502 addToken(node.finallyKeyword); |
| 503 visit(node.finallyBlock); | 503 visit(node.finallyBlock); |
| 504 } | 504 } |
| 505 } | 505 } |
| 506 | 506 |
| 507 visitCaseMatch(CaseMatch node) { | 507 visitCaseMatch(CaseMatch node) { |
| 508 add(node.caseKeyword.value); | 508 add(node.caseKeyword.value); |
| 509 sb.add(" "); | 509 sb.write(" "); |
| 510 visit(node.expression); | 510 visit(node.expression); |
| 511 add(node.colonToken.value); | 511 add(node.colonToken.value); |
| 512 } | 512 } |
| 513 | 513 |
| 514 visitCatchBlock(CatchBlock node) { | 514 visitCatchBlock(CatchBlock node) { |
| 515 addToken(node.onKeyword); | 515 addToken(node.onKeyword); |
| 516 if (node.type != null) { | 516 if (node.type != null) { |
| 517 visit(node.type); | 517 visit(node.type); |
| 518 sb.add(' '); | 518 sb.write(' '); |
| 519 } | 519 } |
| 520 addToken(node.catchKeyword); | 520 addToken(node.catchKeyword); |
| 521 visit(node.formals); | 521 visit(node.formals); |
| 522 visit(node.block); | 522 visit(node.block); |
| 523 } | 523 } |
| 524 | 524 |
| 525 visitTypedef(Typedef node) { | 525 visitTypedef(Typedef node) { |
| 526 addToken(node.typedefKeyword); | 526 addToken(node.typedefKeyword); |
| 527 if (node.returnType != null) { | 527 if (node.returnType != null) { |
| 528 visit(node.returnType); | 528 visit(node.returnType); |
| 529 sb.add(' '); | 529 sb.write(' '); |
| 530 } | 530 } |
| 531 visit(node.name); | 531 visit(node.name); |
| 532 if (node.typeParameters != null) { | 532 if (node.typeParameters != null) { |
| 533 visit(node.typeParameters); | 533 visit(node.typeParameters); |
| 534 } | 534 } |
| 535 visit(node.formals); | 535 visit(node.formals); |
| 536 add(node.endToken.value); | 536 add(node.endToken.value); |
| 537 } | 537 } |
| 538 | 538 |
| 539 visitLibraryName(LibraryName node) { | 539 visitLibraryName(LibraryName node) { |
| 540 addToken(node.libraryKeyword); | 540 addToken(node.libraryKeyword); |
| 541 node.visitChildren(this); | 541 node.visitChildren(this); |
| 542 add(node.getEndToken().value); | 542 add(node.getEndToken().value); |
| 543 } | 543 } |
| 544 | 544 |
| 545 visitImport(Import node) { | 545 visitImport(Import node) { |
| 546 addToken(node.importKeyword); | 546 addToken(node.importKeyword); |
| 547 visit(node.uri); | 547 visit(node.uri); |
| 548 if (node.prefix != null) { | 548 if (node.prefix != null) { |
| 549 sb.add(' '); | 549 sb.write(' '); |
| 550 addToken(node.asKeyword); | 550 addToken(node.asKeyword); |
| 551 visit(node.prefix); | 551 visit(node.prefix); |
| 552 } | 552 } |
| 553 if (node.combinators != null) { | 553 if (node.combinators != null) { |
| 554 sb.add(' '); | 554 sb.write(' '); |
| 555 visit(node.combinators); | 555 visit(node.combinators); |
| 556 } | 556 } |
| 557 add(node.getEndToken().value); | 557 add(node.getEndToken().value); |
| 558 } | 558 } |
| 559 | 559 |
| 560 visitExport(Export node) { | 560 visitExport(Export node) { |
| 561 addToken(node.exportKeyword); | 561 addToken(node.exportKeyword); |
| 562 visit(node.uri); | 562 visit(node.uri); |
| 563 if (node.combinators != null) { | 563 if (node.combinators != null) { |
| 564 sb.add(' '); | 564 sb.write(' '); |
| 565 visit(node.combinators); | 565 visit(node.combinators); |
| 566 } | 566 } |
| 567 add(node.getEndToken().value); | 567 add(node.getEndToken().value); |
| 568 } | 568 } |
| 569 | 569 |
| 570 visitPart(Part node) { | 570 visitPart(Part node) { |
| 571 addToken(node.partKeyword); | 571 addToken(node.partKeyword); |
| 572 visit(node.uri); | 572 visit(node.uri); |
| 573 add(node.getEndToken().value); | 573 add(node.getEndToken().value); |
| 574 } | 574 } |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 } | 618 } |
| 619 | 619 |
| 620 visitStatement(Statement node) { | 620 visitStatement(Statement node) { |
| 621 throw 'internal error'; // Should not be called. | 621 throw 'internal error'; // Should not be called. |
| 622 } | 622 } |
| 623 | 623 |
| 624 visitStringNode(StringNode node) { | 624 visitStringNode(StringNode node) { |
| 625 throw 'internal error'; // Should not be called. | 625 throw 'internal error'; // Should not be called. |
| 626 } | 626 } |
| 627 } | 627 } |
| OLD | NEW |