From 9512d3f6bb3fbc584acef80e45081087731dd6f3 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Fri, 12 Apr 2024 22:56:05 -0400 Subject: [PATCH] Ensure Scanner adds line ends for text block continuation lines (#2339) - fixes #2338 - add new test to ScannerTest --- .../jdt/internal/compiler/parser/Scanner.java | 5 ++- .../compiler/regression/ScannerTest.java | 38 ++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Scanner.java b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Scanner.java index 7c637341e71..e27509e10ad 100644 --- a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Scanner.java +++ b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Scanner.java @@ -2057,8 +2057,11 @@ protected int scanForTextBlock() throws InvalidInputException { break outer; case '\n' : case '\r' : + this.currentCharacter = this.source[this.currentPosition++]; + if (this.recordLineSeparator) { + pushLineSeparator(); + } this.currentCharacter = '\\'; - this.currentPosition++; break; case '\"' : this.currentPosition++; diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ScannerTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ScannerTest.java index f15cdd9ad30..fad96367c46 100644 --- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ScannerTest.java +++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ScannerTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2019 IBM Corporation and others. + * Copyright (c) 2000, 2024 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -1582,6 +1582,42 @@ public void testBug575556_at_15() { } } + public void testIssue2338_001_since_14() { + char[] source = ("class X {\n" + + " String s = \"\"\"\nThis is the new\\\n String\"\"\";\n" + + "}").toCharArray(); + Scanner scanner = new Scanner(false, false, false, ClassFileConstants.MAJOR_LATEST_VERSION, null, null, false); + scanner.previewEnabled = true; + scanner.recordLineSeparator = true; + scanner.setSource(source); + scanner.resetTo(0, source.length - 1); + try { + int token; + StringBuilder buffer = new StringBuilder(); + while ((token = scanner.getNextToken()) != TerminalTokens.TokenNameEOF) { + try { + switch(token) { + case TerminalTokens.TokenNameTextBlock : + buffer.append( new String(scanner.getCurrentTextBlock())); + break; + case TerminalTokens.TokenNameStringLiteral : + break; + case TerminalTokens.TokenNameEOF : + break; + default : + break; + } + } catch (ArrayIndexOutOfBoundsException e) { + e.printStackTrace(); + } + } + assertEquals("Wrong contents", "This is the new String", String.valueOf(buffer)); + assertEquals("Missing line end for continuation", 44, scanner.lineEnds[2]); + } catch (InvalidInputException e) { + assertTrue(false); + } + } + public void testSealed() { char[] source = ("sealed class X { }").toCharArray(); IScanner scanner = ToolFactory.createScanner(false, true, false, "17", "17", false);