Chromium Code Reviews| 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 class CloningVisitor implements Visitor<Node> { | |
| 6 final TreeElements originalTreeElements; | |
| 7 final TreeElements cloneTreeElements; | |
| 8 | |
| 9 CloningVisitor(this.originalTreeElements) | |
|
Roman
2012/09/07 08:10:56
I suggest removing TreeElements cloning from this
Anton Muhin
2012/09/07 12:26:07
I might be missing some simple solution, but I fou
Roman
2012/09/07 13:19:59
Nothing particular.
| |
| 10 : cloneTreeElements = new TreeElementMapping(); | |
| 11 | |
| 12 visit(Node node) { | |
| 13 if (node === null) return null; | |
| 14 final clone = node.accept(this); | |
| 15 final originalElement = originalTreeElements[node]; | |
| 16 if (originalElement !== null) { | |
| 17 cloneTreeElements[clone] = originalElement; | |
| 18 } | |
| 19 TypeAnnotation asTypeAnnotation = node.asTypeAnnotation(); | |
| 20 if (asTypeAnnotation !== null) { | |
| 21 final originalType = originalTreeElements.getType(asTypeAnnotation); | |
| 22 if (originalType !== null) { | |
| 23 cloneTreeElements.setType(clone.asTypeAnnotation(), originalType); | |
| 24 } | |
| 25 } | |
| 26 return clone; | |
| 27 } | |
| 28 | |
| 29 visitBlock(Block node) => new Block(visit(node.statements)); | |
| 30 | |
| 31 visitBreakStatement(BreakStatement node) => new BreakStatement( | |
| 32 visit(node.target), node.keywordToken, node.semicolonToken); | |
| 33 | |
| 34 visitCascade(Cascade node) => new Cascade(visit(node.expression)); | |
| 35 | |
| 36 visitCascadeReceiver(CascadeReceiver node) => new CascadeReceiver( | |
| 37 visit(node.expression), node.cascadeOperator); | |
| 38 | |
| 39 visitCaseMatch(CaseMatch node) => new CaseMatch( | |
| 40 node.caseKeyword, visit(node.expression), node.colonToken); | |
| 41 | |
| 42 visitCatchBlock(CatchBlock node) => new CatchBlock( | |
| 43 visit(node.type), visit(node.formals), visit(node.block), | |
| 44 node.onKeyword, node.catchKeyword); | |
| 45 | |
| 46 visitClassNode(ClassNode node) => new ClassNode( | |
| 47 visit(node.name), visit(node.typeParameters), | |
| 48 visit(node.superclass), visit(node.interfaces), visit(node.defaultClause), | |
| 49 node.beginToken, node.extendsKeyword, visit(node.body), node.endToken); | |
| 50 | |
| 51 visitConditional(Conditional node) => new Conditional( | |
| 52 visit(node.condition), visit(node.thenExpression), | |
| 53 visit(node.elseExpression), node.questionToken, node.colonToken); | |
| 54 | |
| 55 visitContinueStatement(ContinueStatement node) => new ContinueStatement( | |
| 56 visit(node.target), node.keywordToken, node.semicolonToken); | |
| 57 | |
| 58 visitDoWhile(DoWhile node) => new DoWhile( | |
| 59 visit(node.body), visit(node.condition), | |
| 60 node.doKeyword, node.whileKeyword, node.endToken); | |
| 61 | |
| 62 visitEmptyStatement(EmptyStatement node) => new EmptyStatement( | |
| 63 node.semicolonToken); | |
| 64 | |
| 65 visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement( | |
| 66 visit(node.expression), node.endToken); | |
| 67 | |
| 68 visitFor(For node) => new For( | |
| 69 visit(node.initializer), visit(node.conditionStatement), | |
| 70 visit(node.update), visit(node.body), node.forToken); | |
| 71 | |
| 72 visitForIn(ForIn node) => new ForIn( | |
| 73 visit(node.declaredIdentifier), visit(node.expression), visit(node.body), | |
| 74 node.forToken, node.inToken); | |
| 75 | |
| 76 visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration( | |
| 77 visit(node.function)); | |
| 78 | |
| 79 visitFunctionExpression(FunctionExpression node) => new FunctionExpression( | |
| 80 visit(node.name), visit(node.parameters), | |
| 81 visit(node.body), | |
| 82 visit(node.returnType), visit(node.modifiers), visit(node.initializers), | |
| 83 node.getOrSet); | |
| 84 | |
| 85 visitIdentifier(Identifier node) => new Identifier(node.token); | |
| 86 | |
| 87 visitIf(If node) => new If( | |
| 88 visit(node.condition), visit(node.thenPart), visit(node.elsePart), | |
| 89 node.ifToken, node.elseToken); | |
| 90 | |
| 91 visitLabel(Label node) => new Label(visit(node.identifier), node.colonToken); | |
| 92 | |
| 93 visitLabeledStatement(LabeledStatement node) => new LabeledStatement( | |
| 94 visit(node.labels), visit(node.statement)); | |
| 95 | |
| 96 visitLiteralBool(LiteralBool node) => new LiteralBool( | |
| 97 node.token, node.handler); | |
| 98 | |
| 99 visitLiteralDouble(LiteralDouble node) => new LiteralDouble( | |
| 100 node.token, node.handler); | |
| 101 | |
| 102 visitLiteralInt(LiteralInt node) => new LiteralInt(node.token, node.handler); | |
| 103 | |
| 104 visitLiteralList(LiteralList node) => new LiteralList( | |
| 105 visit(node.typeArguments), visit(node.elements), node.constKeyword); | |
| 106 | |
| 107 visitLiteralMap(LiteralMap node) => new LiteralMap( | |
| 108 visit(node.typeArguments), visit(node.entries), node.constKeyword); | |
| 109 | |
| 110 visitLiteralMapEntry(LiteralMapEntry node) => new LiteralMapEntry( | |
| 111 visit(node.key), node.colonToken, visit(node.value)); | |
| 112 | |
| 113 visitLiteralNull(LiteralNull node) => new LiteralNull(node.token); | |
| 114 | |
| 115 visitLiteralString(LiteralString node) => new LiteralString( | |
| 116 node.token, node.dartString); | |
| 117 | |
| 118 visitModifiers(Modifiers node) => new Modifiers(visit(node.nodes)); | |
| 119 | |
| 120 visitNamedArgument(NamedArgument node) => new NamedArgument( | |
| 121 visit(node.name), node.colonToken, visit(node.expression)); | |
| 122 | |
| 123 visitNewExpression(NewExpression node) => new NewExpression( | |
| 124 node.newToken, visit(node.send)); | |
| 125 | |
| 126 visitNodeList(NodeList node) { | |
| 127 // Special case for classes which exist in hierarchy, but not | |
| 128 // in the visitor. | |
| 129 if (node is Prefix) { | |
| 130 return node.nodes.isEmpty() ? | |
| 131 new Prefix() : new Prefix.singleton(visit(node.nodes.head)); | |
| 132 } | |
| 133 if (node is Postfix) { | |
| 134 return node.nodes.isEmpty() ? | |
| 135 new Postfix() : new Postfix.singleton(visit(node.nodes.head)); | |
| 136 } | |
| 137 LinkBuilder<Node> builder = new LinkBuilder<Node>(); | |
| 138 for (Node n in node.nodes) { | |
| 139 builder.addLast(visit(n)); | |
| 140 } | |
| 141 return new NodeList( | |
| 142 node.beginToken, builder.toLink(), node.endToken, node.delimiter); | |
| 143 } | |
| 144 | |
| 145 visitOperator(Operator node) => new Operator(node.token); | |
| 146 | |
| 147 visitParenthesizedExpression(ParenthesizedExpression node) => | |
| 148 new ParenthesizedExpression(visit(node.expression), node.beginToken); | |
| 149 | |
| 150 visitReturn(Return node) => new Return( | |
| 151 node.beginToken, node.endToken, visit(node.expression)); | |
| 152 | |
| 153 visitScriptTag(ScriptTag node) => new ScriptTag( | |
| 154 visit(node.tag), visit(node.argument), | |
| 155 visit(node.prefixIdentifier), visit(node.prefix), | |
| 156 node.beginToken, node.endToken); | |
| 157 | |
| 158 visitSend(Send node) => new Send( | |
| 159 visit(node.receiver), visit(node.selector), visit(node.argumentsNode)); | |
| 160 | |
| 161 visitSendSet(SendSet node) => new SendSet( | |
| 162 visit(node.receiver), visit(node.selector), | |
| 163 visit(node.assignmentOperator), visit(node.argumentsNode)); | |
| 164 | |
| 165 visitStringInterpolation(StringInterpolation node) => | |
| 166 new StringInterpolation(visit(node.string), visit(node.parts)); | |
| 167 | |
| 168 visitStringInterpolationPart(StringInterpolationPart node) => | |
| 169 new StringInterpolationPart(visit(node.expression), visit(node.string)); | |
| 170 | |
| 171 visitStringJuxtaposition(StringJuxtaposition node) => | |
| 172 new StringJuxtaposition(visit(node.first), visit(node.second)); | |
| 173 | |
| 174 visitSwitchCase(SwitchCase node) => new SwitchCase( | |
| 175 visit(node.labelsAndCases), node.defaultKeyword, visit(node.statements), | |
| 176 node.startToken); | |
| 177 | |
| 178 visitSwitchStatement(SwitchStatement node) => new SwitchStatement( | |
| 179 visit(node.parenthesizedExpression), visit(node.cases), | |
| 180 node.switchKeyword); | |
| 181 | |
| 182 visitThrow(Throw node) => new Throw( | |
| 183 visit(node.expression), node.throwToken, node.endToken); | |
| 184 | |
| 185 visitTryStatement(TryStatement node) => new TryStatement( | |
| 186 visit(node.tryBlock), visit(node.catchBlocks), visit(node.finallyBlock), | |
| 187 node.tryKeyword, node.finallyKeyword); | |
| 188 | |
| 189 visitTypeAnnotation(TypeAnnotation node) => new TypeAnnotation( | |
| 190 visit(node.typeName), visit(node.typeArguments)); | |
| 191 | |
| 192 visitTypedef(Typedef node) => new Typedef( | |
| 193 visit(node.returnType), visit(node.name), visit(node.typeParameters), | |
| 194 visit(node.formals), node.typedefKeyword, node.endToken); | |
| 195 | |
| 196 visitTypeVariable(TypeVariable node) => new TypeVariable( | |
| 197 visit(node.name), visit(node.bound)); | |
| 198 | |
| 199 visitVariableDefinitions(VariableDefinitions node) => new VariableDefinitions( | |
| 200 visit(node.type), visit(node.modifiers), visit(node.definitions), | |
| 201 node.endToken); | |
| 202 | |
| 203 visitWhile(While node) => new While( | |
| 204 visit(node.condition), visit(node.body), node.whileKeyword); | |
| 205 } | |
| OLD | NEW |