OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 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 | 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 import '../common.dart'; | 5 import '../common.dart'; |
6 import '../common_elements.dart'; | 6 import '../common_elements.dart'; |
7 import '../constants/values.dart'; | 7 import '../constants/values.dart'; |
8 import '../elements/elements.dart'; | |
9 import '../elements/types.dart' show TypeVariableType; | |
10 import '../elements/entities.dart'; | 8 import '../elements/entities.dart'; |
11 import '../elements/resolution_types.dart'; | 9 import '../elements/resolution_types.dart' show ResolutionTypedefType; |
| 10 import '../elements/types.dart'; |
12 import '../io/code_output.dart'; | 11 import '../io/code_output.dart'; |
13 import '../js/js.dart' as jsAst; | 12 import '../js/js.dart' as jsAst; |
14 import '../js/js.dart' show js; | 13 import '../js/js.dart' show js; |
15 import '../js_emitter/code_emitter_task.dart'; | 14 import '../js_emitter/code_emitter_task.dart'; |
16 import '../options.dart'; | 15 import '../options.dart'; |
17 import '../universe/world_builder.dart'; | 16 import '../universe/world_builder.dart'; |
18 import 'constant_system_javascript.dart'; | 17 import 'constant_system_javascript.dart'; |
19 import 'js_backend.dart'; | 18 import 'js_backend.dart'; |
20 import 'namer.dart'; | 19 import 'namer.dart'; |
21 import 'runtime_types.dart'; | 20 import 'runtime_types.dart'; |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 jsAst.Expression keyExpression = | 217 jsAst.Expression keyExpression = |
219 constantReferenceGenerator(constant.keys[i]); | 218 constantReferenceGenerator(constant.keys[i]); |
220 jsAst.Expression valueExpression = | 219 jsAst.Expression valueExpression = |
221 constantReferenceGenerator(constant.values[i]); | 220 constantReferenceGenerator(constant.values[i]); |
222 data.add(keyExpression); | 221 data.add(keyExpression); |
223 data.add(valueExpression); | 222 data.add(valueExpression); |
224 } | 223 } |
225 return new jsAst.ArrayInitializer(data); | 224 return new jsAst.ArrayInitializer(data); |
226 } | 225 } |
227 | 226 |
228 ClassElement classElement = constant.type.element; | 227 ClassEntity classElement = constant.type.element; |
229 String className = classElement.name; | 228 String className = classElement.name; |
230 | 229 |
231 List<jsAst.Expression> arguments = <jsAst.Expression>[]; | 230 List<jsAst.Expression> arguments = <jsAst.Expression>[]; |
232 | 231 |
233 // The arguments of the JavaScript constructor for any given Dart class | 232 // The arguments of the JavaScript constructor for any given Dart class |
234 // are in the same order as the members of the class element. | 233 // are in the same order as the members of the class element. |
235 int emittedArgumentCount = 0; | 234 int emittedArgumentCount = 0; |
236 classElement.implementation.forEachInstanceField( | 235 _worldBuilder.forEachInstanceField(classElement, |
237 (ClassElement enclosing, Element field) { | 236 (ClassEntity enclosing, FieldEntity field) { |
238 if (field.name == JavaScriptMapConstant.LENGTH_NAME) { | 237 if (field.name == JavaScriptMapConstant.LENGTH_NAME) { |
239 arguments | 238 arguments |
240 .add(new jsAst.LiteralNumber('${constant.keyList.entries.length}')); | 239 .add(new jsAst.LiteralNumber('${constant.keyList.entries.length}')); |
241 } else if (field.name == JavaScriptMapConstant.JS_OBJECT_NAME) { | 240 } else if (field.name == JavaScriptMapConstant.JS_OBJECT_NAME) { |
242 arguments.add(jsMap()); | 241 arguments.add(jsMap()); |
243 } else if (field.name == JavaScriptMapConstant.KEYS_NAME) { | 242 } else if (field.name == JavaScriptMapConstant.KEYS_NAME) { |
244 arguments.add(constantReferenceGenerator(constant.keyList)); | 243 arguments.add(constantReferenceGenerator(constant.keyList)); |
245 } else if (field.name == JavaScriptMapConstant.PROTO_VALUE) { | 244 } else if (field.name == JavaScriptMapConstant.PROTO_VALUE) { |
246 assert(constant.protoValue != null); | 245 assert(constant.protoValue != null); |
247 arguments.add(constantReferenceGenerator(constant.protoValue)); | 246 arguments.add(constantReferenceGenerator(constant.protoValue)); |
248 } else if (field.name == JavaScriptMapConstant.JS_DATA_NAME) { | 247 } else if (field.name == JavaScriptMapConstant.JS_DATA_NAME) { |
249 arguments.add(jsGeneralMap()); | 248 arguments.add(jsGeneralMap()); |
250 } else { | 249 } else { |
251 failedAt(field, | 250 failedAt(field, |
252 "Compiler has unexpected field ${field.name} for ${className}."); | 251 "Compiler has unexpected field ${field.name} for ${className}."); |
253 } | 252 } |
254 emittedArgumentCount++; | 253 emittedArgumentCount++; |
255 }, includeSuperAndInjectedMembers: true); | 254 }); |
256 if ((className == JavaScriptMapConstant.DART_STRING_CLASS && | 255 if ((className == JavaScriptMapConstant.DART_STRING_CLASS && |
257 emittedArgumentCount != 3) || | 256 emittedArgumentCount != 3) || |
258 (className == JavaScriptMapConstant.DART_PROTO_CLASS && | 257 (className == JavaScriptMapConstant.DART_PROTO_CLASS && |
259 emittedArgumentCount != 4) || | 258 emittedArgumentCount != 4) || |
260 (className == JavaScriptMapConstant.DART_GENERAL_CLASS && | 259 (className == JavaScriptMapConstant.DART_GENERAL_CLASS && |
261 emittedArgumentCount != 1)) { | 260 emittedArgumentCount != 1)) { |
262 failedAt(classElement, | 261 failedAt(classElement, |
263 "Compiler and ${className} disagree on number of fields."); | 262 "Compiler and ${className} disagree on number of fields."); |
264 } | 263 } |
265 | 264 |
266 if (_rtiNeed.classNeedsRtiField(classElement)) { | 265 if (_rtiNeed.classNeedsRtiField(classElement)) { |
267 arguments.add(_reifiedTypeArguments(constant.type)); | 266 arguments.add(_reifiedTypeArguments(constant.type)); |
268 } | 267 } |
269 | 268 |
270 jsAst.Expression constructor = _emitter.constructorAccess(classElement); | 269 jsAst.Expression constructor = _emitter.constructorAccess(classElement); |
271 jsAst.Expression value = new jsAst.New(constructor, arguments); | 270 jsAst.Expression value = new jsAst.New(constructor, arguments); |
272 return value; | 271 return value; |
273 } | 272 } |
274 | 273 |
275 jsAst.PropertyAccess getHelperProperty(MethodElement helper) { | 274 jsAst.PropertyAccess getHelperProperty(FunctionEntity helper) { |
276 return _emitter.staticFunctionAccess(helper); | 275 return _emitter.staticFunctionAccess(helper); |
277 } | 276 } |
278 | 277 |
279 @override | 278 @override |
280 jsAst.Expression visitType(TypeConstantValue constant, [_]) { | 279 jsAst.Expression visitType(TypeConstantValue constant, [_]) { |
281 ResolutionDartType type = constant.representedType; | 280 DartType type = constant.representedType; |
282 jsAst.Name typeName = _namer.runtimeTypeName(type.element); | 281 jsAst.Name typeName; |
| 282 Entity element; |
| 283 if (type is InterfaceType) { |
| 284 element = type.element; |
| 285 } else if (type is ResolutionTypedefType) { |
| 286 // TODO(redemption): Handle typedef type literals from .dill. |
| 287 element = type.element; |
| 288 } else { |
| 289 assert(type is DynamicType); |
| 290 } |
| 291 typeName = _namer.runtimeTypeName(element); |
283 return new jsAst.Call(getHelperProperty(_commonElements.createRuntimeType), | 292 return new jsAst.Call(getHelperProperty(_commonElements.createRuntimeType), |
284 [js.quoteName(typeName)]); | 293 [js.quoteName(typeName)]); |
285 } | 294 } |
286 | 295 |
287 @override | 296 @override |
288 jsAst.Expression visitInterceptor(InterceptorConstantValue constant, [_]) { | 297 jsAst.Expression visitInterceptor(InterceptorConstantValue constant, [_]) { |
289 ClassEntity interceptorClass = constant.cls; | 298 ClassEntity interceptorClass = constant.cls; |
290 return _task.interceptorPrototypeAccess(interceptorClass); | 299 return _task.interceptorPrototypeAccess(interceptorClass); |
291 } | 300 } |
292 | 301 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 } | 333 } |
325 jsAst.New instantiation = new jsAst.New(constructor, fields); | 334 jsAst.New instantiation = new jsAst.New(constructor, fields); |
326 return instantiation; | 335 return instantiation; |
327 } | 336 } |
328 | 337 |
329 String stripComments(String rawJavaScript) { | 338 String stripComments(String rawJavaScript) { |
330 return rawJavaScript.replaceAll(COMMENT_RE, ''); | 339 return rawJavaScript.replaceAll(COMMENT_RE, ''); |
331 } | 340 } |
332 | 341 |
333 jsAst.Expression maybeAddTypeArguments( | 342 jsAst.Expression maybeAddTypeArguments( |
334 ResolutionInterfaceType type, jsAst.Expression value) { | 343 InterfaceType type, jsAst.Expression value) { |
335 if (type is ResolutionInterfaceType && | 344 if (type is InterfaceType && |
336 !type.treatAsRaw && | 345 !type.treatAsRaw && |
337 _rtiNeed.classNeedsRti(type.element)) { | 346 _rtiNeed.classNeedsRti(type.element)) { |
338 return new jsAst.Call( | 347 return new jsAst.Call( |
339 getHelperProperty(_commonElements.setRuntimeTypeInfo), | 348 getHelperProperty(_commonElements.setRuntimeTypeInfo), |
340 [value, _reifiedTypeArguments(type)]); | 349 [value, _reifiedTypeArguments(type)]); |
341 } | 350 } |
342 return value; | 351 return value; |
343 } | 352 } |
344 | 353 |
345 jsAst.Expression _reifiedTypeArguments(ResolutionInterfaceType type) { | 354 jsAst.Expression _reifiedTypeArguments(InterfaceType type) { |
346 jsAst.Expression unexpected(TypeVariableType _variable) { | 355 jsAst.Expression unexpected(TypeVariableType _variable) { |
347 ResolutionTypeVariableType variable = _variable; | 356 TypeVariableType variable = _variable; |
348 throw failedAt( | 357 throw failedAt( |
349 NO_LOCATION_SPANNABLE, | 358 NO_LOCATION_SPANNABLE, |
350 "Unexpected type variable '${variable.getStringAsDeclared(null)}'" | 359 "Unexpected type variable '${variable}'" |
351 " in constant type '${type.getStringAsDeclared(null)}'"); | 360 " in constant type '${type}'"); |
352 } | 361 } |
353 | 362 |
354 List<jsAst.Expression> arguments = <jsAst.Expression>[]; | 363 List<jsAst.Expression> arguments = <jsAst.Expression>[]; |
355 for (ResolutionDartType argument in type.typeArguments) { | 364 for (DartType argument in type.typeArguments) { |
356 arguments.add( | 365 arguments.add( |
357 _rtiEncoder.getTypeRepresentation(_emitter, argument, unexpected)); | 366 _rtiEncoder.getTypeRepresentation(_emitter, argument, unexpected)); |
358 } | 367 } |
359 return new jsAst.ArrayInitializer(arguments); | 368 return new jsAst.ArrayInitializer(arguments); |
360 } | 369 } |
361 | 370 |
362 @override | 371 @override |
363 jsAst.Expression visitDeferred(DeferredConstantValue constant, [_]) { | 372 jsAst.Expression visitDeferred(DeferredConstantValue constant, [_]) { |
364 return constantReferenceGenerator(constant.referenced); | 373 return constantReferenceGenerator(constant.referenced); |
365 } | 374 } |
366 } | 375 } |
OLD | NEW |