in sources/frontend/plain/yaml-psi/src/org/jetbrains/yaml/parser/YAMLParser.java [73:145]
private void parseBlockNode(int indent, boolean insideSequence) {
// Preserve most test and current behaviour for most general cases without comments
if (getTokenType() == EOL) {
advanceLexer();
if (getTokenType() == INDENT) {
advanceLexer();
}
}
final PsiBuilder.Marker marker = mark();
passJunk();
PsiBuilder.Marker endOfNodeMarker = null;
IElementType nodeType = null;
// It looks like tag for a block node should be located on a separate line
if (getTokenType() == YAMLTokenTypes.TAG && myBuilder.lookAhead(1) == YAMLTokenTypes.EOL) {
advanceLexer();
}
int numberOfItems = 0;
while (!eof() && (isJunk() || !eolSeen || myIndent + getIndentBonus(insideSequence) >= indent)) {
if (isJunk()) {
advanceLexer();
continue;
}
if (!myStopTokensStack.isEmpty() && myStopTokensStack.peek().contains(getTokenType())) {
rollBackToEol();
break;
}
numberOfItems++;
final IElementType parsedTokenType = parseSingleStatement(eolSeen ? myIndent : indent, indent);
if (nodeType == null) {
if (parsedTokenType == YAMLElementTypes.SEQUENCE_ITEM) {
nodeType = YAMLElementTypes.SEQUENCE;
}
else if (parsedTokenType == YAMLElementTypes.KEY_VALUE_PAIR) {
nodeType = YAMLElementTypes.MAPPING;
}
else if (numberOfItems > 1) {
nodeType = YAMLElementTypes.COMPOUND_VALUE;
}
}
if (endOfNodeMarker != null) {
endOfNodeMarker.drop();
}
endOfNodeMarker = mark();
}
if (endOfNodeMarker != null) {
dropEolMarker();
endOfNodeMarker.rollbackTo();
}
else {
rollBackToEol();
}
includeBlockEmptyTail(indent);
if (nodeType != null) {
marker.done(nodeType);
marker.setCustomEdgeTokenBinders(
(tokens, atStreamEdge, getter) -> findLeftRange(tokens),
(tokens, atStreamEdge, getter) -> tokens.size());
}
else {
marker.drop();
}
}