-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathcross-model-langium-documents.ts
47 lines (44 loc) · 1.93 KB
/
cross-model-langium-documents.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/********************************************************************************
* Copyright (c) 2023 CrossBreeze.
********************************************************************************/
import { DefaultLangiumDocuments, DocumentState, LangiumDocument } from 'langium';
import { TextDocument } from 'vscode-languageserver-textdocument';
import { URI } from 'vscode-uri';
import { isPackageUri } from './cross-model-package-manager.js';
import { CrossModelRoot } from './generated/ast.js';
import { fixDocument } from './util/ast-util.js';
import { Utils } from './util/uri-util.js';
export class CrossModelLangiumDocuments extends DefaultLangiumDocuments {
override async getOrCreateDocument(uri: URI): Promise<LangiumDocument> {
const document = this.getDocument(uri);
if (document) {
return document;
}
const documentUri = this.getDocumentUri(uri);
if (documentUri) {
return super.getOrCreateDocument(documentUri);
}
return this.createEmptyDocument(uri);
}
protected getDocumentUri(uri: URI): URI | undefined {
// we register for package.json files because our package scoping mechanism depends on it
// but we do not want actually want to parse them
if (isPackageUri(uri)) {
return undefined;
}
// we want to resolve existing URIs to properly deal with linked files and folders and not create duplicates for them
return Utils.toRealURIorUndefined(uri);
}
createEmptyDocument(uri: URI, rootType = CrossModelRoot): LangiumDocument {
const document: LangiumDocument = {
uri,
parseResult: { lexerErrors: [], parserErrors: [], value: { $type: rootType } },
references: [],
state: DocumentState.Validated,
textDocument: TextDocument.create(uri.toString(), '', 1, ''),
diagnostics: []
};
fixDocument(document.parseResult.value, document);
return document;
}
}