78 lines
3.0 KiB
JavaScript
78 lines
3.0 KiB
JavaScript
/******************************************************************************
|
|
* Copyright 2021 TypeFox GmbH
|
|
* This program and the accompanying materials are made available under the
|
|
* terms of the MIT License, which is available in the project root.
|
|
******************************************************************************/
|
|
import { UriUtils } from './utils/uri-utils.js';
|
|
/**
|
|
* Generic registry for Langium services, but capable of being used with extending service sets as well (such as the lsp-complete LangiumCoreServices set)
|
|
*/
|
|
export class DefaultServiceRegistry {
|
|
/**
|
|
* @deprecated Use the new `fileExtensionMap` (or `languageIdMap`) property instead.
|
|
*/
|
|
get map() {
|
|
return this.fileExtensionMap;
|
|
}
|
|
constructor(services) {
|
|
this.languageIdMap = new Map();
|
|
this.fileExtensionMap = new Map();
|
|
this.textDocuments = services === null || services === void 0 ? void 0 : services.workspace.TextDocuments;
|
|
}
|
|
register(language) {
|
|
const data = language.LanguageMetaData;
|
|
for (const ext of data.fileExtensions) {
|
|
if (this.fileExtensionMap.has(ext)) {
|
|
console.warn(`The file extension ${ext} is used by multiple languages. It is now assigned to '${data.languageId}'.`);
|
|
}
|
|
this.fileExtensionMap.set(ext, language);
|
|
}
|
|
this.languageIdMap.set(data.languageId, language);
|
|
if (this.languageIdMap.size === 1) {
|
|
this.singleton = language;
|
|
}
|
|
else {
|
|
this.singleton = undefined;
|
|
}
|
|
}
|
|
getServices(uri) {
|
|
var _a, _b;
|
|
if (this.singleton !== undefined) {
|
|
return this.singleton;
|
|
}
|
|
if (this.languageIdMap.size === 0) {
|
|
throw new Error('The service registry is empty. Use `register` to register the services of a language.');
|
|
}
|
|
const languageId = (_b = (_a = this.textDocuments) === null || _a === void 0 ? void 0 : _a.get(uri)) === null || _b === void 0 ? void 0 : _b.languageId;
|
|
if (languageId !== undefined) {
|
|
const services = this.languageIdMap.get(languageId);
|
|
if (services) {
|
|
return services;
|
|
}
|
|
}
|
|
const ext = UriUtils.extname(uri);
|
|
const services = this.fileExtensionMap.get(ext);
|
|
if (!services) {
|
|
if (languageId) {
|
|
throw new Error(`The service registry contains no services for the extension '${ext}' for language '${languageId}'.`);
|
|
}
|
|
else {
|
|
throw new Error(`The service registry contains no services for the extension '${ext}'.`);
|
|
}
|
|
}
|
|
return services;
|
|
}
|
|
hasServices(uri) {
|
|
try {
|
|
this.getServices(uri);
|
|
return true;
|
|
}
|
|
catch (_a) {
|
|
return false;
|
|
}
|
|
}
|
|
get all() {
|
|
return Array.from(this.languageIdMap.values());
|
|
}
|
|
}
|
|
//# sourceMappingURL=service-registry.js.map
|