From 2994bc67a3abcfd4ce13670dcb4a7b12b18b4a8f Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Wed, 6 May 2026 04:15:36 +0100 Subject: [PATCH] refactor and clean up --- .../studio/lsp/messages/DocumentPosition.java | 6 ++ .../CompilerLanguageServiceBridge.java | 60 +------------------ .../compiler/DocumentPositionMapper.java | 57 ++++++++++++++++++ 3 files changed, 65 insertions(+), 58 deletions(-) create mode 100644 prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/messages/DocumentPosition.java create mode 100644 prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/services/compiler/DocumentPositionMapper.java diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/messages/DocumentPosition.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/messages/DocumentPosition.java new file mode 100644 index 00000000..b3ab68ef --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/messages/DocumentPosition.java @@ -0,0 +1,6 @@ +package p.studio.lsp.messages; + +public record DocumentPosition( + int line, + int character) { +} diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/services/compiler/CompilerLanguageServiceBridge.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/services/compiler/CompilerLanguageServiceBridge.java index 07b5cec2..1ff405ee 100644 --- a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/services/compiler/CompilerLanguageServiceBridge.java +++ b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/services/compiler/CompilerLanguageServiceBridge.java @@ -1,5 +1,6 @@ package p.studio.lsp.services.compiler; +import org.apache.commons.lang3.StringUtils; import p.studio.compiler.messages.BuilderPipelineConfig; import p.studio.compiler.messages.BuildingIssue; import p.studio.compiler.models.AnalysisSnapshot; @@ -12,7 +13,6 @@ import p.studio.lsp.services.LanguageServiceBridge; import p.studio.utilities.logs.LogAggregator; import java.net.URI; -import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -37,7 +37,7 @@ public record CompilerLanguageServiceBridge() implements LanguageServiceBridge { final String text) { Objects.requireNonNull(context, "context"); final Path documentPath = normalizeDocumentPath(documentUri); - final String effectiveText = text == null ? "" : text; + final String effectiveText = StringUtils.isBlank(text) ? "" : text; final AnalysisSnapshot snapshot = analyzeProject(context, Map.of(documentPath, effectiveText)); return new BaselineDocumentAnalysis(mapDiagnostics(snapshot, documentPath, effectiveText)); } @@ -121,60 +121,4 @@ public record CompilerLanguageServiceBridge() implements LanguageServiceBridge { private Path normalizeDocumentPath(final String documentUri) { return Path.of(URI.create(Objects.requireNonNull(documentUri, "documentUri"))).toAbsolutePath().normalize(); } - - private record DocumentPosition( - int line, - int character) { - } - - private static final class DocumentPositionMapper { - private final String text; - - private DocumentPositionMapper(final String text) { - this.text = Objects.requireNonNull(text, "text"); - } - - private DocumentPosition positionOf(final Integer byteOffset) { - if (byteOffset == null || byteOffset <= 0 || text.isEmpty()) { - return new DocumentPosition(0, 0); - } - final int target = Math.min(byteOffset, text.getBytes(StandardCharsets.UTF_8).length); - int utf8Offset = 0; - int line = 0; - int character = 0; - for (int index = 0; index < text.length(); ) { - if (utf8Offset >= target) { - return new DocumentPosition(line, character); - } - final int codePoint = text.codePointAt(index); - final int utf16Width = Character.charCount(codePoint); - final int utf8Width = utf8Length(codePoint); - if (utf8Offset + utf8Width > target) { - return new DocumentPosition(line, character); - } - utf8Offset += utf8Width; - if (codePoint == '\n') { - line++; - character = 0; - } else { - character += utf16Width; - } - index += utf16Width; - } - return new DocumentPosition(line, character); - } - - private int utf8Length(final int codePoint) { - if (codePoint <= 0x7F) { - return 1; - } - if (codePoint <= 0x7FF) { - return 2; - } - if (codePoint <= 0xFFFF) { - return 3; - } - return 4; - } - } } diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/services/compiler/DocumentPositionMapper.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/services/compiler/DocumentPositionMapper.java new file mode 100644 index 00000000..7c791003 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/services/compiler/DocumentPositionMapper.java @@ -0,0 +1,57 @@ +package p.studio.lsp.services.compiler; + +import p.studio.lsp.messages.DocumentPosition; + +import java.nio.charset.StandardCharsets; +import java.util.Objects; + +final class DocumentPositionMapper { + private final String text; + + DocumentPositionMapper(final String text) { + this.text = Objects.requireNonNull(text, "text"); + } + + DocumentPosition positionOf(final Integer byteOffset) { + if (byteOffset == null || byteOffset <= 0 || text.isEmpty()) { + return new DocumentPosition(0, 0); + } + final int target = Math.min(byteOffset, text.getBytes(StandardCharsets.UTF_8).length); + int utf8Offset = 0; + int line = 0; + int character = 0; + for (int index = 0; index < text.length(); ) { + if (utf8Offset >= target) { + return new DocumentPosition(line, character); + } + final int codePoint = text.codePointAt(index); + final int utf16Width = Character.charCount(codePoint); + final int utf8Width = utf8Length(codePoint); + if (utf8Offset + utf8Width > target) { + return new DocumentPosition(line, character); + } + utf8Offset += utf8Width; + if (codePoint == '\n') { + line++; + character = 0; + } else { + character += utf16Width; + } + index += utf16Width; + } + return new DocumentPosition(line, character); + } + + private int utf8Length(final int codePoint) { + if (codePoint <= 0x7F) { + return 1; + } + if (codePoint <= 0x7FF) { + return 2; + } + if (codePoint <= 0xFFFF) { + return 3; + } + return 4; + } +} \ No newline at end of file