| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 dart2js.serialization.elements; | 5 library dart2js.serialization.elements; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../constants/constructors.dart'; | 8 import '../constants/constructors.dart'; |
| 9 import '../constants/expressions.dart'; | 9 import '../constants/expressions.dart'; |
| 10 import '../dart_types.dart'; | 10 import '../dart_types.dart'; |
| 11 import '../elements/elements.dart'; | 11 import '../elements/elements.dart'; |
| 12 import '../elements/modelx.dart' show ErroneousElementX; |
| 12 import 'constant_serialization.dart'; | 13 import 'constant_serialization.dart'; |
| 13 import 'keys.dart'; | 14 import 'keys.dart'; |
| 14 import 'modelz.dart'; | 15 import 'modelz.dart'; |
| 15 import 'serialization.dart'; | 16 import 'serialization.dart'; |
| 16 import 'serialization_util.dart'; | 17 import 'serialization_util.dart'; |
| 17 | 18 |
| 18 /// Enum kinds used for encoding [Element]s. | 19 /// Enum kinds used for encoding [Element]s. |
| 19 enum SerializedElementKind { | 20 enum SerializedElementKind { |
| 21 ERROR, |
| 20 LIBRARY, | 22 LIBRARY, |
| 21 COMPILATION_UNIT, | 23 COMPILATION_UNIT, |
| 22 CLASS, | 24 CLASS, |
| 23 ENUM, | 25 ENUM, |
| 24 NAMED_MIXIN_APPLICATION, | 26 NAMED_MIXIN_APPLICATION, |
| 25 GENERATIVE_CONSTRUCTOR, | 27 GENERATIVE_CONSTRUCTOR, |
| 26 DEFAULT_CONSTRUCTOR, | 28 DEFAULT_CONSTRUCTOR, |
| 27 FACTORY_CONSTRUCTOR, | 29 FACTORY_CONSTRUCTOR, |
| 28 REDIRECTING_FACTORY_CONSTRUCTOR, | 30 REDIRECTING_FACTORY_CONSTRUCTOR, |
| 29 FORWARDING_CONSTRUCTOR, | 31 FORWARDING_CONSTRUCTOR, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 56 } | 58 } |
| 57 | 59 |
| 58 /// Set of serializers used to serialize different kinds of elements by | 60 /// Set of serializers used to serialize different kinds of elements by |
| 59 /// encoding into them into [ObjectEncoder]s. | 61 /// encoding into them into [ObjectEncoder]s. |
| 60 /// | 62 /// |
| 61 /// This class is called from the [Serializer] when an [Element] needs | 63 /// This class is called from the [Serializer] when an [Element] needs |
| 62 /// serialization. The [ObjectEncoder] ensures that any [Element], [DartType], | 64 /// serialization. The [ObjectEncoder] ensures that any [Element], [DartType], |
| 63 /// and [ConstantExpression] that the serialized [Element] depends upon are also | 65 /// and [ConstantExpression] that the serialized [Element] depends upon are also |
| 64 /// serialized. | 66 /// serialized. |
| 65 const List<ElementSerializer> ELEMENT_SERIALIZERS = const [ | 67 const List<ElementSerializer> ELEMENT_SERIALIZERS = const [ |
| 68 const ErrorSerializer(), |
| 66 const LibrarySerializer(), | 69 const LibrarySerializer(), |
| 67 const CompilationUnitSerializer(), | 70 const CompilationUnitSerializer(), |
| 68 const ClassSerializer(), | 71 const ClassSerializer(), |
| 69 const ConstructorSerializer(), | 72 const ConstructorSerializer(), |
| 70 const FieldSerializer(), | 73 const FieldSerializer(), |
| 71 const FunctionSerializer(), | 74 const FunctionSerializer(), |
| 72 const TypedefSerializer(), | 75 const TypedefSerializer(), |
| 73 const TypeVariableSerializer(), | 76 const TypeVariableSerializer(), |
| 74 const ParameterSerializer(), | 77 const ParameterSerializer(), |
| 75 const ImportSerializer(), | 78 const ImportSerializer(), |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 if (abstractField.setter != null) { | 189 if (abstractField.setter != null) { |
| 187 set.add(abstractField.setter); | 190 set.add(abstractField.setter); |
| 188 } | 191 } |
| 189 } else { | 192 } else { |
| 190 set.add(element); | 193 set.add(element); |
| 191 } | 194 } |
| 192 }; | 195 }; |
| 193 } | 196 } |
| 194 } | 197 } |
| 195 | 198 |
| 199 class ErrorSerializer implements ElementSerializer { |
| 200 const ErrorSerializer(); |
| 201 |
| 202 SerializedElementKind getSerializedKind(Element element) { |
| 203 if (element.isError) { |
| 204 return SerializedElementKind.ERROR; |
| 205 } |
| 206 return null; |
| 207 } |
| 208 |
| 209 void serialize(ErroneousElement element, ObjectEncoder encoder, |
| 210 SerializedElementKind kind) { |
| 211 encoder.setElement(Key.ENCLOSING, element.enclosingElement); |
| 212 encoder.setString(Key.NAME, element.name); |
| 213 encoder.setEnum(Key.MESSAGE_KIND, element.messageKind); |
| 214 if (element.messageArguments.isNotEmpty) { |
| 215 MapEncoder mapEncoder = encoder.createMap(Key.ARGUMENTS); |
| 216 element.messageArguments.forEach((String key, String value) { |
| 217 mapEncoder.setString(key, value); |
| 218 }); |
| 219 } |
| 220 } |
| 221 } |
| 222 |
| 196 class LibrarySerializer implements ElementSerializer { | 223 class LibrarySerializer implements ElementSerializer { |
| 197 const LibrarySerializer(); | 224 const LibrarySerializer(); |
| 198 | 225 |
| 199 SerializedElementKind getSerializedKind(Element element) { | 226 SerializedElementKind getSerializedKind(Element element) { |
| 200 if (element.isLibrary) { | 227 if (element.isLibrary) { |
| 201 return SerializedElementKind.LIBRARY; | 228 return SerializedElementKind.LIBRARY; |
| 202 } | 229 } |
| 203 return null; | 230 return null; |
| 204 } | 231 } |
| 205 | 232 |
| (...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 class ElementDeserializer { | 725 class ElementDeserializer { |
| 699 /// Deserializes an [Element] from an [ObjectDecoder]. | 726 /// Deserializes an [Element] from an [ObjectDecoder]. |
| 700 /// | 727 /// |
| 701 /// The class is called from the [Deserializer] when an [Element] | 728 /// The class is called from the [Deserializer] when an [Element] |
| 702 /// needs deserialization. The [ObjectDecoder] ensures that any [Element], | 729 /// needs deserialization. The [ObjectDecoder] ensures that any [Element], |
| 703 /// [DartType], and [ConstantExpression] that the deserialized [Element] | 730 /// [DartType], and [ConstantExpression] that the deserialized [Element] |
| 704 /// depends upon are available. | 731 /// depends upon are available. |
| 705 static Element deserialize( | 732 static Element deserialize( |
| 706 ObjectDecoder decoder, SerializedElementKind elementKind) { | 733 ObjectDecoder decoder, SerializedElementKind elementKind) { |
| 707 switch (elementKind) { | 734 switch (elementKind) { |
| 735 case SerializedElementKind.ERROR: |
| 736 Element enclosing = decoder.getElement(Key.ENCLOSING); |
| 737 String name = decoder.getString(Key.NAME); |
| 738 MessageKind messageKind = |
| 739 decoder.getEnum(Key.MESSAGE_KIND, MessageKind.values); |
| 740 Map<String, String> arguments = <String, String>{}; |
| 741 MapDecoder mapDecoder = decoder.getMap(Key.ARGUMENTS, isOptional: true); |
| 742 if (mapDecoder != null) { |
| 743 mapDecoder.forEachKey((String key) { |
| 744 arguments[key] = mapDecoder.getString(key); |
| 745 }); |
| 746 } |
| 747 return new ErroneousElementX(messageKind, arguments, name, enclosing); |
| 708 case SerializedElementKind.LIBRARY: | 748 case SerializedElementKind.LIBRARY: |
| 709 return new LibraryElementZ(decoder); | 749 return new LibraryElementZ(decoder); |
| 710 case SerializedElementKind.COMPILATION_UNIT: | 750 case SerializedElementKind.COMPILATION_UNIT: |
| 711 return new CompilationUnitElementZ(decoder); | 751 return new CompilationUnitElementZ(decoder); |
| 712 case SerializedElementKind.CLASS: | 752 case SerializedElementKind.CLASS: |
| 713 return new ClassElementZ(decoder); | 753 return new ClassElementZ(decoder); |
| 714 case SerializedElementKind.ENUM: | 754 case SerializedElementKind.ENUM: |
| 715 return new EnumClassElementZ(decoder); | 755 return new EnumClassElementZ(decoder); |
| 716 case SerializedElementKind.NAMED_MIXIN_APPLICATION: | 756 case SerializedElementKind.NAMED_MIXIN_APPLICATION: |
| 717 return new NamedMixinApplicationElementZ(decoder); | 757 return new NamedMixinApplicationElementZ(decoder); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 return new LocalVariableElementZ(decoder); | 812 return new LocalVariableElementZ(decoder); |
| 773 case SerializedElementKind.EXTERNAL_LIBRARY: | 813 case SerializedElementKind.EXTERNAL_LIBRARY: |
| 774 case SerializedElementKind.EXTERNAL_LIBRARY_MEMBER: | 814 case SerializedElementKind.EXTERNAL_LIBRARY_MEMBER: |
| 775 case SerializedElementKind.EXTERNAL_CLASS_MEMBER: | 815 case SerializedElementKind.EXTERNAL_CLASS_MEMBER: |
| 776 case SerializedElementKind.EXTERNAL_CONSTRUCTOR: | 816 case SerializedElementKind.EXTERNAL_CONSTRUCTOR: |
| 777 break; | 817 break; |
| 778 } | 818 } |
| 779 throw new UnsupportedError("Unexpected element kind '${elementKind}."); | 819 throw new UnsupportedError("Unexpected element kind '${elementKind}."); |
| 780 } | 820 } |
| 781 } | 821 } |
| OLD | NEW |