public @Nullable ASTNode parseLazyElement(@NotNull IElementType rootElement,
                                            @NotNull PsiBuilder builder,
                                            @NotNull LanguageLevel languageLevel,
                                            @NotNull TriConsumer<? super IElementType, ? super SyntaxTreeBuilder, ? super LanguageLevel> parsingFunction) {
    long start = System.currentTimeMillis();
    parsingFunction.accept(rootElement, builder, languageLevel);
    try {
      if (!builder.eof()) {
        LOG.debug("Lazy parseable element of type " + rootElement + "ends before EOF");
        return null;
      }
      ASTNode ast = builder.getTreeBuilt();
      return ast.getFirstChildNode();
    }
    finally {
      if (LOG.isDebugEnabled()) {
        long diff = System.currentTimeMillis() - start;
        double kb = builder.getCurrentOffset() / 1000.0;
        LOG.debug("Parsed " + String.format("%.1f", kb) + "K file in " + diff + "ms");
      }
    }
  }
public @Nullable ASTNode parseLazyElement(@NotNull IElementType rootElement,
                                            @NotNull PsiBuilder builder,
                                            @NotNull LanguageLevel languageLevel,
                                            @NotNull TriConsumer<? super IElementType, ? super SyntaxTreeBuilder, ? super LanguageLevel> parsingFunction)