Skip to content

Commit d71b47b

Browse files
authored
Perform parser optimizations in production mode (#1688)
1 parent 8faa4b8 commit d71b47b

File tree

12 files changed

+40
-12
lines changed

12 files changed

+40
-12
lines changed

examples/arithmetics/src/language-server/generated/module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import { ArithmeticsGrammar } from './grammar.js';
1010
export const ArithmeticsLanguageMetaData = {
1111
languageId: 'arithmetics',
1212
fileExtensions: ['.calc'],
13-
caseInsensitive: true
13+
caseInsensitive: true,
14+
mode: 'development'
1415
} as const satisfies LanguageMetaData;
1516

1617
export const ArithmeticsGeneratedSharedModule: Module<LangiumSharedCoreServices, LangiumGeneratedSharedCoreServices> = {

examples/domainmodel/src/language-server/generated/module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import { DomainModelGrammar } from './grammar.js';
1010
export const DomainModelLanguageMetaData = {
1111
languageId: 'domain-model',
1212
fileExtensions: ['.dmodel'],
13-
caseInsensitive: false
13+
caseInsensitive: false,
14+
mode: 'development'
1415
} as const satisfies LanguageMetaData;
1516

1617
export const parserConfig: IParserConfig = {

examples/requirements/src/language-server/generated/module.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ import { RequirementsGrammar, TestsGrammar } from './grammar.js';
1010
export const RequirementsLanguageMetaData = {
1111
languageId: 'requirements-lang',
1212
fileExtensions: ['.req'],
13-
caseInsensitive: false
13+
caseInsensitive: false,
14+
mode: 'development'
1415
} as const satisfies LanguageMetaData;
1516

1617
export const TestsLanguageMetaData = {
1718
languageId: 'tests-lang',
1819
fileExtensions: ['.tst'],
19-
caseInsensitive: false
20+
caseInsensitive: false,
21+
mode: 'development'
2022
} as const satisfies LanguageMetaData;
2123

2224
export const RequirementsAndTestsGeneratedSharedModule: Module<LangiumSharedCoreServices, LangiumGeneratedSharedCoreServices> = {

examples/statemachine/src/language-server/generated/module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import { StatemachineGrammar } from './grammar.js';
1010
export const StatemachineLanguageMetaData = {
1111
languageId: 'statemachine',
1212
fileExtensions: ['.statemachine'],
13-
caseInsensitive: false
13+
caseInsensitive: false,
14+
mode: 'development'
1415
} as const satisfies LanguageMetaData;
1516

1617
export const StatemachineGeneratedSharedModule: Module<LangiumSharedCoreServices, LangiumGeneratedSharedCoreServices> = {

packages/generator-langium/templates/core/.package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"watch": "tsc -b <%= tsconfig %> --watch",
1313
"lint": "eslint src --ext ts",
1414
"langium:generate": "langium generate",
15+
"langium:generate:production": "langium generate --mode=production",
1516
"langium:watch": "langium generate --watch"
1617
},
1718
"dependencies": {

packages/langium-cli/src/generator/module-generator.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { generatedHeader } from './node-util.js';
1212
export function generateModule(grammars: Grammar[], config: LangiumConfig, grammarConfigMap: Map<Grammar, LangiumLanguageConfig>): string {
1313
const grammarsWithName = grammars.filter(grammar => !!grammar.name);
1414
const parserConfig = config.chevrotainParserConfig;
15+
const mode = config.mode;
1516
const hasIParserConfigImport = Boolean(parserConfig) || grammars.some(grammar => grammarConfigMap.get(grammar)?.chevrotainParserConfig !== undefined);
1617
let needsGeneralParserConfig = undefined;
1718

@@ -41,12 +42,14 @@ export function generateModule(grammars: Grammar[], config: LangiumConfig, gramm
4142
grammarsWithName,
4243
grammar => {
4344
const config = grammarConfigMap.get(grammar)!;
45+
const modeValue = mode === 'production' ? mode : 'development';
4446
return expandToNode`
4547
4648
export const ${ grammar.name }LanguageMetaData = {
4749
languageId: '${config.id}',
4850
fileExtensions: [${config.fileExtensions && joinToNode(config.fileExtensions, e => appendQuotesAndDot(e), { separator: ', ' })}],
49-
caseInsensitive: ${Boolean(config.caseInsensitive)}
51+
caseInsensitive: ${Boolean(config.caseInsensitive)},
52+
mode: '${modeValue}'
5053
} as const satisfies LanguageMetaData;
5154
`;
5255
},

packages/langium-cli/src/parser-validation.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ function languageConfigToMetaData(config: LangiumLanguageConfig): LanguageMetaDa
5959
return {
6060
languageId: config.id,
6161
fileExtensions: config.fileExtensions ?? [],
62-
caseInsensitive: Boolean(config.caseInsensitive)
62+
caseInsensitive: Boolean(config.caseInsensitive),
63+
mode: 'development'
6364
};
6465
}
6566

packages/langium/src/grammar/generated/module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import { LangiumGrammarGrammar } from './grammar.js';
1313
export const LangiumGrammarLanguageMetaData = {
1414
languageId: 'langium',
1515
fileExtensions: ['.langium'],
16-
caseInsensitive: false
16+
caseInsensitive: false,
17+
mode: 'development'
1718
} as const satisfies LanguageMetaData;
1819

1920
export const LangiumGrammarParserConfig: IParserConfig = {

packages/langium/src/grammar/internal-grammar-util.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,8 @@ export async function createServicesForGrammar<L extends LangiumServices = Langi
182182
const languageMetaData = config.languageMetaData ?? {
183183
caseInsensitive: false,
184184
fileExtensions: [`.${grammarNode.name?.toLowerCase() ?? 'unknown'}`],
185-
languageId: grammarNode.name ?? 'UNKNOWN'
185+
languageId: grammarNode.name ?? 'UNKNOWN',
186+
mode: 'development'
186187
};
187188
const generatedSharedModule: Module<LangiumGeneratedSharedCoreServices> = {
188189
AstReflection: () => interpretAstReflection(grammarNode),

packages/langium/src/languages/language-meta-data.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,17 @@
44
* terms of the MIT License, which is available in the project root.
55
******************************************************************************/
66

7+
/**
8+
* Metadata of a language.
9+
*/
710
export interface LanguageMetaData {
811
languageId: string;
912
fileExtensions: readonly string[];
1013
caseInsensitive: boolean;
14+
/**
15+
* Mode used to optimize code for development or production environments.
16+
*
17+
* In production mode, all Chevrotain lexer/parser validations are disabled.
18+
*/
19+
mode: 'development' | 'production';
1120
}

0 commit comments

Comments
 (0)