OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 part of polymer; | 5 part of polymer; |
6 | 6 |
7 /** | 7 /** |
8 * Use this annotation to publish a field as an attribute. For example: | 8 * Use this annotation to publish a field as an attribute. For example: |
9 * | 9 * |
10 * class MyPlaybackElement extends PolymerElement { | 10 * class MyPlaybackElement extends PolymerElement { |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 // TODO(jmesserly): this should probably take a ClassMirror instead of | 327 // TODO(jmesserly): this should probably take a ClassMirror instead of |
328 // TypeMirror, but it is currently impossible to get from a TypeMirror to a | 328 // TypeMirror, but it is currently impossible to get from a TypeMirror to a |
329 // ClassMirror. | 329 // ClassMirror. |
330 Object deserializeValue(String value, Object defaultValue, TypeMirror type) => | 330 Object deserializeValue(String value, Object defaultValue, TypeMirror type) => |
331 deserialize.deserializeValue(value, defaultValue, type); | 331 deserialize.deserializeValue(value, defaultValue, type); |
332 | 332 |
333 String serializeValue(Object value, TypeMirror inferredType) { | 333 String serializeValue(Object value, TypeMirror inferredType) { |
334 if (value == null) return null; | 334 if (value == null) return null; |
335 | 335 |
336 final type = inferredType.qualifiedName; | 336 final type = inferredType.qualifiedName; |
337 if (type == const Symbol('dart.core.bool')) { | 337 if (type == #dart.core.bool) { |
338 return _toBoolean(value) ? '' : null; | 338 return _toBoolean(value) ? '' : null; |
339 } else if (type == const Symbol('dart.core.String') | 339 } else if (type == #dart.core.String |
340 || type == const Symbol('dart.core.int') | 340 || type == #dart.core.int |
341 || type == const Symbol('dart.core.double')) { | 341 || type == #dart.core.double) { |
342 return '$value'; | 342 return '$value'; |
343 } | 343 } |
344 return null; | 344 return null; |
345 } | 345 } |
346 | 346 |
347 void reflectPropertyToAttribute(String name) { | 347 void reflectPropertyToAttribute(String name) { |
348 // TODO(sjmiles): consider memoizing this | 348 // TODO(sjmiles): consider memoizing this |
349 final self = reflect(this); | 349 final self = reflect(this); |
350 // try to intelligently serialize property value | 350 // try to intelligently serialize property value |
351 // TODO(jmesserly): cache symbol? | 351 // TODO(jmesserly): cache symbol? |
352 final propValue = self.getField(new Symbol(name)).reflectee; | 352 final propValue = self.getField(new Symbol(name)).reflectee; |
353 final property = _declaration._publish[name]; | 353 final property = _declaration._publish[name]; |
354 var inferredType = _inferPropertyType(propValue, property); | 354 var inferredType = _inferPropertyType(propValue, property); |
355 final serializedValue = serializeValue(propValue, inferredType); | 355 final serializedValue = serializeValue(propValue, inferredType); |
356 // boolean properties must reflect as boolean attributes | 356 // boolean properties must reflect as boolean attributes |
357 if (serializedValue != null) { | 357 if (serializedValue != null) { |
358 attributes[name] = serializedValue; | 358 attributes[name] = serializedValue; |
359 // TODO(sorvell): we should remove attr for all properties | 359 // TODO(sorvell): we should remove attr for all properties |
360 // that have undefined serialization; however, we will need to | 360 // that have undefined serialization; however, we will need to |
361 // refine the attr reflection system to achieve this; pica, for example, | 361 // refine the attr reflection system to achieve this; pica, for example, |
362 // relies on having inferredType object properties not removed as | 362 // relies on having inferredType object properties not removed as |
363 // attrs. | 363 // attrs. |
364 } else if (inferredType.qualifiedName == const Symbol('dart.core.bool')) { | 364 } else if (inferredType.qualifiedName == #dart.core.bool) { |
365 attributes.remove(name); | 365 attributes.remove(name); |
366 } | 366 } |
367 } | 367 } |
368 | 368 |
369 /** | 369 /** |
370 * Creates the document fragment to use for each instance of the custom | 370 * Creates the document fragment to use for each instance of the custom |
371 * element, given the `<template>` node. By default this is equivalent to: | 371 * element, given the `<template>` node. By default this is equivalent to: |
372 * | 372 * |
373 * template.createInstance(this, polymerSyntax); | 373 * template.createInstance(this, polymerSyntax); |
374 * | 374 * |
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
903 | 903 |
904 bool _toBoolean(value) => null != value && false != value; | 904 bool _toBoolean(value) => null != value && false != value; |
905 | 905 |
906 TypeMirror _propertyType(DeclarationMirror property) => | 906 TypeMirror _propertyType(DeclarationMirror property) => |
907 property is VariableMirror | 907 property is VariableMirror |
908 ? (property as VariableMirror).type | 908 ? (property as VariableMirror).type |
909 : (property as MethodMirror).returnType; | 909 : (property as MethodMirror).returnType; |
910 | 910 |
911 TypeMirror _inferPropertyType(Object value, DeclarationMirror property) { | 911 TypeMirror _inferPropertyType(Object value, DeclarationMirror property) { |
912 var type = _propertyType(property); | 912 var type = _propertyType(property); |
913 if (type.qualifiedName == const Symbol('dart.core.Object') || | 913 if (type.qualifiedName == #dart.core.Object || |
914 type.qualifiedName == const Symbol('dynamic')) { | 914 type.qualifiedName == #dynamic) { |
915 // Attempt to infer field type from the default value. | 915 // Attempt to infer field type from the default value. |
916 if (value != null) { | 916 if (value != null) { |
917 type = reflect(value).type; | 917 type = reflect(value).type; |
918 } | 918 } |
919 } | 919 } |
920 return type; | 920 return type; |
921 } | 921 } |
922 | 922 |
923 final Logger _observeLog = new Logger('polymer.observe'); | 923 final Logger _observeLog = new Logger('polymer.observe'); |
924 final Logger _eventsLog = new Logger('polymer.events'); | 924 final Logger _eventsLog = new Logger('polymer.events'); |
925 final Logger _unbindLog = new Logger('polymer.unbind'); | 925 final Logger _unbindLog = new Logger('polymer.unbind'); |
926 final Logger _bindLog = new Logger('polymer.bind'); | 926 final Logger _bindLog = new Logger('polymer.bind'); |
927 | 927 |
928 final Expando _shadowHost = new Expando<Element>(); | 928 final Expando _shadowHost = new Expando<Element>(); |
929 | 929 |
930 final Expando _eventHandledTable = new Expando<Set<Node>>(); | 930 final Expando _eventHandledTable = new Expando<Set<Node>>(); |
OLD | NEW |