Skip to content

Commit 72689f0

Browse files
Resolve wait until if document already in desired state (#1830)
Signed-off-by: Colin Grant <[email protected]>
1 parent d11ab3a commit 72689f0

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

packages/langium/src/workspace/document-builder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ export class DefaultDocumentBuilder implements DocumentBuilder {
422422
cancelToken ??= CancellationToken.None;
423423
if (uri) {
424424
const document = this.langiumDocuments.getDocument(uri);
425-
if (document && document.state > state) {
425+
if (document && document.state >= state) {
426426
return Promise.resolve(uri);
427427
}
428428
}

packages/langium/test/workspace/document-builder.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,25 @@ describe('DefaultDocumentBuilder', () => {
417417
await builder.build([document], { validation: true });
418418
});
419419

420+
test('`waitUntil` will correctly resolve if the document is already in the target state.', async () => {
421+
const services = await createServices();
422+
const documentFactory = services.shared.workspace.LangiumDocumentFactory;
423+
const documents = services.shared.workspace.LangiumDocuments;
424+
const builder = services.shared.workspace.DocumentBuilder;
425+
const documentUri = URI.parse('file:///test1.txt');
426+
const document = documentFactory.fromString('', documentUri);
427+
documents.addDocument(document);
428+
await builder.build([document], { validation: true });
429+
expect(document.state).toBe(DocumentState.Validated);
430+
// Should instantly resolve, since the document is already validated.
431+
await expect(
432+
Promise.race([
433+
builder.waitUntil(DocumentState.Validated, documentUri),
434+
new Promise((_, rej) => setTimeout(rej))
435+
])
436+
).resolves.toEqual(documentUri);
437+
});
438+
420439
test('`onDocumentPhase` always triggers before the respective `onBuildPhase`', async () => {
421440
const services = await createServices();
422441
const documentFactory = services.shared.workspace.LangiumDocumentFactory;

0 commit comments

Comments
 (0)