Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2014, 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 library code_generator; | |
| 6 | |
| 7 import '../../tree_ir/tree_ir_nodes.dart' as tree_ir; | |
| 8 import '../../js/js.dart' as js; | |
| 9 import '../../elements/elements.dart'; | |
| 10 | |
| 11 class CodeGen extends tree_ir.Visitor<dynamic, js.Expression> { | |
| 12 static const String UNIMPLEMENTED = "Javascript generation aborted"; | |
| 13 | |
| 14 /// Variables to be hoisted at the top of the current function. | |
| 15 List<js.VariableDeclaration> variables = <js.VariableDeclaration>[]; | |
| 16 | |
| 17 /// Maps variables to their name. | |
| 18 Map<tree_ir.Variable, String> variableNames = <tree_ir.Variable, String>{}; | |
| 19 | |
| 20 | |
| 21 /// Maps local constants to their name. | |
| 22 Map<VariableElement, String> constantNames = <VariableElement, String>{}; | |
|
floitsch
2014/11/12 11:03:20
Maplet?
sigurdm
2014/11/13 08:29:42
Done.
| |
| 23 | |
| 24 /// Variables that have had their declaration created. | |
| 25 Set<tree_ir.Variable> declaredVariables = new Set<tree_ir.Variable>(); | |
| 26 | |
| 27 /// Variable names that have already been used. Used to avoid name clashes. | |
| 28 Set<String> usedVariableNames; | |
| 29 | |
| 30 List<js.Parameter> parameters; | |
| 31 List<js.Statement> accumulator = new List<js.Statement>(); | |
| 32 | |
| 33 js.Block body; | |
| 34 | |
| 35 void buildFunction(tree_ir.FunctionDefinition function) { | |
|
floitsch
2014/11/12 11:03:20
This is the main entry point. Right?
Add dartdoc h
sigurdm
2014/11/13 08:29:42
Done.
| |
| 36 visitStatement(function.body); | |
| 37 for (tree_ir.Variable parameter in function.parameters) { | |
| 38 parameters.add(new js.Parameter(variableNames[parameter])); | |
| 39 } | |
| 40 body = new js.Block(accumulator); | |
| 41 } | |
| 42 | |
| 43 List<js.Expression> visitArguments(List<tree_ir.Expression> arguments) { | |
| 44 return arguments.map(visitExpression).toList(); | |
| 45 } | |
| 46 | |
| 47 giveup(tree_ir.Node node) { | |
| 48 throw UNIMPLEMENTED; | |
| 49 } | |
| 50 | |
| 51 @override | |
| 52 js.Expression visitConcatenateStrings(tree_ir.ConcatenateStrings node) { | |
| 53 return giveup(node); | |
| 54 // TODO: implement visitConcatenateStrings | |
| 55 } | |
| 56 | |
| 57 @override | |
| 58 js.Expression visitConditional(tree_ir.Conditional node) { | |
| 59 return giveup(node); | |
| 60 // TODO: implement visitConditional | |
| 61 } | |
| 62 | |
| 63 @override | |
| 64 js.Expression visitConstant(tree_ir.Constant node) { | |
| 65 return giveup(node); | |
| 66 // TODO: implement visitConstant | |
| 67 } | |
| 68 | |
| 69 @override | |
| 70 js.Expression visitFunctionExpression(tree_ir.FunctionExpression node) { | |
| 71 return giveup(node); | |
| 72 // TODO: implement visitFunctionExpression | |
| 73 } | |
| 74 | |
| 75 @override | |
| 76 js.Expression visitInvokeConstructor(tree_ir.InvokeConstructor node) { | |
| 77 return giveup(node); | |
| 78 // TODO: implement visitInvokeConstructor | |
| 79 } | |
| 80 | |
| 81 @override | |
| 82 js.Expression visitInvokeMethod(tree_ir.InvokeMethod node) { | |
| 83 return giveup(node); | |
| 84 // TODO: implement visitInvokeMethod | |
| 85 } | |
| 86 | |
| 87 @override | |
| 88 js.Expression visitInvokeStatic(tree_ir.InvokeStatic node) { | |
| 89 return giveup(node); | |
| 90 // TODO: implement visitInvokeStatic | |
| 91 } | |
| 92 | |
| 93 @override | |
| 94 js.Expression visitInvokeSuperMethod(tree_ir.InvokeSuperMethod node) { | |
| 95 return giveup(node); | |
| 96 // TODO: implement visitInvokeSuperMethod | |
| 97 } | |
| 98 | |
| 99 @override | |
| 100 js.Expression visitLiteralList(tree_ir.LiteralList node) { | |
| 101 return giveup(node); | |
| 102 // TODO: implement visitLiteralList | |
| 103 } | |
| 104 | |
| 105 @override | |
| 106 js.Expression visitLiteralMap(tree_ir.LiteralMap node) { | |
| 107 return giveup(node); | |
| 108 // TODO: implement visitLiteralMap | |
| 109 } | |
| 110 | |
| 111 @override | |
| 112 js.Expression visitLogicalOperator(tree_ir.LogicalOperator node) { | |
| 113 return giveup(node); | |
| 114 // TODO: implement visitLogicalOperator | |
| 115 } | |
| 116 | |
| 117 @override | |
| 118 js.Expression visitNot(tree_ir.Not node) { | |
| 119 return giveup(node); | |
| 120 // TODO: implement visitNot | |
| 121 } | |
| 122 | |
| 123 @override | |
| 124 js.Expression visitReifyTypeVar(tree_ir.ReifyTypeVar node) { | |
| 125 return giveup(node); | |
| 126 // TODO: implement visitReifyTypeVar | |
| 127 } | |
| 128 | |
| 129 @override | |
| 130 js.Expression visitThis(tree_ir.This node) { | |
| 131 return giveup(node); | |
| 132 // TODO: implement visitThis | |
| 133 } | |
| 134 | |
| 135 @override | |
| 136 js.Expression visitTypeOperator(tree_ir.TypeOperator node) { | |
| 137 return giveup(node); | |
| 138 // TODO: implement visitTypeOperator | |
| 139 } | |
| 140 | |
| 141 @override | |
| 142 js.Expression visitVariable(tree_ir.Variable node) { | |
| 143 return giveup(node); | |
| 144 // TODO: implement visitVariable | |
| 145 } | |
| 146 | |
| 147 @override | |
| 148 void visitContinue(tree_ir.Continue node) { | |
| 149 return giveup(node); | |
| 150 // TODO: implement visitContinue | |
| 151 } | |
| 152 | |
| 153 @override | |
| 154 void visitExpressionStatement(tree_ir.ExpressionStatement node) { | |
| 155 accumulator.add(new js.ExpressionStatement( | |
| 156 visitExpression(node.expression))); | |
| 157 visitStatement(node.next); | |
| 158 } | |
| 159 | |
| 160 @override | |
| 161 void visitFunctionDeclaration(tree_ir.FunctionDeclaration node) { | |
| 162 giveup(node); | |
| 163 // TODO: implement visitFunctionDeclaration | |
| 164 } | |
| 165 | |
| 166 @override | |
| 167 void visitIf(tree_ir.If node) { | |
| 168 giveup(node); | |
| 169 // TODO: implement visitIf | |
| 170 } | |
| 171 | |
| 172 @override | |
| 173 void visitLabeledStatement(tree_ir.LabeledStatement node) { | |
| 174 giveup(node); | |
| 175 // TODO: implement visitLabeledStatement | |
| 176 } | |
| 177 | |
| 178 @override | |
| 179 void visitAssign(tree_ir.Assign node) { | |
| 180 giveup(node); | |
| 181 // TODO: implement visitAssign | |
| 182 } | |
| 183 | |
| 184 @override | |
| 185 void visitBreak(tree_ir.Break node) { | |
| 186 giveup(node); | |
| 187 // TODO: implement visitBreak | |
| 188 } | |
| 189 | |
| 190 @override | |
| 191 void visitWhileCondition(tree_ir.WhileCondition node) { | |
| 192 giveup(node); | |
| 193 // TODO: implement visitWhileCondition | |
| 194 } | |
| 195 | |
| 196 @override | |
| 197 void visitWhileTrue(tree_ir.WhileTrue node) { | |
| 198 giveup(node); | |
| 199 // TODO: implement visitWhileTrue | |
| 200 } | |
| 201 | |
| 202 @override | |
| 203 void visitReturn(tree_ir.Return node) { | |
| 204 if (node.value != null) { | |
| 205 accumulator.add(new js.Return(visitExpression(node.value))); | |
| 206 } | |
| 207 } | |
| 208 } | |
| OLD | NEW |