public ParseResult parse(@NotNull ParsePathNode parentNode, boolean optional, int depth, ParserContext context) throws ParseException {
ParserBuilder builder = context.getBuilder();
logBegin(builder, optional, depth);
ParsePathNode node = createParseNode(parentNode, builder.getCurrentOffset());
TokenElementType separatorToken = getElementType().getSeparatorToken();
PsiBuilder.Marker marker = builder.mark(node);
int matchedTokens = 0;
QualifiedIdentifierVariant variant = getMostProbableParseVariant(builder, node);
if (variant != null) {
LeafElementType[] elementTypes = variant.getLeafs();
int currentSiblingPosition = 0;
for (LeafElementType elementType : elementTypes) {
ParseResult result = elementType.getParser().parse(node, true, depth + 1, context);
if (result.isNoMatch()) break; else matchedTokens = matchedTokens + result.getMatchedTokens();
if (elementType != elementTypes[elementTypes.length -1]) {
result = separatorToken.getParser().parse(node, true, depth + 1, context);
if (result.isNoMatch()) break; else matchedTokens = matchedTokens + result.getMatchedTokens();
}
node.incrementIndex(builder.getCurrentOffset());
}
if (variant.isIncomplete()) {
Set<TokenType> expected = new THashSet<TokenType>();
expected.add(separatorToken.getTokenType());
ParseBuilderErrorHandler.updateBuilderError(expected, context);
return stepOut(marker, depth, ParseResultType.PARTIAL_MATCH, matchedTokens, node, context);
} else {
return stepOut(marker, depth, ParseResultType.FULL_MATCH, matchedTokens, node, context);
}