-
Notifications
You must be signed in to change notification settings - Fork 65
/
langium-lsp-module.ts
115 lines (108 loc) · 5.95 KB
/
langium-lsp-module.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/******************************************************************************
* Copyright 2023 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 { DefaultCompletionProvider } from './completion/completion-provider.js';
import { DefaultDocumentHighlightProvider } from './document-highlight-provider.js';
import { DefaultDocumentSymbolProvider } from './document-symbol-provider.js';
import { DefaultFoldingRangeProvider } from './folding-range-provider.js';
import { DefaultDefinitionProvider } from './definition-provider.js';
import { MultilineCommentHoverProvider } from './hover-provider.js';
import { DefaultReferencesProvider } from './references-provider.js';
import { DefaultRenameProvider } from './rename-provider.js';
import type { ServiceRegistryI, LangiumServices, LangiumLSPServices, LangiumSharedLSPServices, PartialLangiumSharedLSPServices, LangiumSharedServices } from './lsp-services.js';
import { inject, type Module } from '../dependency-injection.js';
import { TextDocuments } from 'vscode-languageserver';
import { createDefaultModule, createDefaultSharedModule, type DefaultSharedModuleContext } from '../default-module.js';
import { DefaultLanguageServer } from './language-server.js';
import { DefaultWorkspaceSymbolProvider } from './workspace-symbol-provider.js';
import { DefaultNodeKindProvider } from './node-kind-provider.js';
import { DefaultFuzzyMatcher } from './fuzzy-matcher.js';
import { TextDocument } from 'vscode-languageserver-textdocument';
import type { LangiumSharedCoreServices, PartialLangiumSharedCoreServices } from '../services.js';
import { LangiumGrammarModule, type LangiumGrammarServices } from '../grammar/langium-grammar-module.js';
import { LangiumGrammarGeneratedModule, LangiumGrammarGeneratedSharedModule } from '../grammar/generated/module.js';
import { registerValidationChecks } from '../grammar/internal-grammar-util.js';
import { registerTypeValidationChecks } from '../grammar/validation/types-validator.js';
import { LSPConfigurationProvider } from './workspace/default-configuration.js';
import { LSPLangiumDocumentFactory } from './workspace/documents.js';
import { LSPWorkspaceManager } from './workspace/workspace-manager.js';
import { CoreServiceRegistry } from '../service-registry.js';
/**
* Context required for creating the default language-specific dependency injection module.
*/
export interface LSPModuleContext {
shared: LangiumSharedLSPServices;
}
/**
* Create a dependency injection module for the default LSP services. This is a
* set of services that are used by exactly one language.
*/
export function createLSPModule(context: LSPModuleContext): Module<LangiumServices, LangiumLSPServices> {
return {
lsp: {
CompletionProvider: (services) => new DefaultCompletionProvider(services),
DocumentSymbolProvider: (services) => new DefaultDocumentSymbolProvider(services),
HoverProvider: (services) => new MultilineCommentHoverProvider(services),
FoldingRangeProvider: (services) => new DefaultFoldingRangeProvider(services),
ReferencesProvider: (services) => new DefaultReferencesProvider(services),
DefinitionProvider: (services) => new DefaultDefinitionProvider(services),
DocumentHighlightProvider: (services) => new DefaultDocumentHighlightProvider(services),
RenameProvider: (services) => new DefaultRenameProvider(services)
},
shared: () => context.shared
};
}
/**
* Create a dependency injection module for the LSP shared services. This is the set of
* services that are shared between multiple languages.
*/
export function createSharedLSPModule(context: DefaultSharedModuleContext): Module<LangiumSharedLSPServices & LangiumSharedCoreServices, LangiumSharedLSPServices> {
return {
// use the regular registry as an LSP registry, assuming the registry itself is opaque
ServiceRegistry: () => (new CoreServiceRegistry()) as ServiceRegistryI,
lsp: {
Connection: () => context.connection,
LanguageServer: (services) => new DefaultLanguageServer(services),
WorkspaceSymbolProvider: (services) => new DefaultWorkspaceSymbolProvider(services),
NodeKindProvider: () => new DefaultNodeKindProvider(),
FuzzyMatcher: () => new DefaultFuzzyMatcher()
},
workspace: {
TextDocuments: () => new TextDocuments(TextDocument),
WorkspaceManager: (services) => new LSPWorkspaceManager(services),
ConfigurationProvider: (services) => new LSPConfigurationProvider(services),
LangiumDocumentFactory: (services) => new LSPLangiumDocumentFactory(services),
}
};
}
/**
* Creates Langium grammar services, enriched with LSP functionality
*
* @param context Shared module context, used to create additional shared modules
* @param sharedModule Existing shared module to inject together with new shared services
* @returns Shared services enriched with LSP services + Grammar services, per usual
*/
export function createLangiumGrammarServicesWithLSP(context: DefaultSharedModuleContext,
sharedModule?: Module<LangiumSharedServices, PartialLangiumSharedCoreServices & PartialLangiumSharedLSPServices>): {
shared: LangiumSharedServices,
grammar: LangiumGrammarServices
} {
const shared = inject(
createDefaultSharedModule(context),
createSharedLSPModule(context),
LangiumGrammarGeneratedSharedModule,
sharedModule
);
const grammar = inject(
createDefaultModule({ shared }),
createLSPModule({ shared }),
LangiumGrammarGeneratedModule,
LangiumGrammarModule
);
shared.ServiceRegistry.register(grammar);
registerValidationChecks(grammar);
registerTypeValidationChecks(grammar);
return { shared, grammar };
}