HHH-18754 improve HQLParser's error listener usage in StandardHqlTranslator
This commit is contained in:
parent
64c26fa5ab
commit
2eeb6153ff
|
@ -4,8 +4,6 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.query.hql.internal;
|
package org.hibernate.query.hql.internal;
|
||||||
|
|
||||||
import java.util.BitSet;
|
|
||||||
|
|
||||||
import org.antlr.v4.runtime.CommonToken;
|
import org.antlr.v4.runtime.CommonToken;
|
||||||
import org.antlr.v4.runtime.InputMismatchException;
|
import org.antlr.v4.runtime.InputMismatchException;
|
||||||
import org.antlr.v4.runtime.NoViableAltException;
|
import org.antlr.v4.runtime.NoViableAltException;
|
||||||
|
@ -29,13 +27,11 @@ import org.hibernate.query.sqm.tree.SqmStatement;
|
||||||
|
|
||||||
import org.antlr.v4.runtime.ANTLRErrorListener;
|
import org.antlr.v4.runtime.ANTLRErrorListener;
|
||||||
import org.antlr.v4.runtime.BailErrorStrategy;
|
import org.antlr.v4.runtime.BailErrorStrategy;
|
||||||
|
import org.antlr.v4.runtime.BaseErrorListener;
|
||||||
import org.antlr.v4.runtime.DefaultErrorStrategy;
|
import org.antlr.v4.runtime.DefaultErrorStrategy;
|
||||||
import org.antlr.v4.runtime.Parser;
|
|
||||||
import org.antlr.v4.runtime.RecognitionException;
|
import org.antlr.v4.runtime.RecognitionException;
|
||||||
import org.antlr.v4.runtime.Recognizer;
|
import org.antlr.v4.runtime.Recognizer;
|
||||||
import org.antlr.v4.runtime.atn.ATNConfigSet;
|
|
||||||
import org.antlr.v4.runtime.atn.PredictionMode;
|
import org.antlr.v4.runtime.atn.PredictionMode;
|
||||||
import org.antlr.v4.runtime.dfa.DFA;
|
|
||||||
import org.antlr.v4.runtime.misc.ParseCancellationException;
|
import org.antlr.v4.runtime.misc.ParseCancellationException;
|
||||||
|
|
||||||
import static java.util.stream.Collectors.toList;
|
import static java.util.stream.Collectors.toList;
|
||||||
|
@ -50,7 +46,6 @@ public class StandardHqlTranslator implements HqlTranslator {
|
||||||
private final SqmCreationContext sqmCreationContext;
|
private final SqmCreationContext sqmCreationContext;
|
||||||
private final SqmCreationOptions sqmCreationOptions;
|
private final SqmCreationOptions sqmCreationOptions;
|
||||||
|
|
||||||
|
|
||||||
public StandardHqlTranslator(
|
public StandardHqlTranslator(
|
||||||
SqmCreationContext sqmCreationContext,
|
SqmCreationContext sqmCreationContext,
|
||||||
SqmCreationOptions sqmCreationOptions) {
|
SqmCreationOptions sqmCreationOptions) {
|
||||||
|
@ -101,30 +96,9 @@ public class StandardHqlTranslator implements HqlTranslator {
|
||||||
// Build the parse tree
|
// Build the parse tree
|
||||||
final HqlParser hqlParser = HqlParseTreeBuilder.INSTANCE.buildHqlParser( hql, hqlLexer );
|
final HqlParser hqlParser = HqlParseTreeBuilder.INSTANCE.buildHqlParser( hql, hqlLexer );
|
||||||
|
|
||||||
ANTLRErrorListener errorListener = new ANTLRErrorListener() {
|
|
||||||
@Override
|
|
||||||
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
|
|
||||||
throw new SyntaxException( prettifyAntlrError( offendingSymbol, line, charPositionInLine, msg, e, hql, true ), hql );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reportAmbiguity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, boolean exact, BitSet ambigAlts, ATNConfigSet configs) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reportAttemptingFullContext(Parser recognizer, DFA dfa, int startIndex, int stopIndex, BitSet conflictingAlts, ATNConfigSet configs) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reportContextSensitivity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, int prediction, ATNConfigSet configs) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// try to use SLL(k)-based parsing first - its faster
|
// try to use SLL(k)-based parsing first - its faster
|
||||||
hqlLexer.addErrorListener( errorListener );
|
|
||||||
hqlParser.getInterpreter().setPredictionMode( PredictionMode.SLL );
|
hqlParser.getInterpreter().setPredictionMode( PredictionMode.SLL );
|
||||||
hqlParser.removeErrorListeners();
|
hqlParser.removeErrorListeners();
|
||||||
hqlParser.addErrorListener( errorListener );
|
|
||||||
hqlParser.setErrorHandler( new BailErrorStrategy() );
|
hqlParser.setErrorHandler( new BailErrorStrategy() );
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -139,6 +113,14 @@ public class StandardHqlTranslator implements HqlTranslator {
|
||||||
hqlParser.getInterpreter().setPredictionMode( PredictionMode.LL );
|
hqlParser.getInterpreter().setPredictionMode( PredictionMode.LL );
|
||||||
hqlParser.setErrorHandler( new DefaultErrorStrategy() );
|
hqlParser.setErrorHandler( new DefaultErrorStrategy() );
|
||||||
|
|
||||||
|
final ANTLRErrorListener errorListener = new BaseErrorListener() {
|
||||||
|
@Override
|
||||||
|
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
|
||||||
|
throw new SyntaxException( prettifyAntlrError( offendingSymbol, line, charPositionInLine, msg, e, hql, true ), hql );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
hqlParser.addErrorListener( errorListener );
|
||||||
|
|
||||||
return hqlParser.statement();
|
return hqlParser.statement();
|
||||||
}
|
}
|
||||||
catch ( ParsingException ex ) {
|
catch ( ParsingException ex ) {
|
||||||
|
|
|
@ -120,10 +120,10 @@ public class Validation {
|
||||||
private static HqlParser.StatementContext parseAndCheckSyntax(String hql, Handler handler) {
|
private static HqlParser.StatementContext parseAndCheckSyntax(String hql, Handler handler) {
|
||||||
final HqlLexer hqlLexer = HqlParseTreeBuilder.INSTANCE.buildHqlLexer( hql );
|
final HqlLexer hqlLexer = HqlParseTreeBuilder.INSTANCE.buildHqlLexer( hql );
|
||||||
final HqlParser hqlParser = HqlParseTreeBuilder.INSTANCE.buildHqlParser( hql, hqlLexer );
|
final HqlParser hqlParser = HqlParseTreeBuilder.INSTANCE.buildHqlParser( hql, hqlLexer );
|
||||||
hqlLexer.addErrorListener( handler );
|
|
||||||
hqlParser.getInterpreter().setPredictionMode( PredictionMode.SLL );
|
hqlParser.getInterpreter().setPredictionMode( PredictionMode.SLL );
|
||||||
hqlParser.removeErrorListeners();
|
hqlParser.removeErrorListeners();
|
||||||
hqlParser.addErrorListener( handler );
|
|
||||||
hqlParser.setErrorHandler( new BailErrorStrategy() );
|
hqlParser.setErrorHandler( new BailErrorStrategy() );
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -137,6 +137,7 @@ public class Validation {
|
||||||
// fall back to LL(k)-based parsing
|
// fall back to LL(k)-based parsing
|
||||||
hqlParser.getInterpreter().setPredictionMode( PredictionMode.LL );
|
hqlParser.getInterpreter().setPredictionMode( PredictionMode.LL );
|
||||||
hqlParser.setErrorHandler( new DefaultErrorStrategy() );
|
hqlParser.setErrorHandler( new DefaultErrorStrategy() );
|
||||||
|
hqlParser.addErrorListener( handler );
|
||||||
|
|
||||||
return hqlParser.statement();
|
return hqlParser.statement();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue