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..4c19da14ab874c77a8ec741e29105117675713be 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)); |
} else if (scalar.tag.name == "?") { |
for (var fn in [parseNull, parseBool, parseInt, parseFloat]) { |
- var result = fn(scalar.content); |
+ var result = fn(scalar); |
if (result != null) return result; |
} |
- return setAnchor(scalar, parseString(scalar.content)); |
+ return setAnchor(scalar, parseString(scalar)); |
} |
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); |
+ case "bool": return parseBool(scalar); |
+ case "int": return parseInt(scalar); |
+ case "float": return parseFloat(scalar); |
+ case "str": return parseString(scalar); |
} |
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,40 @@ class Composer extends Visitor { |
} |
/// Parses a null scalar. |
- ScalarNode parseNull(String content) { |
- if (!new RegExp(r"^(null|Null|NULL|~|)$").hasMatch(content)) return null; |
- return new ScalarNode(Tag.yaml("null"), value: null); |
+ ScalarNode parseNull(ScalarNode scalar) { |
+ if (new RegExp(r"^(null|Null|NULL|~|)$").hasMatch(scalar.content)) { |
+ return new ScalarNode(Tag.yaml("null"), scalar.span, value: null); |
+ } else { |
+ return null; |
+ } |
} |
/// Parses a boolean scalar. |
- ScalarNode parseBool(String content) { |
+ ScalarNode parseBool(ScalarNode scalar) { |
var match = new RegExp(r"^(?:(true|True|TRUE)|(false|False|FALSE))$"). |
- firstMatch(content); |
+ firstMatch(scalar.content); |
if (match == null) return null; |
- return new ScalarNode(Tag.yaml("bool"), value: match.group(1) != null); |
+ return new ScalarNode(Tag.yaml("bool"), scalar.span, |
+ value: match.group(1) != null); |
} |
/// Parses an integer scalar. |
- ScalarNode parseInt(String content) { |
- var match = new RegExp(r"^[-+]?[0-9]+$").firstMatch(content); |
+ ScalarNode parseInt(ScalarNode scalar) { |
+ var match = new RegExp(r"^[-+]?[0-9]+$").firstMatch(scalar.content); |
if (match != null) { |
- return new ScalarNode(Tag.yaml("int"), |
+ return new ScalarNode(Tag.yaml("int"), scalar.span, |
value: int.parse(match.group(0))); |
} |
- match = new RegExp(r"^0o([0-7]+)$").firstMatch(content); |
+ match = new RegExp(r"^0o([0-7]+)$").firstMatch(scalar.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"), scalar.span, value: n); |
} |
- match = new RegExp(r"^0x[0-9a-fA-F]+$").firstMatch(content); |
+ match = new RegExp(r"^0x[0-9a-fA-F]+$").firstMatch(scalar.content); |
if (match != null) { |
- return new ScalarNode(Tag.yaml("int"), |
+ return new ScalarNode(Tag.yaml("int"), scalar.span, |
value: int.parse(match.group(0))); |
} |
@@ -142,33 +150,33 @@ class Composer extends Visitor { |
} |
/// Parses a floating-point scalar. |
- ScalarNode parseFloat(String content) { |
+ ScalarNode parseFloat(ScalarNode scalar) { |
var match = new RegExp( |
- r"^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$"). |
- firstMatch(content); |
+ r"^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$"). |
+ firstMatch(scalar.content); |
if (match != null) { |
// 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"), scalar.span, |
value: double.parse(matchStr)); |
} |
- match = new RegExp(r"^([+-]?)\.(inf|Inf|INF)$").firstMatch(content); |
+ match = new RegExp(r"^([+-]?)\.(inf|Inf|INF)$").firstMatch(scalar.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"), scalar.span, value: value); |
} |
- match = new RegExp(r"^\.(nan|NaN|NAN)$").firstMatch(content); |
+ match = new RegExp(r"^\.(nan|NaN|NAN)$").firstMatch(scalar.content); |
if (match != null) { |
- return new ScalarNode(Tag.yaml("float"), value: double.NAN); |
+ return new ScalarNode(Tag.yaml("float"), scalar.span, value: double.NAN); |
} |
return null; |
} |
/// Parses a string scalar. |
- ScalarNode parseString(String content) => |
- new ScalarNode(Tag.yaml("str"), value: content); |
+ ScalarNode parseString(ScalarNode scalar) => |
+ new ScalarNode(Tag.yaml("str"), scalar.span, value: scalar.content); |
} |