Index: pkg/compiler/lib/src/serialization/serialization_util.dart |
diff --git a/pkg/compiler/lib/src/serialization/serialization_util.dart b/pkg/compiler/lib/src/serialization/serialization_util.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cd5e77a753f6c6966cd62cedc1c6548af26203d8 |
--- /dev/null |
+++ b/pkg/compiler/lib/src/serialization/serialization_util.dart |
@@ -0,0 +1,481 @@ |
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library dart2js.serialization.util; |
+ |
+import '../dart_types.dart'; |
+import '../common/resolution.dart'; |
+import '../constants/expressions.dart'; |
+import '../elements/elements.dart'; |
+import '../resolution/access_semantics.dart'; |
+import '../resolution/operators.dart'; |
+import '../resolution/send_structure.dart'; |
+import '../universe/call_structure.dart'; |
+import '../universe/selector.dart'; |
+import '../universe/world_impact.dart'; |
+import '../universe/use.dart'; |
+import '../util/enumset.dart'; |
+ |
+import 'keys.dart'; |
+import 'serialization.dart'; |
+ |
+/// Serialize [name] into [encoder]. |
+void serializeName(Name name, ObjectEncoder encoder) { |
+ encoder.setString(Key.NAME, name.text); |
+ encoder.setBool(Key.IS_SETTER, name.isSetter); |
+ if (name.library != null) { |
+ encoder.setElement(Key.LIBRARY, name.library); |
+ } |
+} |
+ |
+/// Deserialize a [Name] from [decoder]. |
+Name deserializeName(ObjectDecoder decoder) { |
+ String name = decoder.getString(Key.NAME); |
+ bool isSetter = decoder.getBool(Key.IS_SETTER); |
+ LibraryElement library = decoder.getElement(Key.LIBRARY, isOptional: true); |
+ return new Name(name, library, isSetter: isSetter); |
+} |
+ |
+/// Serialize [selector] into [encoder]. |
+void serializeSelector(Selector selector, ObjectEncoder encoder) { |
+ encoder.setEnum(Key.KIND, selector.kind); |
+ |
+ encoder.setInt(Key.ARGUMENTS, selector.callStructure.argumentCount); |
+ encoder.setStrings( |
+ Key.NAMED_ARGUMENTS, selector.callStructure.namedArguments); |
+ serializeName(selector.memberName, encoder); |
+} |
+ |
+/// Deserialize a [Selector] from [decoder]. |
+Selector deserializeSelector(ObjectDecoder decoder) { |
+ SelectorKind kind = decoder.getEnum(Key.KIND, SelectorKind.values); |
+ int argumentCount = decoder.getInt(Key.ARGUMENTS); |
+ List<String> namedArguments = |
+ decoder.getStrings(Key.NAMED_ARGUMENTS, isOptional: true); |
+ String name = decoder.getString(Key.NAME); |
+ bool isSetter = decoder.getBool(Key.IS_SETTER); |
+ LibraryElement library = decoder.getElement(Key.LIBRARY, isOptional: true); |
+ return new Selector(kind, deserializeName(decoder), |
+ new CallStructure(argumentCount, namedArguments)); |
+} |
+ |
+/// Serialize [sendStructure] into [encoder]. |
+void serializeSendStructure( |
+ SendStructure sendStructure, ObjectEncoder encoder) { |
+ encoder.setEnum(Key.KIND, sendStructure.kind); |
+ switch (sendStructure.kind) { |
+ case SendStructureKind.IF_NULL: |
+ case SendStructureKind.LOGICAL_AND: |
+ case SendStructureKind.LOGICAL_OR: |
+ case SendStructureKind.NOT: |
+ case SendStructureKind.INVALID_UNARY: |
+ case SendStructureKind.INVALID_BINARY: |
+ // No additional properties. |
+ break; |
+ case SendStructureKind.IS: |
+ IsStructure structure = sendStructure; |
+ encoder.setType(Key.TYPE, structure.type); |
+ break; |
+ case SendStructureKind.IS_NOT: |
+ IsNotStructure structure = sendStructure; |
+ encoder.setType(Key.TYPE, structure.type); |
+ break; |
+ case SendStructureKind.AS: |
+ AsStructure structure = sendStructure; |
+ encoder.setType(Key.TYPE, structure.type); |
+ break; |
+ case SendStructureKind.INVOKE: |
+ InvokeStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ serializeSelector(structure.selector, encoder.createObject(Key.SELECTOR)); |
+ break; |
+ case SendStructureKind.INCOMPATIBLE_INVOKE: |
+ IncompatibleInvokeStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ serializeSelector(structure.selector, encoder.createObject(Key.SELECTOR)); |
+ break; |
+ case SendStructureKind.GET: |
+ GetStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ break; |
+ case SendStructureKind.SET: |
+ SetStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ break; |
+ case SendStructureKind.UNARY: |
+ UnaryStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind); |
+ break; |
+ case SendStructureKind.INDEX: |
+ IndexStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ break; |
+ case SendStructureKind.EQUALS: |
+ EqualsStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ break; |
+ case SendStructureKind.NOT_EQUALS: |
+ NotEqualsStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ break; |
+ case SendStructureKind.BINARY: |
+ BinaryStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind); |
+ break; |
+ case SendStructureKind.INDEX_SET: |
+ IndexSetStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ break; |
+ case SendStructureKind.INDEX_PREFIX: |
+ IndexPrefixStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind); |
+ break; |
+ case SendStructureKind.INDEX_POSTFIX: |
+ IndexPostfixStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind); |
+ break; |
+ case SendStructureKind.COMPOUND: |
+ CompoundStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind); |
+ break; |
+ case SendStructureKind.SET_IF_NULL: |
+ SetIfNullStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ break; |
+ case SendStructureKind.COMPOUND_INDEX_SET: |
+ CompoundIndexSetStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind); |
+ break; |
+ case SendStructureKind.INDEX_SET_IF_NULL: |
+ IndexSetIfNullStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ break; |
+ case SendStructureKind.PREFIX: |
+ PrefixStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind); |
+ break; |
+ case SendStructureKind.POSTFIX: |
+ PostfixStructure structure = sendStructure; |
+ serializeAccessSemantics( |
+ structure.semantics, encoder.createObject(Key.SEMANTICS)); |
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind); |
+ break; |
+ case SendStructureKind.DEFERRED_PREFIX: |
+ DeferredPrefixStructure structure = sendStructure; |
+ encoder.setElement(Key.PREFIX, structure.prefix); |
+ serializeSendStructure( |
+ structure.sendStructure, encoder.createObject(Key.SEND_STRUCTURE)); |
+ break; |
+ } |
+} |
+ |
+/// Deserialize a [SendStructure] from [decoder]. |
+SendStructure deserializeSendStructure(ObjectDecoder decoder) { |
+ SendStructureKind kind = decoder.getEnum(Key.KIND, SendStructureKind.values); |
+ switch (kind) { |
+ case SendStructureKind.IF_NULL: |
+ return const IfNullStructure(); |
+ case SendStructureKind.LOGICAL_AND: |
+ return const LogicalAndStructure(); |
+ case SendStructureKind.LOGICAL_OR: |
+ return const LogicalOrStructure(); |
+ case SendStructureKind.IS: |
+ return new IsStructure(decoder.getType(Key.TYPE)); |
+ case SendStructureKind.IS_NOT: |
+ return new IsNotStructure(decoder.getType(Key.TYPE)); |
+ case SendStructureKind.AS: |
+ return new AsStructure(decoder.getType(Key.TYPE)); |
+ case SendStructureKind.INVOKE: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ Selector selector = deserializeSelector(decoder.getObject(Key.SELECTOR)); |
+ return new InvokeStructure(semantics, selector); |
+ case SendStructureKind.INCOMPATIBLE_INVOKE: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ Selector selector = deserializeSelector(decoder.getObject(Key.SELECTOR)); |
+ return new IncompatibleInvokeStructure(semantics, selector); |
+ case SendStructureKind.GET: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new GetStructure(semantics); |
+ case SendStructureKind.SET: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new SetStructure(semantics); |
+ case SendStructureKind.NOT: |
+ return const NotStructure(); |
+ case SendStructureKind.UNARY: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new UnaryStructure( |
+ semantics, |
+ UnaryOperator.fromKind( |
+ decoder.getEnum(Key.OPERATOR, UnaryOperatorKind.values))); |
+ case SendStructureKind.INVALID_UNARY: |
+ return new InvalidUnaryStructure(); |
+ case SendStructureKind.INDEX: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new IndexStructure(semantics); |
+ case SendStructureKind.EQUALS: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new EqualsStructure(semantics); |
+ case SendStructureKind.NOT_EQUALS: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new NotEqualsStructure(semantics); |
+ case SendStructureKind.BINARY: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new BinaryStructure( |
+ semantics, |
+ BinaryOperator.fromKind( |
+ decoder.getEnum(Key.OPERATOR, BinaryOperatorKind.values))); |
+ case SendStructureKind.INVALID_BINARY: |
+ return const InvalidBinaryStructure(); |
+ case SendStructureKind.INDEX_SET: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new IndexSetStructure(semantics); |
+ case SendStructureKind.INDEX_PREFIX: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new IndexPrefixStructure( |
+ semantics, |
+ IncDecOperator.fromKind( |
+ decoder.getEnum(Key.OPERATOR, IncDecOperatorKind.values))); |
+ case SendStructureKind.INDEX_POSTFIX: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new IndexPostfixStructure( |
+ semantics, |
+ IncDecOperator.fromKind( |
+ decoder.getEnum(Key.OPERATOR, IncDecOperatorKind.values))); |
+ case SendStructureKind.COMPOUND: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new CompoundStructure( |
+ semantics, |
+ AssignmentOperator.fromKind( |
+ decoder.getEnum(Key.OPERATOR, AssignmentOperatorKind.values))); |
+ case SendStructureKind.SET_IF_NULL: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new SetIfNullStructure(semantics); |
+ case SendStructureKind.COMPOUND_INDEX_SET: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new CompoundIndexSetStructure( |
+ semantics, |
+ AssignmentOperator.fromKind( |
+ decoder.getEnum(Key.OPERATOR, AssignmentOperatorKind.values))); |
+ case SendStructureKind.INDEX_SET_IF_NULL: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new IndexSetIfNullStructure(semantics); |
+ case SendStructureKind.PREFIX: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new PrefixStructure( |
+ semantics, |
+ IncDecOperator.fromKind( |
+ decoder.getEnum(Key.OPERATOR, IncDecOperatorKind.values))); |
+ case SendStructureKind.POSTFIX: |
+ AccessSemantics semantics = |
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS)); |
+ return new PostfixStructure( |
+ semantics, |
+ IncDecOperator.fromKind( |
+ decoder.getEnum(Key.OPERATOR, IncDecOperatorKind.values))); |
+ case SendStructureKind.DEFERRED_PREFIX: |
+ PrefixElement prefix = decoder.getElement(Key.PREFIX); |
+ SendStructure sendStructure = |
+ deserializeSendStructure(decoder.getObject(Key.SEND_STRUCTURE)); |
+ return new DeferredPrefixStructure(prefix, sendStructure); |
+ } |
+} |
+ |
+/// Serialize [newStructure] into [encoder]. |
+void serializeNewStructure(NewStructure newStructure, ObjectEncoder encoder) { |
+ encoder.setEnum(Key.KIND, newStructure.kind); |
+ switch (newStructure.kind) { |
+ case NewStructureKind.NEW_INVOKE: |
+ NewInvokeStructure structure = newStructure; |
+ encoder.setEnum(Key.SUB_KIND, structure.semantics.kind); |
+ encoder.setElement(Key.ELEMENT, structure.semantics.element); |
+ encoder.setType(Key.TYPE, structure.semantics.type); |
+ serializeSelector(structure.selector, encoder.createObject(Key.SELECTOR)); |
+ break; |
+ case NewStructureKind.CONST_INVOKE: |
+ ConstInvokeStructure structure = newStructure; |
+ encoder.setEnum(Key.SUB_KIND, structure.constantInvokeKind); |
+ encoder.setConstant(Key.CONSTANT, structure.constant); |
+ break; |
+ case NewStructureKind.LATE_CONST: |
+ throw new UnsupportedError( |
+ 'Unsupported NewStructure kind ${newStructure.kind}.'); |
+ } |
+} |
+ |
+/// Deserialize a [NewStructure] from [decoder]. |
+NewStructure deserializeNewStructure(ObjectDecoder decoder) { |
+ NewStructureKind kind = decoder.getEnum(Key.KIND, NewStructureKind.values); |
+ switch (kind) { |
+ case NewStructureKind.NEW_INVOKE: |
+ ConstructorAccessKind constructorAccessKind = |
+ decoder.getEnum(Key.SUB_KIND, ConstructorAccessKind.values); |
+ Element element = decoder.getElement(Key.ELEMENT); |
+ DartType type = decoder.getType(Key.TYPE); |
+ ConstructorAccessSemantics semantics = |
+ new ConstructorAccessSemantics(constructorAccessKind, element, type); |
+ Selector selector = deserializeSelector(decoder.getObject(Key.SELECTOR)); |
+ return new NewInvokeStructure(semantics, selector); |
+ |
+ case NewStructureKind.CONST_INVOKE: |
+ ConstantInvokeKind constantInvokeKind = |
+ decoder.getEnum(Key.SUB_KIND, ConstantInvokeKind.values); |
+ ConstantExpression constant = decoder.getConstant(Key.CONSTANT); |
+ return new ConstInvokeStructure(constantInvokeKind, constant); |
+ case NewStructureKind.LATE_CONST: |
+ throw new UnsupportedError('Unsupported NewStructure kind $kind.'); |
+ } |
+} |
+ |
+/// Serialize [semantics] into [encoder]. |
+void serializeAccessSemantics( |
+ AccessSemantics semantics, ObjectEncoder encoder) { |
+ encoder.setEnum(Key.KIND, semantics.kind); |
+ switch (semantics.kind) { |
+ case AccessKind.EXPRESSION: |
+ case AccessKind.THIS: |
+ // No additional properties. |
+ break; |
+ case AccessKind.THIS_PROPERTY: |
+ case AccessKind.DYNAMIC_PROPERTY: |
+ case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: |
+ serializeName(semantics.name, encoder); |
+ break; |
+ case AccessKind.CLASS_TYPE_LITERAL: |
+ case AccessKind.TYPEDEF_TYPE_LITERAL: |
+ case AccessKind.DYNAMIC_TYPE_LITERAL: |
+ encoder.setConstant(Key.CONSTANT, semantics.constant); |
+ break; |
+ case AccessKind.LOCAL_FUNCTION: |
+ case AccessKind.LOCAL_VARIABLE: |
+ case AccessKind.FINAL_LOCAL_VARIABLE: |
+ case AccessKind.PARAMETER: |
+ case AccessKind.FINAL_PARAMETER: |
+ case AccessKind.STATIC_FIELD: |
+ case AccessKind.FINAL_STATIC_FIELD: |
+ case AccessKind.STATIC_METHOD: |
+ case AccessKind.STATIC_GETTER: |
+ case AccessKind.STATIC_SETTER: |
+ case AccessKind.TOPLEVEL_FIELD: |
+ case AccessKind.FINAL_TOPLEVEL_FIELD: |
+ case AccessKind.TOPLEVEL_METHOD: |
+ case AccessKind.TOPLEVEL_GETTER: |
+ case AccessKind.TOPLEVEL_SETTER: |
+ case AccessKind.SUPER_FIELD: |
+ case AccessKind.SUPER_FINAL_FIELD: |
+ case AccessKind.SUPER_METHOD: |
+ case AccessKind.SUPER_GETTER: |
+ case AccessKind.SUPER_SETTER: |
+ case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: |
+ case AccessKind.UNRESOLVED: |
+ case AccessKind.UNRESOLVED_SUPER: |
+ case AccessKind.INVALID: |
+ encoder.setElement(Key.ELEMENT, semantics.element); |
+ break; |
+ case AccessKind.COMPOUND: |
+ CompoundAccessSemantics compoundAccess = semantics; |
+ encoder.setEnum(Key.SUB_KIND, compoundAccess.compoundAccessKind); |
+ encoder.setElement(Key.GETTER, semantics.getter); |
+ encoder.setElement(Key.SETTER, semantics.setter); |
+ break; |
+ case AccessKind.CONSTANT: |
+ throw new UnsupportedError('Unsupported access kind: ${semantics.kind}'); |
+ } |
+} |
+ |
+/// Deserialize a [AccessSemantics] from [decoder]. |
+AccessSemantics deserializeAccessSemantics(ObjectDecoder decoder) { |
+ AccessKind kind = decoder.getEnum(Key.KIND, AccessKind.values); |
+ switch (kind) { |
+ case AccessKind.EXPRESSION: |
+ return const DynamicAccess.expression(); |
+ case AccessKind.THIS: |
+ return const DynamicAccess.thisAccess(); |
+ case AccessKind.THIS_PROPERTY: |
+ return new DynamicAccess.thisProperty(deserializeName(decoder)); |
+ case AccessKind.DYNAMIC_PROPERTY: |
+ return new DynamicAccess.dynamicProperty(deserializeName(decoder)); |
+ case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY: |
+ return new DynamicAccess.ifNotNullProperty(deserializeName(decoder)); |
+ case AccessKind.CLASS_TYPE_LITERAL: |
+ case AccessKind.TYPEDEF_TYPE_LITERAL: |
+ case AccessKind.DYNAMIC_TYPE_LITERAL: |
+ return new ConstantAccess(kind, decoder.getConstant(Key.CONSTANT)); |
+ |
+ case AccessKind.LOCAL_FUNCTION: |
+ case AccessKind.LOCAL_VARIABLE: |
+ case AccessKind.FINAL_LOCAL_VARIABLE: |
+ case AccessKind.PARAMETER: |
+ case AccessKind.FINAL_PARAMETER: |
+ case AccessKind.STATIC_FIELD: |
+ case AccessKind.FINAL_STATIC_FIELD: |
+ case AccessKind.STATIC_METHOD: |
+ case AccessKind.STATIC_GETTER: |
+ case AccessKind.STATIC_SETTER: |
+ case AccessKind.TOPLEVEL_FIELD: |
+ case AccessKind.FINAL_TOPLEVEL_FIELD: |
+ case AccessKind.TOPLEVEL_METHOD: |
+ case AccessKind.TOPLEVEL_GETTER: |
+ case AccessKind.TOPLEVEL_SETTER: |
+ case AccessKind.SUPER_FIELD: |
+ case AccessKind.SUPER_FINAL_FIELD: |
+ case AccessKind.SUPER_METHOD: |
+ case AccessKind.SUPER_GETTER: |
+ case AccessKind.SUPER_SETTER: |
+ case AccessKind.TYPE_PARAMETER_TYPE_LITERAL: |
+ case AccessKind.UNRESOLVED: |
+ case AccessKind.UNRESOLVED_SUPER: |
+ case AccessKind.INVALID: |
+ return new StaticAccess.internal(kind, decoder.getElement(Key.ELEMENT)); |
+ |
+ case AccessKind.COMPOUND: |
+ CompoundAccessKind compoundAccessKind = |
+ decoder.getEnum(Key.SUB_KIND, CompoundAccessKind.values); |
+ Element getter = decoder.getElement(Key.GETTER); |
+ Element setter = decoder.getElement(Key.SETTER); |
+ return new CompoundAccessSemantics(compoundAccessKind, getter, setter); |
+ case AccessKind.CONSTANT: |
+ throw new UnsupportedError('Unsupported access kind: $kind'); |
+ } |
+} |