Index: pkg/yaml/lib/src/parser.dart |
diff --git a/pkg/yaml/lib/src/parser.dart b/pkg/yaml/lib/src/parser.dart |
index d203c32e2df90b9af6aae498ed1fe20db630e686..98658e6a3058eb8a45c34ee955de00ab0676a941 100644 |
--- a/pkg/yaml/lib/src/parser.dart |
+++ b/pkg/yaml/lib/src/parser.dart |
@@ -6,11 +6,13 @@ library yaml.parser; |
import 'dart:collection'; |
+import 'package:source_maps/source_maps.dart'; |
import 'package:string_scanner/string_scanner.dart'; |
+import 'equality.dart'; |
import 'model.dart'; |
+import 'utils.dart'; |
import 'yaml_exception.dart'; |
-import 'yaml_map.dart'; |
/// Translates a string of characters into a YAML serialization tree. |
/// |
@@ -317,7 +319,7 @@ class Parser { |
} |
/// Adds a tag and an anchor to [node], if they're defined. |
- Node addProps(Node node, _Pair<Tag, String> props) { |
+ Node addProps(Node node, Pair<Tag, String> props) { |
if (props == null || node == null) return node; |
if (truth(props.first)) node.tag = props.first; |
if (truth(props.last)) node.anchor = props.last; |
@@ -325,10 +327,10 @@ class Parser { |
} |
/// Creates a MappingNode from [pairs]. |
- MappingNode map(List<_Pair<Node, Node>> pairs) { |
+ MappingNode map(List<Pair<Node, Node>> pairs, Span span) { |
var content = new Map<Node, Node>(); |
pairs.forEach((pair) => content[pair.first] = pair.last); |
- return new MappingNode("?", content); |
+ return new MappingNode("?", content, span); |
} |
/// Runs [fn] in a context named [name]. Used for error reporting. |
@@ -759,7 +761,7 @@ class Parser { |
bool l_directive() => false; // TODO(nweiz): implement |
// 96 |
- _Pair<Tag, String> c_ns_properties(int indent, int ctx) { |
+ Pair<Tag, String> c_ns_properties(int indent, int ctx) { |
var tag, anchor; |
tag = c_ns_tagProperty(); |
if (truth(tag)) { |
@@ -767,7 +769,7 @@ class Parser { |
if (!truth(s_separate(indent, ctx))) return null; |
return c_ns_anchorProperty(); |
}); |
- return new _Pair<Tag, String>(tag, anchor); |
+ return new Pair<Tag, String>(tag, anchor); |
} |
anchor = c_ns_anchorProperty(); |
@@ -776,7 +778,7 @@ class Parser { |
if (!truth(s_separate(indent, ctx))) return null; |
return c_ns_tagProperty(); |
}); |
- return new _Pair<Tag, String>(tag, anchor); |
+ return new Pair<Tag, String>(tag, anchor); |
} |
return null; |
@@ -797,13 +799,14 @@ class Parser { |
// 104 |
Node c_ns_aliasNode() { |
+ var start = _scanner.state; |
if (!truth(c_indicator(C_ALIAS))) return null; |
var name = expect(ns_anchorName(), 'anchor name'); |
- return new AliasNode(name); |
+ return new AliasNode(name, _scanner.spanFrom(start)); |
} |
// 105 |
- ScalarNode e_scalar() => new ScalarNode("?", content: ""); |
+ ScalarNode e_scalar() => new ScalarNode("?", _scanner.emptySpan, content: ""); |
// 106 |
ScalarNode e_node() => e_scalar(); |
@@ -820,10 +823,11 @@ class Parser { |
// 109 |
Node c_doubleQuoted(int indent, int ctx) => context('string', () { |
return transaction(() { |
+ var start = _scanner.state; |
if (!truth(c_indicator(C_DOUBLE_QUOTE))) return null; |
var contents = nb_doubleText(indent, ctx); |
if (!truth(c_indicator(C_DOUBLE_QUOTE))) return null; |
- return new ScalarNode("!", content: contents); |
+ return new ScalarNode("!", _scanner.spanFrom(start), content: contents); |
}); |
}); |
@@ -908,10 +912,11 @@ class Parser { |
// 120 |
Node c_singleQuoted(int indent, int ctx) => context('string', () { |
return transaction(() { |
+ var start = _scanner.state; |
if (!truth(c_indicator(C_SINGLE_QUOTE))) return null; |
var contents = nb_singleText(indent, ctx); |
if (!truth(c_indicator(C_SINGLE_QUOTE))) return null; |
- return new ScalarNode("!", content: contents); |
+ return new ScalarNode("!", _scanner.spanFrom(start), content: contents); |
}); |
}); |
@@ -1075,11 +1080,13 @@ class Parser { |
// 137 |
SequenceNode c_flowSequence(int indent, int ctx) => transaction(() { |
+ var start = _scanner.state; |
if (!truth(c_indicator(C_SEQUENCE_START))) return null; |
zeroOrOne(() => s_separate(indent, ctx)); |
var content = zeroOrOne(() => ns_s_flowSeqEntries(indent, inFlow(ctx))); |
if (!truth(c_indicator(C_SEQUENCE_END))) return null; |
- return new SequenceNode("?", new List<Node>.from(content)); |
+ return new SequenceNode("?", new List<Node>.from(content), |
+ _scanner.spanFrom(start)); |
}); |
// 138 |
@@ -1108,17 +1115,18 @@ class Parser { |
// 140 |
Node c_flowMapping(int indent, int ctx) { |
+ var start = _scanner.state; |
if (!truth(c_indicator(C_MAPPING_START))) return null; |
zeroOrOne(() => s_separate(indent, ctx)); |
var content = zeroOrOne(() => ns_s_flowMapEntries(indent, inFlow(ctx))); |
if (!truth(c_indicator(C_MAPPING_END))) return null; |
- return new MappingNode("?", content); |
+ return new MappingNode("?", content, _scanner.spanFrom(start)); |
} |
// 141 |
- YamlMap ns_s_flowMapEntries(int indent, int ctx) { |
+ Map ns_s_flowMapEntries(int indent, int ctx) { |
var first = ns_flowMapEntry(indent, ctx); |
- if (!truth(first)) return new YamlMap(); |
+ if (!truth(first)) return deepEqualsMap(); |
zeroOrOne(() => s_separate(indent, ctx)); |
var rest; |
@@ -1127,7 +1135,7 @@ class Parser { |
rest = ns_s_flowMapEntries(indent, ctx); |
} |
- if (rest == null) rest = new YamlMap(); |
+ if (rest == null) rest = deepEqualsMap(); |
// TODO(nweiz): Duplicate keys should be an error. This includes keys with |
// different representations but the same value (e.g. 10 vs 0xa). To make |
@@ -1139,7 +1147,7 @@ class Parser { |
} |
// 142 |
- _Pair<Node, Node> ns_flowMapEntry(int indent, int ctx) => or([ |
+ Pair<Node, Node> ns_flowMapEntry(int indent, int ctx) => or([ |
() => transaction(() { |
if (!truth(c_indicator(C_MAPPING_KEY))) return false; |
if (!truth(s_separate(indent, ctx))) return false; |
@@ -1149,20 +1157,20 @@ class Parser { |
]); |
// 143 |
- _Pair<Node, Node> ns_flowMapExplicitEntry(int indent, int ctx) => or([ |
+ Pair<Node, Node> ns_flowMapExplicitEntry(int indent, int ctx) => or([ |
() => ns_flowMapImplicitEntry(indent, ctx), |
- () => new _Pair<Node, Node>(e_node(), e_node()) |
+ () => new Pair<Node, Node>(e_node(), e_node()) |
]); |
// 144 |
- _Pair<Node, Node> ns_flowMapImplicitEntry(int indent, int ctx) => or([ |
+ Pair<Node, Node> ns_flowMapImplicitEntry(int indent, int ctx) => or([ |
() => ns_flowMapYamlKeyEntry(indent, ctx), |
() => c_ns_flowMapEmptyKeyEntry(indent, ctx), |
() => c_ns_flowMapJsonKeyEntry(indent, ctx) |
]); |
// 145 |
- _Pair<Node, Node> ns_flowMapYamlKeyEntry(int indent, int ctx) { |
+ Pair<Node, Node> ns_flowMapYamlKeyEntry(int indent, int ctx) { |
var key = ns_flowYamlNode(indent, ctx); |
if (!truth(key)) return null; |
var value = or([ |
@@ -1172,14 +1180,14 @@ class Parser { |
}), |
e_node |
]); |
- return new _Pair<Node, Node>(key, value); |
+ return new Pair<Node, Node>(key, value); |
} |
// 146 |
- _Pair<Node, Node> c_ns_flowMapEmptyKeyEntry(int indent, int ctx) { |
+ Pair<Node, Node> c_ns_flowMapEmptyKeyEntry(int indent, int ctx) { |
var value = c_ns_flowMapSeparateValue(indent, ctx); |
if (!truth(value)) return null; |
- return new _Pair<Node, Node>(e_node(), value); |
+ return new Pair<Node, Node>(e_node(), value); |
} |
// 147 |
@@ -1197,7 +1205,7 @@ class Parser { |
}); |
// 148 |
- _Pair<Node, Node> c_ns_flowMapJsonKeyEntry(int indent, int ctx) { |
+ Pair<Node, Node> c_ns_flowMapJsonKeyEntry(int indent, int ctx) { |
var key = c_flowJsonNode(indent, ctx); |
if (!truth(key)) return null; |
var value = or([ |
@@ -1207,7 +1215,7 @@ class Parser { |
}), |
e_node |
]); |
- return new _Pair<Node, Node>(key, value); |
+ return new Pair<Node, Node>(key, value); |
} |
// 149 |
@@ -1224,6 +1232,7 @@ class Parser { |
// 150 |
Node ns_flowPair(int indent, int ctx) { |
+ var start = _scanner.state; |
var pair = or([ |
() => transaction(() { |
if (!truth(c_indicator(C_MAPPING_KEY))) return null; |
@@ -1234,34 +1243,34 @@ class Parser { |
]); |
if (!truth(pair)) return null; |
- return map([pair]); |
+ return map([pair], _scanner.spanFrom(start)); |
} |
// 151 |
- _Pair<Node, Node> ns_flowPairEntry(int indent, int ctx) => or([ |
+ Pair<Node, Node> ns_flowPairEntry(int indent, int ctx) => or([ |
() => ns_flowPairYamlKeyEntry(indent, ctx), |
() => c_ns_flowMapEmptyKeyEntry(indent, ctx), |
() => c_ns_flowPairJsonKeyEntry(indent, ctx) |
]); |
// 152 |
- _Pair<Node, Node> ns_flowPairYamlKeyEntry(int indent, int ctx) => |
+ Pair<Node, Node> ns_flowPairYamlKeyEntry(int indent, int ctx) => |
transaction(() { |
var key = ns_s_implicitYamlKey(FLOW_KEY); |
if (!truth(key)) return null; |
var value = c_ns_flowMapSeparateValue(indent, ctx); |
if (!truth(value)) return null; |
- return new _Pair<Node, Node>(key, value); |
+ return new Pair<Node, Node>(key, value); |
}); |
// 153 |
- _Pair<Node, Node> c_ns_flowPairJsonKeyEntry(int indent, int ctx) => |
+ Pair<Node, Node> c_ns_flowPairJsonKeyEntry(int indent, int ctx) => |
transaction(() { |
var key = c_s_implicitJsonKey(FLOW_KEY); |
if (!truth(key)) return null; |
var value = c_ns_flowMapAdjacentValue(indent, ctx); |
if (!truth(value)) return null; |
- return new _Pair<Node, Node>(key, value); |
+ return new Pair<Node, Node>(key, value); |
}); |
// 154 |
@@ -1288,9 +1297,10 @@ class Parser { |
// 156 |
Node ns_flowYamlContent(int indent, int ctx) { |
+ var start = _scanner.state; |
var str = ns_plain(indent, ctx); |
if (!truth(str)) return null; |
- return new ScalarNode("?", content: str); |
+ return new ScalarNode("?", _scanner.spanFrom(start), content: str); |
} |
// 157 |
@@ -1437,6 +1447,7 @@ class Parser { |
// 170 |
Node c_l_literal(int indent) => transaction(() { |
+ var start = _scanner.state; |
if (!truth(c_indicator(C_LITERAL))) return null; |
var header = c_b_blockHeader(); |
if (!truth(header)) return null; |
@@ -1445,7 +1456,7 @@ class Parser { |
var content = l_literalContent(indent + additionalIndent, header.chomping); |
if (!truth(content)) return null; |
- return new ScalarNode("!", content: content); |
+ return new ScalarNode("!", _scanner.spanFrom(start), content: content); |
}); |
// 171 |
@@ -1474,6 +1485,7 @@ class Parser { |
// 174 |
Node c_l_folded(int indent) => transaction(() { |
+ var start = _scanner.state; |
if (!truth(c_indicator(C_FOLDED))) return null; |
var header = c_b_blockHeader(); |
if (!truth(header)) return null; |
@@ -1482,7 +1494,7 @@ class Parser { |
var content = l_foldedContent(indent + additionalIndent, header.chomping); |
if (!truth(content)) return null; |
- return new ScalarNode("!", content: content); |
+ return new ScalarNode("!", _scanner.spanFrom(start), content: content); |
}); |
// 175 |
@@ -1562,13 +1574,14 @@ class Parser { |
var additionalIndent = countIndentation() - indent; |
if (additionalIndent <= 0) return null; |
+ var start = _scanner.state; |
var content = oneOrMore(() => transaction(() { |
if (!truth(s_indent(indent + additionalIndent))) return null; |
return c_l_blockSeqEntry(indent + additionalIndent); |
})); |
if (!truth(content)) return null; |
- return new SequenceNode("?", content); |
+ return new SequenceNode("?", content, _scanner.spanFrom(start)); |
}); |
// 184 |
@@ -1595,6 +1608,7 @@ class Parser { |
// 186 |
Node ns_l_compactSequence(int indent) => context('sequence', () { |
+ var start = _scanner.state; |
var first = c_l_blockSeqEntry(indent); |
if (!truth(first)) return null; |
@@ -1604,7 +1618,7 @@ class Parser { |
})); |
content.insert(0, first); |
- return new SequenceNode("?", content); |
+ return new SequenceNode("?", content, _scanner.spanFrom(start)); |
}); |
// 187 |
@@ -1612,23 +1626,24 @@ class Parser { |
var additionalIndent = countIndentation() - indent; |
if (additionalIndent <= 0) return null; |
+ var start = _scanner.state; |
var pairs = oneOrMore(() => transaction(() { |
if (!truth(s_indent(indent + additionalIndent))) return null; |
return ns_l_blockMapEntry(indent + additionalIndent); |
})); |
if (!truth(pairs)) return null; |
- return map(pairs); |
+ return map(pairs, _scanner.spanFrom(start)); |
}); |
// 188 |
- _Pair<Node, Node> ns_l_blockMapEntry(int indent) => or([ |
+ Pair<Node, Node> ns_l_blockMapEntry(int indent) => or([ |
() => c_l_blockMapExplicitEntry(indent), |
() => ns_l_blockMapImplicitEntry(indent) |
]); |
// 189 |
- _Pair<Node, Node> c_l_blockMapExplicitEntry(int indent) { |
+ Pair<Node, Node> c_l_blockMapExplicitEntry(int indent) { |
var key = c_l_blockMapExplicitKey(indent); |
if (!truth(key)) return null; |
@@ -1637,7 +1652,7 @@ class Parser { |
e_node |
]); |
- return new _Pair<Node, Node>(key, value); |
+ return new Pair<Node, Node>(key, value); |
} |
// 190 |
@@ -1654,10 +1669,10 @@ class Parser { |
}); |
// 192 |
- _Pair<Node, Node> ns_l_blockMapImplicitEntry(int indent) => transaction(() { |
+ Pair<Node, Node> ns_l_blockMapImplicitEntry(int indent) => transaction(() { |
var key = or([ns_s_blockMapImplicitKey, e_node]); |
var value = c_l_blockMapImplicitValue(indent); |
- return truth(value) ? new _Pair<Node, Node>(key, value) : null; |
+ return truth(value) ? new Pair<Node, Node>(key, value) : null; |
}); |
// 193 |
@@ -1678,6 +1693,7 @@ class Parser { |
// 195 |
Node ns_l_compactMapping(int indent) => context('mapping', () { |
+ var start = _scanner.state; |
var first = ns_l_blockMapEntry(indent); |
if (!truth(first)) return null; |
@@ -1687,7 +1703,7 @@ class Parser { |
})); |
pairs.insert(0, first); |
- return map(pairs); |
+ return map(pairs, _scanner.spanFrom(start)); |
}); |
// 196 |
@@ -1807,7 +1823,8 @@ class Parser { |
or([l_directiveDocument, l_explicitDocument, l_bareDocument]); |
// 211 |
- List<Node> l_yamlStream() { |
+ Pair<List<Node>, Span> l_yamlStream() { |
+ var start = _scanner.state; |
var docs = []; |
zeroOrMore(l_documentPrefix); |
var first = zeroOrOne(l_anyDocument); |
@@ -1828,20 +1845,10 @@ class Parser { |
}); |
if (!_scanner.isDone) parseFailed(); |
- return docs; |
+ return new Pair(docs, _scanner.spanFrom(start)); |
} |
} |
-/// A pair of values. |
-class _Pair<E, F> { |
- E first; |
- F last; |
- |
- _Pair(this.first, this.last); |
- |
- String toString() => '($first, $last)'; |
-} |
- |
/// The information in the header for a block scalar. |
class _BlockHeader { |
final int additionalIndent; |
@@ -1872,7 +1879,7 @@ class _Range { |
/// expensive. |
class _RangeMap<E> { |
/// The ranges and their associated elements. |
- final List<_Pair<_Range, E>> _contents = <_Pair<_Range, E>>[]; |
+ final List<Pair<_Range, E>> _contents = <Pair<_Range, E>>[]; |
_RangeMap(); |
@@ -1890,5 +1897,5 @@ class _RangeMap<E> { |
/// Associates [value] with [range]. |
operator[]=(_Range range, E value) => |
- _contents.add(new _Pair<_Range, E>(range, value)); |
+ _contents.add(new Pair<_Range, E>(range, value)); |
} |