Index: pkg/analysis_server/lib/src/protocol.dart |
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart |
index f633eb8d7460738887d4b29067ea0e32c59a9ce4..aec8d718031308651d40461e4b09bdd8fd97c832 100644 |
--- a/pkg/analysis_server/lib/src/protocol.dart |
+++ b/pkg/analysis_server/lib/src/protocol.dart |
@@ -281,7 +281,7 @@ abstract class JsonDecoder { |
* Create an exception to throw if the JSON object at [jsonPath] fails to |
* match the API definition of [expected]. |
*/ |
- dynamic mismatch(String jsonPath, String expected); |
+ dynamic mismatch(String jsonPath, String expected, [Object actual]); |
/** |
* Create an exception to throw if the JSON object at [jsonPath] is missing |
@@ -301,7 +301,7 @@ abstract class JsonDecoder { |
} else if (json == 'false') { |
return false; |
} |
- throw mismatch(jsonPath, 'bool'); |
+ throw mismatch(jsonPath, 'bool', json); |
} |
/** |
@@ -313,10 +313,10 @@ abstract class JsonDecoder { |
return json; |
} else if (json is String) { |
return int.parse(json, onError: (String value) { |
- throw mismatch(jsonPath, 'int'); |
+ throw mismatch(jsonPath, 'int', json); |
}); |
} |
- throw mismatch(jsonPath, 'int'); |
+ throw mismatch(jsonPath, 'int', json); |
} |
/** |
@@ -334,7 +334,7 @@ abstract class JsonDecoder { |
} |
return result; |
} else { |
- throw mismatch(jsonPath, 'List'); |
+ throw mismatch(jsonPath, 'List', json); |
} |
} |
@@ -362,7 +362,7 @@ abstract class JsonDecoder { |
}); |
return result; |
} else { |
- throw mismatch(jsonPath, 'Map'); |
+ throw mismatch(jsonPath, 'Map', json); |
} |
} |
@@ -373,7 +373,7 @@ abstract class JsonDecoder { |
if (json is String) { |
return json; |
} else { |
- throw mismatch(jsonPath, 'String'); |
+ throw mismatch(jsonPath, 'String', json); |
} |
} |
@@ -392,11 +392,11 @@ abstract class JsonDecoder { |
var disambiguatorPath = '$jsonPath[${JSON.encode(field)}]'; |
String disambiguator = _decodeString(disambiguatorPath, json[field]); |
if (!decoders.containsKey(disambiguator)) { |
- throw mismatch(disambiguatorPath, 'One of: ${decoders.keys.toList()}'); |
+ throw mismatch(disambiguatorPath, 'One of: ${decoders.keys.toList()}', json); |
} |
return decoders[disambiguator](jsonPath, json); |
} else { |
- throw mismatch(jsonPath, 'Map'); |
+ throw mismatch(jsonPath, 'Map', json); |
} |
} |
} |
@@ -616,9 +616,17 @@ class RequestDecoder extends JsonDecoder { |
} |
@override |
- dynamic mismatch(String jsonPath, String expected) { |
+ dynamic mismatch(String jsonPath, String expected, [Object actual]) { |
+ StringBuffer buffer = new StringBuffer(); |
+ buffer.write('Expected to be '); |
+ buffer.write(expected); |
+ if (actual != null) { |
+ buffer.write('; found "'); |
+ buffer.write(JSON.encode(actual)); |
+ buffer.write('"'); |
+ } |
return new RequestFailure(new Response.invalidParameter( |
- _request, jsonPath, 'Expected to be $expected')); |
+ _request, jsonPath, buffer.toString())); |
} |
@override |
@@ -915,8 +923,18 @@ class ResponseDecoder extends JsonDecoder { |
ResponseDecoder(this.refactoringKind); |
@override |
- dynamic mismatch(String jsonPath, String expected) { |
- return new Exception('Expected $expected at $jsonPath'); |
+ dynamic mismatch(String jsonPath, String expected, [Object actual]) { |
+ StringBuffer buffer = new StringBuffer(); |
+ buffer.write('Expected '); |
+ buffer.write(expected); |
+ if (actual != null) { |
+ buffer.write(' found "'); |
+ buffer.write(JSON.encode(actual)); |
+ buffer.write('"'); |
+ } |
+ buffer.write(' at '); |
+ buffer.write(jsonPath); |
+ return new Exception(buffer.toString()); |
} |
@override |