zenstack/packages/language/src/module.ts
2025-01-18 23:17:06 +08:00

83 lines
2.6 KiB
TypeScript

import { inject, type Module } from 'langium';
import {
createDefaultModule,
createDefaultSharedModule,
type DefaultSharedModuleContext,
type LangiumServices,
type LangiumSharedServices,
type PartialLangiumServices,
} from 'langium/lsp';
import {
ZModelGeneratedModule,
ZModelGeneratedSharedModule,
} from './generated/module';
import { ZModelValidator, registerValidationChecks } from './validator';
/**
* Declaration of custom services - add your own service classes here.
*/
export type ZModelAddedServices = {
validation: {
ZModelValidator: ZModelValidator;
};
};
/**
* Union of Langium default services and your custom services - use this as constructor parameter
* of custom service classes.
*/
export type ZModelServices = LangiumServices & ZModelAddedServices;
/**
* Dependency injection module that overrides Langium default services and contributes the
* declared custom services. The Langium defaults can be partially specified to override only
* selected services, while the custom services must be fully specified.
*/
export const ZModelLanguageModule: Module<
ZModelServices,
PartialLangiumServices & ZModelAddedServices
> = {
validation: {
ZModelValidator: (services) => new ZModelValidator(services),
},
};
/**
* Create the full set of services required by Langium.
*
* First inject the shared services by merging two modules:
* - Langium default shared services
* - Services generated by langium-cli
*
* Then inject the language-specific services by merging three modules:
* - Langium default language-specific services
* - Services generated by langium-cli
* - Services specified in this file
*
* @param context Optional module context with the LSP connection
* @returns An object wrapping the shared services and the language-specific services
*/
export function createZModelLanguageServices(
context: DefaultSharedModuleContext
): {
shared: LangiumSharedServices;
ZModelLanguage: ZModelServices;
} {
const shared = inject(
createDefaultSharedModule(context),
ZModelGeneratedSharedModule
);
const ZModelLanguage = inject(
createDefaultModule({ shared }),
ZModelGeneratedModule,
ZModelLanguageModule
);
shared.ServiceRegistry.register(ZModelLanguage);
registerValidationChecks(ZModelLanguage);
if (!context.connection) {
// We don't run inside a language server
// Therefore, initialize the configuration provider instantly
shared.workspace.ConfigurationProvider.initialized({});
}
return { shared, ZModelLanguage };
}