Skip to content

Commit

Permalink
Merge pull request #20587 from mkouba/issue-20567
Browse files Browse the repository at this point in the history
Qute parser - use standard error report for invalid virtual methods
  • Loading branch information
mkouba authored Oct 8, 2021
2 parents 70a5ed7 + fa096d1 commit 42bca29
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -30,20 +31,20 @@ public static String parseVirtualMethodName(String value) {
return value.substring(0, start);
}

public static List<String> parseVirtualMethodParams(String value) {
public static List<String> 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<String> params) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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("]");
Expand Down Expand Up @@ -740,7 +740,7 @@ static ExpressionImpl parseExpression(Supplier<Integer> idGenerator, String valu
Part first = null;
Iterator<String> 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);
}
Expand All @@ -753,12 +753,11 @@ static ExpressionImpl parseExpression(Supplier<Integer> idGenerator, String valu
}

private static Part createPart(Supplier<Integer> idGenerator, String namespace, Part first,
Iterator<String> strPartsIterator, Scope scope,
Origin origin) {
Iterator<String> strPartsIterator, Scope scope, Origin origin, String exprValue) {
String value = strPartsIterator.next();
if (Expressions.isVirtualMethod(value)) {
String name = Expressions.parseVirtualMethodName(value);
List<String> strParams = new ArrayList<>(Expressions.parseVirtualMethodParams(value));
List<String> strParams = new ArrayList<>(Expressions.parseVirtualMethodParams(value, origin, exprValue));
List<Expression> params = new ArrayList<>(strParams.size());
for (String strParam : strParams) {
params.add(parseExpression(idGenerator, strParam.trim(), scope, origin));
Expand All @@ -769,7 +768,7 @@ private static Part createPart(Supplier<Integer> 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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Item> getItems() {
Expand Down

0 comments on commit 42bca29

Please sign in to comment.