Skip to content

Commit 4635126

Browse files
perf: Avoid stringifying extended document (#2480)
1 parent dc3bab5 commit 4635126

File tree

4 files changed

+35
-14
lines changed

4 files changed

+35
-14
lines changed

server/common/src/main/java/org/eclipse/lsp/cobol/common/mapping/ExtendedDocument.java

+26
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
package org.eclipse.lsp.cobol.common.mapping;
1616

1717
import lombok.Getter;
18+
19+
import java.util.List;
20+
1821
import org.eclipse.lsp4j.Location;
1922
import org.eclipse.lsp4j.Position;
2023
import org.eclipse.lsp4j.Range;
@@ -156,6 +159,29 @@ public String toString() {
156159
return baseText.toString();
157160
}
158161

162+
/**
163+
* Checks if a line segment can be trimmed to empty string
164+
* @param lineno line number to investigate
165+
* @param start start column
166+
* @param end end column (exclusive)
167+
* @return segment consists of trimmable characters only
168+
*/
169+
public boolean isLineEmptyBetweenColumns(int lineno, int start, int end) {
170+
assert 0 <= lineno;
171+
assert 0 <= start;
172+
assert start <= end;
173+
List<ExtendedTextLine> lines = baseText.getLines();
174+
if (lineno >= lines.size())
175+
return true;
176+
List<MappedCharacter> chars = lines.get(lineno).getCharacters();
177+
for (int i = start; i < chars.size() && i < end; ++i) {
178+
// emulates behavior of trim function
179+
if (chars.get(i).getCharacter() > ' ')
180+
return false;
181+
}
182+
return true;
183+
}
184+
159185
private Range updateRangeDueToChanges(Range range) {
160186
if (isDirty()) {
161187
range = new Range(updatePositionDueToChanges(range.getStart()), updatePositionDueToChanges(range.getEnd()));

server/common/src/test/java/org/eclipse/lsp/cobol/common/mapping/ExtendedDocumentTest.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -116,5 +116,10 @@ void testInsertCopybookAfterLine() {
116116
assertEquals(documentUri, location.getUri());
117117
}
118118

119-
119+
@Test
120+
void testIsLineEmptyBetweenColumns() {
121+
assertTrue(document.isLineEmptyBetweenColumns(0, 0, 8));
122+
assertFalse(document.isLineEmptyBetweenColumns(0, 7, 100));
123+
assertTrue(document.isLineEmptyBetweenColumns(1000, 0, 1));
124+
}
120125
}

server/engine/src/main/java/org/eclipse/lsp/cobol/core/preprocessor/delegates/copybooks/CopybookPreprocessorService.java

+1-11
Original file line numberDiff line numberDiff line change
@@ -218,17 +218,7 @@ private boolean firstInstruction(ExtendedDocument extendedDocument, Position sta
218218
if (start.getCharacter() < 7) {
219219
return true;
220220
}
221-
String text = extendedDocument.toString();
222-
String[] lines = text.split("\\r?\\n");
223-
if (lines.length <= start.getLine()) {
224-
return true;
225-
}
226-
String line = lines[start.getLine()];
227-
if (line.length() < 7) {
228-
return true;
229-
}
230-
line = line.substring(7, Math.min(start.getCharacter(), line.length()));
231-
return line.trim().isEmpty();
221+
return extendedDocument.isLineEmptyBetweenColumns(start.getLine(), 7, start.getCharacter());
232222
}
233223

234224
private CopybookName getCopybookName(CobolPreprocessor.CopySourceContext ctx) {

server/engine/src/main/java/org/eclipse/lsp/cobol/core/preprocessor/delegates/replacement/ReplacingServiceImpl.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,10 @@ private String handleSeparator(String trim) {
230230
}
231231

232232
private void replace(@NonNull ExtendedDocument extendedDocument, @NonNull Pair<String, String> pattern, @NonNull Range scope) {
233-
if (StringUtils.isBlank(extendedDocument.toString())) {
233+
String text = extendedDocument.toString();
234+
if (StringUtils.isBlank(text)) {
234235
return;
235236
}
236-
String text = extendedDocument.toString();
237237
try {
238238
Matcher matcher = Pattern.compile(pattern.getLeft(), Pattern.CASE_INSENSITIVE).matcher(text);
239239
while (matcher.find()) {

0 commit comments

Comments
 (0)