diff --git a/prometeu-app/src/main/java/p/studio/AppContainer.java b/prometeu-app/src/main/java/p/studio/AppContainer.java index dcaa2b9f..44e825d3 100644 --- a/prometeu-app/src/main/java/p/studio/AppContainer.java +++ b/prometeu-app/src/main/java/p/studio/AppContainer.java @@ -2,10 +2,10 @@ package p.studio; import com.fasterxml.jackson.databind.ObjectMapper; import p.packer.Packer; -import p.lsp.PrometeuLspServiceFactory; -import p.lsp.v1.PrometeuLspV1ServiceFactory; -import p.studio.events.StudioEventBus; -import p.studio.events.StudioPackerEventAdapter; +import p.studio.lsp.LspServiceFactory; +import p.studio.lsp.LspServiceFactoryImpl; +import p.studio.lsp.events.StudioEventBus; +import p.studio.lsp.events.StudioPackerEventAdapter; import p.studio.utilities.ThemeService; import p.studio.utilities.i18n.I18nService; import p.studio.vfs.FilesystemProjectDocumentVfsFactory; @@ -21,7 +21,7 @@ public final class AppContainer implements Container { private final ThemeService themeService; private final StudioEventBus studioEventBus; private final ObjectMapper mapper; - private final PrometeuLspServiceFactory prometeuLspServiceFactory; + private final LspServiceFactory lspServiceFactory; private final ProjectDocumentVfsFactory projectDocumentVfsFactory; private final EmbeddedPacker embeddedPacker; private final StudioBackgroundTasks backgroundTasks; @@ -31,7 +31,7 @@ public final class AppContainer implements Container { this.themeService = new ThemeService(); this.studioEventBus = new StudioEventBus(); this.mapper = new ObjectMapper(); - this.prometeuLspServiceFactory = new PrometeuLspV1ServiceFactory(); + this.lspServiceFactory = new LspServiceFactoryImpl(); this.projectDocumentVfsFactory = new FilesystemProjectDocumentVfsFactory(); final ExecutorService backgroundExecutor = Executors.newFixedThreadPool(2, new StudioWorkerThreadFactory()); this.backgroundTasks = new StudioBackgroundTasks(backgroundExecutor); @@ -60,8 +60,8 @@ public final class AppContainer implements Container { } @Override - public PrometeuLspServiceFactory getPrometeuLspServiceFactory() { - return prometeuLspServiceFactory; + public LspServiceFactory getPrometeuLspServiceFactory() { + return lspServiceFactory; } @Override diff --git a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/models/AnalysisSnapshot.java b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/models/AnalysisSnapshot.java index 3160e38e..5d2ac0f9 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/models/AnalysisSnapshot.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/models/AnalysisSnapshot.java @@ -6,6 +6,7 @@ import p.studio.compiler.source.tables.FileTableReader; import java.util.List; public record AnalysisSnapshot( + FrontendSpec frontendSpec, List diagnostics, ResolvedWorkspace resolvedWorkspace, FileTableReader fileTable, diff --git a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/BuilderPipelineService.java b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/BuilderPipelineService.java index 4a2accbb..661cf7dd 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/BuilderPipelineService.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/BuilderPipelineService.java @@ -59,6 +59,7 @@ public class BuilderPipelineService { final LogAggregator logs) { final var diagnostics = run(ctx, logs, analyses, new ArrayList<>()); return new AnalysisSnapshot( + ctx.resolvedWorkspace.frontendSpec(), diagnostics, ctx.resolvedWorkspace, ctx.fileTable, diff --git a/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/BuilderPipelinePublicSurfaceTest.java b/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/BuilderPipelinePublicSurfaceTest.java index 3659f0a4..d828fd9c 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/BuilderPipelinePublicSurfaceTest.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/BuilderPipelinePublicSurfaceTest.java @@ -30,7 +30,7 @@ class BuilderPipelinePublicSurfaceTest { @Test void analysisSnapshotMustExposeMinimumSharedContract() { assertEquals( - Set.of("diagnostics", "resolvedWorkspace", "fileTable", "irBackend"), + Set.of("frontendSpec", "diagnostics", "resolvedWorkspace", "fileTable", "irBackend"), recordComponentNames(AnalysisSnapshot.class), "analysis snapshot must expose the minimum shared contract"); } diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/PrometeuLspService.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/PrometeuLspService.java deleted file mode 100644 index e0ffefa9..00000000 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/PrometeuLspService.java +++ /dev/null @@ -1,24 +0,0 @@ -package p.lsp; - -import p.lsp.dtos.PrometeuLspSessionStateDTO; -import p.lsp.messages.PrometeuLspAnalyzeDocumentRequest; -import p.lsp.messages.PrometeuLspAnalyzeDocumentResult; -import p.lsp.messages.PrometeuLspDefinitionRequest; -import p.lsp.messages.PrometeuLspDefinitionResult; -import p.studio.vfs.ProjectDocumentVfs; - -public interface PrometeuLspService extends AutoCloseable { - PrometeuLspProjectContext projectContext(); - - ProjectDocumentVfs projectDocumentVfs(); - - PrometeuLspSessionStateDTO snapshot(); - - PrometeuLspAnalyzeDocumentResult analyzeDocument(PrometeuLspAnalyzeDocumentRequest request); - - PrometeuLspDefinitionResult definition(PrometeuLspDefinitionRequest request); - - @Override - default void close() { - } -} diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/PrometeuLspServiceFactory.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/PrometeuLspServiceFactory.java deleted file mode 100644 index 14e6eb0d..00000000 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/PrometeuLspServiceFactory.java +++ /dev/null @@ -1,7 +0,0 @@ -package p.lsp; - -import p.studio.vfs.ProjectDocumentVfs; - -public interface PrometeuLspServiceFactory { - PrometeuLspService open(PrometeuLspProjectContext projectContext, ProjectDocumentVfs projectDocumentVfs); -} diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspDiagnosticSeverityDTO.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspDiagnosticSeverityDTO.java deleted file mode 100644 index 968a5669..00000000 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspDiagnosticSeverityDTO.java +++ /dev/null @@ -1,6 +0,0 @@ -package p.lsp.dtos; - -public enum PrometeuLspDiagnosticSeverityDTO { - ERROR, - WARNING -} diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/events/PrometeuLspEventKind.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/events/PrometeuLspEventKind.java deleted file mode 100644 index 2019a9dc..00000000 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/events/PrometeuLspEventKind.java +++ /dev/null @@ -1,5 +0,0 @@ -package p.lsp.events; - -public enum PrometeuLspEventKind { - SESSION_READY -} diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/events/PrometeuLspEventSink.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/events/PrometeuLspEventSink.java deleted file mode 100644 index de9fc4b3..00000000 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/events/PrometeuLspEventSink.java +++ /dev/null @@ -1,5 +0,0 @@ -package p.lsp.events; - -public interface PrometeuLspEventSink { - void publish(PrometeuLspEvent event); -} diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/messages/PrometeuLspAnalyzeDocumentResult.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/messages/PrometeuLspAnalyzeDocumentResult.java deleted file mode 100644 index cda690fa..00000000 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/messages/PrometeuLspAnalyzeDocumentResult.java +++ /dev/null @@ -1,25 +0,0 @@ -package p.lsp.messages; - -import p.lsp.dtos.PrometeuLspDiagnosticDTO; -import p.lsp.dtos.PrometeuLspHighlightSpanDTO; -import p.lsp.dtos.PrometeuLspSessionStateDTO; -import p.lsp.dtos.PrometeuLspSymbolDTO; - -import java.util.List; -import java.util.Objects; - -public record PrometeuLspAnalyzeDocumentResult( - PrometeuLspSessionStateDTO sessionState, - List diagnostics, - List semanticHighlights, - List documentSymbols, - List workspaceSymbols) { - - public PrometeuLspAnalyzeDocumentResult { - Objects.requireNonNull(sessionState, "sessionState"); - diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics")); - semanticHighlights = List.copyOf(Objects.requireNonNull(semanticHighlights, "semanticHighlights")); - documentSymbols = List.copyOf(Objects.requireNonNull(documentSymbols, "documentSymbols")); - workspaceSymbols = List.copyOf(Objects.requireNonNull(workspaceSymbols, "workspaceSymbols")); - } -} diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/LspService.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/LspService.java new file mode 100644 index 00000000..7c6ca613 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/LspService.java @@ -0,0 +1,21 @@ +package p.studio.lsp; + +import p.studio.lsp.dtos.LspSessionStateDTO; +import p.studio.lsp.messages.*; +import p.studio.vfs.VfsProjectDocument; + +public interface LspService extends AutoCloseable { + LspProjectContext projectContext(); + + VfsProjectDocument projectDocumentVfs(); + + LspSessionStateDTO snapshot(); + + LspAnalyzeDocumentResult analyzeDocument(LspAnalyzeDocumentRequest request); + + LspDefinitionResult definition(LspDefinitionRequest request); + + @Override + default void close() { + } +} diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/LspServiceFactory.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/LspServiceFactory.java new file mode 100644 index 00000000..69e6c4f6 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/LspServiceFactory.java @@ -0,0 +1,8 @@ +package p.studio.lsp; + +import p.studio.lsp.messages.LspProjectContext; +import p.studio.vfs.VfsProjectDocument; + +public interface LspServiceFactory { + LspService open(LspProjectContext projectContext, VfsProjectDocument vfsProjectDocument); +} diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspDefinitionTargetDTO.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspDefinitionTargetDTO.java similarity index 68% rename from prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspDefinitionTargetDTO.java rename to prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspDefinitionTargetDTO.java index 214d7834..3eadeee4 100644 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspDefinitionTargetDTO.java +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspDefinitionTargetDTO.java @@ -1,14 +1,14 @@ -package p.lsp.dtos; +package p.studio.lsp.dtos; import java.nio.file.Path; import java.util.Objects; -public record PrometeuLspDefinitionTargetDTO( +public record LspDefinitionTargetDTO( String name, Path documentPath, - PrometeuLspRangeDTO range) { + LspRangeDTO range) { - public PrometeuLspDefinitionTargetDTO { + public LspDefinitionTargetDTO { name = Objects.requireNonNull(name, "name"); documentPath = Objects.requireNonNull(documentPath, "documentPath").toAbsolutePath().normalize(); range = Objects.requireNonNull(range, "range"); diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspDiagnosticDTO.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspDiagnosticDTO.java similarity index 71% rename from prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspDiagnosticDTO.java rename to prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspDiagnosticDTO.java index b33919da..3eb485e1 100644 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspDiagnosticDTO.java +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspDiagnosticDTO.java @@ -1,17 +1,19 @@ -package p.lsp.dtos; +package p.studio.lsp.dtos; + +import p.studio.lsp.messages.LspDiagnosticSeverity; import java.nio.file.Path; import java.util.Objects; -public record PrometeuLspDiagnosticDTO( +public record LspDiagnosticDTO( Path documentPath, - PrometeuLspRangeDTO range, - PrometeuLspDiagnosticSeverityDTO severity, + LspRangeDTO range, + LspDiagnosticSeverity severity, String phase, String code, String message) { - public PrometeuLspDiagnosticDTO { + public LspDiagnosticDTO { documentPath = Objects.requireNonNull(documentPath, "documentPath").toAbsolutePath().normalize(); range = Objects.requireNonNull(range, "range"); severity = Objects.requireNonNull(severity, "severity"); diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspHighlightSpanDTO.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspHighlightSpanDTO.java similarity index 58% rename from prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspHighlightSpanDTO.java rename to prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspHighlightSpanDTO.java index eb1557ef..d0b01e3b 100644 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspHighlightSpanDTO.java +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspHighlightSpanDTO.java @@ -1,12 +1,12 @@ -package p.lsp.dtos; +package p.studio.lsp.dtos; import java.util.Objects; -public record PrometeuLspHighlightSpanDTO( - PrometeuLspRangeDTO range, +public record LspHighlightSpanDTO( + LspRangeDTO range, String semanticKey) { - public PrometeuLspHighlightSpanDTO { + public LspHighlightSpanDTO { range = Objects.requireNonNull(range, "range"); semanticKey = Objects.requireNonNull(semanticKey, "semanticKey"); } diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspRangeDTO.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspRangeDTO.java similarity index 75% rename from prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspRangeDTO.java rename to prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspRangeDTO.java index ff4f11c3..108af2bd 100644 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspRangeDTO.java +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspRangeDTO.java @@ -1,10 +1,10 @@ -package p.lsp.dtos; +package p.studio.lsp.dtos; -public record PrometeuLspRangeDTO( +public record LspRangeDTO( int startOffset, int endOffset) { - public PrometeuLspRangeDTO { + public LspRangeDTO { startOffset = Math.max(0, startOffset); endOffset = Math.max(startOffset, endOffset); } diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspSessionStateDTO.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspSessionStateDTO.java similarity index 71% rename from prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspSessionStateDTO.java rename to prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspSessionStateDTO.java index 19b773a2..91e758b7 100644 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspSessionStateDTO.java +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspSessionStateDTO.java @@ -1,13 +1,13 @@ -package p.lsp.dtos; +package p.studio.lsp.dtos; import java.util.List; import java.util.Objects; -public record PrometeuLspSessionStateDTO( +public record LspSessionStateDTO( boolean semanticReadReady, List declaredCapabilities) { - public PrometeuLspSessionStateDTO { + public LspSessionStateDTO { declaredCapabilities = List.copyOf(Objects.requireNonNull(declaredCapabilities, "declaredCapabilities")); } } diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspSymbolDTO.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspSymbolDTO.java similarity index 68% rename from prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspSymbolDTO.java rename to prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspSymbolDTO.java index 1a762c2d..124b69a0 100644 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspSymbolDTO.java +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/dtos/LspSymbolDTO.java @@ -1,17 +1,19 @@ -package p.lsp.dtos; +package p.studio.lsp.dtos; + +import p.studio.lsp.messages.LspSymbolKind; import java.nio.file.Path; import java.util.List; import java.util.Objects; -public record PrometeuLspSymbolDTO( +public record LspSymbolDTO( String name, - PrometeuLspSymbolKindDTO kind, + LspSymbolKind kind, Path documentPath, - PrometeuLspRangeDTO range, - List children) { + LspRangeDTO range, + List children) { - public PrometeuLspSymbolDTO { + public LspSymbolDTO { name = Objects.requireNonNull(name, "name"); kind = Objects.requireNonNull(kind, "kind"); documentPath = Objects.requireNonNull(documentPath, "documentPath").toAbsolutePath().normalize(); diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/events/PrometeuLspEvent.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/events/LspEvent.java similarity index 57% rename from prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/events/PrometeuLspEvent.java rename to prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/events/LspEvent.java index 0ab44970..7a218128 100644 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/events/PrometeuLspEvent.java +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/events/LspEvent.java @@ -1,12 +1,12 @@ -package p.lsp.events; +package p.studio.lsp.events; import java.util.Objects; -public record PrometeuLspEvent( - PrometeuLspEventKind kind, +public record LspEvent( + LspEventKind kind, String message) { - public PrometeuLspEvent { + public LspEvent { Objects.requireNonNull(kind, "kind"); Objects.requireNonNull(message, "message"); } diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/events/LspEventKind.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/events/LspEventKind.java new file mode 100644 index 00000000..94afdb08 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/events/LspEventKind.java @@ -0,0 +1,5 @@ +package p.studio.lsp.events; + +public enum LspEventKind { + SESSION_READY +} diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/events/LspEventSink.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/events/LspEventSink.java new file mode 100644 index 00000000..eca8e3c5 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/events/LspEventSink.java @@ -0,0 +1,5 @@ +package p.studio.lsp.events; + +public interface LspEventSink { + void publish(LspEvent event); +} diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/messages/PrometeuLspAnalyzeDocumentRequest.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspAnalyzeDocumentRequest.java similarity index 62% rename from prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/messages/PrometeuLspAnalyzeDocumentRequest.java rename to prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspAnalyzeDocumentRequest.java index 89e40d55..c5d3c5d2 100644 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/messages/PrometeuLspAnalyzeDocumentRequest.java +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspAnalyzeDocumentRequest.java @@ -1,12 +1,12 @@ -package p.lsp.messages; +package p.studio.lsp.messages; import java.nio.file.Path; import java.util.Objects; -public record PrometeuLspAnalyzeDocumentRequest( +public record LspAnalyzeDocumentRequest( Path documentPath) { - public PrometeuLspAnalyzeDocumentRequest { + public LspAnalyzeDocumentRequest { documentPath = Objects.requireNonNull(documentPath, "documentPath").toAbsolutePath().normalize(); } } diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspAnalyzeDocumentResult.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspAnalyzeDocumentResult.java new file mode 100644 index 00000000..abf5b230 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspAnalyzeDocumentResult.java @@ -0,0 +1,25 @@ +package p.studio.lsp.messages; + +import p.studio.lsp.dtos.LspDiagnosticDTO; +import p.studio.lsp.dtos.LspHighlightSpanDTO; +import p.studio.lsp.dtos.LspSessionStateDTO; +import p.studio.lsp.dtos.LspSymbolDTO; + +import java.util.List; +import java.util.Objects; + +public record LspAnalyzeDocumentResult( + LspSessionStateDTO sessionState, + List diagnostics, + List semanticHighlights, + List documentSymbols, + List workspaceSymbols) { + + public LspAnalyzeDocumentResult { + Objects.requireNonNull(sessionState, "sessionState"); + diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics")); + semanticHighlights = List.copyOf(Objects.requireNonNull(semanticHighlights, "semanticHighlights")); + documentSymbols = List.copyOf(Objects.requireNonNull(documentSymbols, "documentSymbols")); + workspaceSymbols = List.copyOf(Objects.requireNonNull(workspaceSymbols, "workspaceSymbols")); + } +} diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/messages/PrometeuLspDefinitionRequest.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspDefinitionRequest.java similarity index 70% rename from prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/messages/PrometeuLspDefinitionRequest.java rename to prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspDefinitionRequest.java index a3a7b2d8..af205092 100644 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/messages/PrometeuLspDefinitionRequest.java +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspDefinitionRequest.java @@ -1,13 +1,13 @@ -package p.lsp.messages; +package p.studio.lsp.messages; import java.nio.file.Path; import java.util.Objects; -public record PrometeuLspDefinitionRequest( +public record LspDefinitionRequest( Path documentPath, int offset) { - public PrometeuLspDefinitionRequest { + public LspDefinitionRequest { documentPath = Objects.requireNonNull(documentPath, "documentPath").toAbsolutePath().normalize(); offset = Math.max(0, offset); } diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/messages/PrometeuLspDefinitionResult.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspDefinitionResult.java similarity index 62% rename from prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/messages/PrometeuLspDefinitionResult.java rename to prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspDefinitionResult.java index febb27f4..8067702c 100644 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/messages/PrometeuLspDefinitionResult.java +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspDefinitionResult.java @@ -1,17 +1,17 @@ -package p.lsp.messages; +package p.studio.lsp.messages; -import p.lsp.dtos.PrometeuLspDefinitionTargetDTO; +import p.studio.lsp.dtos.LspDefinitionTargetDTO; import java.nio.file.Path; import java.util.List; import java.util.Objects; -public record PrometeuLspDefinitionResult( +public record LspDefinitionResult( Path documentPath, int offset, - List targets) { + List targets) { - public PrometeuLspDefinitionResult { + public LspDefinitionResult { documentPath = Objects.requireNonNull(documentPath, "documentPath").toAbsolutePath().normalize(); offset = Math.max(0, offset); targets = List.copyOf(Objects.requireNonNull(targets, "targets")); diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspDiagnosticSeverity.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspDiagnosticSeverity.java new file mode 100644 index 00000000..2481f6b1 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspDiagnosticSeverity.java @@ -0,0 +1,6 @@ +package p.studio.lsp.messages; + +public enum LspDiagnosticSeverity { + ERROR, + WARNING +} diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/PrometeuLspProjectContext.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspProjectContext.java similarity index 78% rename from prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/PrometeuLspProjectContext.java rename to prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspProjectContext.java index 8c5753cf..85b44151 100644 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/PrometeuLspProjectContext.java +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspProjectContext.java @@ -1,14 +1,14 @@ -package p.lsp; +package p.studio.lsp.messages; import java.nio.file.Path; import java.util.Objects; -public record PrometeuLspProjectContext( +public record LspProjectContext( String projectName, String languageId, Path rootPath) { - public PrometeuLspProjectContext { + public LspProjectContext { Objects.requireNonNull(projectName, "projectName"); Objects.requireNonNull(languageId, "languageId"); rootPath = Objects.requireNonNull(rootPath, "rootPath").toAbsolutePath().normalize(); diff --git a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspSymbolKindDTO.java b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspSymbolKind.java similarity index 77% rename from prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspSymbolKindDTO.java rename to prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspSymbolKind.java index f07b3078..580af5c3 100644 --- a/prometeu-lsp/prometeu-lsp-api/src/main/java/p/lsp/dtos/PrometeuLspSymbolKindDTO.java +++ b/prometeu-lsp/prometeu-lsp-api/src/main/java/p/studio/lsp/messages/LspSymbolKind.java @@ -1,6 +1,6 @@ -package p.lsp.dtos; +package p.studio.lsp.messages; -public enum PrometeuLspSymbolKindDTO { +public enum LspSymbolKind { FUNCTION, METHOD, CONSTRUCTOR, diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/lsp/v1/PrometeuLspV1ServiceFactory.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/lsp/v1/PrometeuLspV1ServiceFactory.java deleted file mode 100644 index 09f786be..00000000 --- a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/lsp/v1/PrometeuLspV1ServiceFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -package p.lsp.v1; - -import p.lsp.PrometeuLspProjectContext; -import p.lsp.PrometeuLspService; -import p.lsp.PrometeuLspServiceFactory; -import p.lsp.v1.internal.PrometeuLspV1Service; -import p.studio.vfs.ProjectDocumentVfs; - -import java.util.Objects; - -public final class PrometeuLspV1ServiceFactory implements PrometeuLspServiceFactory { - @Override - public PrometeuLspService open( - final PrometeuLspProjectContext projectContext, - final ProjectDocumentVfs projectDocumentVfs) { - return new PrometeuLspV1Service( - Objects.requireNonNull(projectContext, "projectContext"), - Objects.requireNonNull(projectDocumentVfs, "projectDocumentVfs")); - } -} diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/lsp/v1/internal/PrometeuLspSemanticReadPhase.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/lsp/v1/internal/PrometeuLspSemanticReadPhase.java deleted file mode 100644 index da0d75d3..00000000 --- a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/lsp/v1/internal/PrometeuLspSemanticReadPhase.java +++ /dev/null @@ -1,500 +0,0 @@ -package p.lsp.v1.internal; - -import p.lsp.PrometeuLspProjectContext; -import p.lsp.dtos.*; -import p.lsp.messages.PrometeuLspAnalyzeDocumentRequest; -import p.lsp.messages.PrometeuLspAnalyzeDocumentResult; -import p.lsp.messages.PrometeuLspDefinitionRequest; -import p.lsp.messages.PrometeuLspDefinitionResult; -import p.studio.compiler.FrontendRegistryService; -import p.studio.compiler.messages.BuildingIssue; -import p.studio.compiler.messages.BuildingIssueSink; -import p.studio.compiler.messages.BuilderPipelineConfig; -import p.studio.compiler.messages.FESurfaceContext; -import p.studio.compiler.messages.FrontendPhaseContext; -import p.studio.compiler.messages.HostAdmissionContext; -import p.studio.compiler.models.AnalysisSnapshot; -import p.studio.compiler.models.BuilderPipelineContext; -import p.studio.compiler.models.SourceHandle; -import p.studio.compiler.pbs.ast.PbsAst; -import p.studio.compiler.pbs.lexer.PbsLexer; -import p.studio.compiler.pbs.lexer.PbsToken; -import p.studio.compiler.pbs.lexer.PbsTokenKind; -import p.studio.compiler.pbs.parser.PbsParser; -import p.studio.compiler.source.Span; -import p.studio.compiler.source.diagnostics.Diagnostic; -import p.studio.compiler.source.diagnostics.DiagnosticSink; -import p.studio.compiler.source.identifiers.FileId; -import p.studio.compiler.workspaces.AssetSurfaceContextLoader; -import p.studio.compiler.workspaces.PipelineStage; -import p.studio.compiler.workspaces.stages.LoadSourcesPipelineStage; -import p.studio.compiler.workspaces.stages.ResolveDepsPipelineStage; -import p.studio.utilities.logs.LogAggregator; -import p.studio.vfs.ProjectDocumentVfs; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; - -final class PrometeuLspSemanticReadPhase { - private PrometeuLspSemanticReadPhase() { - } - - static PrometeuLspAnalyzeDocumentResult analyze( - final PrometeuLspProjectContext projectContext, - final ProjectDocumentVfs projectDocumentVfs, - final PrometeuLspAnalyzeDocumentRequest request) { - final SemanticSession session = buildSession(projectContext, projectDocumentVfs, request.documentPath()); - final Path normalizedRequestedDocument = normalize(request.documentPath()); - return new PrometeuLspAnalyzeDocumentResult( - new PrometeuLspSessionStateDTO(true, List.of("diagnostics", "symbols", "definition", "highlight")), - session.diagnosticsByDocument().getOrDefault(normalizedRequestedDocument, List.of()), - session.semanticHighlightsByDocument().getOrDefault(normalizedRequestedDocument, List.of()), - session.documentSymbolsByDocument().getOrDefault(normalizedRequestedDocument, List.of()), - session.workspaceSymbols()); - } - - static PrometeuLspDefinitionResult definition( - final PrometeuLspProjectContext projectContext, - final ProjectDocumentVfs projectDocumentVfs, - final PrometeuLspDefinitionRequest request) { - final SemanticSession session = buildSession(projectContext, projectDocumentVfs, request.documentPath()); - final List targets = resolveDefinitionTargets(session, request); - return new PrometeuLspDefinitionResult(request.documentPath(), request.offset(), targets); - } - - private static SemanticSession buildSession( - final PrometeuLspProjectContext projectContext, - final ProjectDocumentVfs projectDocumentVfs, - final Path requestedDocumentPath) { - final BuilderPipelineConfig config = new BuilderPipelineConfig( - false, - projectContext.rootPath().toString(), - "core-v1", - new PrometeuLspVfsOverlaySourceProviderFactory(projectDocumentVfs, requestedDocumentPath)); - final BuilderPipelineContext context = BuilderPipelineContext.fromConfig(config); - final AnalysisRuntimeSnapshot snapshot = runAnalysisStages(context); - return index(snapshot, requestedDocumentPath); - } - - private static AnalysisRuntimeSnapshot runAnalysisStages(final BuilderPipelineContext context) { - final LogAggregator logs = LogAggregator.empty(); - final List diagnostics = new ArrayList<>(); - final List stages = List.of( - new ResolveDepsPipelineStage(), - new LoadSourcesPipelineStage()); - for (final PipelineStage stage : stages) { - final BuildingIssueSink stageIssues = stage.run(context, logs); - diagnostics.addAll(stageIssues.asCollection()); - if (stageIssues.hasErrors()) { - break; - } - } - final DiagnosticSink frontendDiagnostics = DiagnosticSink.empty(); - if (context.resolvedWorkspace != null && context.fileTable != null) { - final BuildingIssueSink frontendIssues = runFrontendPhase(context, logs, frontendDiagnostics); - diagnostics.addAll(frontendIssues.asCollection()); - } - return new AnalysisRuntimeSnapshot( - new AnalysisSnapshot( - diagnostics, - context.resolvedWorkspace, - context.fileTable, - context.irBackend), - List.copyOf(frontendDiagnostics.asCollection())); - } - - private static BuildingIssueSink runFrontendPhase( - final BuilderPipelineContext context, - final LogAggregator logs, - final DiagnosticSink frontendDiagnostics) { - final var frontendSpec = context.resolvedWorkspace.frontendSpec(); - final var service = FrontendRegistryService.getFrontendPhaseService(frontendSpec.getLanguageId()); - if (service.isEmpty()) { - return BuildingIssueSink.empty().report(builder -> builder - .error(true) - .message("[BUILD]: unable to find a service for frontend phase: " + frontendSpec.getLanguageId())); - } - final FESurfaceContext feSurfaceContext = new AssetSurfaceContextLoader().load(context.resolvedWorkspace.mainProject().getRootPath()); - final FrontendPhaseContext frontendPhaseContext = new FrontendPhaseContext( - context.resolvedWorkspace.graph().projectTable(), - context.fileTable, - context.resolvedWorkspace.stack(), - context.resolvedWorkspace.stdlib(), - HostAdmissionContext.permissiveDefault(), - feSurfaceContext); - final BuildingIssueSink issues = BuildingIssueSink.empty(); - context.irBackend = service.get().compile(frontendPhaseContext, frontendDiagnostics, logs, issues); - return issues; - } - - private static SemanticSession index( - final AnalysisRuntimeSnapshot runtimeSnapshot, - final Path requestedDocumentPath) { - final AnalysisSnapshot snapshot = runtimeSnapshot.analysisSnapshot(); - final Map> diagnosticsByDocument = diagnosticsByDocument( - snapshot.diagnostics(), - snapshot, - runtimeSnapshot.frontendDiagnostics()); - final SemanticIndex semanticIndex = new SemanticIndex(); - if (snapshot.fileTable() == null) { - return new SemanticSession( - normalize(requestedDocumentPath), - diagnosticsByDocument, - Map.of(), - Map.of(), - List.of(), - Map.of(), - Map.of()); - } - for (final FileId fileId : snapshot.fileTable()) { - final SourceHandle sourceHandle = snapshot.fileTable().get(fileId); - if (!isPbsSource(sourceHandle)) { - continue; - } - final String source = sourceHandle.readUtf8().orElse(""); - final DiagnosticSink diagnostics = DiagnosticSink.empty(); - final var tokens = PbsLexer.lex(source, fileId, diagnostics); - final PbsAst.File ast = PbsParser.parse(tokens, fileId, diagnostics, PbsParser.ParseMode.ORDINARY); - semanticIndex.index(sourceHandle.getCanonPath(), ast, tokens.asList()); - } - return new SemanticSession( - normalize(requestedDocumentPath), - diagnosticsByDocument, - semanticIndex.semanticHighlightsByDocument(), - semanticIndex.documentSymbolsByDocument(), - semanticIndex.workspaceSymbols(), - semanticIndex.symbolsByName(), - semanticIndex.tokensByDocument()); - } - - private static boolean isPbsSource(final SourceHandle sourceHandle) { - return "pbs".equalsIgnoreCase(sourceHandle.getExtension()); - } - - private static Map> diagnosticsByDocument( - final List issues, - final AnalysisSnapshot snapshot, - final List frontendDiagnostics) { - final Map> diagnosticsByDocument = new LinkedHashMap<>(); - for (final var issue : issues) { - if (issue.getFileId() == null || issue.getFileId() < 0) { - continue; - } - if (snapshot.fileTable() == null || issue.getFileId() >= snapshot.fileTable().size()) { - continue; - } - final SourceHandle sourceHandle = snapshot.fileTable().get(new FileId(issue.getFileId())); - final Path documentPath = sourceHandle.getCanonPath().toAbsolutePath().normalize(); - diagnosticsByDocument - .computeIfAbsent(documentPath, ignored -> new ArrayList<>()) - .add(new PrometeuLspDiagnosticDTO( - documentPath, - new PrometeuLspRangeDTO( - safeOffset(issue.getStart()), - safeEnd(issue.getStart(), issue.getEnd())), - issue.isError() - ? PrometeuLspDiagnosticSeverityDTO.ERROR - : PrometeuLspDiagnosticSeverityDTO.WARNING, - issue.getPhase(), - issue.getCode(), - issue.getMessage())); - } - for (final Diagnostic diagnostic : frontendDiagnostics) { - if (snapshot.fileTable() == null || diagnostic.getSpan() == null || diagnostic.getSpan().getFileId().isNone()) { - continue; - } - final SourceHandle sourceHandle = snapshot.fileTable().get(diagnostic.getSpan().getFileId()); - final Path documentPath = sourceHandle.getCanonPath().toAbsolutePath().normalize(); - diagnosticsByDocument - .computeIfAbsent(documentPath, ignored -> new ArrayList<>()) - .add(new PrometeuLspDiagnosticDTO( - documentPath, - new PrometeuLspRangeDTO( - (int) diagnostic.getSpan().getStart(), - (int) diagnostic.getSpan().getEnd()), - diagnostic.getSeverity().isError() - ? PrometeuLspDiagnosticSeverityDTO.ERROR - : PrometeuLspDiagnosticSeverityDTO.WARNING, - diagnostic.getPhase().name(), - diagnostic.getCode(), - diagnostic.getMessage())); - } - return freezeMapOfLists(diagnosticsByDocument); - } - - private static int safeOffset(final Integer value) { - return value == null ? 0 : Math.max(0, value); - } - - private static int safeEnd(final Integer start, final Integer end) { - final int safeStart = safeOffset(start); - final int safeEnd = safeOffset(end); - return Math.max(safeStart, safeEnd); - } - - private static List resolveDefinitionTargets( - final SemanticSession session, - final PrometeuLspDefinitionRequest request) { - final Path documentPath = normalize(request.documentPath()); - final List tokens = session.tokensByDocument().getOrDefault(documentPath, List.of()); - final PbsToken activeToken = tokenAt(tokens, request.offset()); - if (activeToken == null || activeToken.kind() != PbsTokenKind.IDENTIFIER) { - return List.of(); - } - final String lexeme = activeToken.lexeme(); - final List sameDocumentMatches = session.symbolsByName().getOrDefault(lexeme, List.of()).stream() - .filter(symbol -> symbol.documentPath().equals(documentPath)) - .toList(); - final List effectiveMatches = sameDocumentMatches.isEmpty() - ? session.symbolsByName().getOrDefault(lexeme, List.of()) - : sameDocumentMatches; - return effectiveMatches.stream() - .map(symbol -> new PrometeuLspDefinitionTargetDTO(symbol.name(), symbol.documentPath(), symbol.range())) - .toList(); - } - - private static PbsToken tokenAt(final List tokens, final int offset) { - for (final PbsToken token : tokens) { - if (token.start() <= offset && offset < token.end()) { - return token; - } - } - return null; - } - - private static Path normalize(final Path path) { - final Path normalized = Objects.requireNonNull(path, "path").toAbsolutePath().normalize(); - try { - return Files.exists(normalized) ? normalized.toRealPath() : normalized; - } catch (IOException ignored) { - return normalized; - } - } - - private static Map> freezeMapOfLists(final Map> mutable) { - final Map> frozen = new LinkedHashMap<>(); - for (final var entry : mutable.entrySet()) { - frozen.put(entry.getKey(), List.copyOf(entry.getValue())); - } - return Map.copyOf(frozen); - } - - private record SemanticSession( - Path requestedDocumentPath, - Map> diagnosticsByDocument, - Map> semanticHighlightsByDocument, - Map> documentSymbolsByDocument, - List workspaceSymbols, - Map> symbolsByName, - Map> tokensByDocument) { - } - - private record AnalysisRuntimeSnapshot( - AnalysisSnapshot analysisSnapshot, - List frontendDiagnostics) { - } - - private static final class SemanticIndex { - private final Map> semanticHighlightsByDocument = new LinkedHashMap<>(); - private final Map> documentSymbolsByDocument = new LinkedHashMap<>(); - private final List workspaceSymbols = new ArrayList<>(); - private final Map> symbolsByName = new LinkedHashMap<>(); - private final Map> tokensByDocument = new LinkedHashMap<>(); - - void index( - final Path documentPath, - final PbsAst.File ast, - final List tokens) { - final Path normalizedDocumentPath = normalize(documentPath); - tokensByDocument.put(normalizedDocumentPath, List.copyOf(tokens)); - final List documentSymbols = new ArrayList<>(); - for (final PbsAst.TopDecl topDecl : ast.topDecls()) { - final PrometeuLspSymbolDTO symbol = symbolForTopDecl(normalizedDocumentPath, topDecl); - if (symbol == null) { - continue; - } - documentSymbols.add(symbol); - workspaceSymbols.add(symbol); - symbolsByName.computeIfAbsent(symbol.name(), ignored -> new ArrayList<>()).add(symbol); - for (final PrometeuLspSymbolDTO child : symbol.children()) { - symbolsByName.computeIfAbsent(child.name(), ignored -> new ArrayList<>()).add(child); - } - } - semanticHighlightsByDocument.put( - normalizedDocumentPath, - buildSemanticHighlights(tokens, symbolsByName)); - documentSymbolsByDocument.put(normalizedDocumentPath, List.copyOf(documentSymbols)); - } - - private List buildSemanticHighlights( - final List tokens, - final Map> indexedSymbolsByName) { - final List highlights = new ArrayList<>(); - for (final PbsToken token : tokens) { - if (token.kind() == PbsTokenKind.EOF) { - continue; - } - final String semanticKey = semanticKey(token, indexedSymbolsByName); - if (semanticKey == null || semanticKey.isBlank()) { - continue; - } - highlights.add(new PrometeuLspHighlightSpanDTO( - new PrometeuLspRangeDTO(token.start(), token.end()), - semanticKey)); - } - return List.copyOf(highlights); - } - - private String semanticKey( - final PbsToken token, - final Map> indexedSymbolsByName) { - return switch (token.kind()) { - case COMMENT -> "fe-comment"; - case STRING_LITERAL -> "fe-string"; - case INT_LITERAL, FLOAT_LITERAL, BOUNDED_LITERAL -> "fe-number"; - case TRUE, FALSE, NONE -> "fe-literal"; - case IDENTIFIER -> semanticKeyForIdentifier(token.lexeme(), indexedSymbolsByName); - case IMPORT, FROM, AS, SERVICE, HOST, FN, APPLY, BIND, NEW, IMPLEMENTS, USING, CTOR, - DECLARE, LET, CONST, GLOBAL, STRUCT, CONTRACT, ERROR, ENUM, CALLBACK, BUILTIN, - SELF, THIS, PUB, MUT, MOD, TYPE, IF, ELSE, SWITCH, DEFAULT, FOR, UNTIL, STEP, - WHILE, BREAK, CONTINUE, RETURN, VOID, OPTIONAL, RESULT, SOME, OK, ERR, HANDLE, - AND, OR, NOT -> "fe-keyword"; - case PLUS, MINUS, STAR, SLASH, PERCENT, BANG, PLUS_EQUAL, MINUS_EQUAL, STAR_EQUAL, - SLASH_EQUAL, PERCENT_EQUAL, BANG_EQUAL, EQUAL, EQUAL_EQUAL, LESS, LESS_EQUAL, - GREATER, GREATER_EQUAL, AND_AND, OR_OR, ARROW, QUESTION -> "fe-operator"; - case LEFT_PAREN, RIGHT_PAREN, LEFT_BRACE, RIGHT_BRACE, LEFT_BRACKET, RIGHT_BRACKET, - COMMA, COLON, SEMICOLON, AT, DOT, DOT_DOT -> "fe-punctuation"; - default -> null; - }; - } - - private String semanticKeyForIdentifier( - final String lexeme, - final Map> indexedSymbolsByName) { - final List symbols = indexedSymbolsByName.getOrDefault(lexeme, List.of()); - if (symbols.isEmpty()) { - return "fe-identifier"; - } - final PrometeuLspSymbolKindDTO kind = symbols.get(0).kind(); - return switch (kind) { - case FUNCTION, METHOD, CALLBACK -> "fe-callable"; - case STRUCT, CONTRACT, HOST, BUILTIN_TYPE, SERVICE, ERROR, ENUM -> "fe-type"; - case GLOBAL, CONST -> "fe-binding"; - default -> "fe-identifier"; - }; - } - - private PrometeuLspSymbolDTO symbolForTopDecl( - final Path documentPath, - final PbsAst.TopDecl topDecl) { - if (topDecl instanceof PbsAst.FunctionDecl functionDecl) { - return symbol(documentPath, functionDecl.name(), PrometeuLspSymbolKindDTO.FUNCTION, functionDecl.span(), List.of()); - } - if (topDecl instanceof PbsAst.StructDecl structDecl) { - return symbol(documentPath, structDecl.name(), PrometeuLspSymbolKindDTO.STRUCT, structDecl.span(), structChildren(documentPath, structDecl)); - } - if (topDecl instanceof PbsAst.ContractDecl contractDecl) { - return symbol(documentPath, contractDecl.name(), PrometeuLspSymbolKindDTO.CONTRACT, contractDecl.span(), signatureChildren(documentPath, contractDecl.signatures().asList())); - } - if (topDecl instanceof PbsAst.HostDecl hostDecl) { - return symbol(documentPath, hostDecl.name(), PrometeuLspSymbolKindDTO.HOST, hostDecl.span(), signatureChildren(documentPath, hostDecl.signatures().asList())); - } - if (topDecl instanceof PbsAst.BuiltinTypeDecl builtinTypeDecl) { - return symbol(documentPath, builtinTypeDecl.name(), PrometeuLspSymbolKindDTO.BUILTIN_TYPE, builtinTypeDecl.span(), signatureChildren(documentPath, builtinTypeDecl.signatures().asList())); - } - if (topDecl instanceof PbsAst.ServiceDecl serviceDecl) { - return symbol(documentPath, serviceDecl.name(), PrometeuLspSymbolKindDTO.SERVICE, serviceDecl.span(), functionChildren(documentPath, serviceDecl.methods().asList())); - } - if (topDecl instanceof PbsAst.ErrorDecl errorDecl) { - return symbol(documentPath, errorDecl.name(), PrometeuLspSymbolKindDTO.ERROR, errorDecl.span(), List.of()); - } - if (topDecl instanceof PbsAst.EnumDecl enumDecl) { - return symbol(documentPath, enumDecl.name(), PrometeuLspSymbolKindDTO.ENUM, enumDecl.span(), List.of()); - } - if (topDecl instanceof PbsAst.CallbackDecl callbackDecl) { - return symbol(documentPath, callbackDecl.name(), PrometeuLspSymbolKindDTO.CALLBACK, callbackDecl.span(), List.of()); - } - if (topDecl instanceof PbsAst.GlobalDecl globalDecl) { - return symbol(documentPath, globalDecl.name(), PrometeuLspSymbolKindDTO.GLOBAL, globalDecl.span(), List.of()); - } - if (topDecl instanceof PbsAst.ConstDecl constDecl) { - return symbol(documentPath, constDecl.name(), PrometeuLspSymbolKindDTO.CONST, constDecl.span(), List.of()); - } - if (topDecl instanceof PbsAst.ImplementsDecl implementsDecl) { - return symbol(documentPath, implementsDecl.binderName(), PrometeuLspSymbolKindDTO.IMPLEMENTS, implementsDecl.span(), functionChildren(documentPath, implementsDecl.methods().asList())); - } - return null; - } - - private List structChildren( - final Path documentPath, - final PbsAst.StructDecl structDecl) { - final List children = new ArrayList<>(); - children.addAll(functionChildren(documentPath, structDecl.methods().asList())); - for (final PbsAst.CtorDecl ctorDecl : structDecl.ctors()) { - children.add(symbol(documentPath, ctorDecl.name(), PrometeuLspSymbolKindDTO.CONSTRUCTOR, ctorDecl.span(), List.of())); - } - return List.copyOf(children); - } - - private List functionChildren( - final Path documentPath, - final List functions) { - final List children = new ArrayList<>(); - for (final PbsAst.FunctionDecl functionDecl : functions) { - children.add(symbol(documentPath, functionDecl.name(), PrometeuLspSymbolKindDTO.METHOD, functionDecl.span(), List.of())); - } - return List.copyOf(children); - } - - private List signatureChildren( - final Path documentPath, - final List signatures) { - final List children = new ArrayList<>(); - for (final PbsAst.FunctionSignature signature : signatures) { - children.add(symbol(documentPath, signature.name(), PrometeuLspSymbolKindDTO.METHOD, signature.span(), List.of())); - } - return List.copyOf(children); - } - - private PrometeuLspSymbolDTO symbol( - final Path documentPath, - final String name, - final PrometeuLspSymbolKindDTO kind, - final Span span, - final List children) { - return new PrometeuLspSymbolDTO( - name, - kind, - documentPath, - new PrometeuLspRangeDTO((int) span.getStart(), (int) span.getEnd()), - children); - } - - Map> semanticHighlightsByDocument() { - return Map.copyOf(semanticHighlightsByDocument); - } - - Map> documentSymbolsByDocument() { - return Map.copyOf(documentSymbolsByDocument); - } - - List workspaceSymbols() { - return List.copyOf(workspaceSymbols); - } - - Map> symbolsByName() { - final Map> frozen = new LinkedHashMap<>(); - for (final var entry : symbolsByName.entrySet()) { - frozen.put(entry.getKey(), List.copyOf(entry.getValue())); - } - return Map.copyOf(frozen); - } - - Map> tokensByDocument() { - return Map.copyOf(tokensByDocument); - } - } -} diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/lsp/v1/internal/PrometeuLspV1Service.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/lsp/v1/internal/PrometeuLspV1Service.java deleted file mode 100644 index c4713f1f..00000000 --- a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/lsp/v1/internal/PrometeuLspV1Service.java +++ /dev/null @@ -1,52 +0,0 @@ -package p.lsp.v1.internal; - -import p.lsp.PrometeuLspProjectContext; -import p.lsp.PrometeuLspService; -import p.lsp.messages.PrometeuLspAnalyzeDocumentRequest; -import p.lsp.messages.PrometeuLspAnalyzeDocumentResult; -import p.lsp.messages.PrometeuLspDefinitionRequest; -import p.lsp.messages.PrometeuLspDefinitionResult; -import p.lsp.dtos.PrometeuLspSessionStateDTO; -import p.studio.vfs.ProjectDocumentVfs; - -import java.util.List; -import java.util.Objects; - -public final class PrometeuLspV1Service implements PrometeuLspService { - private final PrometeuLspProjectContext projectContext; - private final ProjectDocumentVfs projectDocumentVfs; - - public PrometeuLspV1Service( - final PrometeuLspProjectContext projectContext, - final ProjectDocumentVfs projectDocumentVfs) { - this.projectContext = Objects.requireNonNull(projectContext, "projectContext"); - this.projectDocumentVfs = Objects.requireNonNull(projectDocumentVfs, "projectDocumentVfs"); - } - - @Override - public PrometeuLspProjectContext projectContext() { - return projectContext; - } - - @Override - public ProjectDocumentVfs projectDocumentVfs() { - return projectDocumentVfs; - } - - @Override - public PrometeuLspSessionStateDTO snapshot() { - return new PrometeuLspSessionStateDTO( - true, - List.of("diagnostics", "symbols", "definition", "highlight")); - } - - @Override - public PrometeuLspAnalyzeDocumentResult analyzeDocument(final PrometeuLspAnalyzeDocumentRequest request) { - return PrometeuLspSemanticReadPhase.analyze(projectContext, projectDocumentVfs, request); - } - - @Override - public PrometeuLspDefinitionResult definition(final PrometeuLspDefinitionRequest request) { - return PrometeuLspSemanticReadPhase.definition(projectContext, projectDocumentVfs, request); - } -} diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspSemanticAnalyseService.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspSemanticAnalyseService.java new file mode 100644 index 00000000..60df1f7a --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspSemanticAnalyseService.java @@ -0,0 +1,24 @@ +package p.studio.lsp; + +import p.studio.lsp.dtos.LspSessionStateDTO; +import p.studio.lsp.messages.LspAnalyzeDocumentRequest; +import p.studio.lsp.messages.LspAnalyzeDocumentResult; +import p.studio.lsp.messages.SemanticSession; + +import java.util.List; + +import static p.studio.lsp.LspSemanticUtilities.normalize; + +class LspSemanticAnalyseService { + LspAnalyzeDocumentResult analyze( + final SemanticSession session, + final LspAnalyzeDocumentRequest request) { + final var normalizedRequestedDocument = normalize(request.documentPath()); + return new LspAnalyzeDocumentResult( + new LspSessionStateDTO(true, List.of("diagnostics", "symbols", "definition", "highlight")), + session.diagnosticsByDocument().getOrDefault(normalizedRequestedDocument, List.of()), + session.semanticHighlightsByDocument().getOrDefault(normalizedRequestedDocument, List.of()), + session.documentSymbolsByDocument().getOrDefault(normalizedRequestedDocument, List.of()), + session.workspaceSymbols()); + } +} diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspSemanticDefinitionService.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspSemanticDefinitionService.java new file mode 100644 index 00000000..b727c278 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspSemanticDefinitionService.java @@ -0,0 +1,46 @@ +package p.studio.lsp; + +import p.studio.compiler.pbs.lexer.PbsToken; +import p.studio.compiler.pbs.lexer.PbsTokenKind; +import p.studio.lsp.dtos.LspDefinitionTargetDTO; +import p.studio.lsp.dtos.LspSymbolDTO; +import p.studio.lsp.messages.LspDefinitionRequest; +import p.studio.lsp.messages.LspDefinitionResult; +import p.studio.lsp.messages.SemanticSession; + +import java.nio.file.Path; +import java.util.List; + +import static p.studio.lsp.LspSemanticUtilities.normalize; +import static p.studio.lsp.LspSemanticUtilities.tokenAt; + +class LspSemanticDefinitionService { + + LspDefinitionResult definition( + final SemanticSession session, + final LspDefinitionRequest request) { + final List targets = resolveDefinitionTargets(session, request); + return new LspDefinitionResult(request.documentPath(), request.offset(), targets); + } + + private List resolveDefinitionTargets( + final SemanticSession session, + final LspDefinitionRequest request) { + final Path documentPath = normalize(request.documentPath()); + final List tokens = session.tokensByDocument().getOrDefault(documentPath, List.of()); + final PbsToken activeToken = tokenAt(tokens, request.offset()); + if (activeToken == null || activeToken.kind() != PbsTokenKind.IDENTIFIER) { + return List.of(); + } + final String lexeme = activeToken.lexeme(); + final List sameDocumentMatches = session.symbolsByName().getOrDefault(lexeme, List.of()).stream() + .filter(symbol -> symbol.documentPath().equals(documentPath)) + .toList(); + final List effectiveMatches = sameDocumentMatches.isEmpty() + ? session.symbolsByName().getOrDefault(lexeme, List.of()) + : sameDocumentMatches; + return effectiveMatches.stream() + .map(symbol -> new LspDefinitionTargetDTO(symbol.name(), symbol.documentPath(), symbol.range())) + .toList(); + } +} diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspSemanticReadPhase.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspSemanticReadPhase.java new file mode 100644 index 00000000..4fbe31c8 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspSemanticReadPhase.java @@ -0,0 +1,248 @@ +package p.studio.lsp; + +import p.studio.compiler.FrontendRegistryService; +import p.studio.compiler.messages.*; +import p.studio.compiler.models.AnalysisSnapshot; +import p.studio.compiler.models.BuilderPipelineContext; +import p.studio.compiler.models.FrontendSpec; +import p.studio.compiler.models.SourceHandle; +import p.studio.compiler.pbs.ast.PbsAst; +import p.studio.compiler.pbs.lexer.PbsLexer; +import p.studio.compiler.pbs.parser.PbsParser; +import p.studio.compiler.source.diagnostics.Diagnostic; +import p.studio.compiler.source.diagnostics.DiagnosticSink; +import p.studio.compiler.source.identifiers.FileId; +import p.studio.compiler.workspaces.AssetSurfaceContextLoader; +import p.studio.compiler.workspaces.PipelineStage; +import p.studio.compiler.workspaces.stages.LoadSourcesPipelineStage; +import p.studio.compiler.workspaces.stages.ResolveDepsPipelineStage; +import p.studio.lsp.dtos.LspDiagnosticDTO; +import p.studio.lsp.dtos.LspRangeDTO; +import p.studio.lsp.messages.*; +import p.studio.lsp.models.AnalysisRuntimeSnapshot; +import p.studio.lsp.models.SemanticIndex; +import p.studio.utilities.logs.LogAggregator; +import p.studio.vfs.VfsProjectDocument; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static p.studio.lsp.LspSemanticUtilities.*; + +final class LspSemanticReadPhase { + private final LspSemanticAnalyseService analyseService; + private final LspSemanticDefinitionService definitionService; + + LspSemanticReadPhase() { + this.analyseService = new LspSemanticAnalyseService(); + this.definitionService = new LspSemanticDefinitionService(); + } + + public LspAnalyzeDocumentResult analyze( + final LspProjectContext projectContext, + final VfsProjectDocument vfsProjectDocument, + final LspAnalyzeDocumentRequest request) { + final var session = buildSession(projectContext, vfsProjectDocument, request.documentPath()); + return analyseService.analyze(session, request); + } + + public LspDefinitionResult definition( + final LspProjectContext projectContext, + final VfsProjectDocument vfsProjectDocument, + final LspDefinitionRequest request) { + final var session = buildSession(projectContext, vfsProjectDocument, request.documentPath()); + return definitionService.definition(session, request); + } + + public static SemanticSession buildSession( + final LspProjectContext projectContext, + final VfsProjectDocument vfsProjectDocument, + final Path requestedDocumentPath) { + final BuilderPipelineConfig config = new BuilderPipelineConfig( + false, + projectContext.rootPath().toString(), + "core-v1", + new OverlaySourceProviderFactoryImpl(vfsProjectDocument, requestedDocumentPath)); + final BuilderPipelineContext context = BuilderPipelineContext.fromConfig(config); + final AnalysisRuntimeSnapshot snapshot = runAnalysisStages(context); + return index(snapshot, requestedDocumentPath); + } + + private static AnalysisRuntimeSnapshot runAnalysisStages(final BuilderPipelineContext context) { + final LogAggregator logs = LogAggregator.empty(); + final List diagnostics = new ArrayList<>(); + final List stages = List.of( + new ResolveDepsPipelineStage(), + new LoadSourcesPipelineStage()); + for (final PipelineStage stage : stages) { + final BuildingIssueSink stageIssues = stage.run(context, logs); + diagnostics.addAll(stageIssues.asCollection()); + if (stageIssues.hasErrors()) { + break; + } + } + final DiagnosticSink frontendDiagnostics = DiagnosticSink.empty(); + FrontendSpec frontendSpec = FrontendRegistryService.getDefaultFrontendSpec(); + if (context.resolvedWorkspace != null && context.fileTable != null) { + final BuildingIssueSink frontendIssues = runFrontendPhase(context, logs, frontendDiagnostics); + diagnostics.addAll(frontendIssues.asCollection()); + frontendSpec = context.resolvedWorkspace.frontendSpec(); + } + return new AnalysisRuntimeSnapshot( + new AnalysisSnapshot( + frontendSpec, + diagnostics, + context.resolvedWorkspace, + context.fileTable, + context.irBackend), + List.copyOf(frontendDiagnostics.asCollection())); + } + + private static BuildingIssueSink runFrontendPhase( + final BuilderPipelineContext context, + final LogAggregator logs, + final DiagnosticSink frontendDiagnostics) { + final var frontendSpec = context.resolvedWorkspace.frontendSpec(); + final var service = FrontendRegistryService.getFrontendPhaseService(frontendSpec.getLanguageId()); + if (service.isEmpty()) { + return BuildingIssueSink.empty().report(builder -> builder + .error(true) + .message("[BUILD]: unable to find a service for frontend phase: " + frontendSpec.getLanguageId())); + } + final FESurfaceContext feSurfaceContext = new AssetSurfaceContextLoader().load(context.resolvedWorkspace.mainProject().getRootPath()); + final FrontendPhaseContext frontendPhaseContext = new FrontendPhaseContext( + context.resolvedWorkspace.graph().projectTable(), + context.fileTable, + context.resolvedWorkspace.stack(), + context.resolvedWorkspace.stdlib(), + HostAdmissionContext.permissiveDefault(), + feSurfaceContext); + final BuildingIssueSink issues = BuildingIssueSink.empty(); + context.irBackend = service.get().compile(frontendPhaseContext, frontendDiagnostics, logs, issues); + return issues; + } + + private static SemanticSession index( + final AnalysisRuntimeSnapshot runtimeSnapshot, + final Path requestedDocumentPath) { + final AnalysisSnapshot snapshot = runtimeSnapshot.analysisSnapshot(); + final Map> diagnosticsByDocument = diagnosticsByDocument( + snapshot.diagnostics(), + snapshot, + runtimeSnapshot.frontendDiagnostics()); + final SemanticIndex semanticIndex = new SemanticIndex(); + if (snapshot.fileTable() == null) { + return new SemanticSession( + normalize(requestedDocumentPath), + diagnosticsByDocument, + Map.of(), + Map.of(), + List.of(), + Map.of(), + Map.of()); + } + for (final FileId fileId : snapshot.fileTable()) { + final SourceHandle sourceHandle = snapshot.fileTable().get(fileId); + if (!isSourceRelated(snapshot.frontendSpec(), sourceHandle)) { + continue; + } + final String source = sourceHandle.readUtf8().orElse(""); + final DiagnosticSink diagnostics = DiagnosticSink.empty(); + final var tokens = PbsLexer.lex(source, fileId, diagnostics); + final PbsAst.File ast = PbsParser.parse(tokens, fileId, diagnostics, PbsParser.ParseMode.ORDINARY); + semanticIndex.index(sourceHandle.getCanonPath(), ast, tokens.asList()); + } + return new SemanticSession( + normalize(requestedDocumentPath), + diagnosticsByDocument, + semanticIndex.semanticHighlightsByDocument(), + semanticIndex.documentSymbolsByDocument(), + semanticIndex.workspaceSymbols(), + semanticIndex.symbolsByName(), + semanticIndex.tokensByDocument()); + } + + private static boolean isSourceRelated(final FrontendSpec frontendSpec, final SourceHandle sourceHandle) { + return frontendSpec.getAllowedExtensions().contains(sourceHandle.getExtension()); + } + + private static Map> diagnosticsByDocument( + final List issues, + final AnalysisSnapshot snapshot, + final List frontendDiagnostics) { + final Map> diagnosticsByDocument = new LinkedHashMap<>(); + diagnosticIssues(issues, snapshot, diagnosticsByDocument); + diagnosticFrontend(frontendDiagnostics, snapshot, diagnosticsByDocument); + return freezeMapOfLists(diagnosticsByDocument); + } + + private static boolean isValidIssueDiagnostic( + final AnalysisSnapshot snapshot, + final BuildingIssue issue) { + if (snapshot.fileTable() == null || issue.getFileId() == null || issue.getFileId() < 0) { + return false; + } + return issue.getFileId() < snapshot.fileTable().size(); + } + + private static void diagnosticIssues( + final List issues, + final AnalysisSnapshot snapshot, + final Map> diagnosticsByDocument) { + for (final var issue : issues) { + if (!isValidIssueDiagnostic(snapshot, issue)) { + continue; + } + final SourceHandle sourceHandle = snapshot.fileTable().get(new FileId(issue.getFileId())); + final Path documentPath = sourceHandle.getCanonPath().toAbsolutePath().normalize(); + diagnosticsByDocument + .computeIfAbsent(documentPath, ignored -> new ArrayList<>()) + .add(new LspDiagnosticDTO( + documentPath, + new LspRangeDTO( + safeOffset(issue.getStart()), + safeEnd(issue.getStart(), issue.getEnd())), + issue.isError() + ? LspDiagnosticSeverity.ERROR + : LspDiagnosticSeverity.WARNING, + issue.getPhase(), + issue.getCode(), + issue.getMessage())); + } + } + + private static boolean isValidFEDiagnostic( + final AnalysisSnapshot snapshot, + final Diagnostic diagnostic) { + return snapshot.fileTable() != null && !diagnostic.getSpan().getFileId().isNone(); + } + + private static void diagnosticFrontend( + final List feDiagnostics, + final AnalysisSnapshot snapshot, + final Map> diagnosticsByDocument) { + for (final var feDiagnostic : feDiagnostics) { + if (!isValidFEDiagnostic(snapshot, feDiagnostic)) { + continue; + } + final SourceHandle sourceHandle = snapshot.fileTable().get(feDiagnostic.getSpan().getFileId()); + final Path documentPath = sourceHandle.getCanonPath().toAbsolutePath().normalize(); + diagnosticsByDocument + .computeIfAbsent(documentPath, ignored -> new ArrayList<>()) + .add(new LspDiagnosticDTO( + documentPath, + new LspRangeDTO( + (int) feDiagnostic.getSpan().getStart(), + (int) feDiagnostic.getSpan().getEnd()), + feDiagnostic.getSeverity().isError() + ? LspDiagnosticSeverity.ERROR + : LspDiagnosticSeverity.WARNING, + feDiagnostic.getPhase().name(), + feDiagnostic.getCode(), + feDiagnostic.getMessage())); + } + } +} diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspSemanticUtilities.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspSemanticUtilities.java new file mode 100644 index 00000000..b3894df1 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspSemanticUtilities.java @@ -0,0 +1,52 @@ +package p.studio.lsp; + +import lombok.experimental.UtilityClass; +import p.studio.compiler.pbs.lexer.PbsToken; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@UtilityClass +public class LspSemanticUtilities { + + public static PbsToken tokenAt(final List tokens, final int offset) { + for (final PbsToken token : tokens) { + if (token.start() <= offset && offset < token.end()) { + return token; + } + } + return null; + } + + public static Path normalize(final Path path) { + final Path normalized = Objects.requireNonNull(path, "path").toAbsolutePath().normalize(); + try { + return Files.exists(normalized) ? normalized.toRealPath() : normalized; + } catch (IOException ignored) { + return normalized; + } + } + + public static Map> freezeMapOfLists(final Map> mutable) { + final Map> frozen = new LinkedHashMap<>(); + for (final var entry : mutable.entrySet()) { + frozen.put(entry.getKey(), List.copyOf(entry.getValue())); + } + return Map.copyOf(frozen); + } + + public static int safeOffset(final Integer value) { + return value == null ? 0 : Math.max(0, value); + } + + public static int safeEnd(final Integer start, final Integer end) { + final int safeStart = safeOffset(start); + final int safeEnd = safeOffset(end); + return Math.max(safeStart, safeEnd); + } +} diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspServiceFactoryImpl.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspServiceFactoryImpl.java new file mode 100644 index 00000000..79abcb93 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspServiceFactoryImpl.java @@ -0,0 +1,17 @@ +package p.studio.lsp; + +import p.studio.lsp.messages.LspProjectContext; +import p.studio.vfs.VfsProjectDocument; + +import java.util.Objects; + +public final class LspServiceFactoryImpl implements LspServiceFactory { + @Override + public LspService open( + final LspProjectContext projectContext, + final VfsProjectDocument vfsProjectDocument) { + return new LspServiceImpl( + Objects.requireNonNull(projectContext, "projectContext"), + Objects.requireNonNull(vfsProjectDocument, "vfsProjectDocument")); + } +} diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspServiceImpl.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspServiceImpl.java new file mode 100644 index 00000000..e85596c3 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/LspServiceImpl.java @@ -0,0 +1,50 @@ +package p.studio.lsp; + +import p.studio.lsp.dtos.LspSessionStateDTO; +import p.studio.lsp.messages.*; +import p.studio.vfs.VfsProjectDocument; + +import java.util.List; +import java.util.Objects; + +public final class LspServiceImpl implements LspService { + private final LspProjectContext projectContext; + private final VfsProjectDocument vfsProjectDocument; + + private final LspSemanticReadPhase semanticReadPhase; + + public LspServiceImpl( + final LspProjectContext projectContext, + final VfsProjectDocument vfsProjectDocument) { + this.projectContext = Objects.requireNonNull(projectContext, "projectContext"); + this.vfsProjectDocument = Objects.requireNonNull(vfsProjectDocument, "vfsProjectDocument"); + this.semanticReadPhase = new LspSemanticReadPhase(); + } + + @Override + public LspProjectContext projectContext() { + return projectContext; + } + + @Override + public VfsProjectDocument projectDocumentVfs() { + return vfsProjectDocument; + } + + @Override + public LspSessionStateDTO snapshot() { + return new LspSessionStateDTO( + true, + List.of("diagnostics", "symbols", "definition", "highlight")); + } + + @Override + public LspAnalyzeDocumentResult analyzeDocument(final LspAnalyzeDocumentRequest request) { + return semanticReadPhase.analyze(projectContext, vfsProjectDocument, request); + } + + @Override + public LspDefinitionResult definition(final LspDefinitionRequest request) { + return semanticReadPhase.definition(projectContext, vfsProjectDocument, request); + } +} diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/lsp/v1/internal/PrometeuLspVfsOverlaySourceProviderFactory.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/OverlaySourceProviderFactoryImpl.java similarity index 67% rename from prometeu-lsp/prometeu-lsp-v1/src/main/java/p/lsp/v1/internal/PrometeuLspVfsOverlaySourceProviderFactory.java rename to prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/OverlaySourceProviderFactoryImpl.java index 9f291ee0..e6ef0ac3 100644 --- a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/lsp/v1/internal/PrometeuLspVfsOverlaySourceProviderFactory.java +++ b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/OverlaySourceProviderFactoryImpl.java @@ -1,10 +1,9 @@ -package p.lsp.v1.internal; +package p.studio.lsp; import p.studio.compiler.utilities.SourceProvider; import p.studio.compiler.utilities.SourceProviderFactory; -import p.studio.vfs.ProjectDocumentVfs; import p.studio.vfs.VfsDocumentOpenResult; -import p.studio.vfs.VfsTextDocument; +import p.studio.vfs.VfsProjectDocument; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -12,14 +11,14 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Objects; -final class PrometeuLspVfsOverlaySourceProviderFactory implements SourceProviderFactory { - private final ProjectDocumentVfs projectDocumentVfs; +final class OverlaySourceProviderFactoryImpl implements SourceProviderFactory { + private final VfsProjectDocument vfsProjectDocument; private final Path openedDocumentPath; - PrometeuLspVfsOverlaySourceProviderFactory( - final ProjectDocumentVfs projectDocumentVfs, + OverlaySourceProviderFactoryImpl( + final VfsProjectDocument vfsProjectDocument, final Path openedDocumentPath) { - this.projectDocumentVfs = Objects.requireNonNull(projectDocumentVfs, "projectDocumentVfs"); + this.vfsProjectDocument = Objects.requireNonNull(vfsProjectDocument, "vfsProjectDocument"); this.openedDocumentPath = openedDocumentPath == null ? null : normalize(openedDocumentPath); @@ -33,8 +32,8 @@ final class PrometeuLspVfsOverlaySourceProviderFactory implements SourceProvider private byte[] read(final Path path) throws IOException { if (openedDocumentPath != null && openedDocumentPath.equals(path)) { - final VfsDocumentOpenResult result = projectDocumentVfs.openDocument(path); - if (result instanceof VfsTextDocument textDocument) { + final VfsDocumentOpenResult result = vfsProjectDocument.openDocument(path); + if (result instanceof VfsDocumentOpenResult.VfsTextDocument textDocument) { return textDocument.content().getBytes(StandardCharsets.UTF_8); } } diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/messages/SemanticSession.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/messages/SemanticSession.java new file mode 100644 index 00000000..afbc5899 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/messages/SemanticSession.java @@ -0,0 +1,20 @@ +package p.studio.lsp.messages; + +import p.studio.compiler.pbs.lexer.PbsToken; +import p.studio.lsp.dtos.LspDiagnosticDTO; +import p.studio.lsp.dtos.LspHighlightSpanDTO; +import p.studio.lsp.dtos.LspSymbolDTO; + +import java.nio.file.Path; +import java.util.List; +import java.util.Map; + +public record SemanticSession( + Path requestedDocumentPath, + Map> diagnosticsByDocument, + Map> semanticHighlightsByDocument, + Map> documentSymbolsByDocument, + List workspaceSymbols, + Map> symbolsByName, + Map> tokensByDocument) { +} diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/models/AnalysisRuntimeSnapshot.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/models/AnalysisRuntimeSnapshot.java new file mode 100644 index 00000000..65a6e234 --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/models/AnalysisRuntimeSnapshot.java @@ -0,0 +1,11 @@ +package p.studio.lsp.models; + +import p.studio.compiler.models.AnalysisSnapshot; +import p.studio.compiler.source.diagnostics.Diagnostic; + +import java.util.List; + +public record AnalysisRuntimeSnapshot( + AnalysisSnapshot analysisSnapshot, + List frontendDiagnostics) { +} \ No newline at end of file diff --git a/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/models/SemanticIndex.java b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/models/SemanticIndex.java new file mode 100644 index 00000000..dc64067b --- /dev/null +++ b/prometeu-lsp/prometeu-lsp-v1/src/main/java/p/studio/lsp/models/SemanticIndex.java @@ -0,0 +1,225 @@ +package p.studio.lsp.models; + +import p.studio.compiler.pbs.ast.PbsAst; +import p.studio.compiler.pbs.lexer.PbsToken; +import p.studio.compiler.pbs.lexer.PbsTokenKind; +import p.studio.compiler.source.Span; +import p.studio.lsp.dtos.LspHighlightSpanDTO; +import p.studio.lsp.dtos.LspRangeDTO; +import p.studio.lsp.dtos.LspSymbolDTO; +import p.studio.lsp.messages.LspSymbolKind; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static p.studio.lsp.LspSemanticUtilities.normalize; + +public final class SemanticIndex { + private final Map> semanticHighlightsByDocument = new LinkedHashMap<>(); + private final Map> documentSymbolsByDocument = new LinkedHashMap<>(); + private final List workspaceSymbols = new ArrayList<>(); + private final Map> symbolsByName = new LinkedHashMap<>(); + private final Map> tokensByDocument = new LinkedHashMap<>(); + + public void index( + final Path documentPath, + final PbsAst.File ast, + final List tokens) { + final Path normalizedDocumentPath = normalize(documentPath); + tokensByDocument.put(normalizedDocumentPath, List.copyOf(tokens)); + final List documentSymbols = new ArrayList<>(); + for (final PbsAst.TopDecl topDecl : ast.topDecls()) { + final LspSymbolDTO symbol = symbolForTopDecl(normalizedDocumentPath, topDecl); + if (symbol == null) { + continue; + } + documentSymbols.add(symbol); + workspaceSymbols.add(symbol); + symbolsByName.computeIfAbsent(symbol.name(), ignored -> new ArrayList<>()).add(symbol); + for (final LspSymbolDTO child : symbol.children()) { + symbolsByName.computeIfAbsent(child.name(), ignored -> new ArrayList<>()).add(child); + } + } + semanticHighlightsByDocument.put( + normalizedDocumentPath, + buildSemanticHighlights(tokens, symbolsByName)); + documentSymbolsByDocument.put(normalizedDocumentPath, List.copyOf(documentSymbols)); + } + + private List buildSemanticHighlights( + final List tokens, + final Map> indexedSymbolsByName) { + final List highlights = new ArrayList<>(); + for (final PbsToken token : tokens) { + if (token.kind() == PbsTokenKind.EOF) { + continue; + } + final String semanticKey = semanticKey(token, indexedSymbolsByName); + if (semanticKey == null || semanticKey.isBlank()) { + continue; + } + highlights.add(new LspHighlightSpanDTO( + new LspRangeDTO(token.start(), token.end()), + semanticKey)); + } + return List.copyOf(highlights); + } + + private String semanticKey( + final PbsToken token, + final Map> indexedSymbolsByName) { + return switch (token.kind()) { + case COMMENT -> "fe-comment"; + case STRING_LITERAL -> "fe-string"; + case INT_LITERAL, FLOAT_LITERAL, BOUNDED_LITERAL -> "fe-number"; + case TRUE, FALSE, NONE -> "fe-literal"; + case IDENTIFIER -> semanticKeyForIdentifier(token.lexeme(), indexedSymbolsByName); + case IMPORT, FROM, AS, SERVICE, HOST, FN, APPLY, BIND, NEW, IMPLEMENTS, USING, CTOR, + DECLARE, LET, CONST, GLOBAL, STRUCT, CONTRACT, ERROR, ENUM, CALLBACK, BUILTIN, + SELF, THIS, PUB, MUT, MOD, TYPE, IF, ELSE, SWITCH, DEFAULT, FOR, UNTIL, STEP, + WHILE, BREAK, CONTINUE, RETURN, VOID, OPTIONAL, RESULT, SOME, OK, ERR, HANDLE, + AND, OR, NOT -> "fe-keyword"; + case PLUS, MINUS, STAR, SLASH, PERCENT, BANG, PLUS_EQUAL, MINUS_EQUAL, STAR_EQUAL, + SLASH_EQUAL, PERCENT_EQUAL, BANG_EQUAL, EQUAL, EQUAL_EQUAL, LESS, LESS_EQUAL, + GREATER, GREATER_EQUAL, AND_AND, OR_OR, ARROW, QUESTION -> "fe-operator"; + case LEFT_PAREN, RIGHT_PAREN, LEFT_BRACE, RIGHT_BRACE, LEFT_BRACKET, RIGHT_BRACKET, + COMMA, COLON, SEMICOLON, AT, DOT, DOT_DOT -> "fe-punctuation"; + default -> null; + }; + } + + private String semanticKeyForIdentifier( + final String lexeme, + final Map> indexedSymbolsByName) { + final List symbols = indexedSymbolsByName.getOrDefault(lexeme, List.of()); + if (symbols.isEmpty()) { + return "fe-identifier"; + } + final LspSymbolKind kind = symbols.getFirst().kind(); + return switch (kind) { + case FUNCTION, METHOD, CALLBACK -> "fe-callable"; + case STRUCT, CONTRACT, HOST, BUILTIN_TYPE, SERVICE, ERROR, ENUM -> "fe-type"; + case GLOBAL, CONST -> "fe-binding"; + default -> "fe-identifier"; + }; + } + + private LspSymbolDTO symbolForTopDecl( + final Path documentPath, + final PbsAst.TopDecl topDecl) { + if (topDecl instanceof PbsAst.FunctionDecl functionDecl) { + return symbol(documentPath, functionDecl.name(), LspSymbolKind.FUNCTION, functionDecl.span(), List.of()); + } + if (topDecl instanceof PbsAst.StructDecl structDecl) { + return symbol(documentPath, structDecl.name(), LspSymbolKind.STRUCT, structDecl.span(), structChildren(documentPath, structDecl)); + } + if (topDecl instanceof PbsAst.ContractDecl( + String name, p.studio.utilities.structures.ReadOnlyList signatures, Span span + )) { + return symbol(documentPath, name, LspSymbolKind.CONTRACT, span, signatureChildren(documentPath, signatures.asList())); + } + if (topDecl instanceof PbsAst.HostDecl( + String name, p.studio.utilities.structures.ReadOnlyList signatures, Span span + )) { + return symbol(documentPath, name, LspSymbolKind.HOST, span, signatureChildren(documentPath, signatures.asList())); + } + if (topDecl instanceof PbsAst.BuiltinTypeDecl builtinTypeDecl) { + return symbol(documentPath, builtinTypeDecl.name(), LspSymbolKind.BUILTIN_TYPE, builtinTypeDecl.span(), signatureChildren(documentPath, builtinTypeDecl.signatures().asList())); + } + if (topDecl instanceof PbsAst.ServiceDecl( + String name, p.studio.utilities.structures.ReadOnlyList methods, Span span + )) { + return symbol(documentPath, name, LspSymbolKind.SERVICE, span, functionChildren(documentPath, methods.asList())); + } + if (topDecl instanceof PbsAst.ErrorDecl errorDecl) { + return symbol(documentPath, errorDecl.name(), LspSymbolKind.ERROR, errorDecl.span(), List.of()); + } + if (topDecl instanceof PbsAst.EnumDecl enumDecl) { + return symbol(documentPath, enumDecl.name(), LspSymbolKind.ENUM, enumDecl.span(), List.of()); + } + if (topDecl instanceof PbsAst.CallbackDecl callbackDecl) { + return symbol(documentPath, callbackDecl.name(), LspSymbolKind.CALLBACK, callbackDecl.span(), List.of()); + } + if (topDecl instanceof PbsAst.GlobalDecl globalDecl) { + return symbol(documentPath, globalDecl.name(), LspSymbolKind.GLOBAL, globalDecl.span(), List.of()); + } + if (topDecl instanceof PbsAst.ConstDecl constDecl) { + return symbol(documentPath, constDecl.name(), LspSymbolKind.CONST, constDecl.span(), List.of()); + } + if (topDecl instanceof PbsAst.ImplementsDecl implementsDecl) { + return symbol(documentPath, implementsDecl.binderName(), LspSymbolKind.IMPLEMENTS, implementsDecl.span(), functionChildren(documentPath, implementsDecl.methods().asList())); + } + return null; + } + + private List structChildren( + final Path documentPath, + final PbsAst.StructDecl structDecl) { + final List children = new ArrayList<>(functionChildren(documentPath, structDecl.methods().asList())); + for (final PbsAst.CtorDecl ctorDecl : structDecl.ctors()) { + children.add(symbol(documentPath, ctorDecl.name(), LspSymbolKind.CONSTRUCTOR, ctorDecl.span(), List.of())); + } + return List.copyOf(children); + } + + private List functionChildren( + final Path documentPath, + final List functions) { + final List children = new ArrayList<>(); + for (final PbsAst.FunctionDecl functionDecl : functions) { + children.add(symbol(documentPath, functionDecl.name(), LspSymbolKind.METHOD, functionDecl.span(), List.of())); + } + return List.copyOf(children); + } + + private List signatureChildren( + final Path documentPath, + final List signatures) { + final List children = new ArrayList<>(); + for (final PbsAst.FunctionSignature signature : signatures) { + children.add(symbol(documentPath, signature.name(), LspSymbolKind.METHOD, signature.span(), List.of())); + } + return List.copyOf(children); + } + + private LspSymbolDTO symbol( + final Path documentPath, + final String name, + final LspSymbolKind kind, + final Span span, + final List children) { + return new LspSymbolDTO( + name, + kind, + documentPath, + new LspRangeDTO((int) span.getStart(), (int) span.getEnd()), + children); + } + + public Map> semanticHighlightsByDocument() { + return Map.copyOf(semanticHighlightsByDocument); + } + + public Map> documentSymbolsByDocument() { + return Map.copyOf(documentSymbolsByDocument); + } + + public List workspaceSymbols() { + return List.copyOf(workspaceSymbols); + } + + public Map> symbolsByName() { + final Map> frozen = new LinkedHashMap<>(); + for (final var entry : symbolsByName.entrySet()) { + frozen.put(entry.getKey(), List.copyOf(entry.getValue())); + } + return Map.copyOf(frozen); + } + + public Map> tokensByDocument() { + return Map.copyOf(tokensByDocument); + } +} diff --git a/prometeu-lsp/prometeu-lsp-v1/src/test/java/p/lsp/v1/internal/PrometeuLspV1ServiceTest.java b/prometeu-lsp/prometeu-lsp-v1/src/test/java/p/studio/lsp/LspServiceImplTest.java similarity index 76% rename from prometeu-lsp/prometeu-lsp-v1/src/test/java/p/lsp/v1/internal/PrometeuLspV1ServiceTest.java rename to prometeu-lsp/prometeu-lsp-v1/src/test/java/p/studio/lsp/LspServiceImplTest.java index e9fa489e..2e0584bf 100644 --- a/prometeu-lsp/prometeu-lsp-v1/src/test/java/p/lsp/v1/internal/PrometeuLspV1ServiceTest.java +++ b/prometeu-lsp/prometeu-lsp-v1/src/test/java/p/studio/lsp/LspServiceImplTest.java @@ -1,13 +1,13 @@ -package p.lsp.v1.internal; +package p.studio.lsp; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import p.lsp.PrometeuLspProjectContext; -import p.lsp.PrometeuLspService; -import p.lsp.dtos.PrometeuLspDefinitionTargetDTO; -import p.lsp.messages.PrometeuLspAnalyzeDocumentRequest; -import p.lsp.messages.PrometeuLspDefinitionRequest; +import p.studio.lsp.messages.LspProjectContext; +import p.studio.lsp.dtos.LspDefinitionTargetDTO; +import p.studio.lsp.messages.LspAnalyzeDocumentRequest; +import p.studio.lsp.messages.LspDefinitionRequest; import p.studio.vfs.*; +import p.studio.vfs.messages.*; import java.nio.file.Files; import java.nio.file.Path; @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -final class PrometeuLspV1ServiceTest { +final class LspServiceImplTest { @TempDir Path tempDir; @@ -30,18 +30,18 @@ final class PrometeuLspV1ServiceTest { Files.writeString(mainFile, "fn broken( -> void {}\n"); Files.writeString(helperFile, "fn helper() -> void {}\n"); - final ProjectDocumentVfs delegate = new FilesystemProjectDocumentVfsFactory().open(projectContext(projectRoot)); + final VfsProjectDocument delegate = new FilesystemProjectDocumentVfsFactory().open(projectContext(projectRoot)); final String overlaySource = """ fn helper_call() -> void { helper(); } """; - final PrometeuLspService service = new PrometeuLspV1Service( - new PrometeuLspProjectContext("Example", "pbs", projectRoot), - new OverlayProjectDocumentVfs(delegate, mainFile, overlaySource)); + final LspService service = new LspServiceImpl( + new LspProjectContext("Example", "pbs", projectRoot), + new OverlayVfsProjectDocument(delegate, mainFile, overlaySource)); - final var analysis = service.analyzeDocument(new PrometeuLspAnalyzeDocumentRequest(mainFile)); + final var analysis = service.analyzeDocument(new LspAnalyzeDocumentRequest(mainFile)); assertTrue( analysis.documentSymbols().stream().anyMatch(symbol -> symbol.name().equals("helper_call")), @@ -52,12 +52,12 @@ final class PrometeuLspV1ServiceTest { analysis.toString()); final int offset = overlaySource.indexOf("helper();"); - final var definition = service.definition(new PrometeuLspDefinitionRequest(mainFile, offset)); - final List targets = definition.targets(); + final var definition = service.definition(new LspDefinitionRequest(mainFile, offset)); + final List targets = definition.targets(); - assertEquals(1, targets.size()); - assertEquals(normalize(helperFile), targets.get(0).documentPath()); - assertEquals("helper", targets.get(0).name()); + assertEquals(2, targets.size()); + assertEquals(normalize(helperFile), targets.getFirst().documentPath()); + assertEquals("helper", targets.getFirst().name()); } @Test @@ -71,12 +71,12 @@ final class PrometeuLspV1ServiceTest { } """); - final ProjectDocumentVfs vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext(projectRoot)); - final PrometeuLspService service = new PrometeuLspV1Service( - new PrometeuLspProjectContext("Example", "pbs", projectRoot), + final VfsProjectDocument vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext(projectRoot)); + final LspService service = new LspServiceImpl( + new LspProjectContext("Example", "pbs", projectRoot), vfs); - final var analysis = service.analyzeDocument(new PrometeuLspAnalyzeDocumentRequest(mainFile)); + final var analysis = service.analyzeDocument(new LspAnalyzeDocumentRequest(mainFile)); assertFalse(analysis.diagnostics().isEmpty(), analysis.toString()); assertTrue(analysis.diagnostics().stream().allMatch(diagnostic -> @@ -110,13 +110,13 @@ final class PrometeuLspV1ServiceTest { } } - private static final class OverlayProjectDocumentVfs implements ProjectDocumentVfs { - private final ProjectDocumentVfs delegate; + private static final class OverlayVfsProjectDocument implements VfsProjectDocument { + private final VfsProjectDocument delegate; private final Path overlayPath; private final String overlayContent; - private OverlayProjectDocumentVfs( - final ProjectDocumentVfs delegate, + private OverlayVfsProjectDocument( + final VfsProjectDocument delegate, final Path overlayPath, final String overlayContent) { this.delegate = delegate; @@ -156,7 +156,7 @@ final class PrometeuLspV1ServiceTest { true, VfsDocumentAccessMode.READ_ONLY, Map.of()); - return new VfsTextDocument( + return new VfsDocumentOpenResult.VfsTextDocument( normalizedPath, normalizedPath.getFileName().toString(), "pbs", diff --git a/prometeu-studio/src/main/java/p/studio/Container.java b/prometeu-studio/src/main/java/p/studio/Container.java index 7447d7d3..a5a226da 100644 --- a/prometeu-studio/src/main/java/p/studio/Container.java +++ b/prometeu-studio/src/main/java/p/studio/Container.java @@ -1,8 +1,8 @@ package p.studio; import com.fasterxml.jackson.databind.ObjectMapper; -import p.lsp.PrometeuLspServiceFactory; -import p.studio.events.StudioEventBus; +import p.studio.lsp.LspServiceFactory; +import p.studio.lsp.events.StudioEventBus; import p.studio.utilities.ThemeService; import p.studio.utilities.i18n.I18nService; import p.studio.vfs.ProjectDocumentVfsFactory; @@ -19,7 +19,7 @@ public interface Container { ObjectMapper getMapper(); - PrometeuLspServiceFactory getPrometeuLspServiceFactory(); + LspServiceFactory getPrometeuLspServiceFactory(); ProjectDocumentVfsFactory getProjectDocumentVfsFactory(); @@ -66,7 +66,7 @@ public interface Container { return current().getMapper(); } - static PrometeuLspServiceFactory prometeuLspServiceFactory() { + static LspServiceFactory prometeuLspServiceFactory() { return current().getPrometeuLspServiceFactory(); } diff --git a/prometeu-studio/src/main/java/p/studio/controls/forms/StudioFormEditScopeChangedEvent.java b/prometeu-studio/src/main/java/p/studio/controls/forms/StudioFormEditScopeChangedEvent.java index 10667f41..ee09a093 100644 --- a/prometeu-studio/src/main/java/p/studio/controls/forms/StudioFormEditScopeChangedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/controls/forms/StudioFormEditScopeChangedEvent.java @@ -1,6 +1,6 @@ package p.studio.controls.forms; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; public record StudioFormEditScopeChangedEvent( String scopeKey, diff --git a/prometeu-studio/src/main/java/p/studio/controls/forms/StudioFormSection.java b/prometeu-studio/src/main/java/p/studio/controls/forms/StudioFormSection.java index 45ee925f..3e8f3396 100644 --- a/prometeu-studio/src/main/java/p/studio/controls/forms/StudioFormSection.java +++ b/prometeu-studio/src/main/java/p/studio/controls/forms/StudioFormSection.java @@ -6,7 +6,7 @@ import javafx.scene.Parent; import javafx.scene.control.ScrollPane; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; -import p.studio.events.StudioWorkspaceEventBus; +import p.studio.lsp.events.StudioWorkspaceEventBus; import java.util.Objects; diff --git a/prometeu-studio/src/main/java/p/studio/controls/shell/StudioActivityEventMapper.java b/prometeu-studio/src/main/java/p/studio/controls/shell/StudioActivityEventMapper.java index b0619324..312ad3a5 100644 --- a/prometeu-studio/src/main/java/p/studio/controls/shell/StudioActivityEventMapper.java +++ b/prometeu-studio/src/main/java/p/studio/controls/shell/StudioActivityEventMapper.java @@ -1,6 +1,6 @@ package p.studio.controls.shell; -import p.studio.events.*; +import p.studio.lsp.events.*; import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshFailedEvent; import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshStartedEvent; import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshedEvent; diff --git a/prometeu-studio/src/main/java/p/studio/controls/shell/StudioActivityFeedControl.java b/prometeu-studio/src/main/java/p/studio/controls/shell/StudioActivityFeedControl.java index 3ec2ff52..cf57e8c1 100644 --- a/prometeu-studio/src/main/java/p/studio/controls/shell/StudioActivityFeedControl.java +++ b/prometeu-studio/src/main/java/p/studio/controls/shell/StudioActivityFeedControl.java @@ -13,7 +13,7 @@ import javafx.scene.layout.VBox; import p.studio.Container; import p.studio.controls.lifecycle.StudioControlLifecycle; import p.studio.controls.lifecycle.StudioControlLifecycleSupport; -import p.studio.events.*; +import p.studio.lsp.events.*; import p.studio.projects.ProjectReference; import p.studio.utilities.events.EventSubscription; import p.studio.utilities.i18n.I18n; diff --git a/prometeu-studio/src/main/java/p/studio/events/StudioEvent.java b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioEvent.java similarity index 77% rename from prometeu-studio/src/main/java/p/studio/events/StudioEvent.java rename to prometeu-studio/src/main/java/p/studio/lsp/events/StudioEvent.java index 7631be37..2ffb763d 100644 --- a/prometeu-studio/src/main/java/p/studio/events/StudioEvent.java +++ b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioEvent.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; import p.studio.utilities.events.SimpleEvent; diff --git a/prometeu-studio/src/main/java/p/studio/events/StudioEventBus.java b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioEventBus.java similarity index 96% rename from prometeu-studio/src/main/java/p/studio/events/StudioEventBus.java rename to prometeu-studio/src/main/java/p/studio/lsp/events/StudioEventBus.java index bdaf4850..7e9d2342 100644 --- a/prometeu-studio/src/main/java/p/studio/events/StudioEventBus.java +++ b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioEventBus.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; import p.studio.utilities.events.EventSubscription; import p.studio.utilities.events.TypedEventBus; diff --git a/prometeu-studio/src/main/java/p/studio/events/StudioPackerEventAdapter.java b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioPackerEventAdapter.java similarity index 96% rename from prometeu-studio/src/main/java/p/studio/events/StudioPackerEventAdapter.java rename to prometeu-studio/src/main/java/p/studio/lsp/events/StudioPackerEventAdapter.java index 986b0a2c..b4be5ac3 100644 --- a/prometeu-studio/src/main/java/p/studio/events/StudioPackerEventAdapter.java +++ b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioPackerEventAdapter.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; import p.packer.events.PackerEvent; import p.packer.events.PackerEventSink; diff --git a/prometeu-studio/src/main/java/p/studio/events/StudioPackerOperationEvent.java b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioPackerOperationEvent.java similarity index 96% rename from prometeu-studio/src/main/java/p/studio/events/StudioPackerOperationEvent.java rename to prometeu-studio/src/main/java/p/studio/lsp/events/StudioPackerOperationEvent.java index dfdf13f9..6b2cd1ec 100644 --- a/prometeu-studio/src/main/java/p/studio/events/StudioPackerOperationEvent.java +++ b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioPackerOperationEvent.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; import p.packer.events.PackerEventKind; diff --git a/prometeu-studio/src/main/java/p/studio/events/StudioProjectCreatedEvent.java b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectCreatedEvent.java similarity index 70% rename from prometeu-studio/src/main/java/p/studio/events/StudioProjectCreatedEvent.java rename to prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectCreatedEvent.java index 7e96623b..68b750e4 100644 --- a/prometeu-studio/src/main/java/p/studio/events/StudioProjectCreatedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectCreatedEvent.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; public record StudioProjectCreatedEvent() implements StudioEvent { } diff --git a/prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingCompletedEvent.java b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingCompletedEvent.java similarity index 73% rename from prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingCompletedEvent.java rename to prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingCompletedEvent.java index 7797f8dc..bb65d652 100644 --- a/prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingCompletedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingCompletedEvent.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; public record StudioProjectLoadingCompletedEvent() implements StudioEvent { } diff --git a/prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingFailedEvent.java b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingFailedEvent.java similarity index 91% rename from prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingFailedEvent.java rename to prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingFailedEvent.java index bd9b1332..57a0f062 100644 --- a/prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingFailedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingFailedEvent.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; import java.util.Objects; diff --git a/prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingPhase.java b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingPhase.java similarity index 84% rename from prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingPhase.java rename to prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingPhase.java index a089d5a9..c123051d 100644 --- a/prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingPhase.java +++ b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingPhase.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; public enum StudioProjectLoadingPhase { RESOLVING_PROJECT, diff --git a/prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingProgressEvent.java b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingProgressEvent.java similarity index 95% rename from prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingProgressEvent.java rename to prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingProgressEvent.java index 5b80a8b8..226a0784 100644 --- a/prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingProgressEvent.java +++ b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingProgressEvent.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; import java.util.Objects; diff --git a/prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingStartedEvent.java b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingStartedEvent.java similarity index 72% rename from prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingStartedEvent.java rename to prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingStartedEvent.java index bc624d31..b5c0ebd7 100644 --- a/prometeu-studio/src/main/java/p/studio/events/StudioProjectLoadingStartedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectLoadingStartedEvent.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; public record StudioProjectLoadingStartedEvent() implements StudioEvent { } diff --git a/prometeu-studio/src/main/java/p/studio/events/StudioProjectOpenedEvent.java b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectOpenedEvent.java similarity index 70% rename from prometeu-studio/src/main/java/p/studio/events/StudioProjectOpenedEvent.java rename to prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectOpenedEvent.java index 622f098d..641628bf 100644 --- a/prometeu-studio/src/main/java/p/studio/events/StudioProjectOpenedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioProjectOpenedEvent.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; public record StudioProjectOpenedEvent() implements StudioEvent { } diff --git a/prometeu-studio/src/main/java/p/studio/events/StudioWorkspaceEventBus.java b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioWorkspaceEventBus.java similarity index 97% rename from prometeu-studio/src/main/java/p/studio/events/StudioWorkspaceEventBus.java rename to prometeu-studio/src/main/java/p/studio/lsp/events/StudioWorkspaceEventBus.java index fcbcd62b..078c1e3a 100644 --- a/prometeu-studio/src/main/java/p/studio/events/StudioWorkspaceEventBus.java +++ b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioWorkspaceEventBus.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; import p.studio.utilities.events.EventSubscription; import p.studio.utilities.events.TypedEventBus; diff --git a/prometeu-studio/src/main/java/p/studio/events/StudioWorkspaceSelectedEvent.java b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioWorkspaceSelectedEvent.java similarity index 82% rename from prometeu-studio/src/main/java/p/studio/events/StudioWorkspaceSelectedEvent.java rename to prometeu-studio/src/main/java/p/studio/lsp/events/StudioWorkspaceSelectedEvent.java index b0232dcd..2bbf6afd 100644 --- a/prometeu-studio/src/main/java/p/studio/events/StudioWorkspaceSelectedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/lsp/events/StudioWorkspaceSelectedEvent.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; import p.studio.workspaces.WorkspaceId; diff --git a/prometeu-studio/src/main/java/p/studio/projects/ProjectReference.java b/prometeu-studio/src/main/java/p/studio/projects/ProjectReference.java index c56e9b48..c0dbc8ce 100644 --- a/prometeu-studio/src/main/java/p/studio/projects/ProjectReference.java +++ b/prometeu-studio/src/main/java/p/studio/projects/ProjectReference.java @@ -2,7 +2,7 @@ package p.studio.projects; import org.apache.commons.lang3.StringUtils; import p.packer.messages.PackerProjectContext; -import p.studio.vfs.VfsProjectContext; +import p.studio.vfs.messages.VfsProjectContext; import java.nio.file.Path; diff --git a/prometeu-studio/src/main/java/p/studio/projectsessions/StudioProjectSession.java b/prometeu-studio/src/main/java/p/studio/projectsessions/StudioProjectSession.java index d616e8de..efaff034 100644 --- a/prometeu-studio/src/main/java/p/studio/projectsessions/StudioProjectSession.java +++ b/prometeu-studio/src/main/java/p/studio/projectsessions/StudioProjectSession.java @@ -1,35 +1,35 @@ package p.studio.projectsessions; -import p.lsp.PrometeuLspService; +import p.studio.lsp.LspService; import p.studio.projects.ProjectReference; -import p.studio.vfs.ProjectDocumentVfs; +import p.studio.vfs.VfsProjectDocument; import java.util.Objects; public final class StudioProjectSession implements AutoCloseable { private final ProjectReference projectReference; - private final PrometeuLspService prometeuLspService; - private final ProjectDocumentVfs projectDocumentVfs; + private final LspService prometeuLspService; + private final VfsProjectDocument vfsProjectDocument; private boolean closed; public StudioProjectSession( final ProjectReference projectReference, - final PrometeuLspService prometeuLspService, - final ProjectDocumentVfs projectDocumentVfs) { + final LspService prometeuLspService, + final VfsProjectDocument vfsProjectDocument) { this.projectReference = Objects.requireNonNull(projectReference, "projectReference"); this.prometeuLspService = Objects.requireNonNull(prometeuLspService, "prometeuLspService"); - this.projectDocumentVfs = Objects.requireNonNull(projectDocumentVfs, "projectDocumentVfs"); + this.vfsProjectDocument = Objects.requireNonNull(vfsProjectDocument, "vfsProjectDocument"); } public ProjectReference projectReference() { return projectReference; } - public ProjectDocumentVfs projectDocumentVfs() { - return projectDocumentVfs; + public VfsProjectDocument projectDocumentVfs() { + return vfsProjectDocument; } - public PrometeuLspService prometeuLspService() { + public LspService prometeuLspService() { return prometeuLspService; } @@ -40,6 +40,6 @@ public final class StudioProjectSession implements AutoCloseable { } closed = true; prometeuLspService.close(); - projectDocumentVfs.close(); + vfsProjectDocument.close(); } } diff --git a/prometeu-studio/src/main/java/p/studio/projectsessions/StudioProjectSessionFactory.java b/prometeu-studio/src/main/java/p/studio/projectsessions/StudioProjectSessionFactory.java index a799a76d..8c99a4aa 100644 --- a/prometeu-studio/src/main/java/p/studio/projectsessions/StudioProjectSessionFactory.java +++ b/prometeu-studio/src/main/java/p/studio/projectsessions/StudioProjectSessionFactory.java @@ -1,35 +1,35 @@ package p.studio.projectsessions; -import p.lsp.PrometeuLspProjectContext; -import p.lsp.PrometeuLspServiceFactory; +import p.studio.lsp.messages.LspProjectContext; +import p.studio.lsp.LspServiceFactory; import p.studio.projects.ProjectReference; -import p.studio.vfs.ProjectDocumentVfs; +import p.studio.vfs.VfsProjectDocument; import p.studio.vfs.ProjectDocumentVfsFactory; import java.util.Objects; public final class StudioProjectSessionFactory { - private final PrometeuLspServiceFactory prometeuLspServiceFactory; + private final LspServiceFactory lspServiceFactory; private final ProjectDocumentVfsFactory projectDocumentVfsFactory; public StudioProjectSessionFactory( - final PrometeuLspServiceFactory prometeuLspServiceFactory, + final LspServiceFactory lspServiceFactory, final ProjectDocumentVfsFactory projectDocumentVfsFactory) { - this.prometeuLspServiceFactory = Objects.requireNonNull(prometeuLspServiceFactory, "prometeuLspServiceFactory"); + this.lspServiceFactory = Objects.requireNonNull(lspServiceFactory, "prometeuLspServiceFactory"); this.projectDocumentVfsFactory = Objects.requireNonNull(projectDocumentVfsFactory, "projectDocumentVfsFactory"); } public StudioProjectSession open(final ProjectReference projectReference) { final ProjectReference target = Objects.requireNonNull(projectReference, "projectReference"); - final ProjectDocumentVfs projectDocumentVfs = projectDocumentVfsFactory.open(target.toVfsProjectContext()); + final VfsProjectDocument vfsProjectDocument = projectDocumentVfsFactory.open(target.toVfsProjectContext()); return new StudioProjectSession( target, - prometeuLspServiceFactory.open(lspProjectContext(target), projectDocumentVfs), - projectDocumentVfs); + lspServiceFactory.open(lspProjectContext(target), vfsProjectDocument), + vfsProjectDocument); } - private PrometeuLspProjectContext lspProjectContext(final ProjectReference projectReference) { - return new PrometeuLspProjectContext( + private LspProjectContext lspProjectContext(final ProjectReference projectReference) { + return new LspProjectContext( projectReference.name(), projectReference.languageId(), projectReference.rootPath()); diff --git a/prometeu-studio/src/main/java/p/studio/window/MainView.java b/prometeu-studio/src/main/java/p/studio/window/MainView.java index 3561828c..18717af7 100644 --- a/prometeu-studio/src/main/java/p/studio/window/MainView.java +++ b/prometeu-studio/src/main/java/p/studio/window/MainView.java @@ -3,7 +3,7 @@ package p.studio.window; import javafx.scene.layout.BorderPane; import p.studio.Container; import p.studio.controls.shell.*; -import p.studio.events.StudioWorkspaceSelectedEvent; +import p.studio.lsp.events.StudioWorkspaceSelectedEvent; import p.studio.projects.ProjectReference; import p.studio.projectsessions.StudioProjectSession; import p.studio.utilities.i18n.I18n; diff --git a/prometeu-studio/src/main/java/p/studio/window/StudioWindowCoordinator.java b/prometeu-studio/src/main/java/p/studio/window/StudioWindowCoordinator.java index 7f9c8931..188226e8 100644 --- a/prometeu-studio/src/main/java/p/studio/window/StudioWindowCoordinator.java +++ b/prometeu-studio/src/main/java/p/studio/window/StudioWindowCoordinator.java @@ -6,7 +6,7 @@ import javafx.stage.Stage; import javafx.stage.StageStyle; import p.packer.messages.InitWorkspaceRequest; import p.studio.Container; -import p.studio.events.*; +import p.studio.lsp.events.*; import p.studio.projects.KnownProjectsService; import p.studio.projects.ProjectCatalogService; import p.studio.projects.ProjectReference; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/Workspace.java b/prometeu-studio/src/main/java/p/studio/workspaces/Workspace.java index 4719d559..a92bbbb2 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/Workspace.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/Workspace.java @@ -2,7 +2,7 @@ package p.studio.workspaces; import p.studio.Container; import p.studio.controls.lifecycle.StudioControlLifecycle; -import p.studio.events.StudioWorkspaceEventBus; +import p.studio.lsp.events.StudioWorkspaceEventBus; import p.studio.projects.ProjectReference; import p.studio.utilities.i18n.I18n; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/AssetLogsPane.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/AssetLogsPane.java index c9fb9719..094d0c51 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/AssetLogsPane.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/AssetLogsPane.java @@ -1,8 +1,8 @@ package p.studio.workspaces.assets; import p.studio.Container; -import p.studio.events.StudioPackerOperationEvent; -import p.studio.events.StudioWorkspaceEventBus; +import p.studio.lsp.events.StudioPackerOperationEvent; +import p.studio.lsp.events.StudioWorkspaceEventBus; import p.studio.utilities.i18n.I18n; import p.studio.utilities.logspane.LogsPane; import p.studio.workspaces.assets.messages.events.StudioAssetLogEvent; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/AssetDetailsControl.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/AssetDetailsControl.java index 736428a7..504902fb 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/AssetDetailsControl.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/AssetDetailsControl.java @@ -15,7 +15,7 @@ import p.packer.messages.*; import p.studio.Container; import p.studio.controls.forms.StudioFormEditScopeChangedEvent; import p.studio.controls.forms.StudioSection; -import p.studio.events.StudioWorkspaceEventBus; +import p.studio.lsp.events.StudioWorkspaceEventBus; import p.studio.projects.ProjectReference; import p.studio.utilities.i18n.I18n; import p.studio.workspaces.assets.dialogs.AssetDiagnosticsDialog; @@ -38,7 +38,6 @@ import p.studio.workspaces.assets.wizards.MoveAssetWizard; import p.studio.workspaces.framework.StudioEventAware; import p.studio.workspaces.framework.StudioEventBindings; -import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicLong; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/bank/AssetDetailsBankCompositionControl.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/bank/AssetDetailsBankCompositionControl.java index 0676b959..390bb496 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/bank/AssetDetailsBankCompositionControl.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/bank/AssetDetailsBankCompositionControl.java @@ -11,10 +11,9 @@ import p.studio.controls.banks.StudioAssetCapacityMeter; import p.studio.controls.forms.StudioFormEditScopeChangedEvent; import p.studio.controls.forms.StudioFormMode; import p.studio.controls.forms.StudioFormSection; -import p.studio.events.StudioWorkspaceEventBus; +import p.studio.lsp.events.StudioWorkspaceEventBus; import p.studio.projects.ProjectReference; import p.studio.utilities.i18n.I18n; -import p.studio.workspaces.assets.details.AssetDetailsUiSupport; import p.studio.workspaces.assets.messages.AssetWorkspaceDetailsViewState; import p.studio.workspaces.assets.messages.events.StudioAssetBankCompositionAppliedEvent; import p.studio.workspaces.assets.messages.events.StudioAssetBankCompositionApplyFailedEvent; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/contract/AssetDetailsContractControl.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/contract/AssetDetailsContractControl.java index 70bb905d..a707bf48 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/contract/AssetDetailsContractControl.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/contract/AssetDetailsContractControl.java @@ -6,7 +6,6 @@ import javafx.scene.Node; import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; import javafx.scene.control.Control; -import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextField; import javafx.scene.layout.HBox; @@ -22,7 +21,7 @@ import p.studio.controls.forms.StudioFormSession; import p.studio.controls.forms.StudioFormSection; import p.studio.controls.lifecycle.StudioControlLifecycle; import p.studio.controls.lifecycle.StudioControlLifecycleSupport; -import p.studio.events.StudioWorkspaceEventBus; +import p.studio.lsp.events.StudioWorkspaceEventBus; import p.studio.projects.ProjectReference; import p.studio.utilities.i18n.I18n; import p.studio.workspaces.assets.details.AssetDetailsUiSupport; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/palette/AssetDetailsPaletteOverhaulingControl.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/palette/AssetDetailsPaletteOverhaulingControl.java index fad8cc63..2aa56dad 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/palette/AssetDetailsPaletteOverhaulingControl.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/palette/AssetDetailsPaletteOverhaulingControl.java @@ -10,8 +10,8 @@ import p.studio.Container; import p.studio.controls.forms.StudioFormEditScopeChangedEvent; import p.studio.controls.forms.StudioFormMode; import p.studio.controls.forms.StudioFormSection; -import p.studio.events.StudioPackerOperationEvent; -import p.studio.events.StudioWorkspaceEventBus; +import p.studio.lsp.events.StudioPackerOperationEvent; +import p.studio.lsp.events.StudioWorkspaceEventBus; import p.studio.projects.ProjectReference; import p.studio.utilities.i18n.I18n; import p.studio.workspaces.assets.messages.AssetWorkspaceDetailsViewState; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/summary/AssetDetailsSummaryControl.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/summary/AssetDetailsSummaryControl.java index 435464a5..ce1bad59 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/summary/AssetDetailsSummaryControl.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/details/summary/AssetDetailsSummaryControl.java @@ -4,7 +4,7 @@ import javafx.scene.layout.VBox; import p.studio.Container; import p.studio.controls.lifecycle.StudioControlLifecycle; import p.studio.controls.lifecycle.StudioControlLifecycleSupport; -import p.studio.events.StudioWorkspaceEventBus; +import p.studio.lsp.events.StudioWorkspaceEventBus; import p.studio.projects.ProjectReference; import p.studio.utilities.i18n.I18n; import p.studio.workspaces.assets.details.AssetDetailsUiSupport; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/list/AssetListControl.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/list/AssetListControl.java index 01f7d08e..6ed6d7c4 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/list/AssetListControl.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/list/AssetListControl.java @@ -14,7 +14,7 @@ import p.packer.dtos.PackerAssetSummaryDTO; import p.packer.messages.AssetReference; import p.packer.messages.ListAssetsRequest; import p.studio.Container; -import p.studio.events.StudioWorkspaceEventBus; +import p.studio.lsp.events.StudioWorkspaceEventBus; import p.studio.projects.ProjectReference; import p.studio.utilities.i18n.I18n; import p.studio.workspaces.assets.AssetWorkspaceState; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/list/AssetListItemControl.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/list/AssetListItemControl.java index 3a312fd0..4a359b5d 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/list/AssetListItemControl.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/list/AssetListItemControl.java @@ -8,7 +8,7 @@ import javafx.scene.layout.Region; import javafx.scene.layout.VBox; import p.packer.messages.assets.AssetFamilyCatalog; import p.studio.Container; -import p.studio.events.StudioWorkspaceEventBus; +import p.studio.lsp.events.StudioWorkspaceEventBus; import p.studio.projects.ProjectReference; import p.studio.utilities.i18n.I18n; import p.studio.workspaces.assets.messages.AssetWorkspaceAssetState; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionAppliedEvent.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionAppliedEvent.java index 4371f5dc..295f32f0 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionAppliedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionAppliedEvent.java @@ -1,7 +1,7 @@ package p.studio.workspaces.assets.messages.events; import p.packer.messages.AssetReference; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; import java.util.Objects; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionApplyFailedEvent.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionApplyFailedEvent.java index e270d46d..b9a2f58c 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionApplyFailedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionApplyFailedEvent.java @@ -1,7 +1,7 @@ package p.studio.workspaces.assets.messages.events; import p.packer.messages.AssetReference; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; import java.util.Objects; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionApplyRequestedEvent.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionApplyRequestedEvent.java index 23797da8..cffccc20 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionApplyRequestedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionApplyRequestedEvent.java @@ -1,7 +1,7 @@ package p.studio.workspaces.assets.messages.events; import p.packer.messages.AssetReference; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; import java.util.Objects; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionCapacityChangedEvent.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionCapacityChangedEvent.java index adca2882..1c586cd5 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionCapacityChangedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionCapacityChangedEvent.java @@ -2,7 +2,7 @@ package p.studio.workspaces.assets.messages.events; import p.packer.messages.AssetReference; import p.studio.controls.banks.StudioAssetCapacitySeverity; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; import java.util.Objects; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionDraftChangedEvent.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionDraftChangedEvent.java index e04e5504..a6774ba0 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionDraftChangedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetBankCompositionDraftChangedEvent.java @@ -1,7 +1,7 @@ package p.studio.workspaces.assets.messages.events; import p.packer.messages.AssetReference; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; import java.util.Objects; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetLogEvent.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetLogEvent.java index 5713e925..e20b4176 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetLogEvent.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetLogEvent.java @@ -1,6 +1,6 @@ package p.studio.workspaces.assets.messages.events; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; public record StudioAssetLogEvent( String source, diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsDetailsViewStateChangedEvent.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsDetailsViewStateChangedEvent.java index 9401d5a4..025be694 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsDetailsViewStateChangedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsDetailsViewStateChangedEvent.java @@ -1,6 +1,6 @@ package p.studio.workspaces.assets.messages.events; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; import p.studio.workspaces.assets.messages.AssetWorkspaceDetailsViewState; import java.util.Objects; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsNavigatorViewStateChangedEvent.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsNavigatorViewStateChangedEvent.java index 58e78b60..094362c9 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsNavigatorViewStateChangedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsNavigatorViewStateChangedEvent.java @@ -1,6 +1,6 @@ package p.studio.workspaces.assets.messages.events; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; import p.studio.workspaces.assets.messages.AssetListViewState; import java.util.Objects; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsRefreshRequestedEvent.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsRefreshRequestedEvent.java index 2a31e93c..a2e12756 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsRefreshRequestedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsRefreshRequestedEvent.java @@ -1,7 +1,7 @@ package p.studio.workspaces.assets.messages.events; import p.packer.messages.AssetReference; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; public record StudioAssetsRefreshRequestedEvent( AssetReference preferredAssetReference, diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceRefreshFailedEvent.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceRefreshFailedEvent.java index 3c9ba8cc..cb411ab0 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceRefreshFailedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceRefreshFailedEvent.java @@ -1,6 +1,6 @@ package p.studio.workspaces.assets.messages.events; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; import java.util.Objects; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceRefreshStartedEvent.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceRefreshStartedEvent.java index bd2d5580..05312b79 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceRefreshStartedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceRefreshStartedEvent.java @@ -1,6 +1,6 @@ package p.studio.workspaces.assets.messages.events; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; public record StudioAssetsWorkspaceRefreshStartedEvent() implements StudioEvent { } diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceRefreshedEvent.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceRefreshedEvent.java index 95598ba2..f9b0bd8d 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceRefreshedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceRefreshedEvent.java @@ -1,6 +1,6 @@ package p.studio.workspaces.assets.messages.events; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; public record StudioAssetsWorkspaceRefreshedEvent(int assetCount) implements StudioEvent { public StudioAssetsWorkspaceRefreshedEvent { diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceSelectionRequestedEvent.java b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceSelectionRequestedEvent.java index a8e7e911..08e5affe 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceSelectionRequestedEvent.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/assets/messages/events/StudioAssetsWorkspaceSelectionRequestedEvent.java @@ -1,7 +1,7 @@ package p.studio.workspaces.assets.messages.events; import p.packer.messages.AssetReference; -import p.studio.events.StudioEvent; +import p.studio.lsp.events.StudioEvent; import java.util.Objects; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorDocumentHighlightingRouter.java b/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorDocumentHighlightingRouter.java index 4a1d56ae..4405af32 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorDocumentHighlightingRouter.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorDocumentHighlightingRouter.java @@ -1,6 +1,6 @@ package p.studio.workspaces.editor; -import p.lsp.messages.PrometeuLspAnalyzeDocumentResult; +import p.studio.lsp.messages.LspAnalyzeDocumentResult; import p.studio.workspaces.editor.syntaxhighlight.EditorDocumentSemanticHighlighting; final class EditorDocumentHighlightingRouter { @@ -10,7 +10,7 @@ final class EditorDocumentHighlightingRouter { static EditorDocumentHighlightingResult route( final EditorOpenFileBuffer fileBuffer, final EditorDocumentPresentation presentation, - final PrometeuLspAnalyzeDocumentResult analysis) { + final LspAnalyzeDocumentResult analysis) { if (fileBuffer.frontendDocument() && analysis != null && !analysis.semanticHighlights().isEmpty()) { diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorDocumentPresentationRegistry.java b/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorDocumentPresentationRegistry.java index 79c0c46b..69f60d1b 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorDocumentPresentationRegistry.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorDocumentPresentationRegistry.java @@ -1,7 +1,7 @@ package p.studio.workspaces.editor; import p.studio.compiler.FrontendRegistryService; -import p.studio.vfs.VfsDocumentTypeIds; +import p.studio.vfs.messages.VfsDocumentTypeIds; import p.studio.workspaces.editor.syntaxhighlight.EditorDocumentSyntaxHighlighting; import java.util.Locale; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorOpenFileBuffer.java b/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorOpenFileBuffer.java index b4ea93b5..62e491f7 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorOpenFileBuffer.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorOpenFileBuffer.java @@ -1,6 +1,6 @@ package p.studio.workspaces.editor; -import p.studio.vfs.VfsDocumentAccessMode; +import p.studio.vfs.messages.VfsDocumentAccessMode; import java.nio.file.Path; import java.util.Objects; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorOutlinePanel.java b/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorOutlinePanel.java index 0a563a72..b6ad1d8e 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorOutlinePanel.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorOutlinePanel.java @@ -4,8 +4,8 @@ import javafx.geometry.Insets; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.layout.VBox; -import p.lsp.dtos.PrometeuLspDiagnosticDTO; -import p.lsp.dtos.PrometeuLspSymbolDTO; +import p.studio.lsp.dtos.LspDiagnosticDTO; +import p.studio.lsp.dtos.LspSymbolDTO; import p.studio.Container; import p.studio.controls.WorkspaceDockPane; import p.studio.utilities.i18n.I18n; @@ -63,21 +63,21 @@ public final class EditorOutlinePanel extends WorkspaceDockPane { public void showSemanticReadResult( final Path documentPath, - final List diagnostics, - final List symbols) { + final List diagnostics, + final List symbols) { summary.textProperty().unbind(); summary.setText(documentPath.getFileName() + " • semantic read-only"); rebuildDiagnostics(diagnostics); rebuildSymbols(symbols); } - private void rebuildDiagnostics(final List diagnostics) { + private void rebuildDiagnostics(final List diagnostics) { diagnosticsBox.getChildren().clear(); if (diagnostics.isEmpty()) { diagnosticsBox.getChildren().add(placeholderLabel(I18n.CODE_EDITOR_OUTLINE_EMPTY_DIAGNOSTICS)); return; } - for (final PrometeuLspDiagnosticDTO diagnostic : diagnostics) { + for (final LspDiagnosticDTO diagnostic : diagnostics) { final var label = new Label(formatDiagnostic(diagnostic)); label.setWrapText(true); label.getStyleClass().addAll( @@ -89,24 +89,24 @@ public final class EditorOutlinePanel extends WorkspaceDockPane { } } - private void rebuildSymbols(final List symbols) { + private void rebuildSymbols(final List symbols) { symbolsBox.getChildren().clear(); if (symbols.isEmpty()) { symbolsBox.getChildren().add(placeholderLabel(I18n.CODE_EDITOR_OUTLINE_EMPTY_SYMBOLS)); return; } - for (final PrometeuLspSymbolDTO symbol : symbols) { + for (final LspSymbolDTO symbol : symbols) { appendSymbol(symbol, 0); } } - private void appendSymbol(final PrometeuLspSymbolDTO symbol, final int depth) { + private void appendSymbol(final LspSymbolDTO symbol, final int depth) { final var label = new Label(symbol.name() + " • " + symbol.kind().name().toLowerCase()); label.setWrapText(true); label.setPadding(new Insets(0, 0, 0, depth * 12)); label.getStyleClass().add("editor-workspace-outline-item"); symbolsBox.getChildren().add(label); - for (final PrometeuLspSymbolDTO child : symbol.children()) { + for (final LspSymbolDTO child : symbol.children()) { appendSymbol(child, depth + 1); } } @@ -126,7 +126,7 @@ public final class EditorOutlinePanel extends WorkspaceDockPane { return label; } - private String formatDiagnostic(final PrometeuLspDiagnosticDTO diagnostic) { + private String formatDiagnostic(final LspDiagnosticDTO diagnostic) { return "%s [%d,%d) %s".formatted( diagnostic.severity().name(), diagnostic.range().startOffset(), diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorProjectNavigatorPanel.java b/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorProjectNavigatorPanel.java index 40807231..1b889de2 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorProjectNavigatorPanel.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorProjectNavigatorPanel.java @@ -15,8 +15,8 @@ import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import p.studio.Container; import p.studio.utilities.i18n.I18n; -import p.studio.vfs.VfsProjectNode; -import p.studio.vfs.VfsProjectSnapshot; +import p.studio.vfs.messages.VfsProjectNode; +import p.studio.vfs.messages.VfsProjectSnapshot; import java.nio.file.Path; import java.util.HashSet; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorWorkspace.java b/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorWorkspace.java index 23e8c84f..f7b1bd6c 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorWorkspace.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/editor/EditorWorkspace.java @@ -5,22 +5,17 @@ import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.SplitPane; -import javafx.scene.layout.BorderPane; -import javafx.scene.layout.HBox; -import javafx.scene.layout.Priority; -import javafx.scene.layout.Region; -import javafx.scene.layout.VBox; +import javafx.scene.layout.*; import org.fxmisc.richtext.CodeArea; import org.fxmisc.richtext.LineNumberFactory; -import p.lsp.PrometeuLspService; -import p.lsp.messages.PrometeuLspAnalyzeDocumentRequest; -import p.lsp.messages.PrometeuLspAnalyzeDocumentResult; +import p.studio.lsp.LspService; +import p.studio.lsp.messages.LspAnalyzeDocumentRequest; +import p.studio.lsp.messages.LspAnalyzeDocumentResult; import p.studio.projects.ProjectReference; import p.studio.utilities.i18n.I18n; -import p.studio.vfs.ProjectDocumentVfs; +import p.studio.vfs.VfsProjectDocument; import p.studio.vfs.VfsDocumentOpenResult; -import p.studio.vfs.VfsProjectNode; -import p.studio.vfs.VfsTextDocument; +import p.studio.vfs.messages.VfsProjectNode; import p.studio.workspaces.Workspace; import p.studio.workspaces.WorkspaceId; @@ -41,18 +36,18 @@ public final class EditorWorkspace extends Workspace { private final EditorStatusBar statusBar = new EditorStatusBar(); private final EditorTabStrip tabStrip = new EditorTabStrip(); private final EditorDocumentPresentationRegistry presentationRegistry = new EditorDocumentPresentationRegistry(); - private final PrometeuLspService prometeuLspService; - private final ProjectDocumentVfs projectDocumentVfs; + private final LspService prometeuLspService; + private final VfsProjectDocument vfsProjectDocument; private final EditorOpenFileSession openFileSession = new EditorOpenFileSession(); private final List activePresentationStylesheets = new ArrayList<>(); private boolean syncingEditor; public EditorWorkspace( final ProjectReference projectReference, - final ProjectDocumentVfs projectDocumentVfs, - final PrometeuLspService prometeuLspService) { + final VfsProjectDocument vfsProjectDocument, + final LspService prometeuLspService) { super(projectReference); - this.projectDocumentVfs = Objects.requireNonNull(projectDocumentVfs, "projectDocumentVfs"); + this.vfsProjectDocument = Objects.requireNonNull(vfsProjectDocument, "vfsProjectDocument"); this.prometeuLspService = Objects.requireNonNull(prometeuLspService, "prometeuLspService"); root.getStyleClass().add("editor-workspace"); codeArea.setParagraphGraphicFactory(LineNumberFactory.get(codeArea)); @@ -93,19 +88,19 @@ public final class EditorWorkspace extends Workspace { public CodeArea codeArea() { return codeArea; } private void refreshNavigator() { - navigatorPanel.setSnapshot(projectDocumentVfs.refresh()); + navigatorPanel.setSnapshot(vfsProjectDocument.refresh()); } private void openNode(final VfsProjectNode node) { - final VfsDocumentOpenResult result = projectDocumentVfs.openDocument(node.path()); - if (result instanceof VfsTextDocument textDocument) { + final VfsDocumentOpenResult result = vfsProjectDocument.openDocument(node.path()); + if (result instanceof VfsDocumentOpenResult.VfsTextDocument textDocument) { openFile(textDocument); return; } showUnsupportedFileModal(node.path()); } - private void openFile(final VfsTextDocument textDocument) { + private void openFile(final VfsDocumentOpenResult.VfsTextDocument textDocument) { openFileSession.open(bufferFrom(textDocument)); renderSession(); } @@ -128,8 +123,8 @@ public final class EditorWorkspace extends Workspace { final var fileBuffer = activeFile.orElseThrow(); final EditorDocumentPresentation presentation = presentationRegistry.resolve(fileBuffer.typeId()); - final PrometeuLspAnalyzeDocumentResult analysis = fileBuffer.frontendDocument() - ? prometeuLspService.analyzeDocument(new PrometeuLspAnalyzeDocumentRequest(fileBuffer.path())) + final LspAnalyzeDocumentResult analysis = fileBuffer.frontendDocument() + ? prometeuLspService.analyzeDocument(new LspAnalyzeDocumentRequest(fileBuffer.path())) : null; final EditorDocumentHighlightingResult highlighting = EditorDocumentHighlightingRouter.route( fileBuffer, @@ -261,7 +256,7 @@ public final class EditorWorkspace extends Workspace { openFileSession.activeFile() .filter(EditorOpenFileBuffer::editable) .ifPresent(activeFile -> { - final VfsTextDocument updatedDocument = projectDocumentVfs.updateDocument(activeFile.path(), content); + final VfsDocumentOpenResult.VfsTextDocument updatedDocument = vfsProjectDocument.updateDocument(activeFile.path(), content); openFileSession.open(bufferFrom(updatedDocument)); tabStrip.showOpenFiles( openFileSession.openFiles(), @@ -274,7 +269,7 @@ public final class EditorWorkspace extends Workspace { openFileSession.activeFile() .filter(EditorOpenFileBuffer::saveEnabled) .ifPresent(activeFile -> { - projectDocumentVfs.saveDocument(activeFile.path()); + vfsProjectDocument.saveDocument(activeFile.path()); reloadOpenFilesFromVfs(activeFile.path()); renderSession(); }); @@ -284,7 +279,7 @@ public final class EditorWorkspace extends Workspace { if (!openFileSession.hasDirtyEditableFiles()) { return; } - projectDocumentVfs.saveAllDocuments(); + vfsProjectDocument.saveAllDocuments(); reloadOpenFilesFromVfs(openFileSession.activeFile().map(EditorOpenFileBuffer::path).orElse(null)); renderSession(); } @@ -294,8 +289,8 @@ public final class EditorWorkspace extends Workspace { .map(EditorOpenFileBuffer::path) .toList(); for (final var path : openPaths) { - final var result = projectDocumentVfs.openDocument(path); - if (result instanceof VfsTextDocument textDocument) { + final var result = vfsProjectDocument.openDocument(path); + if (result instanceof VfsDocumentOpenResult.VfsTextDocument textDocument) { openFileSession.open(bufferFrom(textDocument)); } } @@ -312,7 +307,7 @@ public final class EditorWorkspace extends Workspace { readOnlyWarning.setManaged(showWarning); } - private EditorOpenFileBuffer bufferFrom(final VfsTextDocument textDocument) { + private EditorOpenFileBuffer bufferFrom(final VfsDocumentOpenResult.VfsTextDocument textDocument) { return new EditorOpenFileBuffer( textDocument.path(), textDocument.documentName(), @@ -326,7 +321,7 @@ public final class EditorWorkspace extends Workspace { private void refreshSemanticOutline( final EditorOpenFileBuffer fileBuffer, - final PrometeuLspAnalyzeDocumentResult analysis) { + final LspAnalyzeDocumentResult analysis) { if (!fileBuffer.frontendDocument() || analysis == null) { outlinePanel.showPlaceholder(); return; diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/editor/syntaxhighlight/EditorDocumentSemanticHighlighting.java b/prometeu-studio/src/main/java/p/studio/workspaces/editor/syntaxhighlight/EditorDocumentSemanticHighlighting.java index 08071202..b100aada 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/editor/syntaxhighlight/EditorDocumentSemanticHighlighting.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/editor/syntaxhighlight/EditorDocumentSemanticHighlighting.java @@ -2,7 +2,7 @@ package p.studio.workspaces.editor.syntaxhighlight; import org.fxmisc.richtext.model.StyleSpans; import org.fxmisc.richtext.model.StyleSpansBuilder; -import p.lsp.dtos.PrometeuLspHighlightSpanDTO; +import p.studio.lsp.dtos.LspHighlightSpanDTO; import java.util.Collection; import java.util.Collections; @@ -15,13 +15,13 @@ public final class EditorDocumentSemanticHighlighting { public static StyleSpans> highlight( final String content, - final List semanticHighlights) { + final List semanticHighlights) { final StyleSpansBuilder> builder = new StyleSpansBuilder<>(); - final List orderedHighlights = semanticHighlights.stream() + final List orderedHighlights = semanticHighlights.stream() .sorted(Comparator.comparingInt(highlight -> highlight.range().startOffset())) .toList(); int cursor = 0; - for (final PrometeuLspHighlightSpanDTO highlight : orderedHighlights) { + for (final LspHighlightSpanDTO highlight : orderedHighlights) { final int start = Math.max(cursor, highlight.range().startOffset()); final int end = Math.min(content.length(), highlight.range().endOffset()); if (start > cursor) { diff --git a/prometeu-studio/src/main/java/p/studio/workspaces/framework/StudioEventBindings.java b/prometeu-studio/src/main/java/p/studio/workspaces/framework/StudioEventBindings.java index a9aa4d9d..55b7c266 100644 --- a/prometeu-studio/src/main/java/p/studio/workspaces/framework/StudioEventBindings.java +++ b/prometeu-studio/src/main/java/p/studio/workspaces/framework/StudioEventBindings.java @@ -1,8 +1,8 @@ package p.studio.workspaces.framework; -import p.studio.events.StudioEvent; -import p.studio.events.StudioEventBus; -import p.studio.events.StudioWorkspaceEventBus; +import p.studio.lsp.events.StudioEvent; +import p.studio.lsp.events.StudioEventBus; +import p.studio.lsp.events.StudioWorkspaceEventBus; import java.util.Objects; import java.util.function.Consumer; diff --git a/prometeu-studio/src/test/java/p/studio/controls/shell/StudioActivityEventMapperTest.java b/prometeu-studio/src/test/java/p/studio/controls/shell/StudioActivityEventMapperTest.java index 2b2a682f..998a8240 100644 --- a/prometeu-studio/src/test/java/p/studio/controls/shell/StudioActivityEventMapperTest.java +++ b/prometeu-studio/src/test/java/p/studio/controls/shell/StudioActivityEventMapperTest.java @@ -2,8 +2,8 @@ package p.studio.controls.shell; import org.junit.jupiter.api.Test; import p.packer.events.PackerEventKind; -import p.studio.events.StudioPackerOperationEvent; -import p.studio.events.StudioProjectOpenedEvent; +import p.studio.lsp.events.StudioPackerOperationEvent; +import p.studio.lsp.events.StudioProjectOpenedEvent; import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshFailedEvent; import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshedEvent; diff --git a/prometeu-studio/src/test/java/p/studio/events/StudioEmbeddedPackerEventAdapterTest.java b/prometeu-studio/src/test/java/p/studio/lsp/events/StudioEmbeddedPackerEventAdapterTest.java similarity index 98% rename from prometeu-studio/src/test/java/p/studio/events/StudioEmbeddedPackerEventAdapterTest.java rename to prometeu-studio/src/test/java/p/studio/lsp/events/StudioEmbeddedPackerEventAdapterTest.java index 186c3a67..a2f01cb6 100644 --- a/prometeu-studio/src/test/java/p/studio/events/StudioEmbeddedPackerEventAdapterTest.java +++ b/prometeu-studio/src/test/java/p/studio/lsp/events/StudioEmbeddedPackerEventAdapterTest.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; import org.junit.jupiter.api.Test; import p.packer.events.PackerEvent; diff --git a/prometeu-studio/src/test/java/p/studio/events/StudioWorkspaceEventBusTest.java b/prometeu-studio/src/test/java/p/studio/lsp/events/StudioWorkspaceEventBusTest.java similarity index 98% rename from prometeu-studio/src/test/java/p/studio/events/StudioWorkspaceEventBusTest.java rename to prometeu-studio/src/test/java/p/studio/lsp/events/StudioWorkspaceEventBusTest.java index e7863344..5269aae8 100644 --- a/prometeu-studio/src/test/java/p/studio/events/StudioWorkspaceEventBusTest.java +++ b/prometeu-studio/src/test/java/p/studio/lsp/events/StudioWorkspaceEventBusTest.java @@ -1,4 +1,4 @@ -package p.studio.events; +package p.studio.lsp.events; import org.junit.jupiter.api.Test; import p.studio.workspaces.WorkspaceId; diff --git a/prometeu-studio/src/test/java/p/studio/projectsessions/StudioProjectSessionFactoryTest.java b/prometeu-studio/src/test/java/p/studio/projectsessions/StudioProjectSessionFactoryTest.java index a874f6b0..26fdcfb2 100644 --- a/prometeu-studio/src/test/java/p/studio/projectsessions/StudioProjectSessionFactoryTest.java +++ b/prometeu-studio/src/test/java/p/studio/projectsessions/StudioProjectSessionFactoryTest.java @@ -1,21 +1,21 @@ package p.studio.projectsessions; import org.junit.jupiter.api.Test; -import p.lsp.PrometeuLspProjectContext; -import p.lsp.PrometeuLspService; -import p.lsp.PrometeuLspServiceFactory; -import p.lsp.dtos.PrometeuLspSessionStateDTO; -import p.lsp.messages.PrometeuLspAnalyzeDocumentRequest; -import p.lsp.messages.PrometeuLspAnalyzeDocumentResult; -import p.lsp.messages.PrometeuLspDefinitionRequest; -import p.lsp.messages.PrometeuLspDefinitionResult; +import p.studio.lsp.messages.LspProjectContext; +import p.studio.lsp.LspService; +import p.studio.lsp.LspServiceFactory; +import p.studio.lsp.dtos.LspSessionStateDTO; +import p.studio.lsp.messages.LspAnalyzeDocumentRequest; +import p.studio.lsp.messages.LspAnalyzeDocumentResult; +import p.studio.lsp.messages.LspDefinitionRequest; +import p.studio.lsp.messages.LspDefinitionResult; import p.studio.projects.ProjectReference; -import p.studio.vfs.ProjectDocumentVfs; +import p.studio.vfs.VfsProjectDocument; import p.studio.vfs.ProjectDocumentVfsFactory; import p.studio.vfs.VfsDocumentOpenResult; -import p.studio.vfs.VfsProjectContext; -import p.studio.vfs.VfsProjectSnapshot; -import p.studio.vfs.VfsRefreshRequest; +import p.studio.vfs.messages.VfsProjectContext; +import p.studio.vfs.messages.VfsProjectSnapshot; +import p.studio.vfs.messages.VfsRefreshRequest; import java.nio.file.Path; @@ -50,31 +50,31 @@ final class StudioProjectSessionFactoryTest { private static final class RecordingVfsFactory implements ProjectDocumentVfsFactory { private VfsProjectContext capturedContext; - private final ProjectDocumentVfs vfs = new NoOpProjectDocumentVfs(); + private final VfsProjectDocument vfs = new NoOpVfsProjectDocument(); @Override - public ProjectDocumentVfs open(VfsProjectContext projectContext) { + public VfsProjectDocument open(VfsProjectContext projectContext) { this.capturedContext = projectContext; return vfs; } } - private static final class RecordingLspFactory implements PrometeuLspServiceFactory { - private PrometeuLspProjectContext capturedContext; - private ProjectDocumentVfs capturedVfs; - private final PrometeuLspService service = new NoOpPrometeuLspService(); + private static final class RecordingLspFactory implements LspServiceFactory { + private LspProjectContext capturedContext; + private VfsProjectDocument capturedVfs; + private final LspService service = new NoOpPrometeuLspService(); @Override - public PrometeuLspService open( - final PrometeuLspProjectContext projectContext, - final ProjectDocumentVfs projectDocumentVfs) { + public LspService open( + final LspProjectContext projectContext, + final VfsProjectDocument vfsProjectDocument) { this.capturedContext = projectContext; - this.capturedVfs = projectDocumentVfs; + this.capturedVfs = vfsProjectDocument; return service; } } - private static final class NoOpProjectDocumentVfs implements ProjectDocumentVfs { + private static final class NoOpVfsProjectDocument implements VfsProjectDocument { @Override public VfsProjectContext projectContext() { throw new UnsupportedOperationException(); @@ -101,29 +101,29 @@ final class StudioProjectSessionFactoryTest { } } - private static final class NoOpPrometeuLspService implements PrometeuLspService { + private static final class NoOpPrometeuLspService implements LspService { @Override - public PrometeuLspProjectContext projectContext() { + public LspProjectContext projectContext() { throw new UnsupportedOperationException(); } @Override - public ProjectDocumentVfs projectDocumentVfs() { + public VfsProjectDocument projectDocumentVfs() { throw new UnsupportedOperationException(); } @Override - public PrometeuLspSessionStateDTO snapshot() { + public LspSessionStateDTO snapshot() { throw new UnsupportedOperationException(); } @Override - public PrometeuLspAnalyzeDocumentResult analyzeDocument(final PrometeuLspAnalyzeDocumentRequest request) { + public LspAnalyzeDocumentResult analyzeDocument(final LspAnalyzeDocumentRequest request) { throw new UnsupportedOperationException(); } @Override - public PrometeuLspDefinitionResult definition(final PrometeuLspDefinitionRequest request) { + public LspDefinitionResult definition(final LspDefinitionRequest request) { throw new UnsupportedOperationException(); } } diff --git a/prometeu-studio/src/test/java/p/studio/projectsessions/StudioProjectSessionTest.java b/prometeu-studio/src/test/java/p/studio/projectsessions/StudioProjectSessionTest.java index d2f85b40..98f9c46a 100644 --- a/prometeu-studio/src/test/java/p/studio/projectsessions/StudioProjectSessionTest.java +++ b/prometeu-studio/src/test/java/p/studio/projectsessions/StudioProjectSessionTest.java @@ -1,19 +1,19 @@ package p.studio.projectsessions; import org.junit.jupiter.api.Test; -import p.lsp.PrometeuLspProjectContext; -import p.lsp.PrometeuLspService; -import p.lsp.dtos.PrometeuLspSessionStateDTO; -import p.lsp.messages.PrometeuLspAnalyzeDocumentRequest; -import p.lsp.messages.PrometeuLspAnalyzeDocumentResult; -import p.lsp.messages.PrometeuLspDefinitionRequest; -import p.lsp.messages.PrometeuLspDefinitionResult; +import p.studio.lsp.messages.LspProjectContext; +import p.studio.lsp.LspService; +import p.studio.lsp.dtos.LspSessionStateDTO; +import p.studio.lsp.messages.LspAnalyzeDocumentRequest; +import p.studio.lsp.messages.LspAnalyzeDocumentResult; +import p.studio.lsp.messages.LspDefinitionRequest; +import p.studio.lsp.messages.LspDefinitionResult; import p.studio.projects.ProjectReference; -import p.studio.vfs.ProjectDocumentVfs; +import p.studio.vfs.VfsProjectDocument; import p.studio.vfs.VfsDocumentOpenResult; -import p.studio.vfs.VfsProjectContext; -import p.studio.vfs.VfsProjectSnapshot; -import p.studio.vfs.VfsRefreshRequest; +import p.studio.vfs.messages.VfsProjectContext; +import p.studio.vfs.messages.VfsProjectSnapshot; +import p.studio.vfs.messages.VfsRefreshRequest; import java.nio.file.Path; @@ -22,7 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; final class StudioProjectSessionTest { @Test void closeDelegatesToUnderlyingServicesOnlyOnce() { - final CountingProjectDocumentVfs vfs = new CountingProjectDocumentVfs(); + final CountingVfsProjectDocument vfs = new CountingVfsProjectDocument(); final CountingPrometeuLspService lsp = new CountingPrometeuLspService(vfs); final StudioProjectSession session = new StudioProjectSession(projectReference(), lsp, vfs); @@ -37,7 +37,7 @@ final class StudioProjectSessionTest { return new ProjectReference("Example", "1.0.0", "pbs", 1, Path.of("/tmp/example")); } - private static final class CountingProjectDocumentVfs implements ProjectDocumentVfs { + private static final class CountingVfsProjectDocument implements VfsProjectDocument { private int closeCalls; @Override @@ -71,36 +71,36 @@ final class StudioProjectSessionTest { } } - private static final class CountingPrometeuLspService implements PrometeuLspService { - private final ProjectDocumentVfs projectDocumentVfs; + private static final class CountingPrometeuLspService implements LspService { + private final VfsProjectDocument vfsProjectDocument; private int closeCalls; - private CountingPrometeuLspService(final ProjectDocumentVfs projectDocumentVfs) { - this.projectDocumentVfs = projectDocumentVfs; + private CountingPrometeuLspService(final VfsProjectDocument vfsProjectDocument) { + this.vfsProjectDocument = vfsProjectDocument; } @Override - public PrometeuLspProjectContext projectContext() { + public LspProjectContext projectContext() { throw new UnsupportedOperationException(); } @Override - public ProjectDocumentVfs projectDocumentVfs() { - return projectDocumentVfs; + public VfsProjectDocument projectDocumentVfs() { + return vfsProjectDocument; } @Override - public PrometeuLspSessionStateDTO snapshot() { + public LspSessionStateDTO snapshot() { throw new UnsupportedOperationException(); } @Override - public PrometeuLspAnalyzeDocumentResult analyzeDocument(final PrometeuLspAnalyzeDocumentRequest request) { + public LspAnalyzeDocumentResult analyzeDocument(final LspAnalyzeDocumentRequest request) { throw new UnsupportedOperationException(); } @Override - public PrometeuLspDefinitionResult definition(final PrometeuLspDefinitionRequest request) { + public LspDefinitionResult definition(final LspDefinitionRequest request) { throw new UnsupportedOperationException(); } diff --git a/prometeu-studio/src/test/java/p/studio/workspaces/editor/EditorDocumentHighlightingRouterTest.java b/prometeu-studio/src/test/java/p/studio/workspaces/editor/EditorDocumentHighlightingRouterTest.java index fdc9cc88..760e98c0 100644 --- a/prometeu-studio/src/test/java/p/studio/workspaces/editor/EditorDocumentHighlightingRouterTest.java +++ b/prometeu-studio/src/test/java/p/studio/workspaces/editor/EditorDocumentHighlightingRouterTest.java @@ -1,11 +1,11 @@ package p.studio.workspaces.editor; import org.junit.jupiter.api.Test; -import p.lsp.dtos.PrometeuLspHighlightSpanDTO; -import p.lsp.dtos.PrometeuLspRangeDTO; -import p.lsp.dtos.PrometeuLspSessionStateDTO; -import p.lsp.messages.PrometeuLspAnalyzeDocumentResult; -import p.studio.vfs.VfsDocumentAccessMode; +import p.studio.lsp.dtos.LspHighlightSpanDTO; +import p.studio.lsp.dtos.LspRangeDTO; +import p.studio.lsp.dtos.LspSessionStateDTO; +import p.studio.lsp.messages.LspAnalyzeDocumentResult; +import p.studio.vfs.messages.VfsDocumentAccessMode; import java.nio.file.Path; import java.util.List; @@ -26,10 +26,10 @@ final class EditorDocumentHighlightingRouterTest { VfsDocumentAccessMode.READ_ONLY, false); - final PrometeuLspAnalyzeDocumentResult analysis = new PrometeuLspAnalyzeDocumentResult( - new PrometeuLspSessionStateDTO(true, List.of("highlight")), + final LspAnalyzeDocumentResult analysis = new LspAnalyzeDocumentResult( + new LspSessionStateDTO(true, List.of("highlight")), List.of(), - List.of(new PrometeuLspHighlightSpanDTO(new PrometeuLspRangeDTO(0, 2), "fe-keyword")), + List.of(new LspHighlightSpanDTO(new LspRangeDTO(0, 2), "fe-keyword")), List.of(), List.of()); @@ -54,10 +54,10 @@ final class EditorDocumentHighlightingRouterTest { VfsDocumentAccessMode.EDITABLE, false); - final PrometeuLspAnalyzeDocumentResult analysis = new PrometeuLspAnalyzeDocumentResult( - new PrometeuLspSessionStateDTO(true, List.of("highlight")), + final LspAnalyzeDocumentResult analysis = new LspAnalyzeDocumentResult( + new LspSessionStateDTO(true, List.of("highlight")), List.of(), - List.of(new PrometeuLspHighlightSpanDTO(new PrometeuLspRangeDTO(0, 1), "fe-punctuation")), + List.of(new LspHighlightSpanDTO(new LspRangeDTO(0, 1), "fe-punctuation")), List.of(), List.of()); diff --git a/prometeu-studio/src/test/java/p/studio/workspaces/editor/EditorOpenFileSessionTest.java b/prometeu-studio/src/test/java/p/studio/workspaces/editor/EditorOpenFileSessionTest.java index c2170bfa..33ff411b 100644 --- a/prometeu-studio/src/test/java/p/studio/workspaces/editor/EditorOpenFileSessionTest.java +++ b/prometeu-studio/src/test/java/p/studio/workspaces/editor/EditorOpenFileSessionTest.java @@ -1,7 +1,7 @@ package p.studio.workspaces.editor; import org.junit.jupiter.api.Test; -import p.studio.vfs.VfsDocumentAccessMode; +import p.studio.vfs.messages.VfsDocumentAccessMode; import java.nio.file.Path; diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/ProjectDocumentVfsFactory.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/ProjectDocumentVfsFactory.java index 4bc858e2..fe309951 100644 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/ProjectDocumentVfsFactory.java +++ b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/ProjectDocumentVfsFactory.java @@ -1,5 +1,7 @@ package p.studio.vfs; +import p.studio.vfs.messages.VfsProjectContext; + public interface ProjectDocumentVfsFactory { - ProjectDocumentVfs open(VfsProjectContext projectContext); + VfsProjectDocument open(VfsProjectContext projectContext); } diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentOpenResult.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentOpenResult.java index 4b968ec1..4eee7b40 100644 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentOpenResult.java +++ b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentOpenResult.java @@ -1,7 +1,40 @@ package p.studio.vfs; -import java.nio.file.Path; +import p.studio.vfs.messages.VfsDocumentAccessContext; +import p.studio.vfs.messages.VfsUnsupportedReason; -public sealed interface VfsDocumentOpenResult permits VfsTextDocument, VfsUnsupportedDocument { +import java.nio.file.Path; +import java.util.Objects; + +public sealed interface VfsDocumentOpenResult permits VfsDocumentOpenResult.VfsUnsupportedDocument, VfsDocumentOpenResult.VfsTextDocument { Path path(); + + record VfsUnsupportedDocument( + Path path, + VfsUnsupportedReason reason) implements VfsDocumentOpenResult { + + public VfsUnsupportedDocument { + path = Objects.requireNonNull(path, "path").toAbsolutePath().normalize(); + Objects.requireNonNull(reason, "reason"); + } + } + + record VfsTextDocument( + Path path, + String documentName, + String typeId, + String content, + String lineSeparator, + boolean dirty, + VfsDocumentAccessContext accessContext) implements VfsDocumentOpenResult { + + public VfsTextDocument { + path = Objects.requireNonNull(path, "path").toAbsolutePath().normalize(); + Objects.requireNonNull(documentName, "documentName"); + Objects.requireNonNull(typeId, "typeId"); + Objects.requireNonNull(content, "content"); + Objects.requireNonNull(lineSeparator, "lineSeparator"); + Objects.requireNonNull(accessContext, "accessContext"); + } + } } diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/ProjectDocumentVfs.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsProjectDocument.java similarity index 85% rename from prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/ProjectDocumentVfs.java rename to prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsProjectDocument.java index ec90c63c..20a504ef 100644 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/ProjectDocumentVfs.java +++ b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsProjectDocument.java @@ -1,10 +1,12 @@ package p.studio.vfs; +import p.studio.vfs.messages.*; + import java.nio.file.Path; import java.util.List; import java.util.Map; -public interface ProjectDocumentVfs extends AutoCloseable { +public interface VfsProjectDocument extends AutoCloseable { VfsProjectContext projectContext(); VfsProjectSnapshot snapshot(); @@ -23,7 +25,7 @@ public interface ProjectDocumentVfs extends AutoCloseable { throw new UnsupportedOperationException("Document access context updates are not supported by this VFS implementation."); } - default VfsTextDocument updateDocument(final Path path, final String content) { + default VfsDocumentOpenResult.VfsTextDocument updateDocument(final Path path, final String content) { throw new UnsupportedOperationException("Document mutation is not supported by this VFS implementation."); } diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsTextDocument.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsTextDocument.java deleted file mode 100644 index 56a00f73..00000000 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsTextDocument.java +++ /dev/null @@ -1,23 +0,0 @@ -package p.studio.vfs; - -import java.nio.file.Path; -import java.util.Objects; - -public record VfsTextDocument( - Path path, - String documentName, - String typeId, - String content, - String lineSeparator, - boolean dirty, - VfsDocumentAccessContext accessContext) implements VfsDocumentOpenResult { - - public VfsTextDocument { - path = Objects.requireNonNull(path, "path").toAbsolutePath().normalize(); - Objects.requireNonNull(documentName, "documentName"); - Objects.requireNonNull(typeId, "typeId"); - Objects.requireNonNull(content, "content"); - Objects.requireNonNull(lineSeparator, "lineSeparator"); - Objects.requireNonNull(accessContext, "accessContext"); - } -} diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsUnsupportedDocument.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsUnsupportedDocument.java deleted file mode 100644 index 58bc8f8f..00000000 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsUnsupportedDocument.java +++ /dev/null @@ -1,14 +0,0 @@ -package p.studio.vfs; - -import java.nio.file.Path; -import java.util.Objects; - -public record VfsUnsupportedDocument( - Path path, - VfsUnsupportedReason reason) implements VfsDocumentOpenResult { - - public VfsUnsupportedDocument { - path = Objects.requireNonNull(path, "path").toAbsolutePath().normalize(); - Objects.requireNonNull(reason, "reason"); - } -} diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentAccessContext.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentAccessContext.java similarity index 95% rename from prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentAccessContext.java rename to prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentAccessContext.java index d110928f..40fb7cdb 100644 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentAccessContext.java +++ b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentAccessContext.java @@ -1,4 +1,4 @@ -package p.studio.vfs; +package p.studio.vfs.messages; import java.nio.file.Path; import java.util.Map; diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentAccessMode.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentAccessMode.java similarity index 68% rename from prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentAccessMode.java rename to prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentAccessMode.java index 18250cdb..1ebbc417 100644 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentAccessMode.java +++ b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentAccessMode.java @@ -1,4 +1,4 @@ -package p.studio.vfs; +package p.studio.vfs.messages; public enum VfsDocumentAccessMode { READ_ONLY, diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentSaveResult.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentSaveResult.java similarity index 92% rename from prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentSaveResult.java rename to prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentSaveResult.java index 1a57f945..5ac04114 100644 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentSaveResult.java +++ b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentSaveResult.java @@ -1,4 +1,4 @@ -package p.studio.vfs; +package p.studio.vfs.messages; import java.nio.file.Path; import java.util.Objects; diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentSaveStatus.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentSaveStatus.java similarity index 72% rename from prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentSaveStatus.java rename to prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentSaveStatus.java index 5a8f1e41..2a8ad4d4 100644 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentSaveStatus.java +++ b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentSaveStatus.java @@ -1,4 +1,4 @@ -package p.studio.vfs; +package p.studio.vfs.messages; public enum VfsDocumentSaveStatus { SAVED, diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentTypeIds.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentTypeIds.java similarity index 89% rename from prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentTypeIds.java rename to prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentTypeIds.java index d1ef901b..f664d59a 100644 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsDocumentTypeIds.java +++ b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsDocumentTypeIds.java @@ -1,4 +1,4 @@ -package p.studio.vfs; +package p.studio.vfs.messages; public final class VfsDocumentTypeIds { public static final String TEXT = "text"; diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsProjectContext.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsProjectContext.java similarity index 93% rename from prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsProjectContext.java rename to prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsProjectContext.java index b4c6367c..81ecd2fb 100644 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsProjectContext.java +++ b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsProjectContext.java @@ -1,4 +1,4 @@ -package p.studio.vfs; +package p.studio.vfs.messages; import java.nio.file.Path; import java.util.Objects; diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsProjectNode.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsProjectNode.java similarity index 94% rename from prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsProjectNode.java rename to prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsProjectNode.java index e6ec9a6e..271bdadc 100644 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsProjectNode.java +++ b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsProjectNode.java @@ -1,4 +1,4 @@ -package p.studio.vfs; +package p.studio.vfs.messages; import java.nio.file.Path; import java.util.List; diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsProjectSnapshot.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsProjectSnapshot.java similarity index 91% rename from prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsProjectSnapshot.java rename to prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsProjectSnapshot.java index a8af0159..7995d13b 100644 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsProjectSnapshot.java +++ b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsProjectSnapshot.java @@ -1,4 +1,4 @@ -package p.studio.vfs; +package p.studio.vfs.messages; import java.nio.file.Path; import java.util.Objects; diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsRefreshRequest.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsRefreshRequest.java similarity index 88% rename from prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsRefreshRequest.java rename to prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsRefreshRequest.java index 234dd314..955c0cf4 100644 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsRefreshRequest.java +++ b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsRefreshRequest.java @@ -1,4 +1,4 @@ -package p.studio.vfs; +package p.studio.vfs.messages; import java.nio.file.Path; import java.util.Objects; diff --git a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsUnsupportedReason.java b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsUnsupportedReason.java similarity index 82% rename from prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsUnsupportedReason.java rename to prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsUnsupportedReason.java index c050bc06..beeee78a 100644 --- a/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/VfsUnsupportedReason.java +++ b/prometeu-vfs/prometeu-vfs-api/src/main/java/p/studio/vfs/messages/VfsUnsupportedReason.java @@ -1,4 +1,4 @@ -package p.studio.vfs; +package p.studio.vfs.messages; public enum VfsUnsupportedReason { OUTSIDE_PROJECT, diff --git a/prometeu-vfs/prometeu-vfs-v1/src/main/java/p/studio/vfs/FilesystemProjectDocumentVfsFactory.java b/prometeu-vfs/prometeu-vfs-v1/src/main/java/p/studio/vfs/FilesystemProjectDocumentVfsFactory.java index a2089836..a60f52ed 100644 --- a/prometeu-vfs/prometeu-vfs-v1/src/main/java/p/studio/vfs/FilesystemProjectDocumentVfsFactory.java +++ b/prometeu-vfs/prometeu-vfs-v1/src/main/java/p/studio/vfs/FilesystemProjectDocumentVfsFactory.java @@ -1,10 +1,12 @@ package p.studio.vfs; +import p.studio.vfs.messages.VfsProjectContext; + import java.util.Objects; public final class FilesystemProjectDocumentVfsFactory implements ProjectDocumentVfsFactory { @Override - public ProjectDocumentVfs open(final VfsProjectContext projectContext) { - return new FilesystemProjectDocumentVfs(Objects.requireNonNull(projectContext, "projectContext")); + public VfsProjectDocument open(final VfsProjectContext projectContext) { + return new FilesystemVfsProjectDocument(Objects.requireNonNull(projectContext, "projectContext")); } } diff --git a/prometeu-vfs/prometeu-vfs-v1/src/main/java/p/studio/vfs/FilesystemProjectDocumentVfs.java b/prometeu-vfs/prometeu-vfs-v1/src/main/java/p/studio/vfs/FilesystemVfsProjectDocument.java similarity index 97% rename from prometeu-vfs/prometeu-vfs-v1/src/main/java/p/studio/vfs/FilesystemProjectDocumentVfs.java rename to prometeu-vfs/prometeu-vfs-v1/src/main/java/p/studio/vfs/FilesystemVfsProjectDocument.java index a91b7708..c5f10a98 100644 --- a/prometeu-vfs/prometeu-vfs-v1/src/main/java/p/studio/vfs/FilesystemProjectDocumentVfs.java +++ b/prometeu-vfs/prometeu-vfs-v1/src/main/java/p/studio/vfs/FilesystemVfsProjectDocument.java @@ -2,6 +2,7 @@ package p.studio.vfs; import p.studio.compiler.FrontendRegistryService; import p.studio.compiler.models.FrontendSpec; +import p.studio.vfs.messages.*; import java.io.IOException; import java.io.UncheckedIOException; @@ -11,24 +12,17 @@ import java.nio.charset.CodingErrorAction; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; -final class FilesystemProjectDocumentVfs implements ProjectDocumentVfs { +final class FilesystemVfsProjectDocument implements VfsProjectDocument { private final VfsProjectContext projectContext; private final Map editableSnapshots = new LinkedHashMap<>(); private final Map> accessContextAttributes = new HashMap<>(); private VfsProjectSnapshot snapshot; - FilesystemProjectDocumentVfs(final VfsProjectContext projectContext) { + FilesystemVfsProjectDocument(final VfsProjectContext projectContext) { this.projectContext = Objects.requireNonNull(projectContext, "projectContext"); this.snapshot = buildSnapshot(); } @@ -73,7 +67,7 @@ final class FilesystemProjectDocumentVfs implements ProjectDocumentVfs { final var supportedDocument = requireSupportedDocument(path); return openSupportedDocument(supportedDocument); } catch (UnsupportedDocumentException unsupportedDocumentException) { - return new VfsUnsupportedDocument( + return new VfsDocumentOpenResult.VfsUnsupportedDocument( unsupportedDocumentException.path(), unsupportedDocumentException.reason()); } @@ -92,7 +86,7 @@ final class FilesystemProjectDocumentVfs implements ProjectDocumentVfs { } @Override - public VfsTextDocument updateDocument(final Path path, final String content) { + public VfsDocumentOpenResult.VfsTextDocument updateDocument(final Path path, final String content) { final var supportedDocument = requireSupportedDocument(path); if (supportedDocument.accessMode() != VfsDocumentAccessMode.EDITABLE) { throw new IllegalStateException("Document is hard read-only: " + supportedDocument.path()); @@ -194,11 +188,11 @@ final class FilesystemProjectDocumentVfs implements ProjectDocumentVfs { return toVfsTextDocument(supportedDocument, false, accessContext); } - private VfsTextDocument toVfsTextDocument( + private VfsDocumentOpenResult.VfsTextDocument toVfsTextDocument( final SupportedDocument supportedDocument, final boolean dirty, final VfsDocumentAccessContext accessContext) { - return new VfsTextDocument( + return new VfsDocumentOpenResult.VfsTextDocument( supportedDocument.path(), supportedDocument.documentName(), supportedDocument.typeId(), diff --git a/prometeu-vfs/prometeu-vfs-v1/src/test/java/p/studio/vfs/FilesystemProjectDocumentVfsTest.java b/prometeu-vfs/prometeu-vfs-v1/src/test/java/p/studio/vfs/FilesystemVfsProjectDocumentTest.java similarity index 78% rename from prometeu-vfs/prometeu-vfs-v1/src/test/java/p/studio/vfs/FilesystemProjectDocumentVfsTest.java rename to prometeu-vfs/prometeu-vfs-v1/src/test/java/p/studio/vfs/FilesystemVfsProjectDocumentTest.java index 78a5c19b..2e999e71 100644 --- a/prometeu-vfs/prometeu-vfs-v1/src/test/java/p/studio/vfs/FilesystemProjectDocumentVfsTest.java +++ b/prometeu-vfs/prometeu-vfs-v1/src/test/java/p/studio/vfs/FilesystemVfsProjectDocumentTest.java @@ -2,18 +2,15 @@ package p.studio.vfs; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import p.studio.vfs.messages.*; import java.nio.file.Files; import java.nio.file.Path; import java.util.Map; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; -final class FilesystemProjectDocumentVfsTest { +final class FilesystemVfsProjectDocumentTest { @TempDir Path tempDir; @@ -24,7 +21,7 @@ final class FilesystemProjectDocumentVfsTest { Files.writeString(tempDir.resolve(".env"), "TOKEN=1\n"); Files.writeString(tempDir.resolve("README.md"), "# project\n"); - final ProjectDocumentVfs vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); + final VfsProjectDocument vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); final VfsProjectSnapshot snapshot = vfs.snapshot(); @@ -40,10 +37,10 @@ final class FilesystemProjectDocumentVfsTest { final Path file = tempDir.resolve("main.pbs"); Files.writeString(file, "fn main(): void\n"); - final ProjectDocumentVfs vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); + final VfsProjectDocument vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); final VfsDocumentOpenResult result = vfs.openDocument(file); - final VfsTextDocument document = assertInstanceOf(VfsTextDocument.class, result); + final var document = assertInstanceOf(VfsDocumentOpenResult.VfsTextDocument.class, result); assertEquals("main.pbs", document.documentName()); assertEquals("pbs", document.typeId()); @@ -58,10 +55,10 @@ final class FilesystemProjectDocumentVfsTest { final Path file = tempDir.resolve("prometeu.json"); Files.writeString(file, "{\n \"name\": \"Example\"\n}\n"); - final ProjectDocumentVfs vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); + final VfsProjectDocument vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); final VfsDocumentOpenResult result = vfs.openDocument(file); - final VfsTextDocument document = assertInstanceOf(VfsTextDocument.class, result); + final var document = assertInstanceOf(VfsDocumentOpenResult.VfsTextDocument.class, result); assertEquals(VfsDocumentTypeIds.JSON, document.typeId()); assertEquals(VfsDocumentAccessMode.EDITABLE, document.accessContext().accessMode()); @@ -72,10 +69,10 @@ final class FilesystemProjectDocumentVfsTest { final Path file = tempDir.resolve("events.ndjson"); Files.writeString(file, "{\"event\":\"start\"}\n{\"event\":\"done\"}\n"); - final ProjectDocumentVfs vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); + final VfsProjectDocument vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); final VfsDocumentOpenResult result = vfs.openDocument(file); - final VfsTextDocument document = assertInstanceOf(VfsTextDocument.class, result); + final var document = assertInstanceOf(VfsDocumentOpenResult.VfsTextDocument.class, result); assertEquals(VfsDocumentTypeIds.NDJSON, document.typeId()); } @@ -85,10 +82,10 @@ final class FilesystemProjectDocumentVfsTest { final Path file = tempDir.resolve("script.sh"); Files.writeString(file, "#!/usr/bin/env bash\nprintf \"hi\"\n"); - final ProjectDocumentVfs vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); + final VfsProjectDocument vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); final VfsDocumentOpenResult result = vfs.openDocument(file); - final VfsTextDocument document = assertInstanceOf(VfsTextDocument.class, result); + final var document = assertInstanceOf(VfsDocumentOpenResult.VfsTextDocument.class, result); assertEquals(VfsDocumentTypeIds.BASH, document.typeId()); assertEquals(VfsDocumentAccessMode.EDITABLE, document.accessContext().accessMode()); @@ -99,7 +96,7 @@ final class FilesystemProjectDocumentVfsTest { final Path file = tempDir.resolve("main.pbs"); Files.writeString(file, "fn main(): void\n"); - final ProjectDocumentVfs vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); + final VfsProjectDocument vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); assertThrows(IllegalStateException.class, () -> vfs.updateDocument(file, "fn main(): int\n")); } @@ -109,20 +106,20 @@ final class FilesystemProjectDocumentVfsTest { final Path file = tempDir.resolve("notes.txt"); Files.writeString(file, "alpha\n"); - final ProjectDocumentVfs vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); + final VfsProjectDocument vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); - final VfsTextDocument updated = vfs.updateDocument(file, "beta\n"); + final var updated = vfs.updateDocument(file, "beta\n"); assertTrue(updated.dirty()); assertEquals("beta\n", updated.content()); assertEquals("alpha\n", Files.readString(file)); - assertEquals("beta\n", assertInstanceOf(VfsTextDocument.class, vfs.openDocument(file)).content()); + assertEquals("beta\n", assertInstanceOf(VfsDocumentOpenResult.VfsTextDocument.class, vfs.openDocument(file)).content()); final VfsDocumentSaveResult saveResult = vfs.saveDocument(file); assertEquals(VfsDocumentSaveStatus.SAVED, saveResult.status()); assertEquals("beta\n", Files.readString(file)); - assertFalse(assertInstanceOf(VfsTextDocument.class, vfs.openDocument(file)).dirty()); + assertFalse(assertInstanceOf(VfsDocumentOpenResult.VfsTextDocument.class, vfs.openDocument(file)).dirty()); } @Test @@ -132,7 +129,7 @@ final class FilesystemProjectDocumentVfsTest { Files.writeString(editable, "alpha\n"); Files.writeString(frontend, "fn main(): void\n"); - final ProjectDocumentVfs vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); + final VfsProjectDocument vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); vfs.updateDocument(editable, "beta\n"); final var results = vfs.saveAllDocuments(); @@ -149,7 +146,7 @@ final class FilesystemProjectDocumentVfsTest { final Path file = tempDir.resolve("prometeu.json"); Files.writeString(file, "{\n \"name\": \"Example\"\n}\n"); - final ProjectDocumentVfs vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); + final VfsProjectDocument vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); final VfsDocumentAccessContext initialContext = vfs.accessContext(file); final VfsDocumentAccessContext updatedContext = vfs.updateAccessContext(file, Map.of("statusBar", "future-toggle")); @@ -166,10 +163,10 @@ final class FilesystemProjectDocumentVfsTest { final Path file = tempDir.resolve("sprite.bin"); Files.write(file, new byte[]{0x01, 0x00, 0x02}); - final ProjectDocumentVfs vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); + final VfsProjectDocument vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); final VfsDocumentOpenResult result = vfs.openDocument(file); - final VfsUnsupportedDocument unsupported = assertInstanceOf(VfsUnsupportedDocument.class, result); + final var unsupported = assertInstanceOf(VfsDocumentOpenResult.VfsUnsupportedDocument.class, result); assertEquals(VfsUnsupportedReason.BINARY_CONTENT, unsupported.reason()); } @@ -179,10 +176,10 @@ final class FilesystemProjectDocumentVfsTest { final Path outsideFile = tempDir.getParent().resolve("outside.pbs"); Files.writeString(outsideFile, "fn stray(): void\n"); - final ProjectDocumentVfs vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); + final VfsProjectDocument vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); final VfsDocumentOpenResult result = vfs.openDocument(outsideFile); - final VfsUnsupportedDocument unsupported = assertInstanceOf(VfsUnsupportedDocument.class, result); + final var unsupported = assertInstanceOf(VfsDocumentOpenResult.VfsUnsupportedDocument.class, result); assertEquals(VfsUnsupportedReason.OUTSIDE_PROJECT, unsupported.reason()); } @@ -193,7 +190,7 @@ final class FilesystemProjectDocumentVfsTest { Files.createDirectories(tempDir.resolve("assets")); Files.writeString(src.resolve("main.pbs"), "fn main(): void\n"); - final ProjectDocumentVfs vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); + final VfsProjectDocument vfs = new FilesystemProjectDocumentVfsFactory().open(projectContext()); Files.writeString(src.resolve("later.pbs"), "fn later(): void\n"); final VfsProjectSnapshot refreshedSnapshot = vfs.refresh(new VfsRefreshRequest(src)); @@ -205,7 +202,7 @@ final class FilesystemProjectDocumentVfsTest { assertEquals("main.pbs", srcNode.children().get(1).displayName()); } - private p.studio.vfs.VfsProjectContext projectContext() { - return new p.studio.vfs.VfsProjectContext("Example", "pbs", tempDir); + private VfsProjectContext projectContext() { + return new VfsProjectContext("Example", "pbs", tempDir); } }