diff --git a/core/src/main/java/io/parsingdata/metal/token/Until.java b/core/src/main/java/io/parsingdata/metal/token/Until.java index a7ddf7df..fe9d2535 100644 --- a/core/src/main/java/io/parsingdata/metal/token/Until.java +++ b/core/src/main/java/io/parsingdata/metal/token/Until.java @@ -113,7 +113,7 @@ private Trampoline> iterate(final Environment environment, } private Trampoline> parseSlice(final Environment environment, final BigInteger currentSize, final BigInteger stepSize, final BigInteger maxSize, final Slice slice) { - return (currentSize.compareTo(ZERO) == 0 ? Optional.of(environment.parseState) : environment.parseState.add(new ParseValue(name, this, slice, environment.encoding)).seek(environment.parseState.offset.add(currentSize))) + return (currentSize.compareTo(ZERO) == 0 ? Optional.of(environment.parseState) : environment.parseState.add(new ParseValue(environment.scope, this, slice, environment.encoding)).seek(environment.parseState.offset.add(currentSize))) .map(preparedParseState -> terminator.parse(environment.withParseState(preparedParseState))) .orElseGet(Util::failure) .map(parsedParseState -> complete(() -> success(parsedParseState))) diff --git a/core/src/test/java/io/parsingdata/metal/token/UntilTest.java b/core/src/test/java/io/parsingdata/metal/token/UntilTest.java index 7b196bd1..f5795445 100644 --- a/core/src/test/java/io/parsingdata/metal/token/UntilTest.java +++ b/core/src/test/java/io/parsingdata/metal/token/UntilTest.java @@ -17,6 +17,7 @@ package io.parsingdata.metal.token; import static io.parsingdata.metal.Shorthand.CURRENT_OFFSET; +import static io.parsingdata.metal.Shorthand.seq; import static io.parsingdata.metal.Shorthand.sub; import static java.nio.charset.StandardCharsets.US_ASCII; @@ -127,4 +128,16 @@ private Token createToken(final ValueExpression initialSize, final Token termina return repn(until("line", initialSize, terminator), con(3)); } + @Test + public void nameScope() { + final Token terminator = def("terminator", con(1), eq(con(0x00))); + final Token token = seq("struct", until("value", terminator), terminator); + final Optional parse = token.parse(env(stream('d', 'a', 't', 'a', 0, 0))); + assertTrue(parse.isPresent()); + assertEquals(1, getAllValues(parse.get().order, "struct.terminator").size); + assertEquals(1, getAllValues(parse.get().order, "struct.value").size); + assertEquals(1, getAllValues(parse.get().order, "struct.value.terminator").size); + assertEquals("data", getAllValues(parse.get().order, "struct.value").head.asString()); + } + }