diff --git a/pkg/compiler/lib/src/closure.dart b/pkg/compiler/lib/src/closure.dart
index af806f9..e5e807e 100644
--- a/pkg/compiler/lib/src/closure.dart
+++ b/pkg/compiler/lib/src/closure.dart
@@ -16,11 +16,11 @@
 abstract class ClosureData {
   /// Deserializes a [ClosureData] object from [source].
   factory ClosureData.readFromDataSource(
-          JsToElementMap elementMap, DataSource source) =
+          JsToElementMap elementMap, DataSourceReader source) =
       ClosureDataImpl.readFromDataSource;
 
   /// Serializes this [ClosureData] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 
   /// Look up information about the variables that have been mutated and are
   /// used inside the scope of [node].
@@ -66,7 +66,7 @@
   const ScopeInfo();
 
   /// Deserializes a [ScopeInfo] object from [source].
-  factory ScopeInfo.readFromDataSource(DataSource source) {
+  factory ScopeInfo.readFromDataSource(DataSourceReader source) {
     ScopeInfoKind kind = source.readEnum(ScopeInfoKind.values);
     switch (kind) {
       case ScopeInfoKind.scopeInfo:
@@ -82,7 +82,7 @@
   }
 
   /// Serializes this [ScopeInfo] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     throw UnsupportedError('${runtimeType}.writeToDataSink');
   }
 
@@ -126,7 +126,7 @@
   const CapturedScope();
 
   /// Deserializes a [CapturedScope] object from [source].
-  factory CapturedScope.readFromDataSource(DataSource source) {
+  factory CapturedScope.readFromDataSource(DataSourceReader source) {
     ScopeInfoKind kind = source.readEnum(ScopeInfoKind.values);
     switch (kind) {
       case ScopeInfoKind.scopeInfo:
@@ -173,7 +173,7 @@
   const CapturedLoopScope();
 
   /// Deserializes a [CapturedLoopScope] object from [source].
-  factory CapturedLoopScope.readFromDataSource(DataSource source) {
+  factory CapturedLoopScope.readFromDataSource(DataSourceReader source) {
     ScopeInfoKind kind = source.readEnum(ScopeInfoKind.values);
     switch (kind) {
       case ScopeInfoKind.scopeInfo:
@@ -241,7 +241,8 @@
   const ClosureRepresentationInfo();
 
   /// Deserializes a [ClosureRepresentationInfo] object from [source].
-  factory ClosureRepresentationInfo.readFromDataSource(DataSource source) {
+  factory ClosureRepresentationInfo.readFromDataSource(
+      DataSourceReader source) {
     ScopeInfoKind kind = source.readEnum(ScopeInfoKind.values);
     switch (kind) {
       case ScopeInfoKind.scopeInfo:
diff --git a/pkg/compiler/lib/src/common/codegen.dart b/pkg/compiler/lib/src/common/codegen.dart
index 0cf5baf..527f2fa 100644
--- a/pkg/compiler/lib/src/common/codegen.dart
+++ b/pkg/compiler/lib/src/common/codegen.dart
@@ -40,10 +40,10 @@
 class CodegenImpact extends WorldImpact {
   const CodegenImpact();
 
-  factory CodegenImpact.readFromDataSource(DataSource source) =
+  factory CodegenImpact.readFromDataSource(DataSourceReader source) =
       _CodegenImpact.readFromDataSource;
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     throw UnsupportedError('CodegenImpact.writeToDataSink');
   }
 
@@ -105,7 +105,7 @@
       this._oneShotInterceptors)
       : super.internal(dynamicUses, staticUses, typeUses, constantUses);
 
-  factory _CodegenImpact.readFromDataSource(DataSource source) {
+  factory _CodegenImpact.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     MemberEntity member = source.readMember();
     Set<DynamicUse> dynamicUses = source
@@ -165,7 +165,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMember(member);
     sink.writeList(dynamicUses, (DynamicUse use) => use.writeToDataSink(sink),
@@ -502,7 +502,7 @@
   /// deserialization are collected in [modularNames] and [modularExpressions]
   /// to avoid the need for visiting the [code] node post deserialization.
   factory CodegenResult.readFromDataSource(
-      DataSource source,
+      DataSourceReader source,
       List<ModularName> modularNames,
       List<ModularExpression> modularExpressions) {
     source.begin(tag);
@@ -517,7 +517,7 @@
   /// The [modularNames] and [modularExpressions] fields are not directly
   /// serializes because these are embedded in the [code] node and collected
   /// through this during deserialization.
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeJsNodeOrNull(code);
     impact.writeToDataSink(sink);
@@ -635,7 +635,7 @@
 
   ModularName(this.kind, {this.data, this.set});
 
-  factory ModularName.readFromDataSource(DataSource source) {
+  factory ModularName.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ModularNameKind kind = source.readEnum(ModularNameKind.values);
     Object data;
@@ -678,7 +678,7 @@
     return ModularName(kind, data: data, set: set);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeEnum(kind);
     switch (kind) {
@@ -884,7 +884,7 @@
 
   ModularExpression(this.kind, this.data);
 
-  factory ModularExpression.readFromDataSource(DataSource source) {
+  factory ModularExpression.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ModularExpressionKind kind = source.readEnum(ModularExpressionKind.values);
     Object data;
@@ -900,7 +900,7 @@
     return ModularExpression(kind, data);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeEnum(kind);
     switch (kind) {
@@ -1107,13 +1107,13 @@
   static const String deferredHolderExpression = 'js-deferredHolderExpression';
 }
 
-/// Visitor that serializes a [js.Node] into a [DataSink].
+/// Visitor that serializes a [js.Node] into a [DataSinkWriter].
 class JsNodeSerializer implements js.NodeVisitor<void> {
-  final DataSink sink;
+  final DataSinkWriter sink;
 
   JsNodeSerializer._(this.sink);
 
-  static void writeToDataSink(DataSink sink, js.Node node) {
+  static void writeToDataSink(DataSinkWriter sink, js.Node node) {
     sink.begin(JsNodeTags.tag);
     JsNodeSerializer serializer = JsNodeSerializer._(sink);
     serializer.visit(node);
@@ -1775,19 +1775,19 @@
   }
 }
 
-/// Helper class that deserializes a [js.Node] from [DataSource].
+/// Helper class that deserializes a [js.Node] from [DataSourceReader].
 ///
 /// Deserialized [ModularName]s and [ModularExpression]s are collected in the
 /// [modularNames] and [modularExpressions] lists.
 class JsNodeDeserializer {
-  final DataSource source;
+  final DataSourceReader source;
   final List<ModularName> modularNames;
   final List<ModularExpression> modularExpressions;
 
   JsNodeDeserializer._(this.source, this.modularNames, this.modularExpressions);
 
   static js.Node readFromDataSource(
-      DataSource source,
+      DataSourceReader source,
       List<ModularName> modularNames,
       List<ModularExpression> modularExpressions) {
     source.begin(JsNodeTags.tag);
@@ -2229,24 +2229,24 @@
       this.closedWorld, this.modularNames, this.modularExpressions);
 
   @override
-  AbstractValue readAbstractValue(DataSource source) {
+  AbstractValue readAbstractValue(DataSourceReader source) {
     return closedWorld.abstractValueDomain
         .readAbstractValueFromDataSource(source);
   }
 
   @override
-  js.Node readJsNode(DataSource source) {
+  js.Node readJsNode(DataSourceReader source) {
     return JsNodeDeserializer.readFromDataSource(
         source, modularNames, modularExpressions);
   }
 
   @override
-  OutputUnit readOutputUnitReference(DataSource source) {
+  OutputUnit readOutputUnitReference(DataSourceReader source) {
     return closedWorld.outputUnitData.outputUnits[source.readInt()];
   }
 
   @override
-  TypeRecipe readTypeRecipe(DataSource source) {
+  TypeRecipe readTypeRecipe(DataSourceReader source) {
     return TypeRecipe.readFromDataSource(source);
   }
 }
@@ -2257,22 +2257,22 @@
   CodegenWriterImpl(this.closedWorld);
 
   @override
-  void writeAbstractValue(DataSink sink, AbstractValue value) {
+  void writeAbstractValue(DataSinkWriter sink, AbstractValue value) {
     closedWorld.abstractValueDomain.writeAbstractValueToDataSink(sink, value);
   }
 
   @override
-  void writeJsNode(DataSink sink, js.Node node) {
+  void writeJsNode(DataSinkWriter sink, js.Node node) {
     JsNodeSerializer.writeToDataSink(sink, node);
   }
 
   @override
-  void writeOutputUnitReference(DataSink sink, OutputUnit value) {
+  void writeOutputUnitReference(DataSinkWriter sink, OutputUnit value) {
     sink.writeInt(closedWorld.outputUnitData.outputUnits.indexOf(value));
   }
 
   @override
-  void writeTypeRecipe(DataSink sink, TypeRecipe recipe) {
+  void writeTypeRecipe(DataSinkWriter sink, TypeRecipe recipe) {
     recipe.writeToDataSink(sink);
   }
 }
diff --git a/pkg/compiler/lib/src/deferred_load/output_unit.dart b/pkg/compiler/lib/src/deferred_load/output_unit.dart
index 17daef0..bd27d06 100644
--- a/pkg/compiler/lib/src/deferred_load/output_unit.dart
+++ b/pkg/compiler/lib/src/deferred_load/output_unit.dart
@@ -156,7 +156,7 @@
   }
 
   /// Deserializes an [OutputUnitData] object from [source].
-  factory OutputUnitData.readFromDataSource(DataSource source) {
+  factory OutputUnitData.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     bool isProgramSplit = source.readBool();
     List<OutputUnit> outputUnits = source.readList(() {
@@ -205,7 +205,7 @@
   }
 
   /// Serializes this [OutputUnitData] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeBool(isProgramSplit);
     Map<OutputUnit, int> outputUnitIndices = {};
diff --git a/pkg/compiler/lib/src/elements/entities.dart b/pkg/compiler/lib/src/elements/entities.dart
index a9f5514..f8d96a3 100644
--- a/pkg/compiler/lib/src/elements/entities.dart
+++ b/pkg/compiler/lib/src/elements/entities.dart
@@ -350,7 +350,7 @@
   }
 
   /// Deserializes a [ParameterStructure] object from [source].
-  factory ParameterStructure.readFromDataSource(DataSource source) {
+  factory ParameterStructure.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     int requiredPositionalParameters = source.readInt();
     int positionalParameters = source.readInt();
@@ -368,7 +368,7 @@
   }
 
   /// Serializes this [ParameterStructure] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeInt(requiredPositionalParameters);
     sink.writeInt(positionalParameters);
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index c93c535..a0d63a9 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -24,7 +24,7 @@
 /// implemented directly but other entity systems, for instance based directly
 /// on kernel ir without the need for [Element].
 
-extension on DataSource {
+extension on DataSourceReader {
   List<DartType> _readDartTypes(
       List<FunctionTypeVariable> functionTypeVariables) {
     int count = readInt();
@@ -36,7 +36,7 @@
   }
 }
 
-extension on DataSink {
+extension on DataSinkWriter {
   void _writeDartTypes(
       List<DartType> types, List<FunctionTypeVariable> functionTypeVariables) {
     writeInt(types.length);
@@ -49,8 +49,8 @@
 abstract class DartType {
   const DartType();
 
-  factory DartType.readFromDataSource(
-      DataSource source, List<FunctionTypeVariable> functionTypeVariables) {
+  factory DartType.readFromDataSource(DataSourceReader source,
+      List<FunctionTypeVariable> functionTypeVariables) {
     DartTypeKind kind = source.readEnum(DartTypeKind.values);
     switch (kind) {
       case DartTypeKind.none:
@@ -86,7 +86,7 @@
   }
 
   void writeToDataSink(
-      DataSink sink, List<FunctionTypeVariable> functionTypeVariables);
+      DataSinkWriter sink, List<FunctionTypeVariable> functionTypeVariables);
 
   /// Returns the base type if this is a [LegacyType] or [NullableType] and
   /// returns this type otherwise.
@@ -204,8 +204,8 @@
 
   const LegacyType._(this.baseType);
 
-  factory LegacyType._readFromDataSource(
-      DataSource source, List<FunctionTypeVariable> functionTypeVariables) {
+  factory LegacyType._readFromDataSource(DataSourceReader source,
+      List<FunctionTypeVariable> functionTypeVariables) {
     DartType baseType =
         DartType.readFromDataSource(source, functionTypeVariables);
     return LegacyType._(baseType);
@@ -213,7 +213,7 @@
 
   @override
   void writeToDataSink(
-      DataSink sink, List<FunctionTypeVariable> functionTypeVariables) {
+      DataSinkWriter sink, List<FunctionTypeVariable> functionTypeVariables) {
     sink.writeEnum(DartTypeKind.legacyType);
     baseType.writeToDataSink(sink, functionTypeVariables);
   }
@@ -259,8 +259,8 @@
 
   const NullableType._(this.baseType);
 
-  factory NullableType._readFromDataSource(
-      DataSource source, List<FunctionTypeVariable> functionTypeVariables) {
+  factory NullableType._readFromDataSource(DataSourceReader source,
+      List<FunctionTypeVariable> functionTypeVariables) {
     DartType baseType =
         DartType.readFromDataSource(source, functionTypeVariables);
     return NullableType._(baseType);
@@ -268,7 +268,7 @@
 
   @override
   void writeToDataSink(
-      DataSink sink, List<FunctionTypeVariable> functionTypeVariables) {
+      DataSinkWriter sink, List<FunctionTypeVariable> functionTypeVariables) {
     sink.writeEnum(DartTypeKind.nullableType);
     baseType.writeToDataSink(sink, functionTypeVariables);
   }
@@ -321,8 +321,8 @@
     return InterfaceType._allocate(element, typeArguments);
   }
 
-  factory InterfaceType._readFromDataSource(
-      DataSource source, List<FunctionTypeVariable> functionTypeVariables) {
+  factory InterfaceType._readFromDataSource(DataSourceReader source,
+      List<FunctionTypeVariable> functionTypeVariables) {
     ClassEntity element = source.readClass();
     List<DartType> typeArguments = source._readDartTypes(functionTypeVariables);
     return InterfaceType._(element, typeArguments);
@@ -330,7 +330,7 @@
 
   @override
   void writeToDataSink(
-      DataSink sink, List<FunctionTypeVariable> functionTypeVariables) {
+      DataSinkWriter sink, List<FunctionTypeVariable> functionTypeVariables) {
     sink.writeEnum(DartTypeKind.interfaceType);
     sink.writeClass(element);
     sink._writeDartTypes(typeArguments, functionTypeVariables);
@@ -393,15 +393,15 @@
 
   const TypeVariableType._(this.element);
 
-  factory TypeVariableType._readFromDataSource(
-      DataSource source, List<FunctionTypeVariable> functionTypeVariables) {
+  factory TypeVariableType._readFromDataSource(DataSourceReader source,
+      List<FunctionTypeVariable> functionTypeVariables) {
     TypeVariableEntity element = source.readTypeVariable();
     return TypeVariableType._(element);
   }
 
   @override
   void writeToDataSink(
-      DataSink sink, List<FunctionTypeVariable> functionTypeVariables) {
+      DataSinkWriter sink, List<FunctionTypeVariable> functionTypeVariables) {
     sink.writeEnum(DartTypeKind.typeVariable);
     sink.writeTypeVariable(element);
   }
@@ -449,8 +449,8 @@
 
   FunctionTypeVariable._(this.index);
 
-  factory FunctionTypeVariable._readFromDataSource(
-      DataSource source, List<FunctionTypeVariable> functionTypeVariables) {
+  factory FunctionTypeVariable._readFromDataSource(DataSourceReader source,
+      List<FunctionTypeVariable> functionTypeVariables) {
     int index = source.readInt();
     assert(0 <= index && index < functionTypeVariables.length);
     return functionTypeVariables[index];
@@ -458,7 +458,7 @@
 
   @override
   void writeToDataSink(
-      DataSink sink, List<FunctionTypeVariable> functionTypeVariables) {
+      DataSinkWriter sink, List<FunctionTypeVariable> functionTypeVariables) {
     int index = functionTypeVariables.indexOf(this);
     if (index == -1) {
       // TODO(johnniwinther): Avoid free variables.
@@ -498,14 +498,14 @@
 class NeverType extends DartType {
   const NeverType._();
 
-  factory NeverType._readFromDataSource(
-      DataSource source, List<FunctionTypeVariable> functionTypeVariables) {
+  factory NeverType._readFromDataSource(DataSourceReader source,
+      List<FunctionTypeVariable> functionTypeVariables) {
     return const NeverType._();
   }
 
   @override
   void writeToDataSink(
-      DataSink sink, List<FunctionTypeVariable> functionTypeVariables) {
+      DataSinkWriter sink, List<FunctionTypeVariable> functionTypeVariables) {
     sink.writeEnum(DartTypeKind.neverType);
   }
 
@@ -526,13 +526,13 @@
 class VoidType extends DartType {
   const VoidType._();
 
-  factory VoidType._readFromDataSource(DataSource source,
+  factory VoidType._readFromDataSource(DataSourceReader source,
           List<FunctionTypeVariable> functionTypeVariables) =>
       const VoidType._();
 
   @override
   void writeToDataSink(
-      DataSink sink, List<FunctionTypeVariable> functionTypeVariables) {
+      DataSinkWriter sink, List<FunctionTypeVariable> functionTypeVariables) {
     sink.writeEnum(DartTypeKind.voidType);
   }
 
@@ -553,13 +553,13 @@
 class DynamicType extends DartType {
   const DynamicType._();
 
-  factory DynamicType._readFromDataSource(DataSource source,
+  factory DynamicType._readFromDataSource(DataSourceReader source,
           List<FunctionTypeVariable> functionTypeVariables) =>
       const DynamicType._();
 
   @override
   void writeToDataSink(
-      DataSink sink, List<FunctionTypeVariable> functionTypeVariables) {
+      DataSinkWriter sink, List<FunctionTypeVariable> functionTypeVariables) {
     sink.writeEnum(DartTypeKind.dynamicType);
   }
 
@@ -580,13 +580,13 @@
 class ErasedType extends DartType {
   const ErasedType._();
 
-  factory ErasedType._readFromDataSource(DataSource source,
+  factory ErasedType._readFromDataSource(DataSourceReader source,
           List<FunctionTypeVariable> functionTypeVariables) =>
       const ErasedType._();
 
   @override
   void writeToDataSink(
-      DataSink sink, List<FunctionTypeVariable> functionTypeVariables) {
+      DataSinkWriter sink, List<FunctionTypeVariable> functionTypeVariables) {
     sink.writeEnum(DartTypeKind.erasedType);
   }
 
@@ -618,13 +618,13 @@
 class AnyType extends DartType {
   const AnyType._();
 
-  factory AnyType._readFromDataSource(DataSource source,
+  factory AnyType._readFromDataSource(DataSourceReader source,
           List<FunctionTypeVariable> functionTypeVariables) =>
       const AnyType._();
 
   @override
   void writeToDataSink(
-      DataSink sink, List<FunctionTypeVariable> functionTypeVariables) {
+      DataSinkWriter sink, List<FunctionTypeVariable> functionTypeVariables) {
     sink.writeEnum(DartTypeKind.anyType);
   }
 
@@ -706,8 +706,8 @@
         typeVariables);
   }
 
-  factory FunctionType._readFromDataSource(
-      DataSource source, List<FunctionTypeVariable> functionTypeVariables) {
+  factory FunctionType._readFromDataSource(DataSourceReader source,
+      List<FunctionTypeVariable> functionTypeVariables) {
     int typeVariableCount = source.readInt();
     List<FunctionTypeVariable> typeVariables =
         List<FunctionTypeVariable>.generate(
@@ -745,7 +745,7 @@
 
   @override
   void writeToDataSink(
-      DataSink sink, List<FunctionTypeVariable> functionTypeVariables) {
+      DataSinkWriter sink, List<FunctionTypeVariable> functionTypeVariables) {
     sink.writeEnum(DartTypeKind.functionType);
     functionTypeVariables = List<FunctionTypeVariable>.of(functionTypeVariables)
       ..addAll(typeVariables);
@@ -851,8 +851,8 @@
 
   const FutureOrType._(this.typeArgument);
 
-  factory FutureOrType._readFromDataSource(
-      DataSource source, List<FunctionTypeVariable> functionTypeVariables) {
+  factory FutureOrType._readFromDataSource(DataSourceReader source,
+      List<FunctionTypeVariable> functionTypeVariables) {
     DartType typeArgument =
         DartType.readFromDataSource(source, functionTypeVariables);
     return FutureOrType._(typeArgument);
@@ -860,7 +860,7 @@
 
   @override
   void writeToDataSink(
-      DataSink sink, List<FunctionTypeVariable> functionTypeVariables) {
+      DataSinkWriter sink, List<FunctionTypeVariable> functionTypeVariables) {
     sink.writeEnum(DartTypeKind.futureOr);
     typeArgument.writeToDataSink(sink, functionTypeVariables);
   }
diff --git a/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart b/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart
index 582d331..e6d05b1 100644
--- a/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart
+++ b/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart
@@ -632,8 +632,8 @@
   String getCompactText(AbstractValue value);
 
   /// Deserializes an [AbstractValue] for this domain from [source].
-  AbstractValue readAbstractValueFromDataSource(DataSource source);
+  AbstractValue readAbstractValueFromDataSource(DataSourceReader source);
 
   /// Serializes this [value] for this domain to [sink].
-  void writeAbstractValueToDataSink(DataSink sink, AbstractValue value);
+  void writeAbstractValueToDataSink(DataSinkWriter sink, AbstractValue value);
 }
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index c56d855..3d9dd84 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -1354,7 +1354,7 @@
 
   /// Deserializes a [GlobalTypeInferenceElementData] object from [source].
   factory KernelGlobalTypeInferenceElementData.readFromDataSource(
-      DataSource source,
+      DataSourceReader source,
       ir.Member context,
       AbstractValueDomain abstractValueDomain) {
     return source.inMemberContext(context, () {
@@ -1381,7 +1381,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink, ir.Member context,
+  void writeToDataSink(DataSinkWriter sink, ir.Member context,
       AbstractValueDomain abstractValueDomain) {
     sink.inMemberContext(context, () {
       sink.begin(tag);
diff --git a/pkg/compiler/lib/src/inferrer/powersets/powersets.dart b/pkg/compiler/lib/src/inferrer/powersets/powersets.dart
index b4f6789..6314434 100644
--- a/pkg/compiler/lib/src/inferrer/powersets/powersets.dart
+++ b/pkg/compiler/lib/src/inferrer/powersets/powersets.dart
@@ -74,14 +74,14 @@
   //TODO(coam)
   @override
   void writeAbstractValueToDataSink(
-      DataSink sink, covariant PowersetValue value) {
+      DataSinkWriter sink, covariant PowersetValue value) {
     _abstractValueDomain.writeAbstractValueToDataSink(
         sink, value._abstractValue);
   }
 
   //TODO(coam)
   @override
-  AbstractValue readAbstractValueFromDataSource(DataSource source) {
+  AbstractValue readAbstractValueFromDataSource(DataSourceReader source) {
     int powersetBits = _powersetBitsDomain.powersetTop;
     AbstractValue abstractValue =
         _abstractValueDomain.readAbstractValueFromDataSource(source);
diff --git a/pkg/compiler/lib/src/inferrer/powersets/wrapped.dart b/pkg/compiler/lib/src/inferrer/powersets/wrapped.dart
index 7e21d25..35c2641 100644
--- a/pkg/compiler/lib/src/inferrer/powersets/wrapped.dart
+++ b/pkg/compiler/lib/src/inferrer/powersets/wrapped.dart
@@ -58,13 +58,13 @@
 
   @override
   void writeAbstractValueToDataSink(
-      DataSink sink, covariant WrappedAbstractValue value) {
+      DataSinkWriter sink, covariant WrappedAbstractValue value) {
     _abstractValueDomain.writeAbstractValueToDataSink(
         sink, value._abstractValue);
   }
 
   @override
-  AbstractValue readAbstractValueFromDataSource(DataSource source) =>
+  AbstractValue readAbstractValueFromDataSource(DataSourceReader source) =>
       WrappedAbstractValue(
           _abstractValueDomain.readAbstractValueFromDataSource(source));
 
diff --git a/pkg/compiler/lib/src/inferrer/trivial.dart b/pkg/compiler/lib/src/inferrer/trivial.dart
index 6ba231b..c81c91f 100644
--- a/pkg/compiler/lib/src/inferrer/trivial.dart
+++ b/pkg/compiler/lib/src/inferrer/trivial.dart
@@ -31,10 +31,10 @@
   AbstractValue get dynamicType => const TrivialAbstractValue();
 
   @override
-  void writeAbstractValueToDataSink(DataSink sink, AbstractValue value) {}
+  void writeAbstractValueToDataSink(DataSinkWriter sink, AbstractValue value) {}
 
   @override
-  AbstractValue readAbstractValueFromDataSource(DataSource source) =>
+  AbstractValue readAbstractValueFromDataSource(DataSourceReader source) =>
       const TrivialAbstractValue();
 
   @override
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart
index ab14e11..a001c78 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart
@@ -32,7 +32,7 @@
 
   /// Deserializes a [ContainerTypeMask] object from [source].
   factory ContainerTypeMask.readFromDataSource(
-      DataSource source, CommonMasks domain) {
+      DataSourceReader source, CommonMasks domain) {
     source.begin(tag);
     TypeMask forwardTo = TypeMask.readFromDataSource(source, domain);
     ir.TreeNode allocationNode = source.readTreeNodeOrNull();
@@ -46,7 +46,7 @@
 
   /// Serializes this [ContainerTypeMask] to [sink].
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(TypeMaskKind.container);
     sink.begin(tag);
     forwardTo.writeToDataSink(sink);
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
index 00eece2..20adc15 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
@@ -29,7 +29,7 @@
 
   /// Deserializes a [DictionaryTypeMask] object from [source].
   factory DictionaryTypeMask.readFromDataSource(
-      DataSource source, CommonMasks domain) {
+      DataSourceReader source, CommonMasks domain) {
     source.begin(tag);
     TypeMask forwardTo = TypeMask.readFromDataSource(source, domain);
     ir.TreeNode allocationNode = source.readTreeNodeOrNull();
@@ -45,7 +45,7 @@
 
   /// Serializes this [DictionaryTypeMask] to [sink].
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(TypeMaskKind.dictionary);
     sink.begin(tag);
     forwardTo.writeToDataSink(sink);
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
index 321a8d7..d42d4bd 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
@@ -123,7 +123,7 @@
 
   /// Deserializes a [FlatTypeMask] object from [source].
   factory FlatTypeMask.readFromDataSource(
-      DataSource source, CommonMasks domain) {
+      DataSourceReader source, CommonMasks domain) {
     source.begin(tag);
     ClassEntity base = source.readClassOrNull();
     int flags = source.readInt();
@@ -133,7 +133,7 @@
 
   /// Serializes this [FlatTypeMask] to [sink].
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(TypeMaskKind.flat);
     sink.begin(tag);
     sink.writeClassOrNull(base);
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
index 035fa9d..7232e60 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
@@ -32,7 +32,7 @@
 
   /// Deserializes a [MapTypeMask] object from [source].
   factory MapTypeMask.readFromDataSource(
-      DataSource source, CommonMasks domain) {
+      DataSourceReader source, CommonMasks domain) {
     source.begin(tag);
     TypeMask forwardTo = TypeMask.readFromDataSource(source, domain);
     ir.TreeNode allocationNode = source.readTreeNodeOrNull();
@@ -46,7 +46,7 @@
 
   /// Serializes this [MapTypeMask] to [sink].
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(TypeMaskKind.map);
     sink.begin(tag);
     forwardTo.writeToDataSink(sink);
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index c6e534b..9de70a3 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
@@ -974,13 +974,14 @@
   }
 
   @override
-  TypeMask readAbstractValueFromDataSource(DataSource source) {
+  TypeMask readAbstractValueFromDataSource(DataSourceReader source) {
     return source
         .readCached<TypeMask>(() => TypeMask.readFromDataSource(source, this));
   }
 
   @override
-  void writeAbstractValueToDataSink(DataSink sink, covariant TypeMask value) {
+  void writeAbstractValueToDataSink(
+      DataSinkWriter sink, covariant TypeMask value) {
     sink.writeCached<TypeMask>(
         value, (TypeMask value) => value.writeToDataSink(sink));
   }
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
index bfa9098..ab01cc4 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
@@ -29,7 +29,7 @@
 
   /// Deserializes a [SetTypeMask] object from [source].
   factory SetTypeMask.readFromDataSource(
-      DataSource source, CommonMasks domain) {
+      DataSourceReader source, CommonMasks domain) {
     source.begin(tag);
     TypeMask forwardTo = TypeMask.readFromDataSource(source, domain);
     ir.TreeNode allocationNode = source.readTreeNodeOrNull();
@@ -42,7 +42,7 @@
 
   /// Serializes this [SetTypeMask] to [sink].
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(TypeMaskKind.set);
     sink.begin(tag);
     forwardTo.writeToDataSink(sink);
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
index 4702bdf..7f8af43 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
@@ -242,7 +242,8 @@
   }
 
   /// Deserializes a [TypeMask] object from [source].
-  factory TypeMask.readFromDataSource(DataSource source, CommonMasks domain) {
+  factory TypeMask.readFromDataSource(
+      DataSourceReader source, CommonMasks domain) {
     TypeMaskKind kind = source.readEnum(TypeMaskKind.values);
     switch (kind) {
       case TypeMaskKind.flat:
@@ -264,7 +265,7 @@
   }
 
   /// Serializes this [TypeMask] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 
   /// If [mask] is forwarding, returns the first non-forwarding [TypeMask] in
   /// [mask]'s forwarding chain.
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
index 3a647ea..c9abe7d 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
@@ -39,7 +39,7 @@
 
   /// Deserializes a [UnionTypeMask] object from [source].
   factory UnionTypeMask.readFromDataSource(
-      DataSource source, CommonMasks domain) {
+      DataSourceReader source, CommonMasks domain) {
     source.begin(tag);
     List<FlatTypeMask> disjointMasks =
         source.readList(() => TypeMask.readFromDataSource(source, domain));
@@ -52,7 +52,7 @@
 
   /// Serializes this [UnionTypeMask] to [sink].
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(TypeMaskKind.union);
     sink.begin(tag);
     sink.writeList(
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart
index 62b6747..61b43de 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart
@@ -17,7 +17,7 @@
 
   /// Deserializes a [ValueTypeMask] object from [source].
   factory ValueTypeMask.readFromDataSource(
-      DataSource source, CommonMasks domain) {
+      DataSourceReader source, CommonMasks domain) {
     source.begin(tag);
     TypeMask forwardTo = TypeMask.readFromDataSource(source, domain);
     ConstantValue constant = source.readConstant();
@@ -27,7 +27,7 @@
 
   /// Serializes this [ValueTypeMask] to [sink].
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(TypeMaskKind.value);
     sink.begin(tag);
     forwardTo.writeToDataSink(sink);
diff --git a/pkg/compiler/lib/src/inferrer/types.dart b/pkg/compiler/lib/src/inferrer/types.dart
index c72c1f5..bd2c38d 100644
--- a/pkg/compiler/lib/src/inferrer/types.dart
+++ b/pkg/compiler/lib/src/inferrer/types.dart
@@ -34,12 +34,14 @@
 /// based queries (the runtime value could be anything).
 abstract class GlobalTypeInferenceMemberResult {
   /// Deserializes a [GlobalTypeInferenceMemberResult] object from [source].
-  factory GlobalTypeInferenceMemberResult.readFromDataSource(DataSource source,
-          ir.Member context, AbstractValueDomain abstractValueDomain) =
+  factory GlobalTypeInferenceMemberResult.readFromDataSource(
+          DataSourceReader source,
+          ir.Member context,
+          AbstractValueDomain abstractValueDomain) =
       GlobalTypeInferenceMemberResultImpl.readFromDataSource;
 
   /// Serializes this [GlobalTypeInferenceMemberResult] to [sink].
-  void writeToDataSink(DataSink sink, ir.Member context,
+  void writeToDataSink(DataSinkWriter sink, ir.Member context,
       AbstractValueDomain abstractValueDomain);
 
   /// The inferred type when this result belongs to a field, null otherwise.
@@ -73,12 +75,14 @@
 /// a single element.
 abstract class GlobalTypeInferenceElementData {
   /// Deserializes a [GlobalTypeInferenceElementData] object from [source].
-  factory GlobalTypeInferenceElementData.readFromDataSource(DataSource source,
-          ir.Member context, AbstractValueDomain abstractValueDomain) =
+  factory GlobalTypeInferenceElementData.readFromDataSource(
+          DataSourceReader source,
+          ir.Member context,
+          AbstractValueDomain abstractValueDomain) =
       KernelGlobalTypeInferenceElementData.readFromDataSource;
 
   /// Serializes this [GlobalTypeInferenceElementData] to [sink].
-  void writeToDataSink(DataSink sink, ir.Member context,
+  void writeToDataSink(DataSinkWriter sink, ir.Member context,
       AbstractValueDomain abstractValueDomain);
 
   /// Compresses the inner representation by removing [AbstractValue] mappings
@@ -110,7 +114,7 @@
 abstract class GlobalTypeInferenceResults {
   /// Deserializes a [GlobalTypeInferenceResults] object from [source].
   factory GlobalTypeInferenceResults.readFromDataSource(
-      DataSource source,
+      DataSourceReader source,
       JsToElementMap elementMap,
       JClosedWorld closedWorld,
       GlobalLocalsMap globalLocalsMap,
@@ -124,7 +128,7 @@
   }
 
   /// Serializes this [GlobalTypeInferenceResults] to [sink].
-  void writeToDataSink(DataSink sink, JsToElementMap elementMap);
+  void writeToDataSink(DataSinkWriter sink, JsToElementMap elementMap);
 
   JClosedWorld get closedWorld;
 
@@ -239,7 +243,7 @@
         _trivialParameterResult = closedWorld.abstractValueDomain.dynamicType;
 
   factory GlobalTypeInferenceResultsImpl.readFromDataSource(
-      DataSource source,
+      DataSourceReader source,
       JsToElementMap elementMap,
       JClosedWorld closedWorld,
       GlobalLocalsMap globalLocalsMap,
@@ -275,7 +279,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink, JsToElementMap elementMap) {
+  void writeToDataSink(DataSinkWriter sink, JsToElementMap elementMap) {
     sink.writeBool(false); // Is _not_ trivial.
     sink.begin(tag);
     sink.writeMemberMap(
@@ -436,7 +440,7 @@
       {this.throwsAlways, this.isCalledOnce});
 
   factory GlobalTypeInferenceMemberResultImpl.readFromDataSource(
-      DataSource source,
+      DataSourceReader source,
       ir.Member context,
       AbstractValueDomain abstractValueDomain) {
     source.begin(tag);
@@ -456,7 +460,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink, ir.Member context,
+  void writeToDataSink(DataSinkWriter sink, ir.Member context,
       AbstractValueDomain abstractValueDomain) {
     sink.begin(tag);
     sink.writeValueOrNull(_data, (GlobalTypeInferenceElementData data) {
@@ -497,7 +501,7 @@
         _trivialParameterResult = closedWorld.abstractValueDomain.dynamicType;
 
   @override
-  void writeToDataSink(DataSink sink, JsToElementMap elementMap) {
+  void writeToDataSink(DataSinkWriter sink, JsToElementMap elementMap) {
     sink.writeBool(true); // Is trivial.
   }
 
@@ -557,7 +561,7 @@
   bool get isCalledOnce => false;
 
   @override
-  void writeToDataSink(DataSink sink, ir.Member context,
+  void writeToDataSink(DataSinkWriter sink, ir.Member context,
       AbstractValueDomain abstractValueDomain) {
     throw UnsupportedError(
         "TrivialGlobalTypeInferenceMemberResult.writeToDataSink");
@@ -598,7 +602,7 @@
   bool get isCalledOnce => false;
 
   @override
-  void writeToDataSink(DataSink sink, ir.Member context,
+  void writeToDataSink(DataSinkWriter sink, ir.Member context,
       AbstractValueDomain abstractValueDomain) {
     throw UnsupportedError(
         "DeadFieldGlobalTypeInferenceResult.writeToDataSink");
@@ -639,7 +643,7 @@
   bool get isCalledOnce => false;
 
   @override
-  void writeToDataSink(DataSink sink, ir.Member context,
+  void writeToDataSink(DataSinkWriter sink, ir.Member context,
       AbstractValueDomain abstractValueDomain) {
     throw UnsupportedError(
         "DeadFieldGlobalTypeInferenceResult.writeToDataSink");
diff --git a/pkg/compiler/lib/src/io/position_information.dart b/pkg/compiler/lib/src/io/position_information.dart
index b3195a7..5844712 100644
--- a/pkg/compiler/lib/src/io/position_information.dart
+++ b/pkg/compiler/lib/src/io/position_information.dart
@@ -33,7 +33,8 @@
   PositionSourceInformation(
       this.startPosition, this.innerPosition, this.inliningContext);
 
-  factory PositionSourceInformation.readFromDataSource(DataSource source) {
+  factory PositionSourceInformation.readFromDataSource(
+      DataSourceReader source) {
     source.begin(tag);
     SourceLocation startPosition = source.readCached<SourceLocation>(
         () => SourceLocation.readFromDataSource(source));
@@ -47,7 +48,7 @@
         startPosition, innerPosition, inliningContext);
   }
 
-  void writeToDataSinkInternal(DataSink sink) {
+  void writeToDataSinkInternal(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeCached(
         startPosition,
diff --git a/pkg/compiler/lib/src/io/source_information.dart b/pkg/compiler/lib/src/io/source_information.dart
index d31486b..9098af0 100644
--- a/pkg/compiler/lib/src/io/source_information.dart
+++ b/pkg/compiler/lib/src/io/source_information.dart
@@ -18,7 +18,7 @@
 abstract class SourceInformation extends JavaScriptNodeSourceInformation {
   const SourceInformation();
 
-  static SourceInformation readFromDataSource(DataSource source) {
+  static SourceInformation readFromDataSource(DataSourceReader source) {
     int hasSourceInformation = source.readInt();
     if (hasSourceInformation == 0) {
       return null;
@@ -31,7 +31,7 @@
   }
 
   static void writeToDataSink(
-      DataSink sink, SourceInformation sourceInformation) {
+      DataSinkWriter sink, SourceInformation sourceInformation) {
     if (sourceInformation == null) {
       sink.writeInt(0);
     } else if (sourceInformation is SourceMappedMarker) {
@@ -82,7 +82,7 @@
 
   FrameContext(this.callInformation, this.inlinedMethodName);
 
-  factory FrameContext.readFromDataSource(DataSource source) {
+  factory FrameContext.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     SourceInformation callInformation = source.readCached<SourceInformation>(
         () => SourceInformation.readFromDataSource(source));
@@ -91,7 +91,7 @@
     return FrameContext(callInformation, inlinedMethodName);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeCached<SourceInformation>(
         callInformation,
@@ -273,7 +273,7 @@
   /// The name associated with this source location, if any.
   String get sourceName;
 
-  static SourceLocation readFromDataSource(DataSource source) {
+  static SourceLocation readFromDataSource(DataSourceReader source) {
     int hasSourceLocation = source.readInt();
     if (hasSourceLocation == 0) {
       return null;
@@ -292,7 +292,8 @@
     }
   }
 
-  static void writeToDataSink(DataSink sink, SourceLocation sourceLocation) {
+  static void writeToDataSink(
+      DataSinkWriter sink, SourceLocation sourceLocation) {
     if (sourceLocation == null) {
       sink.writeInt(0);
     } else if (sourceLocation is NoSourceLocationMarker) {
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index c72bbde..c68ffeb 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -699,7 +699,7 @@
   ImpactBuilderData(this.node, this.impactData, this.typeMapsForTesting,
       this.cachedStaticTypes);
 
-  factory ImpactBuilderData.fromDataSource(DataSource source) {
+  factory ImpactBuilderData.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     var node = source.readMemberNode();
     var data = ImpactData.fromDataSource(source);
@@ -708,7 +708,7 @@
     return ImpactBuilderData(node, data, const {}, cache);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMemberNode(node);
     impactData.toDataSink(sink);
diff --git a/pkg/compiler/lib/src/ir/impact_data.dart b/pkg/compiler/lib/src/ir/impact_data.dart
index 34f94bd..eb3f407 100644
--- a/pkg/compiler/lib/src/ir/impact_data.dart
+++ b/pkg/compiler/lib/src/ir/impact_data.dart
@@ -530,7 +530,7 @@
 
   ImpactData();
 
-  ImpactData.fromDataSource(DataSource source) {
+  ImpactData.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     _superInitializers = source.readList(
         () => _SuperInitializer.fromDataSource(source),
@@ -628,7 +628,7 @@
     source.end(tag);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
 
     sink.writeList(
@@ -1065,7 +1065,7 @@
         typeArguments, positionalArguments, namedArguments);
   }
 
-  factory _CallStructure.fromDataSource(DataSource source) {
+  factory _CallStructure.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     List<ir.DartType> typeArguments = source.readDartTypeNodes();
     int positionalArguments = source.readInt();
@@ -1075,7 +1075,7 @@
         typeArguments, positionalArguments, namedArguments);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeDartTypeNodes(typeArguments);
     sink.writeInt(positionalArguments);
@@ -1093,7 +1093,7 @@
 
   _SuperInitializer(this.source, this.target, this.callStructure);
 
-  factory _SuperInitializer.fromDataSource(DataSource source) {
+  factory _SuperInitializer.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Constructor sourceConstructor = source.readMemberNode();
     ir.Constructor targetConstructor = source.readMemberNode();
@@ -1103,7 +1103,7 @@
         sourceConstructor, targetConstructor, callStructure);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMemberNode(source);
     sink.writeMemberNode(target);
@@ -1120,7 +1120,7 @@
 
   _SuperInvocation(this.target, this.callStructure);
 
-  factory _SuperInvocation.fromDataSource(DataSource source) {
+  factory _SuperInvocation.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Member member = source.readMemberNode();
     _CallStructure callStructure = _CallStructure.fromDataSource(source);
@@ -1128,7 +1128,7 @@
     return _SuperInvocation(member, callStructure);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMemberNode(target);
     callStructure.toDataSink(sink);
@@ -1145,7 +1145,7 @@
 
   _InstanceAccess(this.receiverType, this.classRelation, this.target);
 
-  factory _InstanceAccess.fromDataSource(DataSource source) {
+  factory _InstanceAccess.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.DartType receiverType = source.readDartTypeNode();
     ClassRelation classRelation = source.readEnum(ClassRelation.values);
@@ -1154,7 +1154,7 @@
     return _InstanceAccess(receiverType, classRelation, target);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeDartTypeNode(receiverType);
     sink.writeEnum(classRelation);
@@ -1172,7 +1172,7 @@
 
   _DynamicAccess(this.receiverType, this.classRelation, this.name);
 
-  factory _DynamicAccess.fromDataSource(DataSource source) {
+  factory _DynamicAccess.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.DartType receiverType = source.readDartTypeNode();
     ClassRelation classRelation = source.readEnum(ClassRelation.values);
@@ -1181,7 +1181,7 @@
     return _DynamicAccess(receiverType, classRelation, name);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeDartTypeNode(receiverType);
     sink.writeEnum(classRelation);
@@ -1198,7 +1198,7 @@
 
   _FunctionInvocation(this.receiverType, this.callStructure);
 
-  factory _FunctionInvocation.fromDataSource(DataSource source) {
+  factory _FunctionInvocation.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.DartType receiverType = source.readDartTypeNode();
     _CallStructure callStructure = _CallStructure.fromDataSource(source);
@@ -1206,7 +1206,7 @@
     return _FunctionInvocation(receiverType, callStructure);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeDartTypeNode(receiverType);
     callStructure.toDataSink(sink);
@@ -1225,7 +1225,7 @@
   _InstanceInvocation(
       this.receiverType, this.classRelation, this.target, this.callStructure);
 
-  factory _InstanceInvocation.fromDataSource(DataSource source) {
+  factory _InstanceInvocation.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.DartType receiverType = source.readDartTypeNode();
     ClassRelation classRelation = source.readEnum(ClassRelation.values);
@@ -1236,7 +1236,7 @@
         receiverType, classRelation, target, callStructure);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeDartTypeNode(receiverType);
     sink.writeEnum(classRelation);
@@ -1257,7 +1257,7 @@
   _DynamicInvocation(
       this.receiverType, this.classRelation, this.name, this.callStructure);
 
-  factory _DynamicInvocation.fromDataSource(DataSource source) {
+  factory _DynamicInvocation.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.DartType receiverType = source.readDartTypeNode();
     ClassRelation classRelation = source.readEnum(ClassRelation.values);
@@ -1267,7 +1267,7 @@
     return _DynamicInvocation(receiverType, classRelation, name, callStructure);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeDartTypeNode(receiverType);
     sink.writeEnum(classRelation);
@@ -1285,7 +1285,7 @@
 
   _LocalFunctionInvocation(this.localFunction, this.callStructure);
 
-  factory _LocalFunctionInvocation.fromDataSource(DataSource source) {
+  factory _LocalFunctionInvocation.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.FunctionDeclaration localFunction = source.readTreeNode();
     _CallStructure callStructure = _CallStructure.fromDataSource(source);
@@ -1293,7 +1293,7 @@
     return _LocalFunctionInvocation(localFunction, callStructure);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeTreeNode(localFunction);
     callStructure.toDataSink(sink);
@@ -1310,7 +1310,7 @@
 
   _StaticInvocation(this.target, this.callStructure, this.import);
 
-  factory _StaticInvocation.fromDataSource(DataSource source) {
+  factory _StaticInvocation.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Procedure target = source.readMemberNode();
     _CallStructure callStructure = _CallStructure.fromDataSource(source);
@@ -1319,7 +1319,7 @@
     return _StaticInvocation(target, callStructure, import);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMemberNode(target);
     callStructure.toDataSink(sink);
@@ -1341,7 +1341,7 @@
       this.constructor, this.type, this.callStructure, this.import,
       {this.isConst});
 
-  factory _ConstructorInvocation.fromDataSource(DataSource source) {
+  factory _ConstructorInvocation.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Member constructor = source.readMemberNode();
     ir.InterfaceType type = source.readDartTypeNode();
@@ -1353,7 +1353,7 @@
         isConst: isConst);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMemberNode(constructor);
     sink.writeDartTypeNode(type);
@@ -1393,7 +1393,7 @@
 
   _TypeUse(this.type, this.kind);
 
-  factory _TypeUse.fromDataSource(DataSource source) {
+  factory _TypeUse.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.DartType type = source.readDartTypeNode();
     _TypeUseKind kind = source.readEnum(_TypeUseKind.values);
@@ -1401,7 +1401,7 @@
     return _TypeUse(type, kind);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeDartTypeNode(type);
     sink.writeEnum(kind);
@@ -1428,7 +1428,7 @@
 
   _RedirectingInitializer(this.constructor, this.callStructure);
 
-  factory _RedirectingInitializer.fromDataSource(DataSource source) {
+  factory _RedirectingInitializer.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Constructor constructor = source.readMemberNode();
     _CallStructure callStructure = _CallStructure.fromDataSource(source);
@@ -1436,7 +1436,7 @@
     return _RedirectingInitializer(constructor, callStructure);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMemberNode(constructor);
     callStructure.toDataSink(sink);
@@ -1452,7 +1452,7 @@
 
   _TypeLiteral(this.type, this.import);
 
-  factory _TypeLiteral.fromDataSource(DataSource source) {
+  factory _TypeLiteral.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.DartType type = source.readDartTypeNode();
     ir.LibraryDependency import = source.readLibraryDependencyNodeOrNull();
@@ -1460,7 +1460,7 @@
     return _TypeLiteral(type, import);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeDartTypeNode(type);
     sink.writeLibraryDependencyNodeOrNull(import);
@@ -1476,7 +1476,7 @@
 
   _GenericInstantiation(this.expressionType, this.typeArguments);
 
-  factory _GenericInstantiation.fromDataSource(DataSource source) {
+  factory _GenericInstantiation.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.FunctionType expressionType = source.readDartTypeNode();
     List<ir.DartType> typeArguments = source.readDartTypeNodes();
@@ -1484,7 +1484,7 @@
     return _GenericInstantiation(expressionType, typeArguments);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeDartTypeNode(expressionType);
     sink.writeDartTypeNodes(typeArguments);
@@ -1500,7 +1500,7 @@
 
   _StaticAccess(this.target, this.import);
 
-  factory _StaticAccess.fromDataSource(DataSource source) {
+  factory _StaticAccess.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Member target = source.readMemberNode();
     ir.LibraryDependency import = source.readLibraryDependencyNodeOrNull();
@@ -1508,7 +1508,7 @@
     return _StaticAccess(target, import);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMemberNode(target);
     sink.writeLibraryDependencyNodeOrNull(import);
@@ -1526,7 +1526,7 @@
 
   _MapLiteral(this.keyType, this.valueType, {this.isConst, this.isEmpty});
 
-  factory _MapLiteral.fromDataSource(DataSource source) {
+  factory _MapLiteral.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.DartType keyType = source.readDartTypeNode();
     ir.DartType valueType = source.readDartTypeNode();
@@ -1536,7 +1536,7 @@
     return _MapLiteral(keyType, valueType, isConst: isConst, isEmpty: isEmpty);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeDartTypeNode(keyType);
     sink.writeDartTypeNode(valueType);
@@ -1555,7 +1555,7 @@
 
   _ContainerLiteral(this.elementType, {this.isConst, this.isEmpty});
 
-  factory _ContainerLiteral.fromDataSource(DataSource source) {
+  factory _ContainerLiteral.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.DartType elementType = source.readDartTypeNode();
     bool isConst = source.readBool();
@@ -1564,7 +1564,7 @@
     return _ContainerLiteral(elementType, isConst: isConst, isEmpty: isEmpty);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeDartTypeNode(elementType);
     sink.writeBool(isConst);
@@ -1585,7 +1585,7 @@
 
   _RuntimeTypeUse(this.node, this.kind, this.receiverType, this.argumentType);
 
-  factory _RuntimeTypeUse.fromDataSource(DataSource source) {
+  factory _RuntimeTypeUse.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.TreeNode node = source.readTreeNode();
     RuntimeTypeUseKind kind = source.readEnum(RuntimeTypeUseKind.values);
@@ -1595,7 +1595,7 @@
     return _RuntimeTypeUse(node, kind, receiverType, argumentType);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeTreeNode(node);
     sink.writeEnum(kind);
diff --git a/pkg/compiler/lib/src/ir/modular.dart b/pkg/compiler/lib/src/ir/modular.dart
index bdb89a3..24afe70 100644
--- a/pkg/compiler/lib/src/ir/modular.dart
+++ b/pkg/compiler/lib/src/ir/modular.dart
@@ -54,7 +54,7 @@
 
   ModuleData(this.impactData);
 
-  factory ModuleData.fromDataSource(DataSource source) {
+  factory ModuleData.fromDataSource(DataSourceReader source) {
     source.begin(tag);
     var impactData = source
         .readMemberNodeMap(() => ImpactBuilderData.fromDataSource(source));
@@ -62,7 +62,7 @@
     return ModuleData(impactData);
   }
 
-  void toDataSink(DataSink sink) {
+  void toDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMemberNodeMap<ImpactBuilderData>(
         impactData, (e) => e.toDataSink(sink));
diff --git a/pkg/compiler/lib/src/ir/static_type_cache.dart b/pkg/compiler/lib/src/ir/static_type_cache.dart
index 59f2d66..f389c80 100644
--- a/pkg/compiler/lib/src/ir/static_type_cache.dart
+++ b/pkg/compiler/lib/src/ir/static_type_cache.dart
@@ -16,7 +16,7 @@
       [this._expressionTypes = const {}, this._forInIteratorTypes]);
 
   factory StaticTypeCache.readFromDataSource(
-      DataSource source, ir.Member context) {
+      DataSourceReader source, ir.Member context) {
     return source.inMemberContext(context, () {
       source.begin(tag);
       Map<ir.Expression, ir.DartType> expressionTypes =
@@ -28,7 +28,7 @@
     });
   }
 
-  void writeToDataSink(DataSink sink, ir.Member context) {
+  void writeToDataSink(DataSinkWriter sink, ir.Member context) {
     sink.inMemberContext(context, () {
       sink.begin(tag);
       sink.writeTreeNodeMapInContext(_expressionTypes, sink.writeDartTypeNode);
diff --git a/pkg/compiler/lib/src/js_backend/annotations.dart b/pkg/compiler/lib/src/js_backend/annotations.dart
index cf4c049..6994be7 100644
--- a/pkg/compiler/lib/src/js_backend/annotations.dart
+++ b/pkg/compiler/lib/src/js_backend/annotations.dart
@@ -256,11 +256,11 @@
 abstract class AnnotationsData {
   /// Deserializes a [AnnotationsData] object from [source].
   factory AnnotationsData.readFromDataSource(
-          CompilerOptions options, DataSource source) =
+          CompilerOptions options, DataSourceReader source) =
       AnnotationsDataImpl.readFromDataSource;
 
   /// Serializes this [AnnotationsData] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 
   /// Returns `true` if [member] has an `@pragma('dart2js:assumeDynamic')`
   /// annotation.
@@ -356,7 +356,7 @@
             options.defaultIndexBoundsCheckPolicy;
 
   factory AnnotationsDataImpl.readFromDataSource(
-      CompilerOptions options, DataSource source) {
+      CompilerOptions options, DataSourceReader source) {
     source.begin(tag);
     Map<MemberEntity, EnumSet<PragmaAnnotation>> pragmaAnnotations =
         source.readMemberMap(
@@ -366,7 +366,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMemberMap(pragmaAnnotations,
         (MemberEntity member, EnumSet<PragmaAnnotation> set) {
diff --git a/pkg/compiler/lib/src/js_backend/backend_usage.dart b/pkg/compiler/lib/src/js_backend/backend_usage.dart
index 08f17ce..600075d 100644
--- a/pkg/compiler/lib/src/js_backend/backend_usage.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_usage.dart
@@ -15,11 +15,11 @@
 
 abstract class BackendUsage {
   /// Deserializes a [BackendUsage] object from [source].
-  factory BackendUsage.readFromDataSource(DataSource source) =
+  factory BackendUsage.readFromDataSource(DataSourceReader source) =
       BackendUsageImpl.readFromDataSource;
 
   /// Serializes this [BackendUsage] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 
   bool needToInitializeIsolateAffinityTag;
   bool needToInitializeDispatchProperty;
@@ -356,7 +356,7 @@
         this._helperClassesUsed = helperClassesUsed,
         this._runtimeTypeUses = runtimeTypeUses;
 
-  factory BackendUsageImpl.readFromDataSource(DataSource source) {
+  factory BackendUsageImpl.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     Set<FunctionEntity> globalFunctionDependencies =
         source.readMembers<FunctionEntity>().toSet();
@@ -396,7 +396,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMembers(_globalFunctionDependencies);
     sink.writeClasses(_globalClassDependencies);
diff --git a/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart b/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
index e038554..22329a2 100644
--- a/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
+++ b/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
@@ -56,7 +56,7 @@
         DeferredHolderExpressionKind.globalObjectForStaticState, null);
   }
 
-  factory DeferredHolderExpression.readFromDataSource(DataSource source) {
+  factory DeferredHolderExpression.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     var kind = source.readEnum(DeferredHolderExpressionKind.values);
     Object data;
@@ -79,7 +79,7 @@
     return DeferredHolderExpression(kind, data);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeEnum(kind);
     switch (kind) {
diff --git a/pkg/compiler/lib/src/js_backend/field_analysis.dart b/pkg/compiler/lib/src/js_backend/field_analysis.dart
index 0f3326c..96c5bf9 100644
--- a/pkg/compiler/lib/src/js_backend/field_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/field_analysis.dart
@@ -252,7 +252,7 @@
 
   /// Deserializes a [JFieldAnalysis] object from [source].
   factory JFieldAnalysis.readFromDataSource(
-      DataSource source, CompilerOptions options) {
+      DataSourceReader source, CompilerOptions options) {
     source.begin(tag);
     Map<FieldEntity, FieldAnalysisData> fieldData = source.readMemberMap(
         (MemberEntity member) => FieldAnalysisData.fromDataSource(source));
@@ -261,7 +261,7 @@
   }
 
   /// Serializes this [JFieldAnalysis] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMemberMap(
         _fieldData,
@@ -602,7 +602,7 @@
       this.eagerCreationIndex = null,
       this.eagerFieldDependenciesForTesting = null});
 
-  factory FieldAnalysisData.fromDataSource(DataSource source) {
+  factory FieldAnalysisData.fromDataSource(DataSourceReader source) {
     source.begin(tag);
 
     ConstantValue initialValue = source.readConstantOrNull();
@@ -624,7 +624,7 @@
         eagerFieldDependenciesForTesting: eagerFieldDependencies);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeConstantOrNull(initialValue);
     sink.writeBool(isInitializedInAllocator);
diff --git a/pkg/compiler/lib/src/js_backend/inferred_data.dart b/pkg/compiler/lib/src/js_backend/inferred_data.dart
index 3dc454a..bf12d8c 100644
--- a/pkg/compiler/lib/src/js_backend/inferred_data.dart
+++ b/pkg/compiler/lib/src/js_backend/inferred_data.dart
@@ -16,7 +16,7 @@
 abstract class InferredData {
   /// Deserializes a [InferredData] object from [source].
   factory InferredData.readFromDataSource(
-      DataSource source, JClosedWorld closedWorld) {
+      DataSourceReader source, JClosedWorld closedWorld) {
     bool isTrivial = source.readBool();
     if (isTrivial) {
       return TrivialInferredData();
@@ -26,7 +26,7 @@
   }
 
   /// Serializes this [InferredData] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 
   /// Returns the side effects of executing [element].
   SideEffects getSideEffectsOfElement(FunctionEntity element);
@@ -100,7 +100,7 @@
       this._functionsThatMightBePassedToApply);
 
   factory InferredDataImpl.readFromDataSource(
-      DataSource source, JClosedWorld closedWorld) {
+      DataSourceReader source, JClosedWorld closedWorld) {
     source.begin(tag);
     Set<MemberEntity> functionsCalledInLoop = source.readMembers().toSet();
     Map<FunctionEntity, SideEffects> sideEffects = source.readMemberMap(
@@ -122,7 +122,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeBool(false); // Is _not_ trivial.
     sink.begin(tag);
     sink.writeMembers(_functionsCalledInLoop);
@@ -302,7 +302,7 @@
   final SideEffects _allSideEffects = SideEffects();
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeBool(true); // Is trivial.
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/interceptor_data.dart b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
index 0300e2d..36052c1 100644
--- a/pkg/compiler/lib/src/js_backend/interceptor_data.dart
+++ b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
@@ -21,12 +21,12 @@
 abstract class InterceptorData {
   /// Deserializes a [InterceptorData] object from [source].
   factory InterceptorData.readFromDataSource(
-      DataSource source,
+      DataSourceReader source,
       NativeData nativeData,
       CommonElements commonElements) = InterceptorDataImpl.readFromDataSource;
 
   /// Serializes this [InterceptorData] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 
   /// Returns `true` if [cls] is an intercepted class.
   bool isInterceptedClass(ClassEntity element);
@@ -110,8 +110,8 @@
       this.interceptedClasses,
       this.classesMixedIntoInterceptedClasses);
 
-  factory InterceptorDataImpl.readFromDataSource(
-      DataSource source, NativeData nativeData, CommonElements commonElements) {
+  factory InterceptorDataImpl.readFromDataSource(DataSourceReader source,
+      NativeData nativeData, CommonElements commonElements) {
     source.begin(tag);
     int interceptedMembersCount = source.readInt();
     Map<String, Set<MemberEntity>> interceptedMembers = {};
@@ -129,7 +129,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeInt(interceptedMembers.length);
     interceptedMembers.forEach((String name, Set<MemberEntity> members) {
diff --git a/pkg/compiler/lib/src/js_backend/native_data.dart b/pkg/compiler/lib/src/js_backend/native_data.dart
index 00ee207..6bbf4ea 100644
--- a/pkg/compiler/lib/src/js_backend/native_data.dart
+++ b/pkg/compiler/lib/src/js_backend/native_data.dart
@@ -200,7 +200,7 @@
 
   /// Deserializes a [NativeBasicData] object from [source].
   factory NativeBasicData.readFromDataSource(
-      DataSource source, ElementEnvironment elementEnvironment) {
+      DataSourceReader source, ElementEnvironment elementEnvironment) {
     source.begin(tag);
     bool isAllowInteropUsed = source.readBool();
     Map<ClassEntity, NativeClassTag> nativeClassTagInfo =
@@ -228,7 +228,7 @@
   }
 
   /// Serializes this [NativeBasicData] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeBool(isAllowInteropUsed);
     sink.writeClassMap(_nativeClassTagInfo, (NativeClassTag tag) {
@@ -484,7 +484,7 @@
 
   /// Deserializes a [NativeData] object from [source].
   factory NativeData.readFromDataSource(
-      DataSource source, ElementEnvironment elementEnvironment) {
+      DataSourceReader source, ElementEnvironment elementEnvironment) {
     source.begin(tag);
     NativeBasicData nativeBasicData =
         NativeBasicData.readFromDataSource(source, elementEnvironment);
@@ -506,7 +506,7 @@
 
   /// Serializes this [NativeData] to [sink].
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     _nativeBasicData.writeToDataSink(sink);
 
diff --git a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
index 8c957ec..f9c2749 100644
--- a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
+++ b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
@@ -190,7 +190,7 @@
       this._throwingImpls, this._otherImpls, this._forwardingSyntaxImpls);
 
   /// Deserializes a [NoSuchMethodData] object from [source].
-  factory NoSuchMethodData.readFromDataSource(DataSource source) {
+  factory NoSuchMethodData.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     Set<FunctionEntity> throwingImpls =
         source.readMembers<FunctionEntity>().toSet();
@@ -209,7 +209,7 @@
   }
 
   /// Serializes this [NoSuchMethodData] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMembers(_throwingImpls);
     sink.writeMembers(_otherImpls);
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart b/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
index 5bf8933..c53fa5f 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
@@ -660,7 +660,7 @@
 abstract class RuntimeTypesNeed {
   /// Deserializes a [RuntimeTypesNeed] object from [source].
   factory RuntimeTypesNeed.readFromDataSource(
-      DataSource source, ElementEnvironment elementEnvironment) {
+      DataSourceReader source, ElementEnvironment elementEnvironment) {
     bool isTrivial = source.readBool();
     if (isTrivial) {
       return TrivialRuntimeTypesNeed(elementEnvironment);
@@ -669,7 +669,7 @@
   }
 
   /// Serializes this [RuntimeTypesNeed] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 
   /// Returns `true` if [cls] needs type arguments at runtime.
   ///
@@ -742,7 +742,7 @@
   const TrivialRuntimeTypesNeed(this._elementEnvironment);
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeBool(true); // Is trivial.
   }
 
@@ -797,7 +797,7 @@
       this.instantiationsNeedingTypeArguments);
 
   factory RuntimeTypesNeedImpl.readFromDataSource(
-      DataSource source, ElementEnvironment elementEnvironment) {
+      DataSourceReader source, ElementEnvironment elementEnvironment) {
     source.begin(tag);
     Set<ClassEntity> classesNeedingTypeArguments =
         source.readClasses<ClassEntity>().toSet();
@@ -822,7 +822,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeBool(false); // Is _not_ trivial.
     sink.begin(tag);
     sink.writeClasses(classesNeedingTypeArguments);
diff --git a/pkg/compiler/lib/src/js_backend/string_reference.dart b/pkg/compiler/lib/src/js_backend/string_reference.dart
index 19aba0e..06d7370 100644
--- a/pkg/compiler/lib/src/js_backend/string_reference.dart
+++ b/pkg/compiler/lib/src/js_backend/string_reference.dart
@@ -101,14 +101,14 @@
   StringReference(this.constant) : sourceInformation = null;
   StringReference._(this.constant, this._value, this.sourceInformation);
 
-  factory StringReference.readFromDataSource(DataSource source) {
+  factory StringReference.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     StringConstantValue constant = source.readConstant() as StringConstantValue;
     source.end(tag);
     return StringReference(constant);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeConstant(constant);
     sink.end(tag);
diff --git a/pkg/compiler/lib/src/js_backend/type_reference.dart b/pkg/compiler/lib/src/js_backend/type_reference.dart
index d796de1..b603532 100644
--- a/pkg/compiler/lib/src/js_backend/type_reference.dart
+++ b/pkg/compiler/lib/src/js_backend/type_reference.dart
@@ -117,7 +117,7 @@
   TypeReference(this.typeRecipe) : sourceInformation = null;
   TypeReference._(this.typeRecipe, this._value, this.sourceInformation);
 
-  factory TypeReference.readFromDataSource(DataSource source) {
+  factory TypeReference.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     TypeRecipe recipe = source.readTypeRecipe();
     bool forLazyInitializer = source.readBool();
@@ -125,7 +125,7 @@
     return TypeReference(recipe)..forLazyInitializer = forLazyInitializer;
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeTypeRecipe(typeRecipe);
     sink.writeBool(forLazyInitializer);
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index 7aa5677..62b1101 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -51,7 +51,7 @@
 
   /// Deserializes a [ClosureData] object from [source].
   factory ClosureDataImpl.readFromDataSource(
-      JsToElementMap elementMap, DataSource source) {
+      JsToElementMap elementMap, DataSourceReader source) {
     source.begin(tag);
     // TODO(johnniwinther): Support shared [ScopeInfo].
     Map<MemberEntity, ScopeInfo> scopeMap = source.readMemberMap(
@@ -78,7 +78,7 @@
 
   /// Serializes this [ClosureData] to [sink].
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMemberMap(_scopeMap,
         (MemberEntity member, ScopeInfo info) => info.writeToDataSink(sink));
@@ -507,7 +507,7 @@
     return _boxedVariablesCache.containsKey(variable);
   }
 
-  factory JsScopeInfo.readFromDataSource(DataSource source) {
+  factory JsScopeInfo.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     Iterable<ir.VariableDeclaration> localsUsedInTryOrSync =
         source.readTreeNodes<ir.VariableDeclaration>();
@@ -522,7 +522,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(ScopeInfoKind.scopeInfo);
     sink.begin(tag);
     sink.writeTreeNodes(_localsUsedInTryOrSync);
@@ -556,7 +556,7 @@
   @override
   bool get requiresContextBox => _boxedVariables.isNotEmpty;
 
-  factory JsCapturedScope.readFromDataSource(DataSource source) {
+  factory JsCapturedScope.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     Iterable<ir.VariableDeclaration> localsUsedInTryOrSync =
         source.readTreeNodes<ir.VariableDeclaration>();
@@ -571,7 +571,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(ScopeInfoKind.capturedScope);
     sink.begin(tag);
     sink.writeTreeNodes(_localsUsedInTryOrSync);
@@ -608,7 +608,7 @@
   @override
   bool get hasBoxedLoopVariables => _boxedLoopVariables.isNotEmpty;
 
-  factory JsCapturedLoopScope.readFromDataSource(DataSource source) {
+  factory JsCapturedLoopScope.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     Iterable<ir.VariableDeclaration> localsUsedInTryOrSync =
         source.readTreeNodes<ir.VariableDeclaration>();
@@ -625,7 +625,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(ScopeInfoKind.capturedLoopScope);
     sink.begin(tag);
     sink.writeTreeNodes(_localsUsedInTryOrSync);
@@ -705,7 +705,7 @@
         _localToFieldMap = {},
         super.from(boxedVariables, info, enclosingClass);
 
-  factory JsClosureClassInfo.readFromDataSource(DataSource source) {
+  factory JsClosureClassInfo.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     Iterable<ir.VariableDeclaration> localsUsedInTryOrSync =
         source.readTreeNodes<ir.VariableDeclaration>();
@@ -743,7 +743,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(ScopeInfoKind.closureRepresentationInfo);
     sink.begin(tag);
     sink.writeTreeNodes(_localsUsedInTryOrSync);
@@ -855,7 +855,7 @@
   JClosureClass(JLibrary library, String name)
       : super(library, name, isAbstract: false);
 
-  factory JClosureClass.readFromDataSource(DataSource source) {
+  factory JClosureClass.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     JLibrary library = source.readLibrary();
     String name = source.readString();
@@ -864,7 +864,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JClassKind.closure);
     sink.begin(tag);
     sink.writeLibrary(library);
@@ -926,7 +926,7 @@
       : super(library, enclosingClass, memberName,
             isAssignable: isAssignable, isConst: isConst, isStatic: false);
 
-  factory JClosureField.readFromDataSource(DataSource source) {
+  factory JClosureField.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     JClass cls = source.readClass();
     String name = source.readString();
@@ -940,7 +940,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberKind.closureField);
     sink.begin(tag);
     sink.writeClass(enclosingClass);
@@ -975,7 +975,7 @@
   RecordClassData(
       this.definition, this.thisType, this.supertype, this.orderedTypeSet);
 
-  factory RecordClassData.readFromDataSource(DataSource source) {
+  factory RecordClassData.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ClassDefinition definition = ClassDefinition.readFromDataSource(source);
     InterfaceType thisType = source.readDartType();
@@ -986,7 +986,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JClassDataKind.record);
     sink.begin(tag);
     definition.writeToDataSink(sink);
@@ -1036,7 +1036,7 @@
   JRecord(LibraryEntity library, String name)
       : super(library, name, isAbstract: false);
 
-  factory JRecord.readFromDataSource(DataSource source) {
+  factory JRecord.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     JLibrary library = source.readLibrary();
     String name = source.readString();
@@ -1045,7 +1045,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JClassKind.record);
     sink.begin(tag);
     sink.writeLibrary(library);
@@ -1075,7 +1075,7 @@
             Name(name, box.container.library),
             isStatic: false, isAssignable: true, isConst: isConst);
 
-  factory JRecordField.readFromDataSource(DataSource source) {
+  factory JRecordField.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     String name = source.readString();
     JClass enclosingClass = source.readClass();
@@ -1085,7 +1085,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberKind.recordField);
     sink.begin(tag);
     sink.writeString(name);
@@ -1118,7 +1118,7 @@
       InterfaceType supertype, OrderedTypeSet orderedTypeSet)
       : super(definition, thisType, supertype, orderedTypeSet);
 
-  factory ClosureClassData.readFromDataSource(DataSource source) {
+  factory ClosureClassData.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ClassDefinition definition = ClassDefinition.readFromDataSource(source);
     InterfaceType thisType = source.readDartType();
@@ -1131,7 +1131,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JClassDataKind.closure);
     sink.begin(tag);
     definition.writeToDataSink(sink);
@@ -1153,7 +1153,7 @@
 
   ClosureClassDefinition(this.location);
 
-  factory ClosureClassDefinition.readFromDataSource(DataSource source) {
+  factory ClosureClassDefinition.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     SourceSpan location = source.readSourceSpan();
     source.end(tag);
@@ -1161,7 +1161,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(ClassKind.closure);
     sink.begin(tag);
     sink.writeSourceSpan(location);
@@ -1221,7 +1221,7 @@
       this.classTypeVariableAccess)
       : super(definition, memberThisType);
 
-  factory ClosureFunctionData.readFromDataSource(DataSource source) {
+  factory ClosureFunctionData.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ClosureMemberDefinition definition =
         MemberDefinition.readFromDataSource(source);
@@ -1236,7 +1236,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberDataKind.closureFunction);
     sink.begin(tag);
     definition.writeToDataSink(sink);
@@ -1275,7 +1275,7 @@
   ClosureFieldData(MemberDefinition definition, InterfaceType memberThisType)
       : super(definition, memberThisType);
 
-  factory ClosureFieldData.readFromDataSource(DataSource source) {
+  factory ClosureFieldData.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     MemberDefinition definition = MemberDefinition.readFromDataSource(source);
     InterfaceType memberThisType = source.readDartType(allowNull: true);
@@ -1284,7 +1284,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberDataKind.closureField);
     sink.begin(tag);
     definition.writeToDataSink(sink);
@@ -1341,7 +1341,7 @@
             kind == MemberKind.closureCall || kind == MemberKind.closureField);
 
   factory ClosureMemberDefinition.readFromDataSource(
-      DataSource source, MemberKind kind) {
+      DataSourceReader source, MemberKind kind) {
     source.begin(tag);
     SourceSpan location = source.readSourceSpan();
     ir.TreeNode node = source.readTreeNode();
@@ -1350,7 +1350,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(kind);
     sink.begin(tag);
     sink.writeSourceSpan(location);
@@ -1372,7 +1372,8 @@
 
   RecordContainerDefinition(this.location);
 
-  factory RecordContainerDefinition.readFromDataSource(DataSource source) {
+  factory RecordContainerDefinition.readFromDataSource(
+      DataSourceReader source) {
     source.begin(tag);
     SourceSpan location = source.readSourceSpan();
     source.end(tag);
@@ -1380,7 +1381,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(ClassKind.record);
     sink.begin(tag);
     sink.writeSourceSpan(location);
diff --git a/pkg/compiler/lib/src/js_model/element_map.dart b/pkg/compiler/lib/src/js_model/element_map.dart
index e87d834..985d77f 100644
--- a/pkg/compiler/lib/src/js_model/element_map.dart
+++ b/pkg/compiler/lib/src/js_model/element_map.dart
@@ -269,7 +269,7 @@
   JumpTarget getJumpTargetForWhile(ir.WhileStatement node);
 
   /// Serializes this [KernelToLocalsMap] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 }
 
 /// Returns the [ir.FunctionNode] that defines [member] or `null` if [member]
@@ -338,7 +338,7 @@
   SourceSpan get location;
 
   /// Deserializes a [MemberDefinition] object from [source].
-  factory MemberDefinition.readFromDataSource(DataSource source) {
+  factory MemberDefinition.readFromDataSource(DataSourceReader source) {
     MemberKind kind = source.readEnum(MemberKind.values);
     switch (kind) {
       case MemberKind.regular:
@@ -356,7 +356,7 @@
   }
 
   /// Serializes this [MemberDefinition] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 }
 
 enum ClassKind {
@@ -378,7 +378,7 @@
 
   RegularMemberDefinition(this.node);
 
-  factory RegularMemberDefinition.readFromDataSource(DataSource source) {
+  factory RegularMemberDefinition.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Member node = source.readMemberNode();
     source.end(tag);
@@ -386,7 +386,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(MemberKind.regular);
     sink.begin(tag);
     sink.writeMemberNode(node);
@@ -418,7 +418,7 @@
   SpecialMemberDefinition(this.node, this.kind);
 
   factory SpecialMemberDefinition.readFromDataSource(
-      DataSource source, MemberKind kind) {
+      DataSourceReader source, MemberKind kind) {
     source.begin(tag);
     ir.TreeNode node = source.readTreeNode();
     source.end(tag);
@@ -426,7 +426,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(kind);
     sink.begin(tag);
     sink.writeTreeNode(node);
@@ -454,7 +454,7 @@
   SourceSpan get location;
 
   /// Deserializes a [ClassDefinition] object from [source].
-  factory ClassDefinition.readFromDataSource(DataSource source) {
+  factory ClassDefinition.readFromDataSource(DataSourceReader source) {
     ClassKind kind = source.readEnum(ClassKind.values);
     switch (kind) {
       case ClassKind.regular:
@@ -468,7 +468,7 @@
   }
 
   /// Serializes this [ClassDefinition] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 }
 
 /// A class directly defined by its [ir.Class] node.
@@ -482,7 +482,7 @@
 
   RegularClassDefinition(this.node);
 
-  factory RegularClassDefinition.readFromDataSource(DataSource source) {
+  factory RegularClassDefinition.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Class node = source.readClassNode();
     source.end(tag);
@@ -490,7 +490,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(kind);
     sink.begin(tag);
     sink.writeClassNode(node);
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index accde9d..5b30ba7 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -293,7 +293,7 @@
   }
 
   JsKernelToElementMap.readFromDataSource(this.options, this.reporter,
-      this._environment, ir.Component component, DataSource source) {
+      this._environment, ir.Component component, DataSourceReader source) {
     _elementEnvironment = JsElementEnvironment(this);
     _typeConverter = DartTypeConverter(this);
     _types = KernelDartTypes(this, options);
@@ -430,7 +430,7 @@
   }
 
   /// Serializes this [JsToElementMap] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
 
     // Serialize the entities before serializing the data.
@@ -2629,7 +2629,7 @@
 
   @override
   IndexedMember readMemberFromDataSource(
-      DataSource source, EntityLookup entityLookup) {
+      DataSourceReader source, EntityLookup entityLookup) {
     int index = source.readInt();
     if (index == 0) {
       return _readLateMemberFromDataSource(source, entityLookup);
@@ -2639,7 +2639,7 @@
   }
 
   IndexedMember _readLateMemberFromDataSource(
-      DataSource source, EntityLookup entityLookup) {
+      DataSourceReader source, EntityLookup entityLookup) {
     LateMemberKind kind = source.readEnum(LateMemberKind.values);
     switch (kind) {
       case LateMemberKind.constructorBody:
@@ -2664,7 +2664,7 @@
   ClosedEntityWriter(this._earlyMemberIndexLimit);
 
   @override
-  void writeMemberToDataSink(DataSink sink, IndexedMember value) {
+  void writeMemberToDataSink(DataSinkWriter sink, IndexedMember value) {
     if (value.memberIndex >= _earlyMemberIndexLimit) {
       sink.writeInt(0);
       _writeLateMemberToDataSink(sink, value);
@@ -2673,7 +2673,7 @@
     }
   }
 
-  void _writeLateMemberToDataSink(DataSink sink, IndexedMember value) {
+  void _writeLateMemberToDataSink(DataSinkWriter sink, IndexedMember value) {
     if (value is JConstructorBody) {
       sink.writeEnum(LateMemberKind.constructorBody);
       sink.writeMember(value.constructor);
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index 62b7315..01c50f9 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -30,7 +30,7 @@
   JLibrary(this.name, this.canonicalUri, this.isNonNullableByDefault);
 
   /// Deserializes a [JLibrary] object from [source].
-  factory JLibrary.readFromDataSource(DataSource source) {
+  factory JLibrary.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     String name = source.readString();
     Uri canonicalUri = source.readUri();
@@ -40,7 +40,7 @@
   }
 
   /// Serializes this [JLibrary] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeString(name);
     sink.writeUri(canonicalUri);
@@ -71,7 +71,7 @@
   JClass(this.library, this.name, {this.isAbstract});
 
   /// Deserializes a [JClass] object from [source].
-  factory JClass.readFromDataSource(DataSource source) {
+  factory JClass.readFromDataSource(DataSourceReader source) {
     JClassKind kind = source.readEnum(JClassKind.values);
     switch (kind) {
       case JClassKind.node:
@@ -90,7 +90,7 @@
   }
 
   /// Serializes this [JClass] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JClassKind.node);
     sink.begin(tag);
     sink.writeLibrary(library);
@@ -135,7 +135,7 @@
       : _isStatic = isStatic;
 
   /// Deserializes a [JMember] object from [source].
-  factory JMember.readFromDataSource(DataSource source) {
+  factory JMember.readFromDataSource(DataSourceReader source) {
     JMemberKind kind = source.readEnum(JMemberKind.values);
     switch (kind) {
       case JMemberKind.generativeConstructor:
@@ -167,7 +167,7 @@
   }
 
   /// Serializes this [JMember] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 
   @override
   String get name => _name.text;
@@ -272,7 +272,7 @@
       : super(enclosingClass, name, parameterStructure,
             isExternal: isExternal, isConst: isConst);
 
-  factory JGenerativeConstructor.readFromDataSource(DataSource source) {
+  factory JGenerativeConstructor.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     JClass enclosingClass = source.readClass();
     String name = source.readString();
@@ -287,7 +287,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberKind.generativeConstructor);
     sink.begin(tag);
     sink.writeClass(enclosingClass);
@@ -319,7 +319,7 @@
       : super(enclosingClass, name, parameterStructure,
             isExternal: isExternal, isConst: isConst);
 
-  factory JFactoryConstructor.readFromDataSource(DataSource source) {
+  factory JFactoryConstructor.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     JClass enclosingClass = source.readClass();
     String name = source.readString();
@@ -337,7 +337,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberKind.factoryConstructor);
     sink.begin(tag);
     sink.writeClass(enclosingClass);
@@ -369,7 +369,7 @@
             constructor.memberName, parameterStructure, AsyncMarker.SYNC,
             isStatic: false, isExternal: false);
 
-  factory JConstructorBody.readFromDataSource(DataSource source) {
+  factory JConstructorBody.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     JConstructor constructor = source.readMember();
     ParameterStructure parameterStructure =
@@ -379,7 +379,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberKind.constructorBody);
     sink.begin(tag);
     sink.writeMember(constructor);
@@ -405,7 +405,7 @@
       : super(library, enclosingClass, name, parameterStructure, asyncMarker,
             isStatic: isStatic, isExternal: isExternal);
 
-  factory JMethod.readFromDataSource(DataSource source) {
+  factory JMethod.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     MemberContextKind kind = source.readEnum(MemberContextKind.values);
     JLibrary library;
@@ -433,7 +433,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberKind.method);
     sink.begin(tag);
     if (enclosingClass != null) {
@@ -475,7 +475,7 @@
             function.parameterStructure, function.asyncMarker,
             isStatic: function.isStatic, isExternal: false);
 
-  factory JGeneratorBody.readFromDataSource(DataSource source) {
+  factory JGeneratorBody.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     JFunction function = source.readMember();
     DartType elementType = source.readDartType();
@@ -484,7 +484,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberKind.generatorBody);
     sink.begin(tag);
     sink.writeMember(function);
@@ -511,7 +511,7 @@
             asyncMarker,
             isStatic: isStatic, isExternal: isExternal);
 
-  factory JGetter.readFromDataSource(DataSource source) {
+  factory JGetter.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     MemberContextKind kind = source.readEnum(MemberContextKind.values);
     JLibrary library;
@@ -536,7 +536,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberKind.getter);
     sink.begin(tag);
     if (enclosingClass != null) {
@@ -575,7 +575,7 @@
             AsyncMarker.SYNC,
             isStatic: isStatic, isExternal: isExternal);
 
-  factory JSetter.readFromDataSource(DataSource source) {
+  factory JSetter.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     MemberContextKind kind = source.readEnum(MemberContextKind.values);
     JLibrary library;
@@ -599,7 +599,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberKind.setter);
     sink.begin(tag);
     if (enclosingClass != null) {
@@ -640,7 +640,7 @@
       {bool isStatic, this.isAssignable, this.isConst})
       : super(library, enclosingClass, name, isStatic: isStatic);
 
-  factory JField.readFromDataSource(DataSource source) {
+  factory JField.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     MemberContextKind kind = source.readEnum(MemberContextKind.values);
     JLibrary library;
@@ -664,7 +664,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberKind.field);
     sink.begin(tag);
     if (enclosingClass != null) {
@@ -699,7 +699,7 @@
             parameterStructure, asyncMarker,
             isStatic: false, isExternal: false, isAbstract: false);
 
-  factory JClosureCallMethod.readFromDataSource(DataSource source) {
+  factory JClosureCallMethod.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     JClass enclosingClass = source.readClass();
     ParameterStructure parameterStructure =
@@ -710,7 +710,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberKind.closureCallMethod);
     sink.begin(tag);
     sink.writeClass(enclosingClass);
@@ -735,7 +735,7 @@
             ParameterStructure.zeroArguments, AsyncMarker.SYNC,
             isStatic: false, isExternal: false, isAbstract: false);
 
-  factory JSignatureMethod.readFromDataSource(DataSource source) {
+  factory JSignatureMethod.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     JClass cls = source.readClass();
     source.end(tag);
@@ -743,7 +743,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberKind.signatureMethod);
     sink.begin(tag);
     sink.writeClass(enclosingClass);
@@ -772,7 +772,7 @@
   JTypeVariable(this.typeDeclaration, this.name, this.index);
 
   /// Deserializes a [JTypeVariable] object from [source].
-  factory JTypeVariable.readFromDataSource(DataSource source) {
+  factory JTypeVariable.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     JTypeVariableKind kind = source.readEnum(JTypeVariableKind.values);
     Entity typeDeclaration;
@@ -797,7 +797,7 @@
   }
 
   /// Serializes this [JTypeVariable] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     if (typeDeclaration is IndexedClass) {
       IndexedClass cls = typeDeclaration;
diff --git a/pkg/compiler/lib/src/js_model/env.dart b/pkg/compiler/lib/src/js_model/env.dart
index c0bcc93..a60b310 100644
--- a/pkg/compiler/lib/src/js_model/env.dart
+++ b/pkg/compiler/lib/src/js_model/env.dart
@@ -67,7 +67,7 @@
   JLibraryEnv(this.library, this._memberMap, this._setterMap);
 
   /// Deserializes a [JLibraryEnv] object from [source].
-  factory JLibraryEnv.readFromDataSource(DataSource source) {
+  factory JLibraryEnv.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Library library = source.readLibraryNode();
     Map<String, ir.Member> memberMap =
@@ -79,7 +79,7 @@
   }
 
   /// Serializes this [JLibraryEnv] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeLibraryNode(library);
     sink.writeStringMap(_memberMap, sink.writeMemberNode);
@@ -130,7 +130,7 @@
 
   JLibraryData(this.library, this.imports);
 
-  factory JLibraryData.readFromDataSource(DataSource source) {
+  factory JLibraryData.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Library library = source.readLibraryNode();
     int importCount = source.readInt();
@@ -147,7 +147,7 @@
     return JLibraryData(library, imports);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeLibraryNode(library);
     if (imports == null) {
@@ -174,7 +174,7 @@
 /// Member data for a class.
 abstract class JClassEnv {
   /// Deserializes a [JClassEnv] object from [source].
-  factory JClassEnv.readFromDataSource(DataSource source) {
+  factory JClassEnv.readFromDataSource(DataSourceReader source) {
     JClassEnvKind kind = source.readEnum(JClassEnvKind.values);
     switch (kind) {
       case JClassEnvKind.node:
@@ -188,7 +188,7 @@
   }
 
   /// Serializes this [JClassEnv] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 
   /// The [ir.Class] that defined the class, if any.
   ir.Class get cls;
@@ -244,7 +244,7 @@
   JClassEnvImpl(this.cls, this._constructorMap, this._memberMap,
       this._setterMap, this._members, this.isMixinApplicationWithMembers);
 
-  factory JClassEnvImpl.readFromDataSource(DataSource source) {
+  factory JClassEnvImpl.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Class cls = source.readClassNode();
     Map<String, ir.Member> constructorMap =
@@ -261,7 +261,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JClassEnvKind.node);
     sink.begin(tag);
     sink.writeClassNode(cls);
@@ -324,7 +324,7 @@
 
   RecordEnv(this._memberMap);
 
-  factory RecordEnv.readFromDataSource(DataSource source) {
+  factory RecordEnv.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     Map<String, IndexedMember> _memberMap =
         source.readStringMap(() => source.readMember());
@@ -333,7 +333,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JClassEnvKind.record);
     sink.begin(tag);
     sink.writeStringMap(
@@ -386,7 +386,7 @@
 
   ClosureClassEnv(Map<String, MemberEntity> memberMap) : super(memberMap);
 
-  factory ClosureClassEnv.readFromDataSource(DataSource source) {
+  factory ClosureClassEnv.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     Map<String, IndexedMember> _memberMap =
         source.readStringMap(() => source.readMember());
@@ -395,7 +395,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JClassEnvKind.closure);
     sink.begin(tag);
     sink.writeStringMap(
@@ -419,7 +419,7 @@
 
 abstract class JClassData {
   /// Deserializes a [JClassData] object from [source].
-  factory JClassData.readFromDataSource(DataSource source) {
+  factory JClassData.readFromDataSource(DataSourceReader source) {
     JClassDataKind kind = source.readEnum(JClassDataKind.values);
     switch (kind) {
       case JClassDataKind.node:
@@ -433,7 +433,7 @@
   }
 
   /// Serializes this [JClassData] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 
   ClassDefinition get definition;
 
@@ -485,7 +485,7 @@
 
   JClassDataImpl(this.cls, this.definition);
 
-  factory JClassDataImpl.readFromDataSource(DataSource source) {
+  factory JClassDataImpl.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Class cls = source.readClassNode();
     ClassDefinition definition = ClassDefinition.readFromDataSource(source);
@@ -494,7 +494,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JClassDataKind.node);
     sink.begin(tag);
     sink.writeClassNode(cls);
@@ -538,7 +538,7 @@
   JMemberData();
 
   /// Deserializes a [JMemberData] object from [source].
-  factory JMemberData.readFromDataSource(DataSource source) {
+  factory JMemberData.readFromDataSource(DataSourceReader source) {
     JMemberDataKind kind = source.readEnum(JMemberDataKind.values);
     switch (kind) {
       case JMemberDataKind.function:
@@ -562,7 +562,7 @@
   }
 
   /// Serializes this [JMemberData] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 }
 
 abstract class JMemberDataImpl implements JMemberData {
@@ -689,7 +689,7 @@
       MemberDefinition definition, StaticTypeCache staticTypes)
       : super(node, definition, staticTypes);
 
-  factory FunctionDataImpl.readFromDataSource(DataSource source) {
+  factory FunctionDataImpl.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Member node = source.readMemberNode();
     ir.FunctionNode functionNode;
@@ -709,7 +709,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberDataKind.function);
     sink.begin(tag);
     sink.writeMemberNode(node);
@@ -748,7 +748,7 @@
   SignatureFunctionData(this.definition, this.memberThisType,
       this.typeParameters, this.classTypeVariableAccess);
 
-  factory SignatureFunctionData.readFromDataSource(DataSource source) {
+  factory SignatureFunctionData.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     MemberDefinition definition = MemberDefinition.readFromDataSource(source);
     InterfaceType memberThisType = source.readDartType(allowNull: true);
@@ -761,7 +761,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberDataKind.signature);
     sink.begin(tag);
     definition.writeToDataSink(sink);
@@ -851,7 +851,8 @@
   GeneratorBodyFunctionData(FunctionData baseData, this.definition)
       : super(baseData);
 
-  factory GeneratorBodyFunctionData.readFromDataSource(DataSource source) {
+  factory GeneratorBodyFunctionData.readFromDataSource(
+      DataSourceReader source) {
     source.begin(tag);
     // TODO(johnniwinther): Share the original base data on deserialization.
     FunctionData baseData = JMemberData.readFromDataSource(source);
@@ -861,7 +862,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberDataKind.generatorBody);
     sink.begin(tag);
     baseData.writeToDataSink(sink);
@@ -887,7 +888,7 @@
       MemberDefinition definition, StaticTypeCache staticTypes)
       : super(node, functionNode, definition, staticTypes);
 
-  factory JConstructorDataImpl.readFromDataSource(DataSource source) {
+  factory JConstructorDataImpl.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Member node = source.readMemberNode();
     ir.FunctionNode functionNode;
@@ -907,7 +908,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberDataKind.constructor);
     sink.begin(tag);
     sink.writeMemberNode(node);
@@ -931,7 +932,7 @@
       MemberDefinition definition, StaticTypeCache staticTypes)
       : super(node, functionNode, definition, staticTypes);
 
-  factory ConstructorBodyDataImpl.readFromDataSource(DataSource source) {
+  factory ConstructorBodyDataImpl.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Member node = source.readMemberNode();
     ir.FunctionNode functionNode;
@@ -951,7 +952,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberDataKind.constructorBody);
     sink.begin(tag);
     sink.writeMemberNode(node);
@@ -982,7 +983,7 @@
       ir.Field node, MemberDefinition definition, StaticTypeCache staticTypes)
       : super(node, definition, staticTypes);
 
-  factory JFieldDataImpl.readFromDataSource(DataSource source) {
+  factory JFieldDataImpl.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.Member node = source.readMemberNode();
     MemberDefinition definition = MemberDefinition.readFromDataSource(source);
@@ -993,7 +994,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.writeEnum(JMemberDataKind.field);
     sink.begin(tag);
     sink.writeMemberNode(node);
@@ -1028,14 +1029,14 @@
 
   JTypeVariableData(this.node);
 
-  factory JTypeVariableData.readFromDataSource(DataSource source) {
+  factory JTypeVariableData.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ir.TypeParameter node = source.readTypeParameterNode();
     source.end(tag);
     return JTypeVariableData(node);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeTypeParameterNode(node);
     sink.end(tag);
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 8740692..61dfd89 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -318,12 +318,12 @@
     if (_compiler.options.testMode) {
       bool useDataKinds = true;
       List<Object> data = [];
-      DataSink sink =
-          DataSink(ObjectSinkWriter(data), useDataKinds: useDataKinds);
+      DataSinkWriter sink =
+          DataSinkWriter(ObjectDataSink(data), useDataKinds: useDataKinds);
       sink.registerCodegenWriter(CodegenWriterImpl(closedWorld));
       result.writeToDataSink(sink);
-      DataSource source =
-          DataSource(ObjectSourceReader(data), useDataKinds: useDataKinds);
+      DataSourceReader source =
+          DataSourceReader(ObjectDataSource(data), useDataKinds: useDataKinds);
       List<ModularName> modularNames = [];
       List<ModularExpression> modularExpression = [];
       source.registerCodegenReader(
@@ -390,7 +390,7 @@
   }
 
   /// Prepare [source] to deserialize modular code generation data.
-  void prepareCodegenReader(DataSource source) {
+  void prepareCodegenReader(DataSourceReader source) {
     source.registerEntityReader(ClosedEntityReader(_elementMap));
     source.registerEntityLookup(ClosedEntityLookup(_elementMap));
     source.registerComponentLookup(
diff --git a/pkg/compiler/lib/src/js_model/js_world.dart b/pkg/compiler/lib/src/js_model/js_world.dart
index 1c45fd2..e6803aa 100644
--- a/pkg/compiler/lib/src/js_model/js_world.dart
+++ b/pkg/compiler/lib/src/js_model/js_world.dart
@@ -126,7 +126,7 @@
       Environment environment,
       AbstractValueStrategy abstractValueStrategy,
       ir.Component component,
-      DataSource source) {
+      DataSourceReader source) {
     source.begin(tag);
 
     JsKernelToElementMap elementMap = JsKernelToElementMap.readFromDataSource(
@@ -198,7 +198,7 @@
   }
 
   /// Serializes this [JsClosedWorld] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     elementMap.writeToDataSink(sink);
     classHierarchy.writeToDataSink(sink);
diff --git a/pkg/compiler/lib/src/js_model/locals.dart b/pkg/compiler/lib/src/js_model/locals.dart
index 6f88356..ff38486 100644
--- a/pkg/compiler/lib/src/js_model/locals.dart
+++ b/pkg/compiler/lib/src/js_model/locals.dart
@@ -38,7 +38,7 @@
   /// Deserializes a [GlobalLocalsMap] object from [source].
   factory GlobalLocalsMap.readFromDataSource(
       MemberEntity Function(MemberEntity) localMapKeyLookup,
-      DataSource source) {
+      DataSourceReader source) {
     source.begin(tag);
     Map<MemberEntity, KernelToLocalsMap> _localsMaps = {};
     int mapCount = source.readInt();
@@ -55,7 +55,7 @@
   }
 
   /// Serializes this [GlobalLocalsMap] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     // [KernelToLocalsMap]s are shared between members and their nested
     // closures, so we reverse [_localsMaps] to ensure that [KernelToLocalsMap]s
@@ -107,7 +107,7 @@
   KernelToLocalsMapImpl(this._currentMember);
 
   /// Deserializes a [KernelToLocalsMapImpl] object from [source].
-  KernelToLocalsMapImpl.readFromDataSource(DataSource source) {
+  KernelToLocalsMapImpl.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     _currentMember = source.readMember();
     int localsCount = source.readInt();
@@ -143,7 +143,7 @@
 
   /// Serializes this [KernelToLocalsMapImpl] to [sink].
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMember(currentMember);
     sink.writeInt(_locals.size);
@@ -475,7 +475,7 @@
       this.isContinueTarget = false});
 
   /// Deserializes a [JJumpTarget] object from [source].
-  factory JJumpTarget.readFromDataSource(DataSource source) {
+  factory JJumpTarget.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     MemberEntity memberContext = source.readMember();
     int nestingLevel = source.readInt();
@@ -501,7 +501,7 @@
   }
 
   /// Serializes this [JJumpTarget] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeMember(memberContext);
     sink.writeInt(nestingLevel);
diff --git a/pkg/compiler/lib/src/js_model/type_recipe.dart b/pkg/compiler/lib/src/js_model/type_recipe.dart
index 161e6cc..590ef0a 100644
--- a/pkg/compiler/lib/src/js_model/type_recipe.dart
+++ b/pkg/compiler/lib/src/js_model/type_recipe.dart
@@ -147,7 +147,7 @@
 
   int _computeHashCode();
 
-  factory TypeRecipe.readFromDataSource(DataSource source) {
+  factory TypeRecipe.readFromDataSource(DataSourceReader source) {
     TypeRecipe recipe;
     source.begin(tag);
     _TypeRecipeKind kind = source.readEnum(_TypeRecipeKind.values);
@@ -166,7 +166,7 @@
     return recipe;
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeEnum(_kind);
     _writeToDataSink(sink);
@@ -174,7 +174,7 @@
   }
 
   _TypeRecipeKind get _kind;
-  void _writeToDataSink(DataSink sink);
+  void _writeToDataSink(DataSinkWriter sink);
 
   /// Returns `true` is [recipeB] evaluated in an environment described by
   /// [structureB] gives the same type as [recipeA] evaluated in environment
@@ -203,7 +203,7 @@
 
   TypeExpressionRecipe(this.type);
 
-  static TypeExpressionRecipe _readFromDataSource(DataSource source) {
+  static TypeExpressionRecipe _readFromDataSource(DataSourceReader source) {
     return TypeExpressionRecipe(source.readDartType());
   }
 
@@ -211,7 +211,7 @@
   _TypeRecipeKind get _kind => _TypeRecipeKind.expression;
 
   @override
-  void _writeToDataSink(DataSink sink) {
+  void _writeToDataSink(DataSinkWriter sink) {
     sink.writeDartType(type);
   }
 
@@ -237,7 +237,8 @@
 
   SingletonTypeEnvironmentRecipe(this.type);
 
-  static SingletonTypeEnvironmentRecipe _readFromDataSource(DataSource source) {
+  static SingletonTypeEnvironmentRecipe _readFromDataSource(
+      DataSourceReader source) {
     return SingletonTypeEnvironmentRecipe(source.readDartType());
   }
 
@@ -245,7 +246,7 @@
   _TypeRecipeKind get _kind => _TypeRecipeKind.singletonEnvironment;
 
   @override
-  void _writeToDataSink(DataSink sink) {
+  void _writeToDataSink(DataSinkWriter sink) {
     sink.writeDartType(type);
   }
 
@@ -277,7 +278,8 @@
 
   FullTypeEnvironmentRecipe({this.classType, this.types = const []});
 
-  static FullTypeEnvironmentRecipe _readFromDataSource(DataSource source) {
+  static FullTypeEnvironmentRecipe _readFromDataSource(
+      DataSourceReader source) {
     InterfaceType classType =
         source.readDartType(allowNull: true) as InterfaceType;
     List<DartType> types = source.readDartTypes(emptyAsNull: true) ?? const [];
@@ -288,7 +290,7 @@
   _TypeRecipeKind get _kind => _TypeRecipeKind.fullEnvironment;
 
   @override
-  void _writeToDataSink(DataSink sink) {
+  void _writeToDataSink(DataSinkWriter sink) {
     sink.writeDartType(classType, allowNull: true);
     sink.writeDartTypes(types, allowNull: false);
   }
diff --git a/pkg/compiler/lib/src/native/behavior.dart b/pkg/compiler/lib/src/native/behavior.dart
index f8f41cb..cf696e9 100644
--- a/pkg/compiler/lib/src/native/behavior.dart
+++ b/pkg/compiler/lib/src/native/behavior.dart
@@ -195,7 +195,7 @@
   NativeBehavior.internal(this.sideEffects);
 
   /// Deserializes a [NativeBehavior] object from [source].
-  factory NativeBehavior.readFromDataSource(DataSource source) {
+  factory NativeBehavior.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
 
     List<Object> readTypes() {
@@ -233,7 +233,7 @@
   }
 
   /// Serializes this [NativeBehavior] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
 
     void writeTypes(List<Object> types) {
diff --git a/pkg/compiler/lib/src/ordered_typeset.dart b/pkg/compiler/lib/src/ordered_typeset.dart
index dc2b669..34232db 100644
--- a/pkg/compiler/lib/src/ordered_typeset.dart
+++ b/pkg/compiler/lib/src/ordered_typeset.dart
@@ -38,7 +38,7 @@
   OrderedTypeSet.internal(this._levels, this.types);
 
   /// Deserializes a [OrderedTypeSet] object from [source].
-  factory OrderedTypeSet.readFromDataSource(DataSource source) {
+  factory OrderedTypeSet.readFromDataSource(DataSourceReader source) {
     // TODO(johnniwinther): Make the deserialized type sets share their
     // internal links like the original type sets do?
     source.begin(tag);
@@ -63,7 +63,7 @@
   }
 
   /// Serializes this [OrderedTypeSet] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     List<InterfaceType> typeList = types.toList();
     sink.writeInt(typeList.length);
diff --git a/pkg/compiler/lib/src/serialization/binary_sink.dart b/pkg/compiler/lib/src/serialization/binary_sink.dart
index a697329..7817a31 100644
--- a/pkg/compiler/lib/src/serialization/binary_sink.dart
+++ b/pkg/compiler/lib/src/serialization/binary_sink.dart
@@ -4,15 +4,15 @@
 
 part of 'serialization.dart';
 
-/// [SinkWriter] that writes data as a sequence of bytes.
+/// [DataSink] that writes data as a sequence of bytes.
 ///
 /// This data sink works together with [BinarySourceWriter].
-class BinarySinkWriter implements SinkWriter {
+class BinaryDataSink implements DataSink {
   final Sink<List<int>> sink;
   BufferedSink _bufferedSink;
   int _length = 0;
 
-  BinarySinkWriter(this.sink) : _bufferedSink = BufferedSink(sink);
+  BinaryDataSink(this.sink) : _bufferedSink = BufferedSink(sink);
 
   @override
   int get length => _length;
diff --git a/pkg/compiler/lib/src/serialization/binary_source.dart b/pkg/compiler/lib/src/serialization/binary_source.dart
index 8c424d3..149f362 100644
--- a/pkg/compiler/lib/src/serialization/binary_source.dart
+++ b/pkg/compiler/lib/src/serialization/binary_source.dart
@@ -4,15 +4,15 @@
 
 part of 'serialization.dart';
 
-/// [SourceReader] that reads data from a sequence of bytes.
+/// [DataSource] that reads data from a sequence of bytes.
 ///
-/// This data source works together with [BinarySinkWriter].
-class BinarySourceReader implements SourceReader {
+/// This data source works together with [BinaryDataSink].
+class BinaryDataSource implements DataSource {
   int _byteOffset = 0;
   final List<int> _bytes;
   final StringInterner _stringInterner;
 
-  BinarySourceReader(this._bytes, {StringInterner stringInterner})
+  BinaryDataSource(this._bytes, {StringInterner stringInterner})
       : _stringInterner = stringInterner;
 
   @override
diff --git a/pkg/compiler/lib/src/serialization/helpers.dart b/pkg/compiler/lib/src/serialization/helpers.dart
index 14dee10..81b2e20 100644
--- a/pkg/compiler/lib/src/serialization/helpers.dart
+++ b/pkg/compiler/lib/src/serialization/helpers.dart
@@ -66,7 +66,7 @@
   functionNode,
 }
 
-/// Class used for encoding tags in [ObjectSinkWriter] and [ObjectSourceReader].
+/// Class used for encoding tags in [ObjectDataSink] and [ObjectDataSource].
 class Tag {
   final String value;
 
@@ -126,7 +126,7 @@
 
 class DartTypeNodeWriter
     extends ir.DartTypeVisitor1<void, List<ir.TypeParameter>> {
-  final DataSink _sink;
+  final DataSinkWriter _sink;
 
   DartTypeNodeWriter(this._sink);
 
@@ -262,7 +262,7 @@
 
 /// Data sink helper that canonicalizes [E] values using indices.
 class IndexedSink<E> {
-  final SinkWriter _sink;
+  final DataSink _sink;
   Map<E, int> cache;
 
   IndexedSink(this._sink, {this.cache}) {
@@ -293,7 +293,7 @@
 
 /// Data source helper reads canonicalized [E] values through indices.
 class IndexedSource<E> {
-  final SourceReader _sourceReader;
+  final DataSource _sourceReader;
   List<E> cache;
 
   IndexedSource(this._sourceReader, {this.cache}) {
diff --git a/pkg/compiler/lib/src/serialization/object_sink.dart b/pkg/compiler/lib/src/serialization/object_sink.dart
index e98bdb0..1388dc6 100644
--- a/pkg/compiler/lib/src/serialization/object_sink.dart
+++ b/pkg/compiler/lib/src/serialization/object_sink.dart
@@ -7,11 +7,11 @@
 /// [DataSinkWriter] that writes to a list of objects, useful for debugging
 /// inconsistencies between serialization and deserialization.
 ///
-/// This data sink writer works together with [ObjectSourceReader].
-class ObjectSinkWriter implements SinkWriter {
+/// This data sink writer works together with [ObjectDataSource].
+class ObjectDataSink implements DataSink {
   List<dynamic> _data;
 
-  ObjectSinkWriter(this._data);
+  ObjectDataSink(this._data);
 
   @override
   void beginTag(String tag) {
diff --git a/pkg/compiler/lib/src/serialization/object_source.dart b/pkg/compiler/lib/src/serialization/object_source.dart
index f34c60c..01b602b 100644
--- a/pkg/compiler/lib/src/serialization/object_source.dart
+++ b/pkg/compiler/lib/src/serialization/object_source.dart
@@ -4,15 +4,15 @@
 
 part of 'serialization.dart';
 
-/// [SourceReader] that read from a list of objects, useful for debugging
+/// [DataSource] that read from a list of objects, useful for debugging
 /// inconsistencies between serialization and deserialization.
 ///
-/// This data source works together with [ObjectSinkWriter].
-class ObjectSourceReader implements SourceReader {
+/// This data source works together with [ObjectDataSink].
+class ObjectDataSource implements DataSource {
   int _index = 0;
   final List<dynamic> _data;
 
-  ObjectSourceReader(this._data);
+  ObjectDataSource(this._data);
 
   T _read<T>() {
     dynamic value = _data[_index++];
diff --git a/pkg/compiler/lib/src/serialization/serialization.dart b/pkg/compiler/lib/src/serialization/serialization.dart
index 4a2648b..b7747d9 100644
--- a/pkg/compiler/lib/src/serialization/serialization.dart
+++ b/pkg/compiler/lib/src/serialization/serialization.dart
@@ -37,7 +37,7 @@
 }
 
 /// Data class representing cache information for a given [T] which can be
-/// passed from a [DataSource] to other [DataSource]s and [DataSink]s.
+/// passed from a [DataSourceReader] to other [DataSourceReader]s and [DataSinkWriter]s.
 class DataSourceTypeIndices<E, T> {
   /// Reshapes a [List<T>] to a [Map<E, int>] using [_getValue].
   Map<E, int> _reshape() {
@@ -57,9 +57,9 @@
   Map<E, int> _cache;
 
   /// Though [DataSourceTypeIndices] supports two types of caches. If the
-  /// exported indices are imported into a [DataSource] then the [cacheAsList]
+  /// exported indices are imported into a [DataSourceReader] then the [cacheAsList]
   /// will be used as is. If, however, the exported indices are imported into a
-  /// [DataSink] then we need to reshape the [List<T>] into a [Map<E, int>]
+  /// [DataSinkWriter] then we need to reshape the [List<T>] into a [Map<E, int>]
   /// where [E] is either [T] or some value which can be derived from [T] by
   /// [_getValue].
   DataSourceTypeIndices(this.cacheAsList, [this._getValue]) {
@@ -69,7 +69,7 @@
 }
 
 /// Data class representing the sum of all cache information for a given
-/// [DataSource].
+/// [DataSourceReader].
 class DataSourceIndices {
   final Map<Type, DataSourceTypeIndices> caches = {};
 }
@@ -94,22 +94,22 @@
   const EntityReader();
 
   IndexedLibrary readLibraryFromDataSource(
-      DataSource source, EntityLookup entityLookup) {
+      DataSourceReader source, EntityLookup entityLookup) {
     return entityLookup.getLibraryByIndex(source.readInt());
   }
 
   IndexedClass readClassFromDataSource(
-      DataSource source, EntityLookup entityLookup) {
+      DataSourceReader source, EntityLookup entityLookup) {
     return entityLookup.getClassByIndex(source.readInt());
   }
 
   IndexedMember readMemberFromDataSource(
-      DataSource source, EntityLookup entityLookup) {
+      DataSourceReader source, EntityLookup entityLookup) {
     return entityLookup.getMemberByIndex(source.readInt());
   }
 
   IndexedTypeVariable readTypeVariableFromDataSource(
-      DataSource source, EntityLookup entityLookup) {
+      DataSourceReader source, EntityLookup entityLookup) {
     return entityLookup.getTypeVariableByIndex(source.readInt());
   }
 }
@@ -118,19 +118,20 @@
 class EntityWriter {
   const EntityWriter();
 
-  void writeLibraryToDataSink(DataSink sink, IndexedLibrary value) {
+  void writeLibraryToDataSink(DataSinkWriter sink, IndexedLibrary value) {
     sink.writeInt(value.libraryIndex);
   }
 
-  void writeClassToDataSink(DataSink sink, IndexedClass value) {
+  void writeClassToDataSink(DataSinkWriter sink, IndexedClass value) {
     sink.writeInt(value.classIndex);
   }
 
-  void writeMemberToDataSink(DataSink sink, IndexedMember value) {
+  void writeMemberToDataSink(DataSinkWriter sink, IndexedMember value) {
     sink.writeInt(value.memberIndex);
   }
 
-  void writeTypeVariableToDataSink(DataSink sink, IndexedTypeVariable value) {
+  void writeTypeVariableToDataSink(
+      DataSinkWriter sink, IndexedTypeVariable value) {
     sink.writeInt(value.typeVariableIndex);
   }
 }
@@ -142,16 +143,16 @@
 
 /// Interface used for reading codegen only data during deserialization.
 abstract class CodegenReader {
-  AbstractValue readAbstractValue(DataSource source);
-  OutputUnit readOutputUnitReference(DataSource source);
-  js.Node readJsNode(DataSource source);
-  TypeRecipe readTypeRecipe(DataSource source);
+  AbstractValue readAbstractValue(DataSourceReader source);
+  OutputUnit readOutputUnitReference(DataSourceReader source);
+  js.Node readJsNode(DataSourceReader source);
+  TypeRecipe readTypeRecipe(DataSourceReader source);
 }
 
 /// Interface used for writing codegen only data during serialization.
 abstract class CodegenWriter {
-  void writeAbstractValue(DataSink sink, AbstractValue value);
-  void writeOutputUnitReference(DataSink sink, OutputUnit value);
-  void writeJsNode(DataSink sink, js.Node node);
-  void writeTypeRecipe(DataSink sink, TypeRecipe recipe);
+  void writeAbstractValue(DataSinkWriter sink, AbstractValue value);
+  void writeOutputUnitReference(DataSinkWriter sink, OutputUnit value);
+  void writeJsNode(DataSinkWriter sink, js.Node node);
+  void writeTypeRecipe(DataSinkWriter sink, TypeRecipe recipe);
 }
diff --git a/pkg/compiler/lib/src/serialization/sink.dart b/pkg/compiler/lib/src/serialization/sink.dart
index 9a4703f..3158728 100644
--- a/pkg/compiler/lib/src/serialization/sink.dart
+++ b/pkg/compiler/lib/src/serialization/sink.dart
@@ -4,11 +4,11 @@
 
 part of 'serialization.dart';
 
-/// Interface handling [DataSink] low-level data serialization.
+/// Interface handling [DataSinkWriter] low-level data serialization.
 ///
-/// Each implementation of [SinkWriter] should have a corresponding
-/// [SourceReader] that deserializes data serialized by that implementation.
-abstract class SinkWriter {
+/// Each implementation of [DataSink] should have a corresponding
+/// [DataSource] that deserializes data serialized by that implementation.
+abstract class DataSink {
   int get length;
 
   /// Serialization of a non-negative integer value.
@@ -32,10 +32,10 @@
 
 /// Serialization writer
 ///
-/// To be used with [DataSource] to read and write serialized data.
-/// Serialization format is deferred to provided [SinkWriter].
-class DataSink {
-  final SinkWriter _sinkWriter;
+/// To be used with [DataSourceReader] to read and write serialized data.
+/// Serialization format is deferred to provided [DataSink].
+class DataSinkWriter {
+  final DataSink _sinkWriter;
 
   /// If `true`, serialization of every data kind is preceded by a [DataKind]
   /// value.
@@ -80,7 +80,7 @@
     }
   }
 
-  DataSink(this._sinkWriter,
+  DataSinkWriter(this._sinkWriter,
       {this.useDataKinds = false, this.tagFrequencyMap, this.importedIndices}) {
     _dartTypeNodeWriter = DartTypeNodeWriter(this);
     _stringIndex = _createSink<String>();
@@ -143,7 +143,7 @@
   /// non-null [f] is called to write the non-null value to the data sink.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readValueOrNull].
+  /// [DataSourceReader.readValueOrNull].
   void writeValueOrNull<E>(E value, void f(E value)) {
     writeBool(value != null);
     if (value != null) {
@@ -155,7 +155,7 @@
   /// the data sink. If [allowNull] is `true`, [values] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readList].
+  /// [DataSourceReader.readList].
   void writeList<E>(Iterable<E> values, void f(E value),
       {bool allowNull = false}) {
     if (values == null) {
@@ -189,7 +189,7 @@
   /// Writes the potentially `null` non-negative [value] to this data sink.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readIntOrNull].
+  /// [DataSourceReader.readIntOrNull].
   void writeIntOrNull(int value) {
     writeBool(value != null);
     if (value != null) {
@@ -211,7 +211,7 @@
   /// Writes the potentially `null` string [value] to this data sink.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readStringOrNull].
+  /// [DataSourceReader.readStringOrNull].
   void writeStringOrNull(String value) {
     writeBool(value != null);
     if (value != null) {
@@ -224,7 +224,7 @@
   /// allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readStringMap].
+  /// [DataSourceReader.readStringMap].
   void writeStringMap<V>(Map<String, V> map, void f(V value),
       {bool allowNull = false}) {
     if (map == null) {
@@ -243,7 +243,7 @@
   /// [values] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readStrings].
+  /// [DataSourceReader.readStrings].
   void writeStrings(Iterable<String> values, {bool allowNull = false}) {
     if (values == null) {
       assert(allowNull);
@@ -339,7 +339,7 @@
   /// If [allowNull] is `true`, [values] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readMemberNodes].
+  /// [DataSourceReader.readMemberNodes].
   void writeMemberNodes(Iterable<ir.Member> values, {bool allowNull = false}) {
     if (values == null) {
       assert(allowNull);
@@ -357,7 +357,7 @@
   /// [allowNull] is `true`, [map] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readMemberNodeMap].
+  /// [DataSourceReader.readMemberNodeMap].
   void writeMemberNodeMap<V>(Map<ir.Member, V> map, void f(V value),
       {bool allowNull = false}) {
     if (map == null) {
@@ -437,7 +437,7 @@
   /// to this data sink.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readTreeNodeOrNull].
+  /// [DataSourceReader.readTreeNodeOrNull].
   void writeTreeNodeOrNull(ir.TreeNode value) {
     writeBool(value != null);
     if (value != null) {
@@ -449,7 +449,7 @@
   /// If [allowNull] is `true`, [values] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readTreeNodes].
+  /// [DataSourceReader.readTreeNodes].
   void writeTreeNodes(Iterable<ir.TreeNode> values, {bool allowNull = false}) {
     if (values == null) {
       assert(allowNull);
@@ -467,7 +467,7 @@
   /// [allowNull] is `true`, [map] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readTreeNodeMap].
+  /// [DataSourceReader.readTreeNodeMap].
   void writeTreeNodeMap<V>(Map<ir.TreeNode, V> map, void f(V value),
       {bool allowNull = false}) {
     if (map == null) {
@@ -498,7 +498,7 @@
   /// the known [context] to this data sink.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readTreeNodeOrNullInContext].
+  /// [DataSourceReader.readTreeNodeOrNullInContext].
   void writeTreeNodeOrNullInContext(ir.TreeNode value) {
     writeBool(value != null);
     if (value != null) {
@@ -511,7 +511,7 @@
   /// `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readTreeNodesInContext].
+  /// [DataSourceReader.readTreeNodesInContext].
   void writeTreeNodesInContext(Iterable<ir.TreeNode> values,
       {bool allowNull = false}) {
     if (values == null) {
@@ -530,7 +530,7 @@
   /// data sink. If [allowNull] is `true`, [map] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readTreeNodeMapInContext].
+  /// [DataSourceReader.readTreeNodeMapInContext].
   void writeTreeNodeMapInContext<V>(Map<ir.TreeNode, V> map, void f(V value),
       {bool allowNull = false}) {
     if (map == null) {
@@ -573,7 +573,7 @@
   /// If [allowNull] is `true`, [values] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readTypeParameterNodes].
+  /// [DataSourceReader.readTypeParameterNodes].
   void writeTypeParameterNodes(Iterable<ir.TypeParameter> values,
       {bool allowNull = false}) {
     if (values == null) {
@@ -611,7 +611,7 @@
   /// [values] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readDartTypes].
+  /// [DataSourceReader.readDartTypes].
   void writeDartTypes(Iterable<DartType> values, {bool allowNull = false}) {
     if (values == null) {
       assert(allowNull);
@@ -648,7 +648,7 @@
   /// `true`, [values] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readDartTypeNodes].
+  /// [DataSourceReader.readDartTypeNodes].
   void writeDartTypeNodes(Iterable<ir.DartType> values,
       {bool allowNull = false}) {
     if (values == null) {
@@ -679,7 +679,7 @@
   /// to this data sink.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readLibraryOrNull].
+  /// [DataSourceReader.readLibraryOrNull].
   void writeLibraryOrNull(IndexedLibrary value) {
     writeBool(value != null);
     if (value != null) {
@@ -692,7 +692,7 @@
   /// [allowNull] is `true`, [map] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readLibraryMap].
+  /// [DataSourceReader.readLibraryMap].
   void writeLibraryMap<V>(Map<LibraryEntity, V> map, void f(V value),
       {bool allowNull = false}) {
     if (map == null) {
@@ -716,7 +716,7 @@
   /// to this data sink.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readClassOrNull].
+  /// [DataSourceReader.readClassOrNull].
   void writeClassOrNull(IndexedClass value) {
     writeBool(value != null);
     if (value != null) {
@@ -728,7 +728,7 @@
   /// [allowNull] is `true`, [values] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readClasses].
+  /// [DataSourceReader.readClasses].
   void writeClasses(Iterable<ClassEntity> values, {bool allowNull = false}) {
     if (values == null) {
       assert(allowNull);
@@ -746,7 +746,7 @@
   /// [allowNull] is `true`, [map] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readClassMap].
+  /// [DataSourceReader.readClassMap].
   void writeClassMap<V>(Map<ClassEntity, V> map, void f(V value),
       {bool allowNull = false}) {
     if (map == null) {
@@ -770,7 +770,7 @@
   /// to this data sink.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readMemberOrNull].
+  /// [DataSourceReader.readMemberOrNull].
   void writeMemberOrNull(IndexedMember value) {
     writeBool(value != null);
     if (value != null) {
@@ -782,7 +782,7 @@
   /// [allowNull] is `true`, [values] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readMembers].
+  /// [DataSourceReader.readMembers].
   void writeMembers(Iterable<MemberEntity> values, {bool allowNull = false}) {
     if (values == null) {
       assert(allowNull);
@@ -800,7 +800,7 @@
   /// [allowNull] is `true`, [map] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readMemberMap].
+  /// [DataSourceReader.readMemberMap].
   void writeMemberMap<V>(
       Map<MemberEntity, V> map, void f(MemberEntity member, V value),
       {bool allowNull = false}) {
@@ -826,7 +826,7 @@
   /// [allowNull] is `true`, [map] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readTypeVariableMap].
+  /// [DataSourceReader.readTypeVariableMap].
   void writeTypeVariableMap<V>(Map<IndexedTypeVariable, V> map, void f(V value),
       {bool allowNull = false}) {
     if (map == null) {
@@ -868,7 +868,7 @@
   /// to this data sink.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readLocalOrNull].
+  /// [DataSourceReader.readLocalOrNull].
   void writeLocalOrNull(Local value) {
     writeBool(value != null);
     if (value != null) {
@@ -880,7 +880,7 @@
   /// is `true`, [values] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readLocals].
+  /// [DataSourceReader.readLocals].
   void writeLocals(Iterable<Local> values, {bool allowNull = false}) {
     if (values == null) {
       assert(allowNull);
@@ -898,7 +898,7 @@
   /// `true`, [map] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readLocalMap].
+  /// [DataSourceReader.readLocalMap].
   void writeLocalMap<V>(Map<Local, V> map, void f(V value),
       {bool allowNull = false}) {
     if (map == null) {
@@ -1019,7 +1019,7 @@
   /// [values] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readConstants].
+  /// [DataSourceReader.readConstants].
   void writeConstants(Iterable<ConstantValue> values,
       {bool allowNull = false}) {
     if (values == null) {
@@ -1038,7 +1038,7 @@
   /// `true`, [map] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readConstantMap].
+  /// [DataSourceReader.readConstantMap].
   void writeConstantMap<V>(Map<ConstantValue, V> map, void f(V value),
       {bool allowNull = false}) {
     if (map == null) {
@@ -1111,7 +1111,7 @@
   /// [values] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readImports].
+  /// [DataSourceReader.readImports].
   void writeImports(Iterable<ImportEntity> values, {bool allowNull = false}) {
     if (values == null) {
       assert(allowNull);
@@ -1129,7 +1129,7 @@
   /// `true`, [map] is allowed to be `null`.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSource.readImportMap].
+  /// [DataSourceReader.readImportMap].
   void writeImportMap<V>(Map<ImportEntity, V> map, void f(V value),
       {bool allowNull = false}) {
     if (map == null) {
diff --git a/pkg/compiler/lib/src/serialization/source.dart b/pkg/compiler/lib/src/serialization/source.dart
index cf7fdad..b43c1ad 100644
--- a/pkg/compiler/lib/src/serialization/source.dart
+++ b/pkg/compiler/lib/src/serialization/source.dart
@@ -4,11 +4,11 @@
 
 part of 'serialization.dart';
 
-/// Interface handling [DataSource] low-level data deserialization.
+/// Interface handling [DataSourceReader] low-level data deserialization.
 ///
-/// Each implementation of [SourceReader] should have a corresponding
-/// [SinkWriter] for which it deserializes data.
-abstract class SourceReader {
+/// Each implementation of [DataSource] should have a corresponding
+/// [DataSink] for which it deserializes data.
+abstract class DataSource {
   /// Deserialization of a section begin tag.
   void begin(String tag);
 
@@ -32,10 +32,10 @@
 
 /// Deserialization reader
 ///
-/// To be used with [DataSink] to read and write serialized data.
-/// Deserialization format is deferred to provided [SourceReader].
-class DataSource {
-  final SourceReader _sourceReader;
+/// To be used with [DataSinkWriter] to read and write serialized data.
+/// Deserialization format is deferred to provided [DataSource].
+class DataSourceReader {
+  final DataSource _sourceReader;
 
   static final List<ir.DartType> emptyListOfDartTypes =
       List<ir.DartType>.filled(0, null, growable: false);
@@ -68,7 +68,7 @@
     }
   }
 
-  DataSource(this._sourceReader,
+  DataSourceReader(this._sourceReader,
       {this.useDataKinds = false, this.importedIndices}) {
     _stringIndex = _createSource<String>();
     _uriIndex = _createSource<Uri>();
@@ -77,8 +77,8 @@
     _constantIndex = _createSource<ConstantValue>();
   }
 
-  /// Exports [DataSourceIndices] for use in other [DataSource]s and
-  /// [DataSink]s.
+  /// Exports [DataSourceIndices] for use in other [DataSourceReader]s and
+  /// [DataSinkWriter]s.
   DataSourceIndices exportIndices() {
     var indices = DataSourceIndices();
     indices.caches[String] = DataSourceTypeIndices(_stringIndex.cache);
@@ -200,7 +200,7 @@
   /// read the non-null value from the data source.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeValueOrNull].
+  /// [DataSinkWriter.writeValueOrNull].
   E readValueOrNull<E>(E f()) {
     bool hasValue = readBool();
     if (hasValue) {
@@ -213,7 +213,7 @@
   /// `true`, `null` is returned instead of an empty list.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeList].
+  /// [DataSinkWriter.writeList].
   List<E> readList<E>(E f(), {bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -246,7 +246,7 @@
   /// source.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeIntOrNull].
+  /// [DataSinkWriter.writeIntOrNull].
   int readIntOrNull() {
     bool hasValue = readBool();
     if (hasValue) {
@@ -268,7 +268,7 @@
   /// Reads a potentially `null` string value from this data source.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeStringOrNull].
+  /// [DataSinkWriter.writeStringOrNull].
   String readStringOrNull() {
     bool hasValue = readBool();
     if (hasValue) {
@@ -281,7 +281,7 @@
   /// `true`, `null` is returned instead of an empty list.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeStrings].
+  /// [DataSinkWriter.writeStrings].
   List<String> readStrings({bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -297,7 +297,7 @@
   /// `true`, `null` is returned instead of an empty map.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeStringMap].
+  /// [DataSinkWriter.writeStringMap].
   Map<String, V> readStringMap<V>(V f(), {bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -402,7 +402,7 @@
   /// If [emptyAsNull] is `true`, `null` is returned instead of an empty list.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeMemberNodes].
+  /// [DataSinkWriter.writeMemberNodes].
   List<E> readMemberNodes<E extends ir.Member>({bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -419,7 +419,7 @@
   /// `true`, `null` is returned instead of an empty map.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeMemberNodeMap].
+  /// [DataSinkWriter.writeMemberNodeMap].
   Map<K, V> readMemberNodeMap<K extends ir.Member, V>(V f(),
       {bool emptyAsNull = false}) {
     int count = readInt();
@@ -506,7 +506,7 @@
   /// If [emptyAsNull] is `true`, `null` is returned instead of an empty list.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeTreeNodes].
+  /// [DataSinkWriter.writeTreeNodes].
   List<E> readTreeNodes<E extends ir.TreeNode>({bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -523,7 +523,7 @@
   /// `true`, `null` is returned instead of an empty map.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeTreeNodeMap].
+  /// [DataSinkWriter.writeTreeNodeMap].
   Map<K, V> readTreeNodeMap<K extends ir.TreeNode, V>(V f(),
       {bool emptyAsNull = false}) {
     int count = readInt();
@@ -563,7 +563,7 @@
   /// instead of an empty list.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeTreeNodesInContext].
+  /// [DataSinkWriter.writeTreeNodesInContext].
   List<E> readTreeNodesInContext<E extends ir.TreeNode>(
       {bool emptyAsNull = false}) {
     int count = readInt();
@@ -582,7 +582,7 @@
   /// map.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeTreeNodeMapInContext].
+  /// [DataSinkWriter.writeTreeNodeMapInContext].
   Map<K, V> readTreeNodeMapInContext<K extends ir.TreeNode, V>(V f(),
       {bool emptyAsNull = false}) {
     int count = readInt();
@@ -620,7 +620,7 @@
   /// list.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeTypeParameterNodes].
+  /// [DataSinkWriter.writeTypeParameterNodes].
   List<ir.TypeParameter> readTypeParameterNodes({bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -644,7 +644,7 @@
   /// `null` is returned instead of an empty list.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeDartTypes].
+  /// [DataSinkWriter.writeDartTypes].
   List<DartType> readDartTypes({bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -771,7 +771,7 @@
   /// is `true`, `null` is returned instead of an empty list.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeDartTypeNodes].
+  /// [DataSinkWriter.writeDartTypeNodes].
   List<ir.DartType> readDartTypeNodes({bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -823,7 +823,7 @@
   /// map.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeLibraryMap].
+  /// [DataSinkWriter.writeLibraryMap].
   Map<K, V> readLibraryMap<K extends LibraryEntity, V>(V f(),
       {bool emptyAsNull = false}) {
     int count = readInt();
@@ -856,7 +856,7 @@
   /// If [emptyAsNull] is `true`, `null` is returned instead of an empty list.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeClasses].
+  /// [DataSinkWriter.writeClasses].
   List<E> readClasses<E extends ClassEntity>({bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -873,7 +873,7 @@
   /// `true`, `null` is returned instead of an empty map.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeClassMap].
+  /// [DataSinkWriter.writeClassMap].
   Map<K, V> readClassMap<K extends ClassEntity, V>(V f(),
       {bool emptyAsNull = false}) {
     int count = readInt();
@@ -906,7 +906,7 @@
   /// If [emptyAsNull] is `true`, `null` is returned instead of an empty list.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeMembers].
+  /// [DataSinkWriter.writeMembers].
   List<E> readMembers<E extends MemberEntity>({bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -923,7 +923,7 @@
   /// `true`, `null` is returned instead of an empty map.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeMemberMap].
+  /// [DataSinkWriter.writeMemberMap].
   Map<K, V> readMemberMap<K extends MemberEntity, V>(V f(MemberEntity member),
       {bool emptyAsNull = false}) {
     int count = readInt();
@@ -947,7 +947,7 @@
   /// [emptyAsNull] is `true`, `null` is returned instead of an empty map.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeTypeVariableMap].
+  /// [DataSinkWriter.writeTypeVariableMap].
   Map<K, V> readTypeVariableMap<K extends IndexedTypeVariable, V>(V f(),
       {bool emptyAsNull = false}) {
     int count = readInt();
@@ -998,7 +998,7 @@
   /// [emptyAsNull] is `true`, `null` is returned instead of an empty list.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeLocals].
+  /// [DataSinkWriter.writeLocals].
   List<E> readLocals<E extends Local>({bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -1015,7 +1015,7 @@
   /// `null` is returned instead of an empty map.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeLocalMap].
+  /// [DataSinkWriter.writeLocalMap].
   Map<K, V> readLocalMap<K extends Local, V>(V f(),
       {bool emptyAsNull = false}) {
     int count = readInt();
@@ -1124,7 +1124,7 @@
   /// `true`, `null` is returned instead of an empty list.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeConstants].
+  /// [DataSinkWriter.writeConstants].
   List<E> readConstants<E extends ConstantValue>({bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -1141,7 +1141,7 @@
   /// `true`, `null` is returned instead of an empty map.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeConstantMap].
+  /// [DataSinkWriter.writeConstantMap].
   Map<K, V> readConstantMap<K extends ConstantValue, V>(V f(),
       {bool emptyAsNull = false}) {
     int count = readInt();
@@ -1214,7 +1214,7 @@
   /// `true`, `null` is returned instead of an empty list.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeImports].
+  /// [DataSinkWriter.writeImports].
   List<ImportEntity> readImports({bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
@@ -1230,7 +1230,7 @@
   /// `true`, `null` is returned instead of an empty map.
   ///
   /// This is a convenience method to be used together with
-  /// [DataSink.writeImportMap].
+  /// [DataSinkWriter.writeImportMap].
   Map<ImportEntity, V> readImportMap<V>(V f(), {bool emptyAsNull = false}) {
     int count = readInt();
     if (count == 0 && emptyAsNull) return null;
diff --git a/pkg/compiler/lib/src/serialization/strategies.dart b/pkg/compiler/lib/src/serialization/strategies.dart
index 95c04aa..d73bddd 100644
--- a/pkg/compiler/lib/src/serialization/strategies.dart
+++ b/pkg/compiler/lib/src/serialization/strategies.dart
@@ -73,7 +73,7 @@
   List<int> serializeGlobalTypeInferenceResults(
       DataSourceIndices indices, GlobalTypeInferenceResults results) {
     ByteSink byteSink = ByteSink();
-    DataSink sink = DataSink(BinarySinkWriter(byteSink),
+    DataSinkWriter sink = DataSinkWriter(BinaryDataSink(byteSink),
         useDataKinds: useDataKinds, importedIndices: indices);
     serializeGlobalTypeInferenceResultsToSink(results, sink);
     return byteSink.builder.takeBytes();
@@ -89,8 +89,8 @@
       JsClosedWorld closedWorld,
       DataSourceIndices indices,
       List<int> globalTypeInferenceResultsData) {
-    DataSource globalTypeInferenceResultsSource = DataSource(
-        BinarySourceReader(globalTypeInferenceResultsData),
+    DataSourceReader globalTypeInferenceResultsSource = DataSourceReader(
+        BinaryDataSource(globalTypeInferenceResultsData),
         useDataKinds: useDataKinds,
         importedIndices: indices);
     return deserializeGlobalTypeInferenceResultsFromSource(
@@ -106,8 +106,8 @@
   @override
   List<int> serializeClosedWorld(JsClosedWorld closedWorld) {
     ByteSink byteSink = ByteSink();
-    DataSink sink =
-        DataSink(BinarySinkWriter(byteSink), useDataKinds: useDataKinds);
+    DataSinkWriter sink =
+        DataSinkWriter(BinaryDataSink(byteSink), useDataKinds: useDataKinds);
     serializeClosedWorldToSink(closedWorld, sink);
     return byteSink.builder.takeBytes();
   }
@@ -120,8 +120,8 @@
       AbstractValueStrategy abstractValueStrategy,
       ir.Component component,
       List<int> data) {
-    DataSource source =
-        DataSource(BinarySourceReader(data), useDataKinds: useDataKinds);
+    DataSourceReader source =
+        DataSourceReader(BinaryDataSource(data), useDataKinds: useDataKinds);
     var closedWorld = deserializeClosedWorldFromSource(options, reporter,
         environment, abstractValueStrategy, component, source);
     return ClosedWorldAndIndices(closedWorld, source.exportIndices());
@@ -137,8 +137,8 @@
   List<int> serializeGlobalTypeInferenceResults(
       DataSourceIndices indices, GlobalTypeInferenceResults results) {
     Uri uri = Uri.base.resolve('world.data');
-    DataSink sink = DataSink(
-        BinarySinkWriter(
+    DataSinkWriter sink = DataSinkWriter(
+        BinaryDataSink(
             BinaryOutputSinkAdapter(RandomAccessBinaryOutputSink(uri))),
         useDataKinds: useDataKinds,
         importedIndices: indices);
@@ -156,8 +156,8 @@
       JsClosedWorld closedWorld,
       DataSourceIndices indices,
       List<int> globalTypeInferenceResultsData) {
-    DataSource globalTypeInferenceResultsSource = DataSource(
-        BinarySourceReader(globalTypeInferenceResultsData),
+    DataSourceReader globalTypeInferenceResultsSource = DataSourceReader(
+        BinaryDataSource(globalTypeInferenceResultsData),
         useDataKinds: useDataKinds,
         importedIndices: indices);
     return deserializeGlobalTypeInferenceResultsFromSource(
@@ -173,8 +173,8 @@
   @override
   List<int> serializeClosedWorld(JsClosedWorld closedWorld) {
     Uri uri = Uri.base.resolve('closed_world.data');
-    DataSink sink = DataSink(
-        BinarySinkWriter(
+    DataSinkWriter sink = DataSinkWriter(
+        BinaryDataSink(
             BinaryOutputSinkAdapter(RandomAccessBinaryOutputSink(uri))),
         useDataKinds: useDataKinds);
     serializeClosedWorldToSink(closedWorld, sink);
@@ -189,8 +189,8 @@
       AbstractValueStrategy abstractValueStrategy,
       ir.Component component,
       List<int> data) {
-    DataSource source =
-        DataSource(BinarySourceReader(data), useDataKinds: useDataKinds);
+    DataSourceReader source =
+        DataSourceReader(BinaryDataSource(data), useDataKinds: useDataKinds);
     var closedWorld = deserializeClosedWorldFromSource(options, reporter,
         environment, abstractValueStrategy, component, source);
     return ClosedWorldAndIndices(closedWorld, source.exportIndices());
@@ -207,7 +207,7 @@
   List<Object> serializeGlobalTypeInferenceResults(
       DataSourceIndices indices, GlobalTypeInferenceResults results) {
     List<Object> data = [];
-    DataSink sink = DataSink(ObjectSinkWriter(data),
+    DataSinkWriter sink = DataSinkWriter(ObjectDataSink(data),
         useDataKinds: useDataKinds, importedIndices: indices);
     serializeGlobalTypeInferenceResultsToSink(results, sink);
     return data;
@@ -223,8 +223,8 @@
       JsClosedWorld closedWorld,
       DataSourceIndices indices,
       List<Object> globalTypeInferenceResultsData) {
-    DataSource globalTypeInferenceResultsSource =
-        DataSource(ObjectSourceReader(globalTypeInferenceResultsData));
+    DataSourceReader globalTypeInferenceResultsSource =
+        DataSourceReader(ObjectDataSource(globalTypeInferenceResultsData));
     return deserializeGlobalTypeInferenceResultsFromSource(
         options,
         reporter,
@@ -238,8 +238,8 @@
   @override
   List<Object> serializeClosedWorld(JsClosedWorld closedWorld) {
     List<Object> data = [];
-    DataSink sink =
-        DataSink(ObjectSinkWriter(data), useDataKinds: useDataKinds);
+    DataSinkWriter sink =
+        DataSinkWriter(ObjectDataSink(data), useDataKinds: useDataKinds);
     serializeClosedWorldToSink(closedWorld, sink);
     return data;
   }
@@ -252,8 +252,8 @@
       AbstractValueStrategy abstractValueStrategy,
       ir.Component component,
       List<Object> data) {
-    DataSource source =
-        DataSource(ObjectSourceReader(data), useDataKinds: useDataKinds);
+    DataSourceReader source =
+        DataSourceReader(ObjectDataSource(data), useDataKinds: useDataKinds);
     var closedWorld = deserializeClosedWorldFromSource(options, reporter,
         environment, abstractValueStrategy, component, source);
     return ClosedWorldAndIndices(closedWorld, source.exportIndices());
diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
index 2077fe9..c69d158 100644
--- a/pkg/compiler/lib/src/serialization/task.dart
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -38,7 +38,7 @@
 }
 
 void serializeGlobalTypeInferenceResultsToSink(
-    GlobalTypeInferenceResults results, DataSink sink) {
+    GlobalTypeInferenceResults results, DataSinkWriter sink) {
   JsClosedWorld closedWorld = results.closedWorld;
   GlobalLocalsMap globalLocalsMap = results.globalLocalsMap;
   InferredData inferredData = results.inferredData;
@@ -55,7 +55,7 @@
     AbstractValueStrategy abstractValueStrategy,
     ir.Component component,
     JsClosedWorld closedWorld,
-    DataSource source) {
+    DataSourceReader source) {
   source.registerComponentLookup(ComponentLookup(component));
   source.registerEntityLookup(ClosedEntityLookup(closedWorld.elementMap));
   GlobalLocalsMap globalLocalsMap = GlobalLocalsMap.readFromDataSource(
@@ -66,7 +66,8 @@
       closedWorld.elementMap, closedWorld, globalLocalsMap, inferredData);
 }
 
-void serializeClosedWorldToSink(JsClosedWorld closedWorld, DataSink sink) {
+void serializeClosedWorldToSink(
+    JsClosedWorld closedWorld, DataSinkWriter sink) {
   closedWorld.writeToDataSink(sink);
   sink.close();
 }
@@ -77,7 +78,7 @@
     Environment environment,
     AbstractValueStrategy abstractValueStrategy,
     ir.Component component,
-    DataSource source) {
+    DataSourceReader source) {
   return JsClosedWorld.readFromDataSource(
       options, reporter, environment, abstractValueStrategy, component, source);
 }
@@ -177,8 +178,8 @@
       _reporter.log('Writing data to ${_options.writeModularAnalysisUri}');
       api.BinaryOutputSink dataOutput =
           _outputProvider.createBinarySink(_options.writeModularAnalysisUri);
-      DataSink sink =
-          DataSink(BinarySinkWriter(BinaryOutputSinkAdapter(dataOutput)));
+      DataSinkWriter sink =
+          DataSinkWriter(BinaryDataSink(BinaryOutputSinkAdapter(dataOutput)));
       data.toDataSink(sink);
       sink.close();
     });
@@ -197,11 +198,11 @@
       //   ModuleData.fromDataSource(source);
 
       BytesSink bytes = BytesSink();
-      DataSink binarySink =
-          DataSink(BinarySinkWriter(bytes), useDataKinds: true);
+      DataSinkWriter binarySink =
+          DataSinkWriter(BinaryDataSink(bytes), useDataKinds: true);
       data.toDataSink(binarySink);
       binarySink.close();
-      var source = DataSource(BinarySourceReader(bytes.builder.toBytes()),
+      var source = DataSourceReader(BinaryDataSource(bytes.builder.toBytes()),
           useDataKinds: true);
       source.registerComponentLookup(ComponentLookup(component));
       ModuleData.fromDataSource(source);
@@ -215,7 +216,8 @@
       for (Uri uri in _options.modularAnalysisInputs) {
         api.Input<List<int>> dataInput =
             await _provider.readFromUri(uri, inputKind: api.InputKind.binary);
-        DataSource source = DataSource(BinarySourceReader(dataInput.data));
+        DataSourceReader source =
+            DataSourceReader(BinaryDataSource(dataInput.data));
         source.registerComponentLookup(ComponentLookup(component));
         results.add(ModuleData.fromDataSource(source));
       }
@@ -228,8 +230,8 @@
       _reporter.log('Writing closed world to ${_options.writeClosedWorldUri}');
       api.BinaryOutputSink dataOutput =
           _outputProvider.createBinarySink(_options.writeClosedWorldUri);
-      DataSink sink =
-          DataSink(BinarySinkWriter(BinaryOutputSinkAdapter(dataOutput)));
+      DataSinkWriter sink =
+          DataSinkWriter(BinaryDataSink(BinaryOutputSinkAdapter(dataOutput)));
       serializeClosedWorldToSink(closedWorld, sink);
     });
   }
@@ -243,8 +245,8 @@
       api.Input<List<int>> dataInput = await _provider.readFromUri(
           _options.readClosedWorldUri,
           inputKind: api.InputKind.binary);
-      DataSource source = DataSource(
-          BinarySourceReader(dataInput.data, stringInterner: _stringInterner));
+      DataSourceReader source = DataSourceReader(
+          BinaryDataSource(dataInput.data, stringInterner: _stringInterner));
       var closedWorld = deserializeClosedWorldFromSource(_options, _reporter,
           environment, abstractValueStrategy, component, source);
       return ClosedWorldAndIndices(closedWorld, source.exportIndices());
@@ -261,8 +263,8 @@
       _reporter.log('Writing data to ${_options.writeDataUri}');
       api.BinaryOutputSink dataOutput =
           _outputProvider.createBinarySink(_options.writeDataUri);
-      DataSink sink = DataSink(
-          BinarySinkWriter(BinaryOutputSinkAdapter(dataOutput)),
+      DataSinkWriter sink = DataSinkWriter(
+          BinaryDataSink(BinaryOutputSinkAdapter(dataOutput)),
           importedIndices: indices);
       serializeGlobalTypeInferenceResultsToSink(results, sink);
     });
@@ -277,8 +279,8 @@
       _reporter.log('Reading data from ${_options.readDataUri}');
       api.Input<List<int>> dataInput = await _provider
           .readFromUri(_options.readDataUri, inputKind: api.InputKind.binary);
-      DataSource source = DataSource(
-          BinarySourceReader(dataInput.data, stringInterner: _stringInterner),
+      DataSourceReader source = DataSourceReader(
+          BinaryDataSource(dataInput.data, stringInterner: _stringInterner),
           importedIndices: closedWorldAndIndices.indices);
       return deserializeGlobalTypeInferenceResultsFromSource(
           _options,
@@ -311,8 +313,8 @@
     measureSubtask('serialize codegen', () {
       Uri uri = Uri.parse('${_options.writeCodegenUri}$shard');
       api.BinaryOutputSink dataOutput = _outputProvider.createBinarySink(uri);
-      DataSink sink = DataSink(
-          BinarySinkWriter(BinaryOutputSinkAdapter(dataOutput)),
+      DataSinkWriter sink = DataSinkWriter(
+          BinaryDataSink(BinaryOutputSinkAdapter(dataOutput)),
           importedIndices: indices);
       _reporter.log('Writing data to ${uri}');
       sink.registerEntityWriter(entityWriter);
@@ -357,8 +359,8 @@
       api.Input<List<int>> dataInput,
       DataSourceIndices importedIndices,
       Map<MemberEntity, CodegenResult> results) {
-    DataSource source = DataSource(
-        BinarySourceReader(dataInput.data, stringInterner: _stringInterner),
+    DataSourceReader source = DataSourceReader(
+        BinaryDataSource(dataInput.data, stringInterner: _stringInterner),
         importedIndices: importedIndices);
     backendStrategy.prepareCodegenReader(source);
     Map<MemberEntity, CodegenResult> codegenResults =
diff --git a/pkg/compiler/lib/src/universe/call_structure.dart b/pkg/compiler/lib/src/universe/call_structure.dart
index 1dc8cdd..0062fc9 100644
--- a/pkg/compiler/lib/src/universe/call_structure.dart
+++ b/pkg/compiler/lib/src/universe/call_structure.dart
@@ -82,7 +82,7 @@
   }
 
   /// Deserializes a [CallStructure] object from [source].
-  factory CallStructure.readFromDataSource(DataSource source) {
+  factory CallStructure.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     int argumentCount = source.readInt();
     List<String> namedArguments = source.readStrings();
@@ -92,7 +92,7 @@
   }
 
   /// Serializes this [CallStructure] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeInt(argumentCount);
     sink.writeStrings(namedArguments);
diff --git a/pkg/compiler/lib/src/universe/class_hierarchy.dart b/pkg/compiler/lib/src/universe/class_hierarchy.dart
index 24cc4ce..a2e6d01 100644
--- a/pkg/compiler/lib/src/universe/class_hierarchy.dart
+++ b/pkg/compiler/lib/src/universe/class_hierarchy.dart
@@ -15,11 +15,11 @@
 abstract class ClassHierarchy {
   /// Deserializes a [ClassHierarchy] object from [source].
   factory ClassHierarchy.readFromDataSource(
-          DataSource source, CommonElements commonElements) =
+          DataSourceReader source, CommonElements commonElements) =
       ClassHierarchyImpl.readFromDataSource;
 
   /// Serializes this [ClassHierarchy] to [sink].
-  void writeToDataSink(DataSink sink);
+  void writeToDataSink(DataSinkWriter sink);
 
   /// Returns `true` if [cls] is either directly or indirectly instantiated.
   bool isInstantiated(ClassEntity cls);
@@ -170,7 +170,7 @@
       this._commonElements, this._classHierarchyNodes, this._classSets);
 
   factory ClassHierarchyImpl.readFromDataSource(
-      DataSource source, CommonElements commonElements) {
+      DataSourceReader source, CommonElements commonElements) {
     source.begin(tag);
     Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes =
         ClassHierarchyNodesMap();
@@ -192,7 +192,7 @@
   }
 
   @override
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeInt(_classSets.length);
     ClassHierarchyNode node =
diff --git a/pkg/compiler/lib/src/universe/class_set.dart b/pkg/compiler/lib/src/universe/class_set.dart
index 5dc7629..f7c899d 100644
--- a/pkg/compiler/lib/src/universe/class_set.dart
+++ b/pkg/compiler/lib/src/universe/class_set.dart
@@ -213,7 +213,7 @@
 
   /// Deserializes a [ClassHierarchyNode] object from [source].
   factory ClassHierarchyNode.readFromDataSource(
-      DataSource source, Map<ClassEntity, ClassHierarchyNode> nodeMap) {
+      DataSourceReader source, Map<ClassEntity, ClassHierarchyNode> nodeMap) {
     source.begin(tag);
     IndexedClass cls = source.readClass();
     ClassHierarchyNode parentNode;
@@ -233,7 +233,7 @@
   }
 
   /// Serializes this [ClassHierarchyNode] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeClass(cls);
     sink.writeClassOrNull(parentNode?.cls);
@@ -541,7 +541,7 @@
 
   /// Deserializes a [ClassSet] object from [source].
   factory ClassSet.readFromDataSource(
-      DataSource source, Map<ClassEntity, ClassHierarchyNode> nodeMap) {
+      DataSourceReader source, Map<ClassEntity, ClassHierarchyNode> nodeMap) {
     source.begin(tag);
     ClassHierarchyNode node = nodeMap[source.readClass()];
     List<ClassHierarchyNode> subtypes = source.readList(() {
@@ -557,7 +557,7 @@
   }
 
   /// Serializes this [ClassSet] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeClass(node.cls);
     sink.writeList(_subtypes, (ClassHierarchyNode node) {
diff --git a/pkg/compiler/lib/src/universe/feature.dart b/pkg/compiler/lib/src/universe/feature.dart
index ca27733..a35a348 100644
--- a/pkg/compiler/lib/src/universe/feature.dart
+++ b/pkg/compiler/lib/src/universe/feature.dart
@@ -241,7 +241,7 @@
 
   GenericInstantiation(this.functionType, this.typeArguments);
 
-  factory GenericInstantiation.readFromDataSource(DataSource source) {
+  factory GenericInstantiation.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     DartType functionType = source.readDartType();
     List<DartType> typeArguments = source.readDartTypes();
@@ -249,7 +249,7 @@
     return GenericInstantiation(functionType, typeArguments);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeDartType(functionType);
     sink.writeDartTypes(typeArguments);
diff --git a/pkg/compiler/lib/src/universe/member_usage.dart b/pkg/compiler/lib/src/universe/member_usage.dart
index 451b6c5..f3fe0b1 100644
--- a/pkg/compiler/lib/src/universe/member_usage.dart
+++ b/pkg/compiler/lib/src/universe/member_usage.dart
@@ -839,7 +839,7 @@
 
   MemberAccess(this.reads, this.writes, this.invokes);
 
-  factory MemberAccess.readFromDataSource(DataSource source) {
+  factory MemberAccess.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     EnumSet<Access> reads = EnumSet.fixed(source.readInt());
     EnumSet<Access> writes = EnumSet.fixed(source.readInt());
@@ -848,7 +848,7 @@
     return MemberAccess(reads, writes, invokes);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeInt(reads.value);
     sink.writeInt(writes.value);
diff --git a/pkg/compiler/lib/src/universe/selector.dart b/pkg/compiler/lib/src/universe/selector.dart
index dddc39b..8ea7244 100644
--- a/pkg/compiler/lib/src/universe/selector.dart
+++ b/pkg/compiler/lib/src/universe/selector.dart
@@ -199,7 +199,7 @@
       CallStructure(0, null, typeArguments));
 
   /// Deserializes a [Selector] object from [source].
-  factory Selector.readFromDataSource(DataSource source) {
+  factory Selector.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     SelectorKind kind = source.readEnum(SelectorKind.values);
     bool isSetter = source.readBool();
@@ -212,7 +212,7 @@
   }
 
   /// Serializes this [Selector] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeEnum(kind);
     sink.writeBool(memberName.isSetter);
diff --git a/pkg/compiler/lib/src/universe/side_effects.dart b/pkg/compiler/lib/src/universe/side_effects.dart
index f4101839..4e8bab0 100644
--- a/pkg/compiler/lib/src/universe/side_effects.dart
+++ b/pkg/compiler/lib/src/universe/side_effects.dart
@@ -43,7 +43,7 @@
   SideEffects.fromFlags(this._flags);
 
   /// Deserializes a [SideEffects] object from [source].
-  factory SideEffects.readFromDataSource(DataSource source) {
+  factory SideEffects.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     int flags = source.readInt();
     source.end(tag);
@@ -51,7 +51,7 @@
   }
 
   /// Serializes this [SideEffects] to [sink].
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeInt(_flags);
     sink.end(tag);
diff --git a/pkg/compiler/lib/src/universe/use.dart b/pkg/compiler/lib/src/universe/use.dart
index bb33b0e..cffa3fc 100644
--- a/pkg/compiler/lib/src/universe/use.dart
+++ b/pkg/compiler/lib/src/universe/use.dart
@@ -59,7 +59,7 @@
     return DynamicUse(selector, otherReceiverConstraint, _typeArguments);
   }
 
-  factory DynamicUse.readFromDataSource(DataSource source) {
+  factory DynamicUse.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     Selector selector = Selector.readFromDataSource(source);
     bool hasConstraint = source.readBool();
@@ -72,7 +72,7 @@
     return DynamicUse(selector, receiverConstraint, typeArguments);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     selector.writeToDataSink(sink);
     sink.writeBool(receiverConstraint != null);
@@ -215,7 +215,7 @@
     return true;
   }
 
-  factory StaticUse.readFromDataSource(DataSource source) {
+  factory StaticUse.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     MemberEntity element = source.readMember();
     StaticUseKind kind = source.readEnum(StaticUseKind.values);
@@ -234,7 +234,7 @@
         typeArguments: typeArguments);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     assert(element is MemberEntity, "Unsupported entity: $element");
     sink.writeMember(element);
@@ -727,7 +727,7 @@
         this.kind = kind,
         this.hashCode = Hashing.objectsHash(type, kind, deferredImport);
 
-  factory TypeUse.readFromDataSource(DataSource source) {
+  factory TypeUse.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     DartType type = source.readDartType();
     TypeUseKind kind = source.readEnum(TypeUseKind.values);
@@ -736,7 +736,7 @@
     return TypeUse.internal(type, kind, deferredImport);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeDartType(type);
     sink.writeEnum(kind);
@@ -900,14 +900,14 @@
 
   ConstantUse._(this.value);
 
-  factory ConstantUse.readFromDataSource(DataSource source) {
+  factory ConstantUse.readFromDataSource(DataSourceReader source) {
     source.begin(tag);
     ConstantValue value = source.readConstant();
     source.end(tag);
     return ConstantUse._(value);
   }
 
-  void writeToDataSink(DataSink sink) {
+  void writeToDataSink(DataSinkWriter sink) {
     sink.begin(tag);
     sink.writeConstant(value);
     sink.end(tag);
