From fa096d1f3978e44b32f3a63c87007e6948ab2979 Mon Sep 17 00:00:00 2001 From: Martin Kouba Date: Thu, 7 Oct 2021 14:00:01 +0200 Subject: [PATCH] Qute parser - use standard error report for invalid virtual methods - resolves #20567 --- .../src/main/java/io/quarkus/qute/Expressions.java | 9 +++++---- .../core/src/main/java/io/quarkus/qute/Parser.java | 11 +++++------ .../src/test/java/io/quarkus/qute/ParserTest.java | 12 ++++++++++++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/independent-projects/qute/core/src/main/java/io/quarkus/qute/Expressions.java b/independent-projects/qute/core/src/main/java/io/quarkus/qute/Expressions.java index 8b4b17f7da774..c4b30c660641f 100644 --- a/independent-projects/qute/core/src/main/java/io/quarkus/qute/Expressions.java +++ b/independent-projects/qute/core/src/main/java/io/quarkus/qute/Expressions.java @@ -1,5 +1,6 @@ package io.quarkus.qute; +import io.quarkus.qute.TemplateNode.Origin; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -30,20 +31,20 @@ public static String parseVirtualMethodName(String value) { return value.substring(0, start); } - public static List parseVirtualMethodParams(String value) { + public static List parseVirtualMethodParams(String value, Origin origin, String exprValue) { int start = value.indexOf(LEFT_BRACKET); if (start != -1 && value.endsWith(RIGHT_BRACKET)) { String params = value.substring(start + 1, value.length() - 1); return splitParts(params, PARAMS_SPLIT_CONFIG); } - throw new IllegalArgumentException("Not a virtual method: " + value); + throw Parser.parserError("invalid virtual method in {" + exprValue + "}", origin); } - public static String parseBracketContent(String value) { + public static String parseBracketContent(String value, Origin origin, String exprValue) { if (value.endsWith(SQUARE_RIGHT_BRACKET)) { return value.substring(1, value.length() - 1); } - throw new IllegalArgumentException("Not a bracket notation expression: " + value); + throw Parser.parserError("invalid bracket notation expression in {" + exprValue + "}", origin); } public static String buildVirtualMethodSignature(String name, List params) { diff --git a/independent-projects/qute/core/src/main/java/io/quarkus/qute/Parser.java b/independent-projects/qute/core/src/main/java/io/quarkus/qute/Parser.java index 085a5b73e9494..b03a0c8aac895 100644 --- a/independent-projects/qute/core/src/main/java/io/quarkus/qute/Parser.java +++ b/independent-projects/qute/core/src/main/java/io/quarkus/qute/Parser.java @@ -492,7 +492,7 @@ private TemplateException parserError(String message) { return parserError(message, origin(0)); } - private static TemplateException parserError(String message, Origin origin) { + static TemplateException parserError(String message, Origin origin) { StringBuilder builder = new StringBuilder("Parser error"); if (!origin.getTemplateId().equals(origin.getTemplateGeneratedId())) { builder.append(" in template [").append(origin.getTemplateId()).append("]"); @@ -740,7 +740,7 @@ static ExpressionImpl parseExpression(Supplier idGenerator, String valu Part first = null; Iterator strPartsIterator = strParts.iterator(); while (strPartsIterator.hasNext()) { - Part part = createPart(idGenerator, namespace, first, strPartsIterator, scope, origin); + Part part = createPart(idGenerator, namespace, first, strPartsIterator, scope, origin, value); if (!isValidIdentifier(part.getName())) { throw parserError("invalid identifier found {" + value + "}", origin); } @@ -753,12 +753,11 @@ static ExpressionImpl parseExpression(Supplier idGenerator, String valu } private static Part createPart(Supplier idGenerator, String namespace, Part first, - Iterator strPartsIterator, Scope scope, - Origin origin) { + Iterator strPartsIterator, Scope scope, Origin origin, String exprValue) { String value = strPartsIterator.next(); if (Expressions.isVirtualMethod(value)) { String name = Expressions.parseVirtualMethodName(value); - List strParams = new ArrayList<>(Expressions.parseVirtualMethodParams(value)); + List strParams = new ArrayList<>(Expressions.parseVirtualMethodParams(value, origin, exprValue)); List params = new ArrayList<>(strParams.size()); for (String strParam : strParams) { params.add(parseExpression(idGenerator, strParam.trim(), scope, origin)); @@ -769,7 +768,7 @@ private static Part createPart(Supplier idGenerator, String namespace, } // Try to parse the literal for bracket notation if (Expressions.isBracketNotation(value)) { - value = Expressions.parseBracketContent(value); + value = Expressions.parseBracketContent(value, origin, exprValue); Object literal = LiteralSupport.getLiteralValue(value); if (literal != null && !Results.isNotFound(literal)) { value = literal.toString(); diff --git a/independent-projects/qute/core/src/test/java/io/quarkus/qute/ParserTest.java b/independent-projects/qute/core/src/test/java/io/quarkus/qute/ParserTest.java index 4e2361c696391..6a978dca6acc4 100644 --- a/independent-projects/qute/core/src/test/java/io/quarkus/qute/ParserTest.java +++ b/independent-projects/qute/core/src/test/java/io/quarkus/qute/ParserTest.java @@ -355,6 +355,18 @@ public void testInvalidNamespaceExpression() { "Parser error on line 1: empty expression found {data:}", 1); } + @Test + public void testInvalidVirtualMethod() { + assertParserError("{foo.baz()(}", + "Parser error on line 1: invalid virtual method in {foo.baz()(}", 1); + } + + @Test + public void testInvalidBracket() { + assertParserError("{foo.baz[}", + "Parser error on line 1: invalid bracket notation expression in {foo.baz[}", 1); + } + public static class Foo { public List getItems() {