This is an automated email from the ASF dual-hosted git repository. benweidig pushed a commit to branch property-expression-parser in repository https://gitbox.apache.org/repos/asf/tapestry-5.git
commit 4fa2fb5100a3178fba0e1f79b99d543f438c4462 Author: Ben Weidig <[email protected]> AuthorDate: Sun Oct 25 12:06:04 2026 +0100 TAP5-2808: Allow ranges in lists, maps and method arguments The grammar accepted a range anywhere an expression may appear, but the code generator rejected it below the top level. A nested range now evaluates to an IntegerRange, and the top-level range shares the same code path. --- .../internal/services/PropertyConduitSourceImpl.java | 20 ++++++++++---------- .../tapestry5/beanmodel/RangeSubexpressionTest.java | 2 -- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/beanmodel/src/main/java/org/apache/tapestry5/beanmodel/internal/services/PropertyConduitSourceImpl.java b/beanmodel/src/main/java/org/apache/tapestry5/beanmodel/internal/services/PropertyConduitSourceImpl.java index ae3971359..7b2e13682 100644 --- a/beanmodel/src/main/java/org/apache/tapestry5/beanmodel/internal/services/PropertyConduitSourceImpl.java +++ b/beanmodel/src/main/java/org/apache/tapestry5/beanmodel/internal/services/PropertyConduitSourceImpl.java @@ -463,10 +463,6 @@ public class PropertyConduitSourceImpl implements PropertyConduitSource case RANGEOP: - // As currently implemented, RANGEOP can only appear as the - // top level, which - // means we didn't need the navigate method after all. - implementRangeOpGetter(node); implementNoOpSetter(); @@ -731,11 +727,7 @@ public class PropertyConduitSourceImpl implements PropertyConduitSource { public void doBuild(InstructionBuilder builder) { - // Put the delegate on top of the stack - - builder.loadThis().getField(getDelegateField()); - - invokeMethod(builder, DelegateMethods.RANGE, rangeNode, 0); + implementSubexpression(builder, null, rangeNode); builder.returnResult(); } @@ -880,9 +872,17 @@ public class PropertyConduitSourceImpl implements PropertyConduitSource return Void.class; + case RANGEOP: + + builder.loadThis().getField(getDelegateField()); + + invokeMethod(builder, DelegateMethods.RANGE, node, 0); + + return IntegerRange.class; + default: throw unexpectedNodeType(node, TRUE, FALSE, INTEGER, DECIMAL, STRING, DEREF, SAFEDEREF, - IDENTIFIER, INVOKE, LIST, MAP, NOT, THIS, NULL); + IDENTIFIER, INVOKE, LIST, MAP, NOT, THIS, NULL, RANGEOP); } } } diff --git a/beanmodel/src/test/java/org/apache/tapestry5/beanmodel/RangeSubexpressionTest.java b/beanmodel/src/test/java/org/apache/tapestry5/beanmodel/RangeSubexpressionTest.java index 42a32081e..a018219b2 100644 --- a/beanmodel/src/test/java/org/apache/tapestry5/beanmodel/RangeSubexpressionTest.java +++ b/beanmodel/src/test/java/org/apache/tapestry5/beanmodel/RangeSubexpressionTest.java @@ -22,13 +22,11 @@ import java.util.Map; import org.apache.tapestry5.beanmodel.services.PropertyConduitSource; import org.apache.tapestry5.commons.util.IntegerRange; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; /** * A range is valid wherever an expression is valid (TAP5-2808). */ -@Disabled("TAP5-2808: The generator rejects a range below the top level") public class RangeSubexpressionTest { private static PropertyConduitSource source;
