in lib/src/parser.dart [262:354]
Event _parseNode({bool block = false, bool indentlessSequence = false}) {
var token = _scanner.peek()!;
if (token is AliasToken) {
_scanner.scan();
_state = _states.removeLast();
return AliasEvent(token.span, token.name);
}
String? anchor;
TagToken? tagToken;
var span = token.span.start.pointSpan();
Token parseAnchor(AnchorToken token) {
anchor = token.name;
span = span.expand(token.span);
return _scanner.advance()!;
}
Token parseTag(TagToken token) {
tagToken = token;
span = span.expand(token.span);
return _scanner.advance()!;
}
if (token is AnchorToken) {
token = parseAnchor(token);
if (token is TagToken) token = parseTag(token);
} else if (token is TagToken) {
token = parseTag(token);
if (token is AnchorToken) token = parseAnchor(token);
}
String? tag;
if (tagToken != null) {
if (tagToken!.handle == null) {
tag = tagToken!.suffix;
} else {
var tagDirective = _tagDirectives[tagToken!.handle];
if (tagDirective == null) {
throw YamlException('Undefined tag handle.', tagToken!.span);
}
tag = tagDirective.prefix + (tagToken?.suffix ?? '');
}
}
if (indentlessSequence && token.type == TokenType.blockEntry) {
_state = _State.INDENTLESS_SEQUENCE_ENTRY;
return SequenceStartEvent(span.expand(token.span), CollectionStyle.BLOCK,
anchor: anchor, tag: tag);
}
if (token is ScalarToken) {
// All non-plain scalars have the "!" tag by default.
if (tag == null && token.style != ScalarStyle.PLAIN) tag = '!';
_state = _states.removeLast();
_scanner.scan();
return ScalarEvent(span.expand(token.span), token.value, token.style,
anchor: anchor, tag: tag);
}
if (token.type == TokenType.flowSequenceStart) {
_state = _State.FLOW_SEQUENCE_FIRST_ENTRY;
return SequenceStartEvent(span.expand(token.span), CollectionStyle.FLOW,
anchor: anchor, tag: tag);
}
if (token.type == TokenType.flowMappingStart) {
_state = _State.FLOW_MAPPING_FIRST_KEY;
return MappingStartEvent(span.expand(token.span), CollectionStyle.FLOW,
anchor: anchor, tag: tag);
}
if (block && token.type == TokenType.blockSequenceStart) {
_state = _State.BLOCK_SEQUENCE_FIRST_ENTRY;
return SequenceStartEvent(span.expand(token.span), CollectionStyle.BLOCK,
anchor: anchor, tag: tag);
}
if (block && token.type == TokenType.blockMappingStart) {
_state = _State.BLOCK_MAPPING_FIRST_KEY;
return MappingStartEvent(span.expand(token.span), CollectionStyle.BLOCK,
anchor: anchor, tag: tag);
}
if (anchor != null || tag != null) {
_state = _states.removeLast();
return ScalarEvent(span, '', ScalarStyle.PLAIN, anchor: anchor, tag: tag);
}
throw YamlException('Expected node content.', span);
}