Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(577)

Side by Side Diff: lib/compiler/implementation/dart_backend/utils.dart

Issue 10919127: Introduce AST cloning. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698