/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html */ package org.hibernate.query.sqm.produce.internal.hql; import org.hibernate.query.sqm.hql.internal.antlr.HqlParser; import org.hibernate.query.sqm.hql.internal.antlr.HqlParserBaseListener; import org.jboss.logging.Logger; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTreeWalker; /** * @author Steve Ebersole */ @SuppressWarnings("WeakerAccess") 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(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(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 ) + "<-"; } }