Skip to content

Commit

Permalink
fix: apply review suggestions
Browse files Browse the repository at this point in the history
  • Loading branch information
bjthehun committed Apr 29, 2024
1 parent 1f6b0da commit 90d6661
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 25 deletions.
15 changes: 5 additions & 10 deletions packages/langium/src/grammar/validation/validator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,7 @@ export class LangiumGrammarValidator {
}

checkEmptyParserRule(parserRule: ast.ParserRule, accept: ValidationAcceptor): void {
// Rule body needs to be set.
// Rule body needs to be set;
// Entry rules and fragments may consume no input.
if (!parserRule.definition || parserRule.entry || parserRule.fragment) {
return;
Expand All @@ -426,20 +426,15 @@ export class LangiumGrammarValidator {
if (element.cardinality === '?' || element.cardinality === '*') {
return true;
}
// Actions themselves count as non-optional.
// Actions themselves count as optional.
if (ast.isAction(element)) {
return false;
}
// Assignments with ?= consume nothing, groups without + too.
if (ast.isAssignment(element)) {
return element.operator === '?=';
return true;
}
// Unordered groups consume something.
if (ast.isUnorderedGroup(element)) {
return false;
}
// Ordered groups consume if all elements do so;
// and alternative groups, too.
// Ordered groups consume if all elements do so, and alternative groups, too.
if (ast.isGroup(element) || ast.isAlternatives(element)) {
return element.elements.every(mayConsumeEmpty);
}
Expand All @@ -448,7 +443,7 @@ export class LangiumGrammarValidator {

};
if (mayConsumeEmpty(parserRule.definition)) {
accept('error', 'This parser rule would succeed without consuming input.', { node: parserRule, property: 'definition', code: IssueCodes.ParsingRuleEmpty });
accept('error', 'This parser rule would succeed without consuming input.', { node: parserRule, property: 'name', code: IssueCodes.ParsingRuleEmpty });
}
}

Expand Down
26 changes: 12 additions & 14 deletions packages/langium/test/grammar/grammar-validator.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -958,8 +958,8 @@ describe('Prohibit empty parser rules', async () => {

const validationResult = await validate(grammarWithMultiplicity);
expect(validationResult.diagnostics).toHaveLength(2);
detectEmptyRule(validationResult, 6, 20, 6, 32);
detectEmptyRule(validationResult, 8, 23, 8, 39);
detectEmptyRule(validationResult, 6, 8, 6, 18);
detectEmptyRule(validationResult, 8, 8, 8, 21);
});

test('Optional assignments and cardinality', async () => {
Expand All @@ -975,13 +975,12 @@ describe('Prohibit empty parser rules', async () => {
hidden terminal WS: /\\s+/;
`;
const validationResult = await validate(grammarWithOptionals);
expect(validationResult.diagnostics).toHaveLength(3);
detectEmptyRule(validationResult, 4, 11, 4, 18);
detectEmptyRule(validationResult, 5, 11, 5, 19);
detectEmptyRule(validationResult, 6, 11, 6, 18);
expect(validationResult.diagnostics).toHaveLength(2);
detectEmptyRule(validationResult, 5, 8, 5, 9);
detectEmptyRule(validationResult, 6, 8, 6, 9);
});

test('Unordered groups', async () => {
test('Unordered groups and alternatives', async () => {
const grammarWithGroups = `
grammar GroupGrammars
Expand All @@ -1004,8 +1003,8 @@ describe('Prohibit empty parser rules', async () => {
`;
const validationResult = await validate(grammarWithGroups);
expect(validationResult.diagnostics).toHaveLength(2);
detectEmptyRule(validationResult, 6, 12, 6, 57);
detectEmptyRule(validationResult, 14, 12, 14, 55);
detectEmptyRule(validationResult, 6, 8, 6, 10);
detectEmptyRule(validationResult, 14, 8, 14, 10);
});

test('Actions, guard conditions, fragments, data types', async () => {
Expand All @@ -1023,17 +1022,16 @@ describe('Prohibit empty parser rules', async () => {
I returns string: '/' ID ('.' ID)*;
J: Student | Teacher;
Teacher: 'Teacher' Name Tel;
Teacher: 'Teacher' Name;
Student: 'Student' Name;
fragment Name: name=ID?;
fragment Tel: 'telephone' ':' number=NUM;
terminal ID: /[a-zA-Z]+/;
terminal NUM: /[0-9]+/;
hidden terminal WS: /\\s+/;
`;
const validationResult = await validate(specialGrammar);
expect(validationResult.diagnostics).toHaveLength(1);
detectEmptyRule(validationResult, 10, 26, 10, 35);
expect(validationResult.diagnostics).toHaveLength(2);
detectEmptyRule(validationResult, 6, 8, 6, 9);
detectEmptyRule(validationResult, 10, 8, 10, 9);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -724,7 +724,7 @@ describe('Property types validation takes in account types hierarchy', () => {
value: A;
}
B returns B: {B};
B returns B: 'B' {B};
Test returns Test:
value=B
Expand Down

0 comments on commit 90d6661

Please sign in to comment.