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