Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(855)

Unified Diff: sdk/lib/_internal/pub/lib/src/lock_file.dart

Issue 391363004: Include file path in JSON error when possible. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/pub/lib/src/lock_file.dart
diff --git a/sdk/lib/_internal/pub/lib/src/lock_file.dart b/sdk/lib/_internal/pub/lib/src/lock_file.dart
index 95421a604fc372af3f170a0fc6c2f9142b51db7f..e659657e10605aaf90a2914ff7da8525b49cb092 100644
--- a/sdk/lib/_internal/pub/lib/src/lock_file.dart
+++ b/sdk/lib/_internal/pub/lib/src/lock_file.dart
@@ -4,6 +4,7 @@
library pub.lock_file;
+import 'package:source_maps/source_maps.dart';
import 'package:yaml/yaml.dart';
import 'io.dart';
@@ -48,26 +49,25 @@ class LockFile {
var packages = <String, PackageId>{};
if (contents.trim() == '') return new LockFile.empty();
- var parsed = loadYaml(contents);
+ var parsed = loadYamlNode(contents, sourceName: filePath);
+
+ _validate(parsed is Map, 'The lockfile must be a YAML mapping.', parsed);
var packageEntries = parsed['packages'];
if (packageEntries != null) {
nweiz 2014/07/16 18:01:42 Validate that `packageEntries` is a map.
Bob Nystrom 2014/07/16 18:34:44 Done.
packageEntries.forEach((name, spec) {
// Parse the version.
- if (!spec.containsKey('version')) {
- throw new FormatException('Package $name is missing a version.');
- }
+ _validate(spec.containsKey('version'),
+ 'Package $name is missing a version.', spec);
nweiz 2014/07/16 18:01:42 These errors originally included the package name
Bob Nystrom 2014/07/16 18:34:44 I kind of like leaving in there because it reads w
nweiz 2014/07/17 07:11:19 The span will include the package name. I feel lik
Bob Nystrom 2014/07/17 22:19:19 Acknowledged.
var version = new Version.parse(spec['version']);
// Parse the source.
- if (!spec.containsKey('source')) {
- throw new FormatException('Package $name is missing a source.');
- }
+ _validate(spec.containsKey('source'),
+ 'Package $name is missing a source.', spec);
var sourceName = spec['source'];
- if (!spec.containsKey('description')) {
- throw new FormatException('Package $name is missing a description.');
- }
+ _validate(spec.containsKey('description'),
+ 'Package $name is missing a description.', spec);
var description = spec['description'];
// Let the source parse the description.
@@ -78,10 +78,8 @@ class LockFile {
var id = new PackageId(name, sourceName, version, description);
// Validate the name.
- if (name != id.name) {
- throw new FormatException(
- "Package name $name doesn't match ${id.name}.");
- }
+ _validate(name == id.name,
+ "Package name $name doesn't match ${id.name}.", parsed);
nweiz 2014/07/16 18:01:42 `parsed` is the entire lockfile; that's not the sp
Bob Nystrom 2014/07/16 18:34:45 Done.
packages[name] = id;
});
@@ -90,6 +88,12 @@ class LockFile {
return new LockFile._(packages);
}
+ /// If [condition] is `false` throws a format error with [message] for [node].
+ static void _validate(bool condition, String message, YamlNode node) {
+ if (condition) return;
+ throw new SpanFormatException(message, node.span);
+ }
+
/// Returns the serialized YAML text of the lock file.
///
/// [packageDir] is the containing directory of the root package, used to

Powered by Google App Engine
This is Rietveld 408576698