Make dart:convert strong mode clean.

Also removes the ChunkedConverter.

R=lrn@google.com

Review URL: https://codereview.chromium.org/1964953003 .
This commit is contained in:
Florian Loitsch 2016-05-11 16:15:31 +02:00
parent a76745e18f
commit fe1fda0766
18 changed files with 120 additions and 175 deletions

View file

@ -1,6 +1,9 @@
## 1.17.0
### Core library changes
* `dart:convert`
* Deprecate `ChunkedConverter` which was erroneously added in 1.16.
* `dart:core`
* `Uri.replace` supports iterables as values for the query parameters.
* `Uri.parseIPv6Address` returns a `Uint8List`.

View file

@ -271,8 +271,7 @@ abstract class CommonInputConverter extends Converter<String, Operation> {
* into a series of operations to be sent to the analysis server.
* The input stream can be either an instrumenation or log file.
*/
class InputConverter
extends ChunkedConverter<String, Operation, String, Operation> {
class InputConverter extends Converter<String, Operation> {
final Logger logger = new Logger('InputConverter');

View file

@ -85,8 +85,7 @@ abstract class ClientCommunicationChannel {
* Instances of the class [JsonStreamDecoder] convert JSON strings to JSON
* maps.
*/
class JsonStreamDecoder extends
ChunkedConverter<String, Map, String, Map> {
class JsonStreamDecoder extends Converter<String, Map> {
@override
Map convert(String text) => JSON.decode(text);
@ -99,8 +98,7 @@ class JsonStreamDecoder extends
* Instances of the class [NotificationConverter] convert JSON maps to
* [Notification]s.
*/
class NotificationConverter extends
ChunkedConverter<Map, Notification, Map, Notification> {
class NotificationConverter extends Converter<Map, Notification> {
@override
Notification convert(Map json) => new Notification.fromJson(json);
@ -112,8 +110,7 @@ class NotificationConverter extends
/**
* Instances of the class [ResponseConverter] convert JSON maps to [Response]s.
*/
class ResponseConverter extends
ChunkedConverter<Map, Response, Map, Response> {
class ResponseConverter extends Converter<Map, Response> {
@override
Response convert(Map json) => new Response.fromJson(json);

View file

@ -23,12 +23,14 @@ patch _parseJson(String json, reviver(var key, var value)) {
patch class Utf8Decoder {
/* patch */
Converter<List<int>, dynamic> fuse(Converter<String, dynamic> next) {
Converter<List<int>, dynamic/*=T*/> fuse/*<T>*/(
Converter<String, dynamic/*=T*/> next) {
if (next is JsonDecoder) {
return new _JsonUtf8Decoder(next._reviver, this._allowMalformed);
return new _JsonUtf8Decoder(next._reviver, this._allowMalformed)
as dynamic/*=Converter<List<int>, T>*/;
}
// TODO(lrn): Recognize a fused decoder where the next step is JsonDecoder.
return super.fuse(next);
return super.fuse/*<T>*/(next);
}
// Allow intercepting of UTF-8 decoding when built-in lists are passed.
@ -39,8 +41,7 @@ patch class Utf8Decoder {
}
}
class _JsonUtf8Decoder extends
ChunkedConverter<List<int>, Object, List<int>, Object> {
class _JsonUtf8Decoder extends Converter<List<int>, Object> {
final _Reviver _reviver;
final bool _allowMalformed;

View file

@ -69,8 +69,7 @@ class AsciiCodec extends Encoding {
// Superclass for [AsciiEncoder] and [Latin1Encoder].
// Generalizes common operations that only differ by a mask;
class _UnicodeSubsetEncoder extends
ChunkedConverter<String, List<int>, String, List<int>> {
class _UnicodeSubsetEncoder extends Converter<String, List<int>> {
final int _subsetMask;
const _UnicodeSubsetEncoder(this._subsetMask);
@ -86,7 +85,7 @@ class _UnicodeSubsetEncoder extends
RangeError.checkValidRange(start, end, stringLength);
if (end == null) end = stringLength;
int length = end - start;
List result = new Uint8List(length);
List<int> result = new Uint8List(length);
for (int i = 0; i < length; i++) {
var codeUnit = string.codeUnitAt(start + i);
if ((codeUnit & ~_subsetMask) != 0) {
@ -155,8 +154,7 @@ class _UnicodeSubsetEncoderSink extends StringConversionSinkBase {
* This class converts Latin-1 bytes (lists of unsigned 8-bit integers)
* to a string.
*/
abstract class _UnicodeSubsetDecoder extends
ChunkedConverter<List<int>, String, List<int>, String> {
abstract class _UnicodeSubsetDecoder extends Converter<List<int>, String> {
final bool _allowInvalid;
final int _subsetMask;

View file

@ -70,8 +70,7 @@ class Base64Codec extends Codec<List<int>, String> {
*
* The results are ASCII strings using a restricted alphabet.
*/
class Base64Encoder extends
ChunkedConverter<List<int>, String, List<int>, String> {
class Base64Encoder extends Converter<List<int>, String> {
final bool _urlSafe;
const Base64Encoder() : _urlSafe = false;
@ -341,8 +340,7 @@ class _Utf8Base64EncoderSink extends _Base64EncoderSink {
*
* The encoding is required to be properly padded.
*/
class Base64Decoder extends
ChunkedConverter<String, List<int>, String, List<int>> {
class Base64Decoder extends Converter<String, List<int>> {
const Base64Decoder();

View file

@ -6,55 +6,14 @@ part of dart.convert;
typedef void _ChunkedConversionCallback<T>(T accumulated);
/**
* A converter that supports chunked conversions.
*
* In addition to immediate conversions from [S] to [T], a chunked converter
* also supports longer-running conversions from [S2] to [T2].
*
* Frequently, the source and target types are the same, but this is not a
* requirement. In particular, converters that work with lists in the
* immediate conversion, could flatten the type for the chunked conversion.
*
* For example, the [LineSplitter] class returns a `List<String>` for the
* immediate conversion, but returns individual `String`s in the chunked
* conversion.
*/
/// This class is deprecated. Extend [Converter] directly.
@deprecated
abstract class ChunkedConverter<S, T, S2, T2> extends Converter<S, T> {
const ChunkedConverter(): super();
const ChunkedConverter();
/**
* Starts a chunked conversion.
*
* The returned sink serves as input for the long-running conversion. The
* given [sink] serves as output.
*/
ChunkedConversionSink<S2> startChunkedConversion(Sink<T2> sink) {
throw new UnsupportedError(
"This converter does not support chunked conversions: $this");
}
Stream<T2> bind(Stream<S2> stream) {
return new Stream<T2>.eventTransformed(
stream,
(EventSink<T2> sink) =>
new _ConverterStreamEventSink<S2, T2>(this, sink));
}
/**
* Fuses this instance with the given [other] converter.
*
* If [other] is a ChunkedConverter (with matching generic types), returns a
* [ChunkedConverter].
*/
Converter<S, dynamic> fuse(Converter<T, dynamic> other) {
if (other is ChunkedConverter<T, dynamic, T2, dynamic>) {
return new _FusedChunkedConverter<S, T, dynamic, S2, T2, dynamic>(
this, other);
}
return super.fuse(other);
}
dynamic bind(dynamic other) => super.bind(other);
dynamic startChunkedConversion(dynamic sink) =>
super.startChunkedConversion(sink);
}
/**
@ -65,13 +24,13 @@ abstract class ChunkedConverter<S, T, S2, T2> extends Converter<S, T> {
* work with a plain `Sink`, but may work more efficiently with certain
* specialized types of `ChunkedConversionSink`.
*
* It is recommended that implementations of `ChunkedConversionSink` extends
* It is recommended that implementations of `ChunkedConversionSink` extend
* this class, to inherit any further methods that may be added to the class.
*/
abstract class ChunkedConversionSink<T> implements Sink<T> {
ChunkedConversionSink();
factory ChunkedConversionSink.withCallback(
void callback(List<T> accumulated)) = _SimpleCallbackSink;
void callback(List<T> accumulated)) = _SimpleCallbackSink<T>;
/**
* Adds chunked data to this sink.
@ -122,10 +81,10 @@ class _ConverterStreamEventSink<S, T> implements EventSink<S> {
* The input sink for new data. All data that is received with
* [handleData] is added into this sink.
*/
final ChunkedConversionSink<S> _chunkedSink;
final Sink<S> _chunkedSink;
_ConverterStreamEventSink(
Converter/*=ChunkedConverter<dynamic, dynamic, S, T>*/ converter,
Converter/*=Converter<S, T>*/ converter,
EventSink<T> sink)
: this._eventSink = sink,
_chunkedSink = converter.startChunkedConversion(sink);
@ -136,20 +95,3 @@ class _ConverterStreamEventSink<S, T> implements EventSink<S> {
}
void close() { _chunkedSink.close(); }
}
/**
* Fuses two chunked converters.
*/
class _FusedChunkedConverter<S, M, T, S2, M2, T2> extends
ChunkedConverter<S, T, S2, T2> {
final ChunkedConverter<S, M, S2, M2> _first;
final ChunkedConverter<M, T, M2, T2> _second;
_FusedChunkedConverter(this._first, this._second);
T convert(S input) => _second.convert(_first.convert(input));
ChunkedConversionSink<S2> startChunkedConversion(Sink<T2> sink) {
return _first.startChunkedConversion(_second.startChunkedConversion(sink));
}
}

View file

@ -84,8 +84,8 @@ class _FusedCodec<S, M, T> extends Codec<S, T> {
final Codec<S, M> _first;
final Codec<M, T> _second;
Converter<S, T> get encoder => _first.encoder.fuse(_second.encoder);
Converter<T, S> get decoder => _second.decoder.fuse(_first.decoder);
Converter<S, T> get encoder => _first.encoder.fuse/*<T>*/(_second.encoder);
Converter<T, S> get decoder => _second.decoder.fuse/*<S>*/(_first.decoder);
_FusedCodec(this._first, this._second);
}

View file

@ -10,7 +10,7 @@ part of dart.convert;
* It is recommended that implementations of `Converter` extend this class,
* to inherit any further methods that may be added to the class.
*/
abstract class Converter<S, T> implements StreamTransformer {
abstract class Converter<S, T> implements StreamTransformer/*<S, T>*/ {
const Converter();
/**
@ -24,29 +24,24 @@ abstract class Converter<S, T> implements StreamTransformer {
* Encoding with the resulting converter is equivalent to converting with
* `this` before converting with `other`.
*/
Converter<S, dynamic> fuse(Converter<T, dynamic> other) {
return new _FusedConverter<S, T, dynamic>(this, other);
Converter<S, dynamic/*=TT*/> fuse/*<TT>*/(
Converter<T, dynamic/*=TT*/> other) {
return new _FusedConverter<S, T, dynamic/*=TT*/>(this, other);
}
/**
* Deprecated.
* Starts a chunked conversion.
*
* Use the [ChunkedConverter] interface instead.
* The returned sink serves as input for the long-running conversion. The
* given [sink] serves as output.
*/
@deprecated
ChunkedConversionSink startChunkedConversion(Sink sink) {
Sink/*<S>*/ startChunkedConversion(Sink/*<T>*/ sink) {
throw new UnsupportedError(
"This converter does not support chunked conversions: $this");
}
/**
* Deprecated.
*
* Use the [ChunkedConverter] interface instead.
*/
@deprecated
Stream bind(Stream stream) {
return new Stream.eventTransformed(
Stream/*<T>*/ bind(Stream/*<S>*/ stream) {
return new Stream/*<T>*/.eventTransformed(
stream,
(EventSink sink) => new _ConverterStreamEventSink(this, sink));
}
@ -64,4 +59,8 @@ class _FusedConverter<S, M, T> extends Converter<S, T> {
_FusedConverter(this._first, this._second);
T convert(S input) => _second.convert(_first.convert(input));
Sink/*<S>*/ startChunkedConversion(Sink/*<T>*/ sink) {
return _first.startChunkedConversion(_second.startChunkedConversion(sink));
}
}

View file

@ -10,8 +10,8 @@ part of dart.convert;
abstract class Encoding extends Codec<String, List<int>> {
const Encoding();
ChunkedConverter<String, List<int>, String, List<int>> get encoder;
ChunkedConverter<List<int>, String, List<int>, String> get decoder;
Converter<String, List<int>> get encoder;
Converter<List<int>, String> get decoder;
Future<String> decodeStream(Stream<List<int>> byteStream) {
return byteStream

View file

@ -152,7 +152,7 @@ class HtmlEscapeMode {
* found to be easier to read if greater-than is also escaped whenever
* less-than is.
*/
class HtmlEscape extends ChunkedConverter<String, String, String, String> {
class HtmlEscape extends Converter<String, String> {
/** The [HtmlEscapeMode] used by the converter. */
final HtmlEscapeMode mode;

View file

@ -139,7 +139,7 @@ class JsonCodec extends Codec<Object, String> {
* If [toEncodable] is omitted, it defaults to a function that returns the
* result of calling `.toJson()` on the unencodable object.
*/
String encode(Object value, {toEncodable(var object)}) {
String encode(Object value, {toEncodable(object)}) {
if (toEncodable == null) toEncodable = _toEncodable;
if (toEncodable == null) return encoder.convert(value);
return new JsonEncoder(toEncodable).convert(value);
@ -159,7 +159,7 @@ class JsonCodec extends Codec<Object, String> {
/**
* This class converts JSON objects to strings.
*/
class JsonEncoder extends ChunkedConverter<Object, String, Object, String> {
class JsonEncoder extends Converter<Object, String> {
/**
* The string used for indention.
*
@ -174,7 +174,7 @@ class JsonEncoder extends ChunkedConverter<Object, String, Object, String> {
* Function called on non-encodable objects to return a replacement
* encodable object that will be encoded in the orignal's place.
*/
final Function _toEncodable;
final _ToEncodable _toEncodable;
/**
* Creates a JSON encoder.
@ -188,7 +188,7 @@ class JsonEncoder extends ChunkedConverter<Object, String, Object, String> {
* If [toEncodable] is omitted, it defaults to calling `.toJson()` on
* the object.
*/
const JsonEncoder([Object toEncodable(Object nonSerializable)])
const JsonEncoder([toEncodable(nonSerializable)])
: this.indent = null,
this._toEncodable = toEncodable;
@ -210,8 +210,7 @@ class JsonEncoder extends ChunkedConverter<Object, String, Object, String> {
* If [toEncodable] is omitted, it defaults to calling `.toJson()` on
* the object.
*/
const JsonEncoder.withIndent(this.indent,
[Object toEncodable(Object nonSerializable)])
const JsonEncoder.withIndent(this.indent, [toEncodable(nonSerializable)])
: this._toEncodable = toEncodable;
/**
@ -268,11 +267,13 @@ class JsonEncoder extends ChunkedConverter<Object, String, Object, String> {
// Override the base class's bind, to provide a better type.
Stream<String> bind(Stream<Object> stream) => super.bind(stream);
Converter<Object, dynamic> fuse(Converter<String, dynamic> other) {
Converter<Object, dynamic/*=T*/> fuse/*<T>*/(
Converter<String, dynamic/*=T*/> other) {
if (other is Utf8Encoder) {
return new JsonUtf8Encoder(indent, _toEncodable);
return new JsonUtf8Encoder(indent, _toEncodable)
as dynamic/*=Converter<Object, T>*/;
}
return super.fuse(other);
return super.fuse/*<T>*/(other);
}
}
@ -283,14 +284,13 @@ class JsonEncoder extends ChunkedConverter<Object, String, Object, String> {
* a JSON string, and then UTF-8 encoding the string, but without
* creating an intermediate string.
*/
class JsonUtf8Encoder extends
ChunkedConverter<Object, List<int>, Object, List<int>> {
class JsonUtf8Encoder extends Converter<Object, List<int>> {
/** Default buffer size used by the JSON-to-UTF-8 encoder. */
static const int DEFAULT_BUFFER_SIZE = 256;
/** Indentation used in pretty-print mode, `null` if not pretty. */
final List<int> _indent;
/** Function called with each un-encodable object encountered. */
final Function _toEncodable;
final _ToEncodable _toEncodable;
/** UTF-8 buffer size. */
final int _bufferSize;
@ -320,7 +320,7 @@ class JsonUtf8Encoder extends
* object.
*/
JsonUtf8Encoder([String indent,
toEncodable(Object object),
toEncodable(object),
int bufferSize = DEFAULT_BUFFER_SIZE])
: _indent = _utf8Encode(indent),
_toEncodable = toEncodable,
@ -395,10 +395,6 @@ class JsonUtf8Encoder extends
Stream<List<int>> bind(Stream<Object> stream) {
return super.bind(stream);
}
Converter<Object, dynamic> fuse(Converter<List<int>, dynamic> other) {
return super.fuse(other);
}
}
/**
@ -408,7 +404,7 @@ class JsonUtf8Encoder extends
*/
class _JsonEncoderSink extends ChunkedConversionSink<Object> {
final String _indent;
final Function _toEncodable;
final _ToEncodable _toEncodable;
final StringConversionSink _sink;
bool _isDone = false;
@ -441,7 +437,7 @@ class _JsonUtf8EncoderSink extends ChunkedConversionSink<Object> {
/** The byte sink receiveing the encoded chunks. */
final ByteConversionSink _sink;
final List<int> _indent;
final Function _toEncodable;
final _ToEncodable _toEncodable;
final int _bufferSize;
bool _isDone = false;
_JsonUtf8EncoderSink(this._sink, this._toEncodable, this._indent,
@ -474,7 +470,7 @@ class _JsonUtf8EncoderSink extends ChunkedConversionSink<Object> {
/**
* This class parses JSON strings and builds the corresponding objects.
*/
class JsonDecoder extends ChunkedConverter<String, Object, String, Object> {
class JsonDecoder extends Converter<String, Object> {
final _Reviver _reviver;
/**
* Constructs a new JsonDecoder.
@ -517,7 +513,7 @@ external _parseJson(String source, reviver(key, value));
// Implementation of encoder/stringifier.
Object _defaultToEncodable(object) => object.toJson();
dynamic _defaultToEncodable(dynamic object) => object.toJson();
/**
* JSON encoder that traverses an object structure and writes JSON source.
@ -545,11 +541,10 @@ abstract class _JsonStringifier {
/** List of objects currently being traversed. Used to detect cycles. */
final List _seen = new List();
/** Function called for each un-encodable object encountered. */
final Function _toEncodable;
final _ToEncodable _toEncodable;
_JsonStringifier(Object _toEncodable(Object o))
: _toEncodable = (_toEncodable != null) ? _toEncodable
: _defaultToEncodable;
_JsonStringifier(toEncodable(o))
: _toEncodable = toEncodable ?? _defaultToEncodable;
/** Append a string to the JSON output. */
void writeString(String characters);
@ -719,7 +714,7 @@ abstract class _JsonStringifier {
}
/** Serialize a [Map]. */
bool writeMap(Map<String, Object> map) {
bool writeMap(Map map) {
if (map.isEmpty) {
writeString("{}");
return true;
@ -761,7 +756,7 @@ abstract class _JsonPrettyPrintMixin implements _JsonStringifier {
/**
* Add [indentLevel] indentations to the JSON output.
*/
void writeIndentation(indentLevel);
void writeIndentation(int indentLevel);
void writeList(List list) {
if (list.isEmpty) {
@ -838,7 +833,7 @@ class _JsonStringStringifier extends _JsonStringifier {
* for each indentation level. It should only contain valid JSON whitespace
* characters (space, tab, carriage return or line feed).
*/
static String stringify(object, toEncodable(object), String indent) {
static String stringify(object, toEncodable(o), String indent) {
StringBuffer output = new StringBuffer();
printOn(object, output, toEncodable, indent);
return output.toString();
@ -849,8 +844,8 @@ class _JsonStringStringifier extends _JsonStringifier {
*
* The result is written piecemally to the sink.
*/
static void printOn(object, StringSink output, toEncodable(object),
String indent) {
static void printOn(
object, StringSink output, toEncodable(o), String indent) {
var stringifier;
if (indent == null) {
stringifier = new _JsonStringStringifier(output, toEncodable);
@ -879,8 +874,7 @@ class _JsonStringStringifierPretty extends _JsonStringStringifier
with _JsonPrettyPrintMixin {
final String _indent;
_JsonStringStringifierPretty(StringSink sink, Function toEncodable,
this._indent)
_JsonStringStringifierPretty(StringSink sink, toEncodable(o), this._indent)
: super(sink, toEncodable);
void writeIndentation(int count) {
@ -888,6 +882,8 @@ class _JsonStringStringifierPretty extends _JsonStringStringifier
}
}
typedef void _AddChunk(Uint8List list, int start, int end);
/**
* Specialization of [_JsonStringifier] that writes the JSON as UTF-8.
*
@ -896,11 +892,11 @@ class _JsonStringStringifierPretty extends _JsonStringStringifier
*/
class _JsonUtf8Stringifier extends _JsonStringifier {
final int bufferSize;
final Function addChunk;
final _AddChunk addChunk;
Uint8List buffer;
int index = 0;
_JsonUtf8Stringifier(toEncodable, int bufferSize, this.addChunk)
_JsonUtf8Stringifier(toEncodable(o), int bufferSize, this.addChunk)
: this.bufferSize = bufferSize,
buffer = new Uint8List(bufferSize),
super(toEncodable);
@ -918,16 +914,15 @@ class _JsonUtf8Stringifier extends _JsonStringifier {
*/
static void stringify(Object object,
List<int> indent,
toEncodableFunction(Object o),
toEncodable(o),
int bufferSize,
void addChunk(Uint8List chunk, int start, int end)) {
_JsonUtf8Stringifier stringifier;
if (indent != null) {
stringifier = new _JsonUtf8StringifierPretty(toEncodableFunction, indent,
stringifier = new _JsonUtf8StringifierPretty(toEncodable, indent,
bufferSize, addChunk);
} else {
stringifier = new _JsonUtf8Stringifier(toEncodableFunction,
bufferSize, addChunk);
stringifier = new _JsonUtf8Stringifier(toEncodable, bufferSize, addChunk);
}
stringifier.writeObject(object);
stringifier.flush();
@ -1037,9 +1032,10 @@ class _JsonUtf8Stringifier extends _JsonStringifier {
class _JsonUtf8StringifierPretty extends _JsonUtf8Stringifier
with _JsonPrettyPrintMixin {
final List<int> indent;
_JsonUtf8StringifierPretty(toEncodableFunction, this.indent,
bufferSize, addChunk)
: super(toEncodableFunction, bufferSize, addChunk);
_JsonUtf8StringifierPretty(
toEncodable(o), this.indent,
bufferSize, void addChunk(Uint8List buffer, int start, int end))
: super(toEncodable, bufferSize, addChunk);
void writeIndentation(int count) {
List<int> indent = this.indent;

View file

@ -17,8 +17,9 @@ const int _CR = 13;
*
* The returned lines do not contain the line terminators.
*/
class LineSplitter extends
ChunkedConverter<String, List<String>, String, String> {
class LineSplitter
extends Converter<String, List<String>>/*=Object*/
implements Object/*=StreamTransformer<String, String>*/ {
const LineSplitter();
@ -80,6 +81,12 @@ class LineSplitter extends
}
return new _LineSplitterSink(sink);
}
Stream/*<String>*/ bind(Stream/*<String>*/ stream) {
return new Stream<String>.eventTransformed(
stream,
(EventSink<String> sink) => new _LineSplitterEventSink(sink));
}
}
// TODO(floitsch): deal with utf8.
@ -157,3 +164,16 @@ class _LineSplitterSink extends StringConversionSinkBase {
}
}
}
class _LineSplitterEventSink extends _LineSplitterSink
implements EventSink<String> {
final EventSink<String> _eventSink;
_LineSplitterEventSink(EventSink<String> eventSink)
: _eventSink = eventSink,
super(new StringConversionSink.from(eventSink));
void addError(Object o, [StackTrace stackTrace]) {
_eventSink.addError(o, stackTrace);
}
}

View file

@ -17,8 +17,7 @@ part of dart.convert;
* [StringConversionSinkMixin], to ensure that their class covers the newly
* added methods.
*/
abstract class StringConversionSink
extends ChunkedConversionSink<String> {
abstract class StringConversionSink extends ChunkedConversionSink<String> {
StringConversionSink();
factory StringConversionSink.withCallback(void callback(String accumulated))
= _StringCallbackSink;

View file

@ -76,8 +76,7 @@ class Utf8Codec extends Encoding {
* This class converts strings to their UTF-8 code units (a list of
* unsigned 8-bit integers).
*/
class Utf8Encoder extends
ChunkedConverter<String, List<int>, String, List<int>> {
class Utf8Encoder extends Converter<String, List<int>> {
const Utf8Encoder();
@ -305,8 +304,7 @@ class _Utf8EncoderSink extends _Utf8Encoder with StringConversionSinkMixin {
* This class converts UTF-8 code units (lists of unsigned 8-bit integers)
* to a string.
*/
class Utf8Decoder extends
ChunkedConverter<List<int>, String, List<int>, String> {
class Utf8Decoder extends Converter<List<int>, String> {
final bool _allowMalformed;
/**
@ -369,7 +367,8 @@ class Utf8Decoder extends
// Override the base-classes bind, to provide a better type.
Stream<String> bind(Stream<List<int>> stream) => super.bind(stream);
external Converter<List<int>,dynamic> fuse(Converter<String, dynamic> next);
external Converter<List<int>, dynamic/*=T*/> fuse/*<T>*/(
Converter<String, dynamic/*=T*/> next);
external static String _convertIntercepted(
bool allowMalformed, List<int> codeUnits, int start, int end);

View file

@ -275,8 +275,7 @@ class GZipCodec extends Codec<List<int>, List<int>> {
* The [ZLibEncoder] encoder is used by [ZLibCodec] and [GZipCodec] to compress
* data.
*/
class ZLibEncoder extends
ChunkedConverter<List<int>, List<int>, List<int>, List<int>> {
class ZLibEncoder extends Converter<List<int>, List<int>> {
/**
* When true, `GZip` frames will be added to the compressed data.
*/
@ -379,8 +378,7 @@ class ZLibEncoder extends
/**
* The [ZLibDecoder] is used by [ZLibCodec] and [GZipCodec] to decompress data.
*/
class ZLibDecoder extends
ChunkedConverter<List<int>, List<int>, List<int>, List<int>> {
class ZLibDecoder extends Converter<List<int>, List<int>> {
/**
* Base two logarithm of the window size (the size of the history buffer). It
* should be in the range `8..15`. Larger values result in better compression

View file

@ -25,7 +25,7 @@ class SystemEncoding extends Encoding {
List<int> encode(String input) => encoder.convert(input);
String decode(List<int> encoded) => decoder.convert(encoded);
ChunkedConverter<String, List<int>, String, List<int>> get encoder {
Converter<String, List<int>> get encoder {
if (Platform.operatingSystem == "windows") {
return const _WindowsCodePageEncoder();
} else {
@ -33,7 +33,7 @@ class SystemEncoding extends Encoding {
}
}
ChunkedConverter<List<int>, String, List<int>, String> get decoder {
Converter<List<int>, String> get decoder {
if (Platform.operatingSystem == "windows") {
return const _WindowsCodePageDecoder();
} else {
@ -42,8 +42,7 @@ class SystemEncoding extends Encoding {
}
}
class _WindowsCodePageEncoder
extends ChunkedConverter<String, List<int>, String, List<int>> {
class _WindowsCodePageEncoder extends Converter<String, List<int>> {
const _WindowsCodePageEncoder();
@ -95,8 +94,7 @@ class _WindowsCodePageEncoderSink extends StringConversionSinkBase {
}
class _WindowsCodePageDecoder
extends ChunkedConverter<List<int>, String, List<int>, String> {
class _WindowsCodePageDecoder extends Converter<List<int>, String> {
const _WindowsCodePageDecoder();

View file

@ -54,8 +54,7 @@ class BoolAdapterSink extends MyChunkedBoolSink {
specialB(o) => add(o);
}
class IntBoolConverter1 extends
ChunkedConverter<List<int>, List<bool>, int, bool> {
class IntBoolConverter1 extends Converter<List<int>, List<bool>> {
List<bool> convert(List<int> input) => input.map((x) => x > 0).toList();
startChunkedConversion(sink) {
@ -64,8 +63,7 @@ class IntBoolConverter1 extends
}
}
class BoolIntConverter1 extends
ChunkedConverter<List<bool>, List<int>, bool, int> {
class BoolIntConverter1 extends Converter<List<bool>, List<int>> {
List<int> convert(List<bool> input) => input.map((x) => x ? 1 : 0).toList();
startChunkedConversion(sink) {
@ -106,7 +104,7 @@ class BoolIntConverter1Sink extends MyChunkedBoolSink {
close() => outSink.close();
}
class IdentityConverter extends ChunkedConverter {
class IdentityConverter extends Converter {
convert(x) => x;
startChunkedConversion(sink) {