using MediatR; using OmniSharp.Extensions.LanguageServer.Protocol; using OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities; using OmniSharp.Extensions.LanguageServer.Protocol.Document; using OmniSharp.Extensions.LanguageServer.Protocol.Models; using OmniSharp.Extensions.LanguageServer.Protocol.Server; namespace NubLang.LSP; internal class TextDocumentSyncHandler : TextDocumentSyncHandlerBase { private readonly DiagnosticsPublisher _diagnostics; public TextDocumentSyncHandler(DiagnosticsPublisher diagnostics) { _diagnostics = diagnostics; } public override TextDocumentAttributes GetTextDocumentAttributes(DocumentUri uri) { return new TextDocumentAttributes(uri, "nub-lang"); } public override Task Handle(DidOpenTextDocumentParams request, CancellationToken cancellationToken) { return Unit.Task; } public override Task Handle(DidChangeTextDocumentParams request, CancellationToken cancellationToken) { _diagnostics.Publish(new Uri("https://example.com"), [new Diagnostic { Severity = DiagnosticSeverity.Error, }]); return Unit.Task; } public override Task Handle(DidSaveTextDocumentParams request, CancellationToken cancellationToken) { return Unit.Task; } public override Task Handle(DidCloseTextDocumentParams request, CancellationToken cancellationToken) { return Unit.Task; } protected override TextDocumentSyncRegistrationOptions CreateRegistrationOptions(TextSynchronizationCapability capability, ClientCapabilities clientCapabilities) { return new TextDocumentSyncRegistrationOptions(); } } public class DiagnosticsPublisher { private readonly ILanguageServerFacade _server; public DiagnosticsPublisher(ILanguageServerFacade server) { _server = server; } public void Publish(Uri uri, IEnumerable diagnostics) { _server.TextDocument.PublishDiagnostics(new PublishDiagnosticsParams { Uri = uri, Diagnostics = new Container(diagnostics) }); } }