Skip to content

Commit fa5cc39

Browse files
authored
Include inherited properties in type meta data (#1383)
1 parent 6f8aa92 commit fa5cc39

File tree

3 files changed

+106
-7
lines changed

3 files changed

+106
-7
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ function buildTypeMetaDataMethod(astTypes: AstTypes): Generated {
8181
joinToNode(
8282
astTypes.interfaces,
8383
interfaceType => {
84-
const props = interfaceType.properties;
84+
const props = interfaceType.superProperties;
8585
return (props.length > 0)
8686
? expandToNode`
8787
case '${interfaceType.name}': {

packages/langium-cli/test/generator/ast-generator.test.ts

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,49 @@ describe('Ast generator', () => {
288288
COMMENT: /\\/\\//,
289289
};
290290
`));
291+
292+
testTypeMetaData('should generate property metadata for super types', `
293+
grammar TestGrammar
294+
295+
interface IAmArray {
296+
elements: ArrayContent[];
297+
}
298+
interface DeclaredArray extends IAmArray{ }
299+
300+
DeclaredArray returns DeclaredArray:
301+
'declared' (elements+=ArrayContent)* ';';
302+
303+
hidden terminal WS: /\\s+/;
304+
terminal ID: /[_a-zA-Z][\\w_]*/;
305+
`, expandToString`
306+
getTypeMetaData(type: string): TypeMetaData {
307+
switch (type) {
308+
case 'IAmArray': {
309+
return {
310+
name: 'IAmArray',
311+
properties: [
312+
{ name: 'elements', defaultValue: [] }
313+
]
314+
};
315+
}
316+
case 'DeclaredArray': {
317+
return {
318+
name: 'DeclaredArray',
319+
properties: [
320+
{ name: 'elements', defaultValue: [] }
321+
]
322+
};
323+
}
324+
default: {
325+
return {
326+
name: type,
327+
properties: []
328+
};
329+
}
330+
}
331+
}
332+
}`
333+
);
291334
});
292335

293336
async function testTerminalConstants(grammar: string, expected: string) {
@@ -307,6 +350,14 @@ async function testTerminalConstants(grammar: string, expected: string) {
307350
}
308351

309352
function testGeneratedAst(name: string, grammar: string, expected: string): void {
353+
testGenerated(name, grammar, expected, 'export type', 'export type testAstType');
354+
}
355+
356+
function testTypeMetaData(name: string, grammar: string, expected: string): void {
357+
testGenerated(name, grammar, expected, 'getTypeMetaData', 'export const reflection');
358+
}
359+
360+
function testGenerated(name: string, grammar: string, expected: string, start: string, end: string): void {
310361
test(name, async () => {
311362
const result = (await parse(grammar)).parseResult;
312363
const config: LangiumConfig = {
@@ -316,7 +367,7 @@ function testGeneratedAst(name: string, grammar: string, expected: string): void
316367
};
317368
const expectedPart = normalizeEOL(expected).trim();
318369
const typesFileContent = generateAst(services.grammar, [result.value], config);
319-
const relevantPart = typesFileContent.substring(typesFileContent.indexOf('export type'), typesFileContent.indexOf('export type testAstType')).trim();
370+
const relevantPart = typesFileContent.substring(typesFileContent.indexOf(start), typesFileContent.indexOf(end)).trim();
320371
expect(relevantPart).toEqual(expectedPart);
321372
});
322373
}

packages/langium/src/languages/generated/ast.ts

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -963,8 +963,10 @@ export class LangiumGrammarAstReflection extends AbstractAstReflection {
963963
return {
964964
name: 'Action',
965965
properties: [
966+
{ name: 'cardinality' },
966967
{ name: 'feature' },
967968
{ name: 'inferredType' },
969+
{ name: 'lookahead' },
968970
{ name: 'operator' },
969971
{ name: 'type' }
970972
]
@@ -974,15 +976,19 @@ export class LangiumGrammarAstReflection extends AbstractAstReflection {
974976
return {
975977
name: 'Alternatives',
976978
properties: [
977-
{ name: 'elements', defaultValue: [] }
979+
{ name: 'cardinality' },
980+
{ name: 'elements', defaultValue: [] },
981+
{ name: 'lookahead' }
978982
]
979983
};
980984
}
981985
case 'Assignment': {
982986
return {
983987
name: 'Assignment',
984988
properties: [
989+
{ name: 'cardinality' },
985990
{ name: 'feature' },
991+
{ name: 'lookahead' },
986992
{ name: 'operator' },
987993
{ name: 'terminal' }
988994
]
@@ -992,7 +998,9 @@ export class LangiumGrammarAstReflection extends AbstractAstReflection {
992998
return {
993999
name: 'CharacterRange',
9941000
properties: [
1001+
{ name: 'cardinality' },
9951002
{ name: 'left' },
1003+
{ name: 'lookahead' },
9961004
{ name: 'right' }
9971005
]
9981006
};
@@ -1001,25 +1009,40 @@ export class LangiumGrammarAstReflection extends AbstractAstReflection {
10011009
return {
10021010
name: 'CrossReference',
10031011
properties: [
1012+
{ name: 'cardinality' },
10041013
{ name: 'deprecatedSyntax', defaultValue: false },
1014+
{ name: 'lookahead' },
10051015
{ name: 'terminal' },
10061016
{ name: 'type' }
10071017
]
10081018
};
10091019
}
1020+
case 'EndOfFile': {
1021+
return {
1022+
name: 'EndOfFile',
1023+
properties: [
1024+
{ name: 'cardinality' },
1025+
{ name: 'lookahead' }
1026+
]
1027+
};
1028+
}
10101029
case 'Group': {
10111030
return {
10121031
name: 'Group',
10131032
properties: [
1033+
{ name: 'cardinality' },
10141034
{ name: 'elements', defaultValue: [] },
1015-
{ name: 'guardCondition' }
1035+
{ name: 'guardCondition' },
1036+
{ name: 'lookahead' }
10161037
]
10171038
};
10181039
}
10191040
case 'Keyword': {
10201041
return {
10211042
name: 'Keyword',
10221043
properties: [
1044+
{ name: 'cardinality' },
1045+
{ name: 'lookahead' },
10231046
{ name: 'value' }
10241047
]
10251048
};
@@ -1028,6 +1051,8 @@ export class LangiumGrammarAstReflection extends AbstractAstReflection {
10281051
return {
10291052
name: 'NegatedToken',
10301053
properties: [
1054+
{ name: 'cardinality' },
1055+
{ name: 'lookahead' },
10311056
{ name: 'terminal' }
10321057
]
10331058
};
@@ -1036,6 +1061,8 @@ export class LangiumGrammarAstReflection extends AbstractAstReflection {
10361061
return {
10371062
name: 'RegexToken',
10381063
properties: [
1064+
{ name: 'cardinality' },
1065+
{ name: 'lookahead' },
10391066
{ name: 'regex' }
10401067
]
10411068
};
@@ -1045,6 +1072,8 @@ export class LangiumGrammarAstReflection extends AbstractAstReflection {
10451072
name: 'RuleCall',
10461073
properties: [
10471074
{ name: 'arguments', defaultValue: [] },
1075+
{ name: 'cardinality' },
1076+
{ name: 'lookahead' },
10481077
{ name: 'rule' }
10491078
]
10501079
};
@@ -1053,22 +1082,28 @@ export class LangiumGrammarAstReflection extends AbstractAstReflection {
10531082
return {
10541083
name: 'TerminalAlternatives',
10551084
properties: [
1056-
{ name: 'elements', defaultValue: [] }
1085+
{ name: 'cardinality' },
1086+
{ name: 'elements', defaultValue: [] },
1087+
{ name: 'lookahead' }
10571088
]
10581089
};
10591090
}
10601091
case 'TerminalGroup': {
10611092
return {
10621093
name: 'TerminalGroup',
10631094
properties: [
1064-
{ name: 'elements', defaultValue: [] }
1095+
{ name: 'cardinality' },
1096+
{ name: 'elements', defaultValue: [] },
1097+
{ name: 'lookahead' }
10651098
]
10661099
};
10671100
}
10681101
case 'TerminalRuleCall': {
10691102
return {
10701103
name: 'TerminalRuleCall',
10711104
properties: [
1105+
{ name: 'cardinality' },
1106+
{ name: 'lookahead' },
10721107
{ name: 'rule' }
10731108
]
10741109
};
@@ -1077,18 +1112,31 @@ export class LangiumGrammarAstReflection extends AbstractAstReflection {
10771112
return {
10781113
name: 'UnorderedGroup',
10791114
properties: [
1080-
{ name: 'elements', defaultValue: [] }
1115+
{ name: 'cardinality' },
1116+
{ name: 'elements', defaultValue: [] },
1117+
{ name: 'lookahead' }
10811118
]
10821119
};
10831120
}
10841121
case 'UntilToken': {
10851122
return {
10861123
name: 'UntilToken',
10871124
properties: [
1125+
{ name: 'cardinality' },
1126+
{ name: 'lookahead' },
10881127
{ name: 'terminal' }
10891128
]
10901129
};
10911130
}
1131+
case 'Wildcard': {
1132+
return {
1133+
name: 'Wildcard',
1134+
properties: [
1135+
{ name: 'cardinality' },
1136+
{ name: 'lookahead' }
1137+
]
1138+
};
1139+
}
10921140
default: {
10931141
return {
10941142
name: type,

0 commit comments

Comments
 (0)