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;

Reply via email to