-
Notifications
You must be signed in to change notification settings - Fork 85
Expand file tree
/
Copy pathExpression.ts
More file actions
127 lines (120 loc) · 4.8 KB
/
Expression.ts
File metadata and controls
127 lines (120 loc) · 4.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import * as ast from '@nomicfoundation/slang/ast';
import {
NonterminalKind,
TerminalNode as SlangTerminalNode
} from '@nomicfoundation/slang/cst';
import { createNonterminalVariantCreator } from '../slang-utils/create-nonterminal-variant-creator.js';
import { SlangNode } from './SlangNode.js';
import { AssignmentExpression } from './AssignmentExpression.js';
import { ConditionalExpression } from './ConditionalExpression.js';
import { OrExpression } from './OrExpression.js';
import { AndExpression } from './AndExpression.js';
import { EqualityExpression } from './EqualityExpression.js';
import { InequalityExpression } from './InequalityExpression.js';
import { BitwiseOrExpression } from './BitwiseOrExpression.js';
import { BitwiseXorExpression } from './BitwiseXorExpression.js';
import { BitwiseAndExpression } from './BitwiseAndExpression.js';
import { ShiftExpression } from './ShiftExpression.js';
import { AdditiveExpression } from './AdditiveExpression.js';
import { MultiplicativeExpression } from './MultiplicativeExpression.js';
import { ExponentiationExpression } from './ExponentiationExpression.js';
import { PostfixExpression } from './PostfixExpression.js';
import { PrefixExpression } from './PrefixExpression.js';
import { FunctionCallExpression } from './FunctionCallExpression.js';
import { CallOptionsExpression } from './CallOptionsExpression.js';
import { MemberAccessExpression } from './MemberAccessExpression.js';
import { IndexAccessExpression } from './IndexAccessExpression.js';
import { NewExpression } from './NewExpression.js';
import { TupleExpression } from './TupleExpression.js';
import { TypeExpression } from './TypeExpression.js';
import { ArrayExpression } from './ArrayExpression.js';
import { HexNumberExpression } from './HexNumberExpression.js';
import { DecimalNumberExpression } from './DecimalNumberExpression.js';
import { StringExpression } from './StringExpression.js';
import { ElementaryType } from './ElementaryType.js';
import { TerminalNode } from './TerminalNode.js';
import type { ParserOptions } from 'prettier';
import type { CollectedMetadata } from '../types.d.ts';
import type { AstNode } from './types.d.ts';
const createNonterminalVariant = createNonterminalVariantCreator<
ast.Expression,
Expression
>(
[
[ast.AssignmentExpression, AssignmentExpression],
[ast.ConditionalExpression, ConditionalExpression],
[ast.OrExpression, OrExpression],
[ast.AndExpression, AndExpression],
[ast.EqualityExpression, EqualityExpression],
[ast.InequalityExpression, InequalityExpression],
[ast.BitwiseOrExpression, BitwiseOrExpression],
[ast.BitwiseXorExpression, BitwiseXorExpression],
[ast.BitwiseAndExpression, BitwiseAndExpression],
[ast.ShiftExpression, ShiftExpression],
[ast.AdditiveExpression, AdditiveExpression],
[ast.MultiplicativeExpression, MultiplicativeExpression],
[ast.ExponentiationExpression, ExponentiationExpression],
[ast.PostfixExpression, PostfixExpression],
[ast.PrefixExpression, PrefixExpression],
[ast.FunctionCallExpression, FunctionCallExpression],
[ast.CallOptionsExpression, CallOptionsExpression],
[ast.MemberAccessExpression, MemberAccessExpression],
[ast.IndexAccessExpression, IndexAccessExpression],
[ast.NewExpression, NewExpression],
[ast.TupleExpression, TupleExpression],
[ast.TypeExpression, TypeExpression],
[ast.ArrayExpression, ArrayExpression],
[ast.HexNumberExpression, HexNumberExpression],
[ast.DecimalNumberExpression, DecimalNumberExpression]
],
[
[ast.StringExpression, StringExpression],
[ast.ElementaryType, ElementaryType]
]
);
export class Expression extends SlangNode {
readonly kind = NonterminalKind.Expression;
variant:
| AssignmentExpression
| ConditionalExpression
| OrExpression
| AndExpression
| EqualityExpression
| InequalityExpression
| BitwiseOrExpression
| BitwiseXorExpression
| BitwiseAndExpression
| ShiftExpression
| AdditiveExpression
| MultiplicativeExpression
| ExponentiationExpression
| PostfixExpression
| PrefixExpression
| FunctionCallExpression
| CallOptionsExpression
| MemberAccessExpression
| IndexAccessExpression
| NewExpression
| TupleExpression
| TypeExpression
| ArrayExpression
| HexNumberExpression
| DecimalNumberExpression
| StringExpression['variant']
| ElementaryType['variant']
| TerminalNode;
constructor(
ast: ast.Expression,
collected: CollectedMetadata,
options: ParserOptions<AstNode>
) {
super(ast, collected);
const variant = ast.variant;
if (variant instanceof SlangTerminalNode) {
this.variant = new TerminalNode(variant, collected);
return;
}
this.variant = createNonterminalVariant(variant, collected, options);
this.updateMetadata(this.variant);
}
}