feat: Add packet diagram

This commit is contained in:
Sidharth Vinod
2023-09-14 22:35:13 +05:30
parent 271b779995
commit c41594d220
25 changed files with 534 additions and 9 deletions

View File

@@ -5,6 +5,11 @@
"id": "info",
"grammar": "src/language/info/info.langium",
"fileExtensions": [".mmd", ".mermaid"]
},
{
"id": "packet",
"grammar": "src/language/packet/packet.langium",
"fileExtensions": [".mmd", ".mermaid"]
}
],
"mode": "production",

View File

@@ -1,3 +1,3 @@
export type { Info } from './language/index.js';
export type { Info, Packet } from './language/index.js';
export type { DiagramAST } from './parse.js';
export { parse, MermaidParseError } from './parse.js';

View File

@@ -4,3 +4,4 @@ export * from './generated/module.js';
export * from './common/index.js';
export * from './info/index.js';
export * from './packet/index.js';

View File

@@ -0,0 +1 @@
export * from './module.js';

View File

@@ -0,0 +1,72 @@
import type {
DefaultSharedModuleContext,
LangiumServices,
LangiumSharedServices,
Module,
PartialLangiumServices,
} from 'langium';
import { EmptyFileSystem, createDefaultModule, createDefaultSharedModule, inject } from 'langium';
import { CommonLexer } from '../common/lexer.js';
import { MermaidGeneratedSharedModule, PacketGeneratedModule } from '../generated/module.js';
import { PacketTokenBuilder } from './tokenBuilder.js';
import { CommonValueConverter } from '../common/valueConverter.js';
/**
* Declaration of `Packet` services.
*/
type PacketAddedServices = {
parser: {
Lexer: CommonLexer;
TokenBuilder: PacketTokenBuilder;
ValueConverter: CommonValueConverter;
};
};
/**
* Union of Langium default services and `Packet` services.
*/
export type PacketServices = LangiumServices & PacketAddedServices;
/**
* Dependency injection module that overrides Langium default services and
* contributes the declared `Packet` services.
*/
export const PacketModule: Module<PacketServices, PartialLangiumServices & PacketAddedServices> = {
parser: {
Lexer: (services: PacketServices) => new CommonLexer(services),
TokenBuilder: () => new PacketTokenBuilder(),
ValueConverter: () => new CommonValueConverter(),
},
};
/**
* Create the full set of services required by Langium.
*
* First inject the shared services by merging two modules:
* - Langium default shared services
* - Services generated by langium-cli
*
* Then inject the language-specific services by merging three modules:
* - Langium default language-specific services
* - Services generated by langium-cli
* - Services specified in this file
* @param context - Optional module context with the LSP connection
* @returns An object wrapping the shared services and the language-specific services
*/
export function createPacketServices(context: DefaultSharedModuleContext = EmptyFileSystem): {
shared: LangiumSharedServices;
Packet: PacketServices;
} {
const shared: LangiumSharedServices = inject(
createDefaultSharedModule(context),
MermaidGeneratedSharedModule
);
const Packet: PacketServices = inject(
createDefaultModule({ shared }),
PacketGeneratedModule,
PacketModule
);
shared.ServiceRegistry.register(Packet);
return { shared, Packet };
}

View File

@@ -0,0 +1,14 @@
grammar Packet
import "../common/common";
entry Packet:
"packet-beta" NEWLINE*
TitleAndAccessibilities?
(blocks+=Block)*;
Block:
start=INT ('-' end=INT)? ':' label=STRING;
hidden terminal WS: /\s+/;
terminal INT returns number: /[0-9]+/;
terminal STRING: /"[^"]*"|'[^']*'/;

View File

@@ -0,0 +1,7 @@
import { MermaidTokenBuilder } from '../common/index.js';
export class PacketTokenBuilder extends MermaidTokenBuilder {
public constructor() {
super(['packet-beta']);
}
}

View File

@@ -1,8 +1,8 @@
import type { LangiumParser, ParseResult } from 'langium';
import type { Info } from './index.js';
import { createInfoServices } from './language/index.js';
import type { Info, Packet } from './index.js';
import { createInfoServices, createPacketServices } from './language/index.js';
export type DiagramAST = Info;
export type DiagramAST = Info | Packet;
const parsers: Record<string, LangiumParser> = {};
@@ -13,8 +13,13 @@ const initializers = {
const parser = createInfoServices().Info.parser.LangiumParser;
parsers['info'] = parser;
},
packet: () => {
const parser = createPacketServices().Packet.parser.LangiumParser;
parsers['packet'] = parser;
},
} as const;
export function parse(diagramType: 'info', text: string): Info;
export function parse(diagramType: 'packet', text: string): Packet;
export function parse<T extends DiagramAST>(
diagramType: keyof typeof initializers,
text: string