Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library backend_ast_emitter; | 5 library backend_ast_emitter; |
| 6 | 6 |
| 7 import 'tree_ir_nodes.dart' as tree; | 7 import 'tree_ir_nodes.dart' as tree; |
| 8 import 'backend_ast_nodes.dart'; | 8 import 'backend_ast_nodes.dart'; |
| 9 import '../constants/expressions.dart'; | 9 import '../constants/expressions.dart'; |
| 10 import '../constants/values.dart'; | 10 import '../constants/values.dart'; |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 147 void removeTrailingReturn() { | 147 void removeTrailingReturn() { |
| 148 if (statementBuffer.isEmpty) return; | 148 if (statementBuffer.isEmpty) return; |
| 149 if (statementBuffer.last is! Return) return; | 149 if (statementBuffer.last is! Return) return; |
| 150 Return ret = statementBuffer.last; | 150 Return ret = statementBuffer.last; |
| 151 Expression expr = ret.expression; | 151 Expression expr = ret.expression; |
| 152 if (expr is Literal && expr.value.isNull) { | 152 if (expr is Literal && expr.value.isNull) { |
| 153 statementBuffer.removeLast(); | 153 statementBuffer.removeLast(); |
| 154 } | 154 } |
| 155 } | 155 } |
| 156 | 156 |
| 157 Parameter emitParameterFromElement(FormalElement element, [String name]) { | 157 /// TODO(johnniwinther): Remove this when issue 21283 has been resolved. |
| 158 if (name == null) { | 158 int pseudoNameCounter = 0; |
| 159 | |
| 160 Parameter emitParameter(DartType type, | |
| 161 {String name, | |
| 162 Element element, | |
| 163 ConstantExpression defaultValue}) { | |
| 164 if (name == null && element != null) { | |
| 159 name = element.name; | 165 name = element.name; |
| 160 } | 166 } |
| 161 if (element.functionSignature != null) { | 167 if (name == null) { |
| 162 FunctionSignature signature = element.functionSignature; | 168 name = '_${pseudoNameCounter++}'; |
| 163 TypeAnnotation returnType = emitOptionalType(signature.type.returnType); | 169 } |
| 164 Parameters innerParameters = emitParameters(signature); | 170 Parameter parameter; |
| 165 return new Parameter.function(name, returnType, innerParameters) | 171 if (type.isFunctionType) { |
| 166 ..element = element; | 172 FunctionType functionType = type; |
| 173 TypeAnnotation returnType = emitOptionalType(functionType.returnType); | |
| 174 Parameters innerParameters = emitParametersFromType(functionType); | |
| 175 parameter = new Parameter.function(name, returnType, innerParameters); | |
| 167 } else { | 176 } else { |
| 168 TypeAnnotation type = emitOptionalType(element.type); | 177 TypeAnnotation typeAnnotation = emitOptionalType(type); |
| 169 return new Parameter(name, type:type) | 178 parameter = new Parameter(name, type: typeAnnotation); |
| 170 ..element = element; | 179 } |
| 180 parameter.element = element; | |
| 181 if (defaultValue != null && !defaultValue.value.isNull) { | |
| 182 parameter.defaultValue = emitConstant(defaultValue); | |
| 183 } | |
| 184 return parameter; | |
| 185 } | |
| 186 | |
| 187 Parameters emitParametersFromType(FunctionType functionType) { | |
| 188 if (functionType.namedParameters.isEmpty) { | |
| 189 return new Parameters( | |
| 190 emitParameters(functionType.parameterTypes), | |
| 191 emitParameters(functionType.optionalParameterTypes), | |
| 192 false); | |
| 193 } else { | |
| 194 return new Parameters( | |
| 195 emitParameters(functionType.parameterTypes), | |
| 196 emitParameters(functionType.namedParameterTypes, | |
| 197 names: functionType.namedParameters), | |
| 198 true); | |
| 171 } | 199 } |
| 172 } | 200 } |
| 173 | 201 |
| 174 Parameters emitParameters(FunctionSignature signature) { | 202 List<Parameter> emitParameters( |
| 175 return new Parameters( | 203 Iterable<DartType> parameterTypes, |
| 176 signature.requiredParameters.mapToList(emitParameterFromElement), | 204 {Iterable<String> names: const <String>[], |
| 177 signature.optionalParameters.mapToList(emitParameterFromElement), | 205 Iterable<ConstantExpression> defaultValues: const <ConstantExpression>[], |
| 178 signature.optionalParametersAreNamed); | 206 Iterable<Element> elements: const <Element>[]}) { |
| 207 Iterator<String> name = names.iterator; | |
| 208 Iterator<ConstantExpression> defaultValue = defaultValues.iterator; | |
| 209 Iterator<Element> element = elements.iterator; | |
| 210 return parameterTypes.map((DartType type) { | |
| 211 return emitParameter(type, | |
| 212 name: name.moveNext() ? name.current : null, | |
|
floitsch
2014/10/10 12:56:04
Minor nit. (not much better. just wanted to point
Johnni Winther
2014/10/13 08:10:53
Done. I thought [current] would throw!
| |
| 213 defaultValue: defaultValue.moveNext() ? defaultValue.current : null, | |
| 214 element: element.moveNext() ? element.current : null); | |
| 215 }).toList(); | |
| 179 } | 216 } |
| 180 | 217 |
| 181 /// Emits parameters that are not nested inside other parameters. | 218 /// Emits parameters that are not nested inside other parameters. |
| 182 /// Root parameters can have default values, while inner parameters cannot. | 219 /// Root parameters can have default values, while inner parameters cannot. |
| 183 Parameters emitRootParameters(tree.FunctionDefinition function) { | 220 Parameters emitRootParameters(tree.FunctionDefinition function) { |
| 184 FunctionSignature signature = function.element.functionSignature; | 221 ParameterElement elementFromParameter(tree.Variable parameter) { |
|
floitsch
2014/10/10 12:56:04
I prefer to inline it.
If it doesn't fit, I'm ok w
Johnni Winther
2014/10/13 08:10:53
Done.
| |
| 185 List<ConstantExpression> defaults = function.defaultParameterValues; | 222 return parameter.element; |
| 186 List<Parameter> required = | |
| 187 signature.requiredParameters.mapToList(emitParameterFromElement); | |
| 188 List<Parameter> optional = new List<Parameter>(defaults.length); | |
| 189 for (int i = 0; i < defaults.length; i++) { | |
| 190 ParameterElement element = signature.orderedOptionalParameters[i]; | |
| 191 optional[i] = emitParameterFromElement(element); | |
| 192 Expression constant = emitConstant(defaults[i]); | |
| 193 if (!isNullLiteral(constant)) { | |
| 194 optional[i].defaultValue = constant; | |
| 195 } | |
| 196 } | 223 } |
| 197 return new Parameters(required, optional, | 224 |
| 198 signature.optionalParametersAreNamed); | 225 FunctionType functionType = function.element.type; |
| 226 List<Parameter> required = emitParameters( | |
| 227 functionType.parameterTypes, | |
| 228 elements: function.parameters.map(elementFromParameter)); | |
| 229 bool optionalParametersAreNamed = !functionType.namedParameters.isEmpty; | |
| 230 List<Parameter> optional = emitParameters( | |
| 231 optionalParametersAreNamed | |
| 232 ? functionType.namedParameterTypes | |
| 233 : functionType.optionalParameterTypes, | |
| 234 defaultValues: function.defaultParameterValues, | |
| 235 elements: function.parameters.skip(required.length) | |
| 236 .map(elementFromParameter)); | |
| 237 return new Parameters(required, optional, optionalParametersAreNamed); | |
| 199 } | 238 } |
| 200 | 239 |
| 201 /// True if the two expressions are a reference to the same variable. | 240 /// True if the two expressions are a reference to the same variable. |
| 202 bool isSameVariable(Receiver e1, Receiver e2) { | 241 bool isSameVariable(Receiver e1, Receiver e2) { |
| 203 return e1 is Identifier && | 242 return e1 is Identifier && |
| 204 e2 is Identifier && | 243 e2 is Identifier && |
| 205 e1.element is VariableElement && | 244 e1.element is VariableElement && |
| 206 e1.element == e2.element; | 245 e1.element == e2.element; |
| 207 } | 246 } |
| 208 | 247 |
| (...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 852 } | 891 } |
| 853 } | 892 } |
| 854 | 893 |
| 855 visitVariable(tree.Variable variable) { | 894 visitVariable(tree.Variable variable) { |
| 856 if (shadowedParameters.contains(variable)) { | 895 if (shadowedParameters.contains(variable)) { |
| 857 hasShadowedUse.add(variable); | 896 hasShadowedUse.add(variable); |
| 858 } | 897 } |
| 859 } | 898 } |
| 860 | 899 |
| 861 } | 900 } |
| OLD | NEW |