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