2.4 KB83 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 {
16 MermaidGeneratedSharedModule,
17 ArchitectureGrammarGeneratedModule as ArchitectureGeneratedModule,
18} from '../generated/module.js';
19import { ArchitectureTokenBuilder } from './tokenBuilder.js';
20import { ArchitectureValueConverter } from './valueConverter.js';
21
22/**
23 * Declaration of `Architecture` services.
24 */
25interface ArchitectureAddedServices {
26 parser: {
27 TokenBuilder: ArchitectureTokenBuilder;
28 ValueConverter: ArchitectureValueConverter;
29 };
30}
31
32/**
33 * Union of Langium default services and `Architecture` services.
34 */
35export type ArchitectureServices = LangiumCoreServices & ArchitectureAddedServices;
36
37/**
38 * Dependency injection module that overrides Langium default services and
39 * contributes the declared `Architecture` services.
40 */
41export const ArchitectureModule: Module<
42 ArchitectureServices,
43 PartialLangiumCoreServices & ArchitectureAddedServices
44> = {
45 parser: {
46 TokenBuilder: () => new ArchitectureTokenBuilder(),
47 ValueConverter: () => new ArchitectureValueConverter(),
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 createArchitectureServices(
66 context: DefaultSharedCoreModuleContext = EmptyFileSystem
67): {
68 shared: LangiumSharedCoreServices;
69 Architecture: ArchitectureServices;
70} {
71 const shared: LangiumSharedCoreServices = inject(
72 createDefaultSharedCoreModule(context),
73 MermaidGeneratedSharedModule
74 );
75 const Architecture: ArchitectureServices = inject(
76 createDefaultCoreModule({ shared }),
77 ArchitectureGeneratedModule,
78 ArchitectureModule
79 );
80 shared.ServiceRegistry.register(Architecture);
81 return { shared, Architecture };
82}
83