Index: sdk/lib/convert/json.dart |
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart |
index e80a9868fab20b1c881dc54f198c90467ac8c569..24931df19496e9b18f0a7f6aa101a553b1ddebb0 100644 |
--- a/sdk/lib/convert/json.dart |
+++ b/sdk/lib/convert/json.dart |
@@ -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; |