@@ -38,94 +38,56 @@ import type { ParserOptions } from 'prettier';
3838import type { CollectedMetadata } from '../types.d.ts' ;
3939import type { AstNode } from './types.d.ts' ;
4040
41+ const variantConstructors = {
42+ [ ast . AssignmentExpression . name ] : AssignmentExpression ,
43+ [ ast . ConditionalExpression . name ] : ConditionalExpression ,
44+ [ ast . OrExpression . name ] : OrExpression ,
45+ [ ast . AndExpression . name ] : AndExpression ,
46+ [ ast . EqualityExpression . name ] : EqualityExpression ,
47+ [ ast . InequalityExpression . name ] : InequalityExpression ,
48+ [ ast . BitwiseOrExpression . name ] : BitwiseOrExpression ,
49+ [ ast . BitwiseXorExpression . name ] : BitwiseXorExpression ,
50+ [ ast . BitwiseAndExpression . name ] : BitwiseAndExpression ,
51+ [ ast . ShiftExpression . name ] : ShiftExpression ,
52+ [ ast . AdditiveExpression . name ] : AdditiveExpression ,
53+ [ ast . MultiplicativeExpression . name ] : MultiplicativeExpression ,
54+ [ ast . ExponentiationExpression . name ] : ExponentiationExpression ,
55+ [ ast . PostfixExpression . name ] : PostfixExpression ,
56+ [ ast . PrefixExpression . name ] : PrefixExpression ,
57+ [ ast . FunctionCallExpression . name ] : FunctionCallExpression ,
58+ [ ast . CallOptionsExpression . name ] : CallOptionsExpression ,
59+ [ ast . MemberAccessExpression . name ] : MemberAccessExpression ,
60+ [ ast . IndexAccessExpression . name ] : IndexAccessExpression ,
61+ [ ast . NewExpression . name ] : NewExpression ,
62+ [ ast . TupleExpression . name ] : TupleExpression ,
63+ [ ast . TypeExpression . name ] : TypeExpression ,
64+ [ ast . ArrayExpression . name ] : ArrayExpression ,
65+ [ ast . HexNumberExpression . name ] : HexNumberExpression ,
66+ [ ast . DecimalNumberExpression . name ] : DecimalNumberExpression
67+ } ;
68+
69+ const variantWithVariantsConstructors = {
70+ [ ast . StringExpression . name ] : StringExpression ,
71+ [ ast . ElementaryType . name ] : ElementaryType
72+ } ;
73+
4174function createNonterminalVariant (
4275 variant : Exclude < ast . Expression [ 'variant' ] , SlangTerminalNode > ,
4376 collected : CollectedMetadata ,
4477 options : ParserOptions < AstNode >
4578) : Expression [ 'variant' ] {
46- if ( variant instanceof ast . AssignmentExpression ) {
47- return new AssignmentExpression ( variant , collected , options ) ;
48- }
49- if ( variant instanceof ast . ConditionalExpression ) {
50- return new ConditionalExpression ( variant , collected , options ) ;
51- }
52- if ( variant instanceof ast . OrExpression ) {
53- return new OrExpression ( variant , collected , options ) ;
54- }
55- if ( variant instanceof ast . AndExpression ) {
56- return new AndExpression ( variant , collected , options ) ;
57- }
58- if ( variant instanceof ast . EqualityExpression ) {
59- return new EqualityExpression ( variant , collected , options ) ;
60- }
61- if ( variant instanceof ast . InequalityExpression ) {
62- return new InequalityExpression ( variant , collected , options ) ;
63- }
64- if ( variant instanceof ast . BitwiseOrExpression ) {
65- return new BitwiseOrExpression ( variant , collected , options ) ;
66- }
67- if ( variant instanceof ast . BitwiseXorExpression ) {
68- return new BitwiseXorExpression ( variant , collected , options ) ;
69- }
70- if ( variant instanceof ast . BitwiseAndExpression ) {
71- return new BitwiseAndExpression ( variant , collected , options ) ;
72- }
73- if ( variant instanceof ast . ShiftExpression ) {
74- return new ShiftExpression ( variant , collected , options ) ;
75- }
76- if ( variant instanceof ast . AdditiveExpression ) {
77- return new AdditiveExpression ( variant , collected , options ) ;
78- }
79- if ( variant instanceof ast . MultiplicativeExpression ) {
80- return new MultiplicativeExpression ( variant , collected , options ) ;
81- }
82- if ( variant instanceof ast . ExponentiationExpression ) {
83- return new ExponentiationExpression ( variant , collected , options ) ;
84- }
85- if ( variant instanceof ast . PostfixExpression ) {
86- return new PostfixExpression ( variant , collected , options ) ;
87- }
88- if ( variant instanceof ast . PrefixExpression ) {
89- return new PrefixExpression ( variant , collected , options ) ;
90- }
91- if ( variant instanceof ast . FunctionCallExpression ) {
92- return new FunctionCallExpression ( variant , collected , options ) ;
93- }
94- if ( variant instanceof ast . CallOptionsExpression ) {
95- return new CallOptionsExpression ( variant , collected , options ) ;
96- }
97- if ( variant instanceof ast . MemberAccessExpression ) {
98- return new MemberAccessExpression ( variant , collected , options ) ;
99- }
100- if ( variant instanceof ast . IndexAccessExpression ) {
101- return new IndexAccessExpression ( variant , collected , options ) ;
102- }
103- if ( variant instanceof ast . NewExpression ) {
104- return new NewExpression ( variant , collected , options ) ;
105- }
106- if ( variant instanceof ast . TupleExpression ) {
107- return new TupleExpression ( variant , collected , options ) ;
108- }
109- if ( variant instanceof ast . TypeExpression ) {
110- return new TypeExpression ( variant , collected , options ) ;
111- }
112- if ( variant instanceof ast . ArrayExpression ) {
113- return new ArrayExpression ( variant , collected , options ) ;
114- }
115- if ( variant instanceof ast . HexNumberExpression ) {
116- return new HexNumberExpression ( variant , collected ) ;
117- }
118- if ( variant instanceof ast . DecimalNumberExpression ) {
119- return new DecimalNumberExpression ( variant , collected ) ;
120- }
121- if ( variant instanceof ast . StringExpression ) {
122- return extractVariant ( new StringExpression ( variant , collected , options ) ) ;
123- }
124- if ( variant instanceof ast . ElementaryType ) {
125- return extractVariant ( new ElementaryType ( variant , collected ) ) ;
126- }
127- const exhaustiveCheck : never = variant ;
128- throw new Error ( `Unexpected variant: ${ JSON . stringify ( exhaustiveCheck ) } ` ) ;
79+ const variantConstructor = variantConstructors [ variant . constructor . name ] ;
80+ if ( variantConstructor !== undefined )
81+ return new variantConstructor ( variant as never , collected , options ) ;
82+
83+ const variantWithVariantsConstructor =
84+ variantWithVariantsConstructors [ variant . constructor . name ] ;
85+ if ( variantWithVariantsConstructor !== undefined )
86+ return extractVariant (
87+ new variantWithVariantsConstructor ( variant as never , collected , options )
88+ ) ;
89+
90+ throw new Error ( `Unexpected variant: ${ JSON . stringify ( variant ) } ` ) ;
12991}
13092
13193export class Expression extends SlangNode {
0 commit comments