2.2 KB81 lines
Blame
1import type {
2 DefaultSharedCoreModuleContext,
3 LangiumCoreServices,
4 LangiumSharedCoreServices,
5 Module,
6 PartialLangiumCoreServices,
7} from 'langium';
8import {
9 EmptyFileSystem,
10 createDefaultCoreModule,
11 createDefaultSharedCoreModule,
12 inject,
13} from 'langium';
14
15import { CommonValueConverter } from '../common/valueConverter.js';
16import {
17 MermaidGeneratedSharedModule,
18 PacketGrammarGeneratedModule as PacketGeneratedModule,
19} from '../generated/module.js';
20import { PacketTokenBuilder } from './tokenBuilder.js';
21
22/**
23 * Declaration of `Packet` services.
24 */
25interface PacketAddedServices {
26 parser: {
27 TokenBuilder: PacketTokenBuilder;
28 ValueConverter: CommonValueConverter;
29 };
30}
31
32/**
33 * Union of Langium default services and `Packet` services.
34 */
35export type PacketServices = LangiumCoreServices & PacketAddedServices;
36
37/**
38 * Dependency injection module that overrides Langium default services and
39 * contributes the declared `Packet` services.
40 */
41export const PacketModule: Module<
42 PacketServices,
43 PartialLangiumCoreServices & PacketAddedServices
44> = {
45 parser: {
46 TokenBuilder: () => new PacketTokenBuilder(),
47 ValueConverter: () => new CommonValueConverter(),
48 },
49};
50
51/**
52 * Create the full set of services required by Langium.
53 *
54 * First inject the shared services by merging two modules:
55 * - Langium default shared services
56 * - Services generated by langium-cli
57 *
58 * Then inject the language-specific services by merging three modules:
59 * - Langium default language-specific services
60 * - Services generated by langium-cli
61 * - Services specified in this file
62 * @param context - Optional module context with the LSP connection
63 * @returns An object wrapping the shared services and the language-specific services
64 */
65export function createPacketServices(context: DefaultSharedCoreModuleContext = EmptyFileSystem): {
66 shared: LangiumSharedCoreServices;
67 Packet: PacketServices;
68} {
69 const shared: LangiumSharedCoreServices = inject(
70 createDefaultSharedCoreModule(context),
71 MermaidGeneratedSharedModule
72 );
73 const Packet: PacketServices = inject(
74 createDefaultCoreModule({ shared }),
75 PacketGeneratedModule,
76 PacketModule
77 );
78 shared.ServiceRegistry.register(Packet);
79 return { shared, Packet };
80}
81