diff --git a/src/main/java/io/github/treesitter/jtreesitter/Parser.java b/src/main/java/io/github/treesitter/jtreesitter/Parser.java index bf51cc5..542420f 100644 --- a/src/main/java/io/github/treesitter/jtreesitter/Parser.java +++ b/src/main/java/io/github/treesitter/jtreesitter/Parser.java @@ -260,6 +260,7 @@ public Optional parse( if (language == null) { throw new IllegalStateException("The parser has no language assigned"); } + final var collected = new java.io.ByteArrayOutputStream(); var input = TSInput.allocate(arena); TSInput.payload(input, MemorySegment.NULL); @@ -272,6 +273,15 @@ public Optional parse( return MemorySegment.NULL; } var buffer = result.getBytes(encoding.charset()); + var collectedSize = collected.size(); + if (index >= collectedSize) { + collected.write(buffer, 0, buffer.length); + } else { + var overlap = collectedSize - index; + if (overlap < buffer.length) { + collected.write(buffer, overlap, buffer.length - overlap); + } + } bytes.set(C_INT, 0, buffer.length); return arena.allocateFrom(C_CHAR, buffer); }, @@ -295,7 +305,7 @@ public Optional parse( tree = ts_parser_parse_with_options(self, old, input, parseOptions); } if (tree.equals(MemorySegment.NULL)) return Optional.empty(); - return Optional.of(new Tree(tree, language, null, null)); + return Optional.of(new Tree(tree, language, collected.toByteArray(), encoding.charset())); } /** diff --git a/src/test/java/io/github/treesitter/jtreesitter/ParserTest.java b/src/test/java/io/github/treesitter/jtreesitter/ParserTest.java index edc6234..3638220 100644 --- a/src/test/java/io/github/treesitter/jtreesitter/ParserTest.java +++ b/src/test/java/io/github/treesitter/jtreesitter/ParserTest.java @@ -106,10 +106,10 @@ void parseLogger() { @DisplayName("parse(callback)") void parseCallback() { var source = "class Foo {}"; - ParseCallback callback = (offset, _) -> source.substring(offset, Integer.min(offset, source.length())); + ParseCallback callback = (offset, _) -> source.substring(offset, Integer.min(source.length(), offset + 1)); parser.setLanguage(language); try (var tree = parser.parse(callback, InputEncoding.UTF_8).orElseThrow()) { - assertNull(tree.getText()); + assertEquals(source, tree.getText()); assertEquals("program", tree.getRootNode().getType()); } }