Debounce LSP processing

This commit is contained in:
2026-02-12 21:30:37 -08:00
parent a9718621e3
commit bf32e6a241

View File

@@ -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)