Skip to content

Commit

Permalink
Introduction of a separate export for LSP services
Browse files Browse the repository at this point in the history
  • Loading branch information
sailingKieler committed Feb 12, 2024
1 parent 0239db7 commit 08d9bad
Show file tree
Hide file tree
Showing 105 changed files with 756 additions and 527 deletions.
6 changes: 3 additions & 3 deletions examples/arithmetics/src/cli/cli-util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
* terms of the MIT License, which is available in the project root.
******************************************************************************/

import type { AstNode, LangiumDocument, LangiumServices } from 'langium';
import type { AstNode, LangiumDocument, LangiumCoreServices } from 'langium';
import { URI } from 'langium';
import * as fs from 'node:fs';
import * as path from 'node:path';
import chalk from 'chalk';

export async function extractDocument<T extends AstNode>(fileName: string, extensions: readonly string[], services: LangiumServices): Promise<LangiumDocument<T>> {
export async function extractDocument<T extends AstNode>(fileName: string, extensions: readonly string[], services: LangiumCoreServices): Promise<LangiumDocument<T>> {
if (!extensions.includes(path.extname(fileName))) {
console.error(chalk.yellow(`Please, choose a file with one of these extensions: ${extensions}.`));
process.exit(1);
Expand Down Expand Up @@ -38,6 +38,6 @@ export async function extractDocument<T extends AstNode>(fileName: string, exten
return document as LangiumDocument<T>;
}

export async function extractAstNode<T extends AstNode>(fileName: string, extensions: string[], services: LangiumServices): Promise<T> {
export async function extractAstNode<T extends AstNode>(fileName: string, extensions: string[], services: LangiumCoreServices): Promise<T> {
return (await extractDocument(fileName, extensions, services)).parseResult.value as T;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
* terms of the MIT License, which is available in the project root.
******************************************************************************/

import type { DefaultSharedModuleContext, LangiumServices, LangiumSharedServices, Module, PartialLangiumServices } from 'langium';
import { createDefaultModule, createDefaultSharedModule, inject } from 'langium';
import { ArithmeticsGeneratedModule, ArithmeticsGeneratedSharedModule } from './generated/module.js';
import { ArithmeticsValidator, registerValidationChecks } from './arithmetics-validator.js';
import { type Module, inject } from 'langium';
import { createDefaultModule, createDefaultSharedModule, type DefaultSharedModuleContext, type LangiumServices, type LangiumSharedServices, type PartialLangiumServices } from 'langium/lsp';
import { ArithmeticsScopeProvider } from './arithmetics-scope-provider.js';
import { ArithmeticsValidator, registerValidationChecks } from './arithmetics-validator.js';
import { ArithmeticsGeneratedModule, ArithmeticsGeneratedSharedModule } from './generated/module.js';

/**
* Declaration of custom services - add your own service classes here.
Expand Down
7 changes: 4 additions & 3 deletions examples/arithmetics/src/language-server/generated/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
* DO NOT EDIT MANUALLY!
******************************************************************************/

import type { LangiumGeneratedServices, LangiumGeneratedSharedServices, LangiumSharedServices, LangiumServices, LanguageMetaData, Module } from 'langium';
import type { LangiumGeneratedCoreServices, LangiumGeneratedSharedCoreServices, LanguageMetaData, Module } from 'langium';
import type { LangiumSharedServices, LangiumServices } from 'langium/lsp';
import { ArithmeticsAstReflection } from './ast.js';
import { ArithmeticsGrammar } from './grammar.js';

Expand All @@ -13,11 +14,11 @@ export const ArithmeticsLanguageMetaData = {
caseInsensitive: true
} as const satisfies LanguageMetaData;

export const ArithmeticsGeneratedSharedModule: Module<LangiumSharedServices, LangiumGeneratedSharedServices> = {
export const ArithmeticsGeneratedSharedModule: Module<LangiumSharedServices, LangiumGeneratedSharedCoreServices> = {
AstReflection: () => new ArithmeticsAstReflection()
};

export const ArithmeticsGeneratedModule: Module<LangiumServices, LangiumGeneratedServices> = {
export const ArithmeticsGeneratedModule: Module<LangiumServices, LangiumGeneratedCoreServices> = {
Grammar: () => ArithmeticsGrammar(),
LanguageMetaData: () => ArithmeticsLanguageMetaData,
parser: {}
Expand Down
5 changes: 3 additions & 2 deletions examples/arithmetics/src/language-server/main-browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
******************************************************************************/

import type { Diagnostic, Range } from 'vscode-languageserver/browser.js';
import { startLanguageServer, EmptyFileSystem, DocumentState } from 'langium';
import { EmptyFileSystem, DocumentState } from 'langium';
import { startLanguageServer } from 'langium/lsp';
import { BrowserMessageReader, BrowserMessageWriter, createConnection, NotificationType } from 'vscode-languageserver/browser.js';
import { createArithmeticsServices } from './arithmetics-module.js';
import { interpretEvaluations } from './arithmetics-evaluator.js';
Expand Down Expand Up @@ -53,4 +54,4 @@ shared.workspace.DocumentBuilder.onBuildPhase(DocumentState.Validated, documents
diagnostics: document.diagnostics ?? []
});
}
});
});
2 changes: 1 addition & 1 deletion examples/arithmetics/src/language-server/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* terms of the MIT License, which is available in the project root.
******************************************************************************/

import { startLanguageServer } from 'langium';
import { startLanguageServer } from 'langium/lsp';
import { NodeFileSystem } from 'langium/node';
import { createConnection, ProposedFeatures } from 'vscode-languageserver/node.js';
import { createArithmeticsServices } from './arithmetics-module.js';
Expand Down
13 changes: 6 additions & 7 deletions examples/domainmodel/src/cli/cli-util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,13 @@
* terms of the MIT License, which is available in the project root.
******************************************************************************/

import type { AstNode, LangiumDocument, LangiumServices } from 'langium';
import type { WorkspaceFolder } from 'vscode-languageserver';
import * as fs from 'node:fs';
import * as path from 'node:path';
import chalk from 'chalk';
import type { AstNode, LangiumCoreServices, LangiumDocument, WorkspaceFolder } from 'langium';
import { URI } from 'langium';
import * as fs from 'node:fs';
import * as path from 'node:path';

export async function extractDocument<T extends AstNode>(fileName: string, extensions: readonly string[], services: LangiumServices): Promise<LangiumDocument<T>> {
export async function extractDocument<T extends AstNode>(fileName: string, extensions: readonly string[], services: LangiumCoreServices): Promise<LangiumDocument<T>> {
if (!extensions.includes(path.extname(fileName))) {
console.error(chalk.yellow(`Please, choose a file with one of these extensions: ${extensions}.`));
process.exit(1);
Expand Down Expand Up @@ -39,11 +38,11 @@ export async function extractDocument<T extends AstNode>(fileName: string, exten
return document as LangiumDocument<T>;
}

export async function extractAstNode<T extends AstNode>(fileName: string, extensions: readonly string[], services: LangiumServices): Promise<T> {
export async function extractAstNode<T extends AstNode>(fileName: string, extensions: readonly string[], services: LangiumCoreServices): Promise<T> {
return (await extractDocument(fileName, extensions, services)).parseResult.value as T;
}

export async function setRootFolder(fileName: string, services: LangiumServices, root?: string): Promise<void> {
export async function setRootFolder(fileName: string, services: LangiumCoreServices, root?: string): Promise<void> {
if (!root) {
root = path.dirname(fileName);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
******************************************************************************/

import type { AstNode } from 'langium';
import { AbstractFormatter, Formatting } from 'langium';
import { AbstractFormatter, Formatting } from 'langium/lsp';
import * as ast from './generated/ast.js';

export class DomainModelFormatter extends AbstractFormatter {
Expand Down
15 changes: 8 additions & 7 deletions examples/domainmodel/src/language-server/domain-model-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
* terms of the MIT License, which is available in the project root.
******************************************************************************/

import type { LangiumServices, Module, PartialLangiumServices, LangiumSharedServices, DefaultSharedModuleContext } from 'langium';
import { inject, createDefaultSharedModule, createDefaultModule } from 'langium';
import { DomainModelGeneratedModule, DomainModelGeneratedSharedModule } from './generated/module.js';
import { DomainModelValidator, registerValidationChecks } from './domain-model-validator.js';
import { DomainModelScopeComputation } from './domain-model-scope.js';
import { QualifiedNameProvider } from './domain-model-naming.js';
import { type Module, inject } from 'langium';
import type { LangiumServices, LangiumSharedServices, PartialLangiumServices } from 'langium/lsp';
import { createDefaultModule, createDefaultSharedModule, type DefaultSharedModuleContext } from 'langium/lsp';
import { DomainModelFormatter } from './domain-model-formatter.js';
import { QualifiedNameProvider } from './domain-model-naming.js';
import { DomainModelRenameProvider } from './domain-model-rename-refactoring.js';
import { DomainModelScopeComputation } from './domain-model-scope.js';
import { DomainModelValidator, registerValidationChecks } from './domain-model-validator.js';
import { DomainModelGeneratedModule, DomainModelGeneratedSharedModule } from './generated/module.js';

export type DomainModelAddedServices = {
references: {
Expand All @@ -22,7 +23,7 @@ export type DomainModelAddedServices = {
}
}

export type DomainModelServices = LangiumServices & DomainModelAddedServices
export type DomainModelServices = LangiumServices & DomainModelAddedServices;

export const DomainModelModule: Module<DomainModelServices, PartialLangiumServices & DomainModelAddedServices> = {
references: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,12 @@
******************************************************************************/

import type { AstNode, LangiumDocument, LangiumDocuments, ReferenceDescription, URI } from 'langium';
import type { Range, WorkspaceEdit } from 'vscode-languageserver';
import { AstUtils, CstUtils, isNamed } from 'langium';
import { DefaultRenameProvider } from 'langium/lsp';
import type { RenameParams } from 'vscode-languageserver-protocol';
import { Location, TextEdit, type Range, type WorkspaceEdit } from 'vscode-languageserver-types';
import type { DomainModelServices } from './domain-model-module.js';
import type { QualifiedNameProvider } from './domain-model-naming.js';
import { AstUtils, CstUtils, DefaultRenameProvider, isNamed } from 'langium';
import { Location } from 'vscode-languageserver';
import { TextEdit } from 'vscode-languageserver-types';
import { isPackageDeclaration } from './generated/ast.js';

export class DomainModelRenameProvider extends DefaultRenameProvider {
Expand Down
7 changes: 4 additions & 3 deletions examples/domainmodel/src/language-server/generated/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
* DO NOT EDIT MANUALLY!
******************************************************************************/

import type { LangiumGeneratedServices, LangiumGeneratedSharedServices, LangiumSharedServices, LangiumServices, LanguageMetaData, Module, IParserConfig } from 'langium';
import type { LangiumGeneratedCoreServices, LangiumGeneratedSharedCoreServices, LanguageMetaData, Module, IParserConfig } from 'langium';
import type { LangiumSharedServices, LangiumServices } from 'langium/lsp';
import { DomainModelAstReflection } from './ast.js';
import { DomainModelGrammar } from './grammar.js';

Expand All @@ -19,11 +20,11 @@ export const parserConfig: IParserConfig = {
maxLookahead: 3,
};

export const DomainModelGeneratedSharedModule: Module<LangiumSharedServices, LangiumGeneratedSharedServices> = {
export const DomainModelGeneratedSharedModule: Module<LangiumSharedServices, LangiumGeneratedSharedCoreServices> = {
AstReflection: () => new DomainModelAstReflection()
};

export const DomainModelGeneratedModule: Module<LangiumServices, LangiumGeneratedServices> = {
export const DomainModelGeneratedModule: Module<LangiumServices, LangiumGeneratedCoreServices> = {
Grammar: () => DomainModelGrammar(),
LanguageMetaData: () => DomainModelLanguageMetaData,
parser: {
Expand Down
3 changes: 2 additions & 1 deletion examples/domainmodel/src/language-server/main-browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
******************************************************************************/

import type { Diagnostic } from 'vscode-languageserver/browser.js';
import { startLanguageServer, EmptyFileSystem, DocumentState } from 'langium';
import { EmptyFileSystem, DocumentState } from 'langium';
import { startLanguageServer } from 'langium/lsp';
import { BrowserMessageReader, BrowserMessageWriter, createConnection, NotificationType } from 'vscode-languageserver/browser.js';
import { createDomainModelServices } from './domain-model-module.js';

Expand Down
2 changes: 1 addition & 1 deletion examples/domainmodel/src/language-server/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* terms of the MIT License, which is available in the project root.
******************************************************************************/

import { startLanguageServer } from 'langium';
import { startLanguageServer } from 'langium/lsp';
import { NodeFileSystem } from 'langium/node';
import { createConnection, ProposedFeatures } from 'vscode-languageserver/node.js';
import { createDomainModelServices } from './domain-model-module.js';
Expand Down
22 changes: 11 additions & 11 deletions examples/domainmodel/test/refs-index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
******************************************************************************/

import type { AstNode, LangiumDocument, ReferenceDescription, URI } from 'langium';
import type { Domainmodel } from '../src/language-server/generated/ast.js';
import { describe, expect, test } from 'vitest';
import { AstUtils, EmptyFileSystem } from 'langium';
import { parseDocument, setTextDocument } from 'langium/test';
import { describe, expect, test } from 'vitest';
import { TextDocument } from 'vscode-languageserver-textdocument';
import { createDomainModelServices } from '../src/language-server/domain-model-module.js';
import type { Domainmodel } from '../src/language-server/generated/ast.js';

const services = createDomainModelServices(EmptyFileSystem).domainmodel;
const { shared, domainmodel } = createDomainModelServices(EmptyFileSystem);

describe('Cross references indexed after affected process', () => {
test('Fixed reference is in index', async () => {
Expand All @@ -22,17 +22,17 @@ describe('Cross references indexed after affected process', () => {
expect(allRefs.length).toEqual(0); // linking error

setTextDocument(
services,
shared,
TextDocument.create(
superDoc.textDocument.uri.toString(),
superDoc.textDocument.languageId,
0,
'entity SuperEntity {}'
)
);
await services.shared.workspace.DocumentBuilder.update([superDoc.uri], []);
await shared.workspace.DocumentBuilder.update([superDoc.uri], []);

const updatedSuperDoc = await services.shared.workspace.LangiumDocuments.getOrCreateDocument(superDoc.uri);
const updatedSuperDoc = await shared.workspace.LangiumDocuments.getOrCreateDocument(superDoc.uri);
const superEntity = (updatedSuperDoc.parseResult.value as Domainmodel).elements[0];
allRefs = await getReferences(superEntity);
expect(allRefs.length).toEqual(1); // re-linked
Expand All @@ -43,16 +43,16 @@ describe('Cross references indexed after affected process', () => {
});

async function updateDocuments(extendsFile: string, superFile: string): Promise<{ 'super': LangiumDocument, 'extends': LangiumDocument }> {
const superDoc: LangiumDocument = await parseDocument(services, superFile);
const extendsDoc: LangiumDocument = await parseDocument(services, extendsFile);
const superDoc: LangiumDocument = await parseDocument(domainmodel, superFile);
const extendsDoc: LangiumDocument = await parseDocument(domainmodel, extendsFile);

await services.shared.workspace.DocumentBuilder.build([extendsDoc, superDoc]);
await shared.workspace.DocumentBuilder.build([extendsDoc, superDoc]);
return { 'super': superDoc, 'extends': extendsDoc };
}

async function getReferences(node: AstNode): Promise<ReferenceDescription[]> {
const allRefs: ReferenceDescription[] = [];
services.shared.workspace.IndexManager.findAllReferences(node, createPath(node))
shared.workspace.IndexManager.findAllReferences(node, createPath(node))
.forEach((ref) => allRefs.push(ref));
return allRefs;
}
Expand All @@ -66,7 +66,7 @@ function nodeRefString(from: AstNode, to: AstNode): string {
}

function createPath(node: AstNode): string {
return services.workspace.AstNodeLocator.getAstNodePath(node);
return domainmodel.workspace.AstNodeLocator.getAstNodePath(node);
}

function asString(fromUri: URI, fromPath: string, toUri: URI, toPath: string): string {
Expand Down
7 changes: 3 additions & 4 deletions examples/requirements/src/cli/cli-util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@
* terms of the MIT License, which is available in the project root.
******************************************************************************/

import type { LangiumDocument, LangiumServices } from 'langium';
import type { LangiumDocument, LangiumCoreServices, WorkspaceFolder } from 'langium';
import type { RequirementModel, TestModel } from '../language-server/generated/ast.js';
import type { WorkspaceFolder } from 'vscode-languageclient';
import chalk from 'chalk';
import * as path from 'node:path';
import * as fs from 'node:fs';
Expand All @@ -21,7 +20,7 @@ import { isTestModel } from '../language-server/generated/ast.js';
* @returns a tuple with the document indicated by the fileName and a list of
* documents from the workspace.
*/
export async function extractDocuments(fileName: string, services: LangiumServices): Promise<[LangiumDocument, LangiumDocument[]]> {
export async function extractDocuments(fileName: string, services: LangiumCoreServices): Promise<[LangiumDocument, LangiumDocument[]]> {
const extensions = services.LanguageMetaData.fileExtensions;
if (!extensions.includes(path.extname(fileName))) {
console.error(chalk.yellow(`Please choose a file with one of these extensions: ${extensions}.`));
Expand Down Expand Up @@ -66,7 +65,7 @@ export async function extractDocuments(fileName: string, services: LangiumServic
* @returns a tuple with the model indicated by the fileName and a list of
* test models from the workspace.
chr */
export async function extractRequirementModelWithTestModels(fileName: string, services: LangiumServices): Promise<[RequirementModel, TestModel[]]> {
export async function extractRequirementModelWithTestModels(fileName: string, services: LangiumCoreServices): Promise<[RequirementModel, TestModel[]]> {
const [mainDocument, allDocuments] = await extractDocuments(fileName, services);
return [
mainDocument.parseResult?.value as RequirementModel,
Expand Down
9 changes: 5 additions & 4 deletions examples/requirements/src/language-server/generated/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
* DO NOT EDIT MANUALLY!
******************************************************************************/

import type { LangiumGeneratedServices, LangiumGeneratedSharedServices, LangiumSharedServices, LangiumServices, LanguageMetaData, Module } from 'langium';
import type { LangiumGeneratedCoreServices, LangiumGeneratedSharedCoreServices, LanguageMetaData, Module } from 'langium';
import type { LangiumSharedServices, LangiumServices } from 'langium/lsp';
import { RequirementsAndTestsAstReflection } from './ast.js';
import { RequirementsGrammar, TestsGrammar } from './grammar.js';

Expand All @@ -19,17 +20,17 @@ export const TestsLanguageMetaData = {
caseInsensitive: false
} as const satisfies LanguageMetaData;

export const RequirementsAndTestsGeneratedSharedModule: Module<LangiumSharedServices, LangiumGeneratedSharedServices> = {
export const RequirementsAndTestsGeneratedSharedModule: Module<LangiumSharedServices, LangiumGeneratedSharedCoreServices> = {
AstReflection: () => new RequirementsAndTestsAstReflection()
};

export const RequirementsGeneratedModule: Module<LangiumServices, LangiumGeneratedServices> = {
export const RequirementsGeneratedModule: Module<LangiumServices, LangiumGeneratedCoreServices> = {
Grammar: () => RequirementsGrammar(),
LanguageMetaData: () => RequirementsLanguageMetaData,
parser: {}
};

export const TestsGeneratedModule: Module<LangiumServices, LangiumGeneratedServices> = {
export const TestsGeneratedModule: Module<LangiumServices, LangiumGeneratedCoreServices> = {
Grammar: () => TestsGrammar(),
LanguageMetaData: () => TestsLanguageMetaData,
parser: {}
Expand Down
Loading

0 comments on commit 08d9bad

Please sign in to comment.