diff --git a/newt-vscode-lsp/src/lsp.ts b/newt-vscode-lsp/src/lsp.ts index 6c4e05d..39726d9 100644 --- a/newt-vscode-lsp/src/lsp.ts +++ b/newt-vscode-lsp/src/lsp.ts @@ -21,17 +21,51 @@ import { TextDocument } from "vscode-languageserver-textdocument"; const connection = createConnection(ProposedFeatures.all); const documents = new TextDocuments(TextDocument); +// the last is the most important to the user, but we run FIFO +// to ensure dependencies are seen in causal order +let changes: TextDocument[] = [] +let running: NodeJS.Timeout | undefined +function addChange(doc: TextDocument) { + console.log('enqueue', doc.uri) + // drop stale pending changes + let before = changes.length + changes = changes.filter(ch => ch.uri != doc.uri) + console.log('DROP', changes.length - before); + changes.push(doc) + if (!running) running = setTimeout(runChange, 1) +} + +function runChange() { + let doc = changes.shift() + if (!doc) { + running = undefined + return + } + const uri = doc.uri + const diagnostics = LSP_checkFile(doc.uri) + connection.sendDiagnostics({uri,diagnostics}) + console.log('SENT', doc.uri); + running = undefined + // give more a chance to file in. + running = setTimeout(runChange,1) +} + documents.onDidChangeContent(async (change) => { console.log('DIDCHANGE', change.document.uri) const uri = change.document.uri; const text = change.document.getText(); LSP_updateFile(uri, text); - const diagnostics = LSP_checkFile(uri); - console.log(`Got ${JSON.stringify(diagnostics, null, ' ')}`) - connection.sendDiagnostics({ uri, diagnostics }) + // we defer the check to let all of the changes file in. + addChange(change.document); + // const diagnostics = LSP_checkFile(uri); + // console.log(`Got ${JSON.stringify(diagnostics, null, ' ')}`) + // connection.sendDiagnostics({ uri, diagnostics }) }); connection.onHover((params): Hover | null => { + // wait until quiesced (REVIEW after query-based) + if (running) return null + const uri = params.textDocument.uri; const pos = params.position; console.log('HOVER', uri, pos)