| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 part of dart_backend; | |
| 6 | |
| 7 class CloningVisitor implements Visitor<Node> { | |
| 8 final TreeElements originalTreeElements; | |
| 9 final TreeElementMapping cloneTreeElements; | |
| 10 | |
| 11 CloningVisitor(originalTreeElements) | |
| 12 : cloneTreeElements = | |
| 13 new TreeElementMapping(originalTreeElements.currentElement), | |
| 14 this.originalTreeElements = originalTreeElements; | |
| 15 | |
| 16 visit(Node node) { | |
| 17 if (node == null) return null; | |
| 18 final clone = node.accept(this); | |
| 19 | |
| 20 final originalElement = originalTreeElements[node]; | |
| 21 if (originalElement != null) cloneTreeElements[clone] = originalElement; | |
| 22 | |
| 23 final originalType = originalTreeElements.getType(node); | |
| 24 if (originalType != null) cloneTreeElements.setType(clone, originalType); | |
| 25 return clone; | |
| 26 } | |
| 27 | |
| 28 Node visitBlock(Block node) => new Block(visit(node.statements)); | |
| 29 | |
| 30 Node visitBreakStatement(BreakStatement node) => new BreakStatement( | |
| 31 visit(node.target), node.keywordToken, node.semicolonToken); | |
| 32 | |
| 33 Node visitCascade(Cascade node) => new Cascade(visit(node.expression)); | |
| 34 | |
| 35 Node visitCascadeReceiver(CascadeReceiver node) => new CascadeReceiver( | |
| 36 visit(node.expression), node.cascadeOperator); | |
| 37 | |
| 38 Node visitCaseMatch(CaseMatch node) => new CaseMatch( | |
| 39 node.caseKeyword, visit(node.expression), node.colonToken); | |
| 40 | |
| 41 Node visitCatchBlock(CatchBlock node) => new CatchBlock( | |
| 42 visit(node.type), visit(node.formals), visit(node.block), | |
| 43 node.onKeyword, node.catchKeyword); | |
| 44 | |
| 45 Node visitClassNode(ClassNode node) => new ClassNode( | |
| 46 visit(node.modifiers), visit(node.name), visit(node.typeParameters), | |
| 47 visit(node.superclass), visit(node.interfaces), | |
| 48 node.beginToken, node.extendsKeyword, visit(node.body), node.endToken); | |
| 49 | |
| 50 Node visitConditional(Conditional node) => new Conditional( | |
| 51 visit(node.condition), visit(node.thenExpression), | |
| 52 visit(node.elseExpression), node.questionToken, node.colonToken); | |
| 53 | |
| 54 Node visitContinueStatement(ContinueStatement node) => new ContinueStatement( | |
| 55 visit(node.target), node.keywordToken, node.semicolonToken); | |
| 56 | |
| 57 Node visitDoWhile(DoWhile node) => new DoWhile( | |
| 58 visit(node.body), visit(node.condition), | |
| 59 node.doKeyword, node.whileKeyword, node.endToken); | |
| 60 | |
| 61 Node visitEmptyStatement(EmptyStatement node) => new EmptyStatement( | |
| 62 node.semicolonToken); | |
| 63 | |
| 64 Node visitExpressionStatement(ExpressionStatement node) => new ExpressionState
ment( | |
| 65 visit(node.expression), node.endToken); | |
| 66 | |
| 67 Node visitFor(For node) => new For( | |
| 68 visit(node.initializer), visit(node.conditionStatement), | |
| 69 visit(node.update), visit(node.body), node.forToken); | |
| 70 | |
| 71 Node visitForIn(ForIn node) => new ForIn( | |
| 72 visit(node.declaredIdentifier), visit(node.expression), visit(node.body), | |
| 73 node.forToken, node.inToken); | |
| 74 | |
| 75 Node visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclara
tion( | |
| 76 visit(node.function)); | |
| 77 | |
| 78 Node rewriteFunctionExpression(FunctionExpression node, Statement body) => | |
| 79 new FunctionExpression( | |
| 80 visit(node.name), visit(node.parameters), body, | |
| 81 visit(node.returnType), visit(node.modifiers), | |
| 82 visit(node.initializers), node.getOrSet); | |
| 83 | |
| 84 Node visitFunctionExpression(FunctionExpression node) => | |
| 85 rewriteFunctionExpression(node, visit(node.body)); | |
| 86 | |
| 87 Node visitIdentifier(Identifier node) => new Identifier(node.token); | |
| 88 | |
| 89 Node visitIf(If node) => new If( | |
| 90 visit(node.condition), visit(node.thenPart), visit(node.elsePart), | |
| 91 node.ifToken, node.elseToken); | |
| 92 | |
| 93 Node visitLabel(Label node) => | |
| 94 new Label(visit(node.identifier), node.colonToken); | |
| 95 | |
| 96 Node visitLabeledStatement(LabeledStatement node) => new LabeledStatement( | |
| 97 visit(node.labels), visit(node.statement)); | |
| 98 | |
| 99 Node visitLiteralBool(LiteralBool node) => new LiteralBool( | |
| 100 node.token, node.handler); | |
| 101 | |
| 102 Node visitLiteralDouble(LiteralDouble node) => new LiteralDouble( | |
| 103 node.token, node.handler); | |
| 104 | |
| 105 Node visitLiteralInt(LiteralInt node) => | |
| 106 new LiteralInt(node.token, node.handler); | |
| 107 | |
| 108 Node visitLiteralList(LiteralList node) => new LiteralList( | |
| 109 visit(node.typeArguments), visit(node.elements), node.constKeyword); | |
| 110 | |
| 111 Node visitLiteralMap(LiteralMap node) => new LiteralMap( | |
| 112 visit(node.typeArguments), visit(node.entries), node.constKeyword); | |
| 113 | |
| 114 Node visitLiteralMapEntry(LiteralMapEntry node) => new LiteralMapEntry( | |
| 115 visit(node.key), node.colonToken, visit(node.value)); | |
| 116 | |
| 117 Node visitLiteralNull(LiteralNull node) => new LiteralNull(node.token); | |
| 118 | |
| 119 Node visitLiteralString(LiteralString node) => new LiteralString( | |
| 120 node.token, node.dartString); | |
| 121 | |
| 122 Node visitMetadata(Metadata node) => new Metadata( | |
| 123 node.token, visit(node.expression)); | |
| 124 | |
| 125 Node visitMixinApplication(MixinApplication node) => new MixinApplication( | |
| 126 visit(node.superclass), visit(node.mixins)); | |
| 127 | |
| 128 Node visitNamedMixinApplication(NamedMixinApplication node) => | |
| 129 new NamedMixinApplication(visit(node.name), | |
| 130 visit(node.typeParameters), | |
| 131 visit(node.modifiers), | |
| 132 visit(node.mixinApplication), | |
| 133 visit(node.interfaces), | |
| 134 node.classKeyword, | |
| 135 node.endToken); | |
| 136 | |
| 137 Node visitModifiers(Modifiers node) => new Modifiers(visit(node.nodes)); | |
| 138 | |
| 139 Node visitNamedArgument(NamedArgument node) => new NamedArgument( | |
| 140 visit(node.name), node.colonToken, visit(node.expression)); | |
| 141 | |
| 142 Node visitNewExpression(NewExpression node) => new NewExpression( | |
| 143 node.newToken, visit(node.send)); | |
| 144 | |
| 145 Node rewriteNodeList(NodeList node, Link link) => | |
| 146 new NodeList(node.beginToken, link, node.endToken, node.delimiter); | |
| 147 | |
| 148 Node visitNodeList(NodeList node) { | |
| 149 // Special case for classes which exist in hierarchy, but not | |
| 150 // in the visitor. | |
| 151 if (node is Prefix) { | |
| 152 return node.nodes.isEmpty ? | |
| 153 new Prefix() : new Prefix.singleton(visit(node.nodes.head)); | |
| 154 } | |
| 155 if (node is Postfix) { | |
| 156 return node.nodes.isEmpty ? | |
| 157 new Postfix() : new Postfix.singleton(visit(node.nodes.head)); | |
| 158 } | |
| 159 LinkBuilder<Node> builder = new LinkBuilder<Node>(); | |
| 160 for (Node n in node.nodes) { | |
| 161 builder.addLast(visit(n)); | |
| 162 } | |
| 163 return rewriteNodeList(node, builder.toLink()); | |
| 164 } | |
| 165 | |
| 166 Node visitOperator(Operator node) => new Operator(node.token); | |
| 167 | |
| 168 Node visitParenthesizedExpression(ParenthesizedExpression node) => | |
| 169 new ParenthesizedExpression(visit(node.expression), node.beginToken); | |
| 170 | |
| 171 Node visitRethrow(Rethrow node) => new Rethrow( | |
| 172 node.throwToken, node.endToken); | |
| 173 | |
| 174 Node visitReturn(Return node) => new Return( | |
| 175 node.beginToken, node.endToken, visit(node.expression)); | |
| 176 | |
| 177 Node visitSend(Send node) => new Send( | |
| 178 visit(node.receiver), visit(node.selector), visit(node.argumentsNode)); | |
| 179 | |
| 180 Node visitSendSet(SendSet node) => new SendSet( | |
| 181 visit(node.receiver), visit(node.selector), | |
| 182 visit(node.assignmentOperator), visit(node.argumentsNode)); | |
| 183 | |
| 184 Node visitStringInterpolation(StringInterpolation node) => | |
| 185 new StringInterpolation(visit(node.string), visit(node.parts)); | |
| 186 | |
| 187 Node visitStringInterpolationPart(StringInterpolationPart node) => | |
| 188 new StringInterpolationPart(visit(node.expression), visit(node.string)); | |
| 189 | |
| 190 Node visitStringJuxtaposition(StringJuxtaposition node) => | |
| 191 new StringJuxtaposition(visit(node.first), visit(node.second)); | |
| 192 | |
| 193 Node visitSwitchCase(SwitchCase node) => new SwitchCase( | |
| 194 visit(node.labelsAndCases), node.defaultKeyword, visit(node.statements), | |
| 195 node.startToken); | |
| 196 | |
| 197 Node visitSwitchStatement(SwitchStatement node) => new SwitchStatement( | |
| 198 visit(node.parenthesizedExpression), visit(node.cases), | |
| 199 node.switchKeyword); | |
| 200 | |
| 201 Node visitLiteralSymbol(LiteralSymbol node) => new LiteralSymbol( | |
| 202 node.hashToken, visit(node.identifiers)); | |
| 203 | |
| 204 Node visitThrow(Throw node) => new Throw( | |
| 205 visit(node.expression), node.throwToken, node.endToken); | |
| 206 | |
| 207 Node visitTryStatement(TryStatement node) => new TryStatement( | |
| 208 visit(node.tryBlock), visit(node.catchBlocks), visit(node.finallyBlock), | |
| 209 node.tryKeyword, node.finallyKeyword); | |
| 210 | |
| 211 Node visitTypeAnnotation(TypeAnnotation node) => new TypeAnnotation( | |
| 212 visit(node.typeName), visit(node.typeArguments)); | |
| 213 | |
| 214 Node visitTypedef(Typedef node) => new Typedef( | |
| 215 visit(node.returnType), visit(node.name), visit(node.typeParameters), | |
| 216 visit(node.formals), node.typedefKeyword, node.endToken); | |
| 217 | |
| 218 Node visitTypeVariable(TypeVariable node) => new TypeVariable( | |
| 219 visit(node.name), visit(node.bound)); | |
| 220 | |
| 221 Node visitVariableDefinitions(VariableDefinitions node) => | |
| 222 new VariableDefinitions.forParameter( | |
| 223 visit(node.metadata), visit(node.type), | |
| 224 visit(node.modifiers), visit(node.definitions)); | |
| 225 | |
| 226 Node visitWhile(While node) => new While( | |
| 227 visit(node.condition), visit(node.body), node.whileKeyword); | |
| 228 | |
| 229 Node visitNode(Node node) { | |
| 230 unimplemented('visitNode', node: node); | |
| 231 return null; | |
| 232 } | |
| 233 | |
| 234 Node visitCombinator(Combinator node) { | |
| 235 unimplemented('visitNode', node: node); | |
| 236 return null; | |
| 237 } | |
| 238 | |
| 239 Node visitExport(Export node) { | |
| 240 unimplemented('visitNode', node: node); | |
| 241 return null; | |
| 242 } | |
| 243 | |
| 244 Node visitExpression(Expression node) { | |
| 245 unimplemented('visitNode', node: node); | |
| 246 return null; | |
| 247 } | |
| 248 | |
| 249 Node visitGotoStatement(GotoStatement node) { | |
| 250 unimplemented('visitNode', node: node); | |
| 251 return null; | |
| 252 } | |
| 253 | |
| 254 Node visitImport(Import node) { | |
| 255 unimplemented('visitNode', node: node); | |
| 256 return null; | |
| 257 } | |
| 258 | |
| 259 Node visitLibraryDependency(LibraryTag node) { | |
| 260 unimplemented('visitNode', node: node); | |
| 261 return null; | |
| 262 } | |
| 263 | |
| 264 Node visitLibraryName(LibraryName node) { | |
| 265 unimplemented('visitNode', node: node); | |
| 266 return null; | |
| 267 } | |
| 268 | |
| 269 Node visitLibraryTag(LibraryTag node) { | |
| 270 unimplemented('visitNode', node: node); | |
| 271 return null; | |
| 272 } | |
| 273 | |
| 274 Node visitLiteral(Literal node) { | |
| 275 unimplemented('visitNode', node: node); | |
| 276 return null; | |
| 277 } | |
| 278 | |
| 279 Node visitLoop(Loop node) { | |
| 280 unimplemented('visitNode', node: node); | |
| 281 return null; | |
| 282 } | |
| 283 | |
| 284 Node visitPart(Part node) { | |
| 285 unimplemented('visitNode', node: node); | |
| 286 return null; | |
| 287 } | |
| 288 | |
| 289 Node visitPartOf(PartOf node) { | |
| 290 unimplemented('visitNode', node: node); | |
| 291 return null; | |
| 292 } | |
| 293 | |
| 294 Node visitPostfix(Postfix node) { | |
| 295 unimplemented('visitNode', node: node); | |
| 296 return null; | |
| 297 } | |
| 298 | |
| 299 Node visitPrefix(Prefix node) { | |
| 300 unimplemented('visitNode', node: node); | |
| 301 return null; | |
| 302 } | |
| 303 | |
| 304 Node visitStatement(Statement node) { | |
| 305 unimplemented('visitNode', node: node); | |
| 306 return null; | |
| 307 } | |
| 308 | |
| 309 Node visitStringNode(StringNode node) { | |
| 310 unimplemented('visitNode', node: node); | |
| 311 return null; | |
| 312 } | |
| 313 | |
| 314 unimplemented(String message, {Node node}) { | |
| 315 throw message; | |
| 316 } | |
| 317 } | |
| OLD | NEW |