From 40a7fa329608b39b674f79402103c07b89d8baee Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 10 Oct 2026 13:44:23 +0000 Subject: [PATCH] fix(core): track actual LineReader read lengths Co-authored-by: jrfaller <3370556+jrfaller@users.noreply.github.com> --- .../com/github/gumtreediff/io/LineReader.java | 10 ++++---- .../gumtreediff/test/TestTreeIoUtils.java | 23 +++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/github/gumtreediff/io/LineReader.java b/core/src/main/java/com/github/gumtreediff/io/LineReader.java index 9348aa7a1..762396ee5 100644 --- a/core/src/main/java/com/github/gumtreediff/io/LineReader.java +++ b/core/src/main/java/com/github/gumtreediff/io/LineReader.java @@ -54,10 +54,12 @@ public LineReader(Reader parent) { @Override public int read(char[] cbuf, int off, int len) throws IOException { int r = reader.read(cbuf, off, len); - for (int i = 0; i < len; i++) - if (cbuf[off + i] == '\n') - lines.add(currentPos + i); - currentPos += len; + if (r > 0) { + for (int i = 0; i < r; i++) + if (cbuf[off + i] == '\n') + lines.add(currentPos + i); + currentPos += r; + } return r; } diff --git a/core/src/test/java/com/github/gumtreediff/test/TestTreeIoUtils.java b/core/src/test/java/com/github/gumtreediff/test/TestTreeIoUtils.java index 5821c4ae1..12b44e481 100644 --- a/core/src/test/java/com/github/gumtreediff/test/TestTreeIoUtils.java +++ b/core/src/test/java/com/github/gumtreediff/test/TestTreeIoUtils.java @@ -90,6 +90,29 @@ public void testLineReader() throws IOException { assertArrayEquals(new int[] { 3, 2 }, lr.positionFor(9)); } + @Test + public void testLineReaderWithPartialReads() throws IOException { + StringReader reader = new StringReader("foo\nbar\nbaz\n") { + @Override + public int read(char[] cbuf, int off, int len) throws IOException { + return super.read(cbuf, off, Math.min(len, 2)); + } + }; + LineReader lr = new LineReader(reader); + char[] buffer = new char[8]; + StringBuilder contents = new StringBuilder(); + int count; + + while ((count = lr.read(buffer, 0, buffer.length)) != -1) + contents.append(buffer, 0, count); + + assertEquals("foo\nbar\nbaz\n", contents.toString()); + assertEquals(4, lr.positionFor(2, 1)); + assertEquals(8, lr.positionFor(3, 1)); + assertArrayEquals(new int[] { 2, 1 }, lr.positionFor(4)); + assertArrayEquals(new int[] { 3, 1 }, lr.positionFor(8)); + } + @Test public void testPrintTextTree() throws Exception { TreeContext tc = getTreeContext();