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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: lib/compiler/implementation/dart_backend/utils.dart
diff --git a/lib/compiler/implementation/dart_backend/utils.dart b/lib/compiler/implementation/dart_backend/utils.dart
new file mode 100644
index 0000000000000000000000000000000000000000..86e048ee06a9132ebabd58b48ab311b13c493e59
--- /dev/null
+++ b/lib/compiler/implementation/dart_backend/utils.dart
@@ -0,0 +1,205 @@
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class CloningVisitor implements Visitor<Node> {
+ final TreeElements originalTreeElements;
+ final TreeElements cloneTreeElements;
+
+ 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.
+ : cloneTreeElements = new TreeElementMapping();
+
+ visit(Node node) {
+ if (node === null) return null;
+ final clone = node.accept(this);
+ final originalElement = originalTreeElements[node];
+ if (originalElement !== null) {
+ cloneTreeElements[clone] = originalElement;
+ }
+ TypeAnnotation asTypeAnnotation = node.asTypeAnnotation();
+ if (asTypeAnnotation !== null) {
+ final originalType = originalTreeElements.getType(asTypeAnnotation);
+ if (originalType !== null) {
+ cloneTreeElements.setType(clone.asTypeAnnotation(), originalType);
+ }
+ }
+ return clone;
+ }
+
+ visitBlock(Block node) => new Block(visit(node.statements));
+
+ visitBreakStatement(BreakStatement node) => new BreakStatement(
+ visit(node.target), node.keywordToken, node.semicolonToken);
+
+ visitCascade(Cascade node) => new Cascade(visit(node.expression));
+
+ visitCascadeReceiver(CascadeReceiver node) => new CascadeReceiver(
+ visit(node.expression), node.cascadeOperator);
+
+ visitCaseMatch(CaseMatch node) => new CaseMatch(
+ node.caseKeyword, visit(node.expression), node.colonToken);
+
+ visitCatchBlock(CatchBlock node) => new CatchBlock(
+ visit(node.type), visit(node.formals), visit(node.block),
+ node.onKeyword, node.catchKeyword);
+
+ visitClassNode(ClassNode node) => new ClassNode(
+ visit(node.name), visit(node.typeParameters),
+ visit(node.superclass), visit(node.interfaces), visit(node.defaultClause),
+ node.beginToken, node.extendsKeyword, visit(node.body), node.endToken);
+
+ visitConditional(Conditional node) => new Conditional(
+ visit(node.condition), visit(node.thenExpression),
+ visit(node.elseExpression), node.questionToken, node.colonToken);
+
+ visitContinueStatement(ContinueStatement node) => new ContinueStatement(
+ visit(node.target), node.keywordToken, node.semicolonToken);
+
+ visitDoWhile(DoWhile node) => new DoWhile(
+ visit(node.body), visit(node.condition),
+ node.doKeyword, node.whileKeyword, node.endToken);
+
+ visitEmptyStatement(EmptyStatement node) => new EmptyStatement(
+ node.semicolonToken);
+
+ visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement(
+ visit(node.expression), node.endToken);
+
+ visitFor(For node) => new For(
+ visit(node.initializer), visit(node.conditionStatement),
+ visit(node.update), visit(node.body), node.forToken);
+
+ visitForIn(ForIn node) => new ForIn(
+ visit(node.declaredIdentifier), visit(node.expression), visit(node.body),
+ node.forToken, node.inToken);
+
+ visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration(
+ visit(node.function));
+
+ visitFunctionExpression(FunctionExpression node) => new FunctionExpression(
+ visit(node.name), visit(node.parameters),
+ visit(node.body),
+ visit(node.returnType), visit(node.modifiers), visit(node.initializers),
+ node.getOrSet);
+
+ visitIdentifier(Identifier node) => new Identifier(node.token);
+
+ visitIf(If node) => new If(
+ visit(node.condition), visit(node.thenPart), visit(node.elsePart),
+ node.ifToken, node.elseToken);
+
+ visitLabel(Label node) => new Label(visit(node.identifier), node.colonToken);
+
+ visitLabeledStatement(LabeledStatement node) => new LabeledStatement(
+ visit(node.labels), visit(node.statement));
+
+ visitLiteralBool(LiteralBool node) => new LiteralBool(
+ node.token, node.handler);
+
+ visitLiteralDouble(LiteralDouble node) => new LiteralDouble(
+ node.token, node.handler);
+
+ visitLiteralInt(LiteralInt node) => new LiteralInt(node.token, node.handler);
+
+ visitLiteralList(LiteralList node) => new LiteralList(
+ visit(node.typeArguments), visit(node.elements), node.constKeyword);
+
+ visitLiteralMap(LiteralMap node) => new LiteralMap(
+ visit(node.typeArguments), visit(node.entries), node.constKeyword);
+
+ visitLiteralMapEntry(LiteralMapEntry node) => new LiteralMapEntry(
+ visit(node.key), node.colonToken, visit(node.value));
+
+ visitLiteralNull(LiteralNull node) => new LiteralNull(node.token);
+
+ visitLiteralString(LiteralString node) => new LiteralString(
+ node.token, node.dartString);
+
+ visitModifiers(Modifiers node) => new Modifiers(visit(node.nodes));
+
+ visitNamedArgument(NamedArgument node) => new NamedArgument(
+ visit(node.name), node.colonToken, visit(node.expression));
+
+ visitNewExpression(NewExpression node) => new NewExpression(
+ node.newToken, visit(node.send));
+
+ visitNodeList(NodeList node) {
+ // Special case for classes which exist in hierarchy, but not
+ // in the visitor.
+ if (node is Prefix) {
+ return node.nodes.isEmpty() ?
+ new Prefix() : new Prefix.singleton(visit(node.nodes.head));
+ }
+ if (node is Postfix) {
+ return node.nodes.isEmpty() ?
+ new Postfix() : new Postfix.singleton(visit(node.nodes.head));
+ }
+ LinkBuilder<Node> builder = new LinkBuilder<Node>();
+ for (Node n in node.nodes) {
+ builder.addLast(visit(n));
+ }
+ return new NodeList(
+ node.beginToken, builder.toLink(), node.endToken, node.delimiter);
+ }
+
+ visitOperator(Operator node) => new Operator(node.token);
+
+ visitParenthesizedExpression(ParenthesizedExpression node) =>
+ new ParenthesizedExpression(visit(node.expression), node.beginToken);
+
+ visitReturn(Return node) => new Return(
+ node.beginToken, node.endToken, visit(node.expression));
+
+ visitScriptTag(ScriptTag node) => new ScriptTag(
+ visit(node.tag), visit(node.argument),
+ visit(node.prefixIdentifier), visit(node.prefix),
+ node.beginToken, node.endToken);
+
+ visitSend(Send node) => new Send(
+ visit(node.receiver), visit(node.selector), visit(node.argumentsNode));
+
+ visitSendSet(SendSet node) => new SendSet(
+ visit(node.receiver), visit(node.selector),
+ visit(node.assignmentOperator), visit(node.argumentsNode));
+
+ visitStringInterpolation(StringInterpolation node) =>
+ new StringInterpolation(visit(node.string), visit(node.parts));
+
+ visitStringInterpolationPart(StringInterpolationPart node) =>
+ new StringInterpolationPart(visit(node.expression), visit(node.string));
+
+ visitStringJuxtaposition(StringJuxtaposition node) =>
+ new StringJuxtaposition(visit(node.first), visit(node.second));
+
+ visitSwitchCase(SwitchCase node) => new SwitchCase(
+ visit(node.labelsAndCases), node.defaultKeyword, visit(node.statements),
+ node.startToken);
+
+ visitSwitchStatement(SwitchStatement node) => new SwitchStatement(
+ visit(node.parenthesizedExpression), visit(node.cases),
+ node.switchKeyword);
+
+ visitThrow(Throw node) => new Throw(
+ visit(node.expression), node.throwToken, node.endToken);
+
+ visitTryStatement(TryStatement node) => new TryStatement(
+ visit(node.tryBlock), visit(node.catchBlocks), visit(node.finallyBlock),
+ node.tryKeyword, node.finallyKeyword);
+
+ visitTypeAnnotation(TypeAnnotation node) => new TypeAnnotation(
+ visit(node.typeName), visit(node.typeArguments));
+
+ visitTypedef(Typedef node) => new Typedef(
+ visit(node.returnType), visit(node.name), visit(node.typeParameters),
+ visit(node.formals), node.typedefKeyword, node.endToken);
+
+ visitTypeVariable(TypeVariable node) => new TypeVariable(
+ visit(node.name), visit(node.bound));
+
+ visitVariableDefinitions(VariableDefinitions node) => new VariableDefinitions(
+ visit(node.type), visit(node.modifiers), visit(node.definitions),
+ node.endToken);
+
+ visitWhile(While node) => new While(
+ visit(node.condition), visit(node.body), node.whileKeyword);
+}

Powered by Google App Engine
This is Rietveld 408576698