Chromium Code Reviews| Index: pkg/yaml/lib/src/composer.dart |
| diff --git a/pkg/yaml/lib/src/composer.dart b/pkg/yaml/lib/src/composer.dart |
| index 317809653d4bfe54935e39a23d008be0d2623ded..507b713560728c1c0d85ed075dc43295b9b781db 100644 |
| --- a/pkg/yaml/lib/src/composer.dart |
| +++ b/pkg/yaml/lib/src/composer.dart |
| @@ -4,6 +4,8 @@ |
| library yaml.composer; |
| +import 'package:source_maps/source_maps.dart'; |
| + |
| import 'model.dart'; |
| import 'visitor.dart'; |
| import 'yaml_exception.dart'; |
| @@ -45,13 +47,13 @@ class Composer extends Visitor { |
| /// Currently this only supports the YAML core type schema. |
| Node visitScalar(ScalarNode scalar) { |
| if (scalar.tag.name == "!") { |
| - return setAnchor(scalar, parseString(scalar.content)); |
| + return setAnchor(scalar, parseString(scalar.content, scalar.span)); |
|
Bob Nystrom
2014/06/03 00:33:14
Would it make more sense to just pass the whole Sc
nweiz
2014/06/03 02:03:21
Done.
|
| } else if (scalar.tag.name == "?") { |
| for (var fn in [parseNull, parseBool, parseInt, parseFloat]) { |
| - var result = fn(scalar.content); |
| + var result = fn(scalar.content, scalar.span); |
| if (result != null) return result; |
| } |
| - return setAnchor(scalar, parseString(scalar.content)); |
| + return setAnchor(scalar, parseString(scalar.content, scalar.span)); |
| } |
| var result = _parseByTag(scalar); |
| @@ -62,11 +64,11 @@ class Composer extends Visitor { |
| ScalarNode _parseByTag(ScalarNode scalar) { |
| switch (scalar.tag.name) { |
| - case "null": return parseNull(scalar.content); |
| - case "bool": return parseBool(scalar.content); |
| - case "int": return parseInt(scalar.content); |
| - case "float": return parseFloat(scalar.content); |
| - case "str": return parseString(scalar.content); |
| + case "null": return parseNull(scalar.content, scalar.span); |
| + case "bool": return parseBool(scalar.content, scalar.span); |
| + case "int": return parseInt(scalar.content, scalar.span); |
| + case "float": return parseFloat(scalar.content, scalar.span); |
| + case "str": return parseString(scalar.content, scalar.span); |
| } |
| throw new YamlException('Undefined tag: ${scalar.tag}.'); |
| } |
| @@ -78,7 +80,8 @@ class Composer extends Visitor { |
| throw new YamlException("Invalid tag for sequence: ${seq.tag}."); |
| } |
| - var result = setAnchor(seq, new SequenceNode(Tag.yaml('seq'), null)); |
| + var result = setAnchor(seq, |
| + new SequenceNode(Tag.yaml('seq'), null, seq.span)); |
| result.content = super.visitSequence(seq); |
| return result; |
| } |
| @@ -90,7 +93,8 @@ class Composer extends Visitor { |
| throw new YamlException("Invalid tag for mapping: ${map.tag}."); |
| } |
| - var result = setAnchor(map, new MappingNode(Tag.yaml('map'), null)); |
| + var result = setAnchor(map, |
| + new MappingNode(Tag.yaml('map'), null, map.span)); |
| result.content = super.visitMapping(map); |
| return result; |
| } |
| @@ -105,36 +109,37 @@ class Composer extends Visitor { |
| } |
| /// Parses a null scalar. |
| - ScalarNode parseNull(String content) { |
| + ScalarNode parseNull(String content, Span span) { |
| if (!new RegExp(r"^(null|Null|NULL|~|)$").hasMatch(content)) return null; |
| - return new ScalarNode(Tag.yaml("null"), value: null); |
| + return new ScalarNode(Tag.yaml("null"), span, value: null); |
| } |
| /// Parses a boolean scalar. |
| - ScalarNode parseBool(String content) { |
| + ScalarNode parseBool(String content, Span span) { |
| var match = new RegExp(r"^(?:(true|True|TRUE)|(false|False|FALSE))$"). |
| firstMatch(content); |
| if (match == null) return null; |
| - return new ScalarNode(Tag.yaml("bool"), value: match.group(1) != null); |
| + return new ScalarNode(Tag.yaml("bool"), span, |
| + value: match.group(1) != null); |
| } |
| /// Parses an integer scalar. |
| - ScalarNode parseInt(String content) { |
| + ScalarNode parseInt(String content, Span span) { |
| var match = new RegExp(r"^[-+]?[0-9]+$").firstMatch(content); |
| if (match != null) { |
| - return new ScalarNode(Tag.yaml("int"), |
| + return new ScalarNode(Tag.yaml("int"), span, |
| value: int.parse(match.group(0))); |
| } |
| match = new RegExp(r"^0o([0-7]+)$").firstMatch(content); |
| if (match != null) { |
| int n = int.parse(match.group(1), radix: 8); |
| - return new ScalarNode(Tag.yaml("int"), value: n); |
| + return new ScalarNode(Tag.yaml("int"), span, value: n); |
| } |
| match = new RegExp(r"^0x[0-9a-fA-F]+$").firstMatch(content); |
| if (match != null) { |
| - return new ScalarNode(Tag.yaml("int"), |
| + return new ScalarNode(Tag.yaml("int"), span, |
| value: int.parse(match.group(0))); |
| } |
| @@ -142,7 +147,7 @@ class Composer extends Visitor { |
| } |
| /// Parses a floating-point scalar. |
| - ScalarNode parseFloat(String content) { |
| + ScalarNode parseFloat(String content, Span span) { |
| var match = new RegExp( |
| r"^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$"). |
| firstMatch(content); |
| @@ -150,25 +155,25 @@ class Composer extends Visitor { |
| // YAML allows floats of the form "0.", but Dart does not. Fix up those |
| // floats by removing the trailing dot. |
| var matchStr = match.group(0).replaceAll(new RegExp(r"\.$"), ""); |
| - return new ScalarNode(Tag.yaml("float"), |
| + return new ScalarNode(Tag.yaml("float"), span, |
| value: double.parse(matchStr)); |
| } |
| match = new RegExp(r"^([+-]?)\.(inf|Inf|INF)$").firstMatch(content); |
| if (match != null) { |
| var value = match.group(1) == "-" ? -double.INFINITY : double.INFINITY; |
| - return new ScalarNode(Tag.yaml("float"), value: value); |
| + return new ScalarNode(Tag.yaml("float"), span, value: value); |
| } |
| match = new RegExp(r"^\.(nan|NaN|NAN)$").firstMatch(content); |
| if (match != null) { |
| - return new ScalarNode(Tag.yaml("float"), value: double.NAN); |
| + return new ScalarNode(Tag.yaml("float"), span, value: double.NAN); |
| } |
| return null; |
| } |
| /// Parses a string scalar. |
| - ScalarNode parseString(String content) => |
| - new ScalarNode(Tag.yaml("str"), value: content); |
| + ScalarNode parseString(String content, Span span) => |
| + new ScalarNode(Tag.yaml("str"), span, value: content); |
| } |