org.hibernate.sqm.parser.hql.internal.HqlParseTreePrinter.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.sqm.parser.hql.internal.HqlParseTreePrinter.java

Source

/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: Apache License, Version 2.0
 * See the LICENSE file in the root directory or visit http://www.apache.org/licenses/LICENSE-2.0
 */
package org.hibernate.sqm.parser.hql.internal;

import org.hibernate.sqm.parser.hql.internal.antlr.HqlParser;
import org.hibernate.sqm.parser.hql.internal.antlr.HqlParserBaseListener;

import org.jboss.logging.Logger;

import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.misc.NotNull;
import org.antlr.v4.runtime.tree.ParseTreeWalker;

/**
 * @author Steve Ebersole
 */
public class HqlParseTreePrinter extends HqlParserBaseListener {
    private static final Logger HQL_LOGGER = Logger.getLogger("org.hibernate.sqm.hql.parseTree");

    public static void logParseTree(HqlParser parser) {
        if (!HQL_LOGGER.isDebugEnabled()) {
            return;
        }

        ParseTreeWalker.DEFAULT.walk(new HqlParseTreePrinter(parser), parser.statement());
        parser.reset();
    }

    private final HqlParser parser;

    private int depth = 0;

    public HqlParseTreePrinter(HqlParser parser) {
        this.parser = parser;
    }

    @Override
    public void enterEveryRule(@NotNull ParserRuleContext ctx) {
        final String ruleName = parser.getRuleNames()[ctx.getRuleIndex()];

        if (!ruleName.endsWith("Keyword")) {
            HQL_LOGGER.debugf("%s %s (%s) [`%s`]", enterRulePadding(), ctx.getClass().getSimpleName(), ruleName,
                    ctx.getText());
        }
        super.enterEveryRule(ctx);
    }

    private String enterRulePadding() {
        return pad(depth++) + "->";
    }

    private String pad(int depth) {
        StringBuilder buf = new StringBuilder(2 * depth);
        for (int i = 0; i < depth; i++) {
            buf.append("  ");
        }
        return buf.toString();
    }

    @Override
    public void exitEveryRule(@NotNull ParserRuleContext ctx) {
        super.exitEveryRule(ctx);

        final String ruleName = parser.getRuleNames()[ctx.getRuleIndex()];

        if (!ruleName.endsWith("Keyword")) {
            HQL_LOGGER.debugf("%s %s (%s) [`%s`]", exitRulePadding(), ctx.getClass().getSimpleName(),
                    parser.getRuleNames()[ctx.getRuleIndex()], ctx.getText());
        }
    }

    private String exitRulePadding() {
        return pad(--depth) + "<-";
    }
}