| 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 | 
|---|