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

Unified Diff: pkg/yaml/lib/src/composer.dart

Issue 302313007: Attach source range information to parsed YAML nodes. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 7 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: 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);
}

Powered by Google App Engine
This is Rietveld 408576698