public QueryTemplateParseResult parse()

in src/main/java/com/uber/uberscriptquery/antlr4/parsing/QueryTemplateParser.java [37:103]


    public QueryTemplateParseResult parse(String text, Map<String, Object> variableOverwrite) {
        final char[] charArray = text.toCharArray();

        final char[] charArrayUpperCase = text.toUpperCase().toCharArray();

        final QueryTemplateParseResult parsedResult = new QueryTemplateParseResult();

        UberScriptQueryTemplateLexer l = new UberScriptQueryTemplateLexer(new ANTLRInputStream(charArrayUpperCase, charArrayUpperCase.length));
        com.uber.uberscriptquery.antlr4.generated.UberScriptQueryTemplateParser p = new com.uber.uberscriptquery.antlr4.generated.UberScriptQueryTemplateParser(new CommonTokenStream(l));
        p.addErrorListener(new BaseErrorListener() {
            @Override
            public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
                throw new IllegalStateException(
                        String.format("Failed to parse at line %s char %s due to %s", line, charPositionInLine, msg),
                        e);
            }
        });

        final AtomicInteger lastOffset = new AtomicInteger(-1);

        final Map<String, Object> variableMap = new HashMap<>();

        if (variableOverwrite != null && !variableOverwrite.isEmpty()) {
            variableMap.putAll(variableOverwrite);
        }

        p.addParseListener(
                new UberScriptQueryTemplateBaseListener() {
                    @Override
                    public void exitVariableAssignment(com.uber.uberscriptquery.antlr4.generated.UberScriptQueryTemplateParser.VariableAssignmentContext ctx) {
                        lastOffset.set(ctx.getStop().getStopIndex());

                        String variableName = getMatchedString(ctx.variableAssignment_variableName(), charArray);

                        if (variableOverwrite != null && variableOverwrite.containsKey(variableName)) {
                            logger.info(String.format("Ignored variable %s because of variable overwrite with value %s", variableName, variableOverwrite.get(variableName)));
                            return;
                        }

                        String variableValue = getMatchedString(ctx.STRING().getSymbol(), charArray);

                        if (variableValue == null) {
                            return;
                        }
                        variableValue = ParserUtils.getStringStatementInnerValue(variableValue);

                        variableValue = TemplateUtils.transform(variableValue, variableMap);

                        variableMap.put(variableName, variableValue);
                    }

                    @Override
                    public void exitAssignmentWithSemicolon(com.uber.uberscriptquery.antlr4.generated.UberScriptQueryTemplateParser.AssignmentWithSemicolonContext ctx) {
                        lastOffset.set(ctx.getStop().getStopIndex());
                    }
                });

        p.root();

        parsedResult.setVariableMap(variableMap);

        String templateBody = new String(charArray, lastOffset.get() + 1, charArray.length - lastOffset.get() - 1);
        templateBody = TemplateUtils.transform(templateBody, variableMap);
        parsedResult.setTemplateBody(templateBody);

        return parsedResult;
    }