Skip to content

Commit c0b28b0

Browse files
committed
removing YulExpression from the AST tree
1 parent 6527066 commit c0b28b0

10 files changed

Lines changed: 41 additions & 32 deletions

src/slang-nodes/YulArguments.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printSeparatedList } from '../slang-printers/print-separated-list.js';
3-
import { printVariant } from '../slang-printers/print-variant.js';
3+
import { extractVariant } from '../slang-utils/extract-variant.js';
44
import { SlangNode } from './SlangNode.js';
55
import { YulExpression } from './YulExpression.js';
66

@@ -12,15 +12,17 @@ import type { AstNode } from './types.d.ts';
1212
export class YulArguments extends SlangNode {
1313
readonly kind = NonterminalKind.YulArguments;
1414

15-
items: YulExpression[];
15+
items: YulExpression['variant'][];
1616

1717
constructor(ast: ast.YulArguments, options: ParserOptions<AstNode>) {
1818
super(ast, true);
1919

20-
this.items = ast.items.map((item) => new YulExpression(item, options));
20+
this.items = ast.items.map((item) =>
21+
extractVariant(new YulExpression(item, options))
22+
);
2123
}
2224

2325
print(path: AstPath<YulArguments>, print: PrintFunction): Doc {
24-
return printSeparatedList(path.map(printVariant(print), 'items'));
26+
return printSeparatedList(path.map(print, 'items'));
2527
}
2628
}

src/slang-nodes/YulExpression.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as ast from '@nomicfoundation/slang/ast';
22
import { NonterminalKind } from '@nomicfoundation/slang/cst';
33
import { extractVariant } from '../slang-utils/extract-variant.js';
4-
import { PolymorphicNode } from './PolymorphicNode.js';
4+
import { SlangNode } from './SlangNode.js';
55
import { YulFunctionCallExpression } from './YulFunctionCallExpression.js';
66
import { YulLiteral } from './YulLiteral.js';
77
import { YulPath } from './YulPath.js';
@@ -26,7 +26,7 @@ function createNonterminalVariant(
2626
return exhaustiveCheck;
2727
}
2828

29-
export class YulExpression extends PolymorphicNode {
29+
export class YulExpression extends SlangNode {
3030
readonly kind = NonterminalKind.YulExpression;
3131

3232
variant: YulFunctionCallExpression | YulLiteral['variant'] | YulPath;

src/slang-nodes/YulForStatement.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { doc } from 'prettier';
3-
import { printVariant } from '../slang-printers/print-variant.js';
3+
import { extractVariant } from '../slang-utils/extract-variant.js';
44
import { SlangNode } from './SlangNode.js';
55
import { YulBlock } from './YulBlock.js';
66
import { YulExpression } from './YulExpression.js';
@@ -17,7 +17,7 @@ export class YulForStatement extends SlangNode {
1717

1818
initialization: YulBlock;
1919

20-
condition: YulExpression;
20+
condition: YulExpression['variant'];
2121

2222
iterator: YulBlock;
2323

@@ -27,7 +27,7 @@ export class YulForStatement extends SlangNode {
2727
super(ast);
2828

2929
this.initialization = new YulBlock(ast.initialization, options);
30-
this.condition = new YulExpression(ast.condition, options);
30+
this.condition = extractVariant(new YulExpression(ast.condition, options));
3131
this.iterator = new YulBlock(ast.iterator, options);
3232
this.body = new YulBlock(ast.body, options);
3333

@@ -43,7 +43,7 @@ export class YulForStatement extends SlangNode {
4343
return join(' ', [
4444
'for',
4545
path.call(print, 'initialization'),
46-
path.call(printVariant(print), 'condition'),
46+
path.call(print, 'condition'),
4747
path.call(print, 'iterator'),
4848
path.call(print, 'body')
4949
]);

src/slang-nodes/YulFunctionCallExpression.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
2-
import { printVariant } from '../slang-printers/print-variant.js';
2+
import { extractVariant } from '../slang-utils/extract-variant.js';
33
import { SlangNode } from './SlangNode.js';
44
import { YulExpression } from './YulExpression.js';
55
import { YulArguments } from './YulArguments.js';
@@ -12,7 +12,7 @@ import type { AstNode } from './types.d.ts';
1212
export class YulFunctionCallExpression extends SlangNode {
1313
readonly kind = NonterminalKind.YulFunctionCallExpression;
1414

15-
operand: YulExpression;
15+
operand: YulExpression['variant'];
1616

1717
arguments: YulArguments;
1818

@@ -22,15 +22,15 @@ export class YulFunctionCallExpression extends SlangNode {
2222
) {
2323
super(ast);
2424

25-
this.operand = new YulExpression(ast.operand, options);
25+
this.operand = extractVariant(new YulExpression(ast.operand, options));
2626
this.arguments = new YulArguments(ast.arguments, options);
2727

2828
this.updateMetadata(this.operand, this.arguments);
2929
}
3030

3131
print(path: AstPath<YulFunctionCallExpression>, print: PrintFunction): Doc {
3232
return [
33-
path.call(printVariant(print), 'operand'),
33+
path.call(print, 'operand'),
3434
'(',
3535
path.call(print, 'arguments'),
3636
')'

src/slang-nodes/YulIfStatement.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
2-
import { printVariant } from '../slang-printers/print-variant.js';
2+
import { extractVariant } from '../slang-utils/extract-variant.js';
33
import { SlangNode } from './SlangNode.js';
44
import { YulExpression } from './YulExpression.js';
55
import { YulBlock } from './YulBlock.js';
@@ -12,14 +12,14 @@ import type { AstNode } from './types.d.ts';
1212
export class YulIfStatement extends SlangNode {
1313
readonly kind = NonterminalKind.YulIfStatement;
1414

15-
condition: YulExpression;
15+
condition: YulExpression['variant'];
1616

1717
body: YulBlock;
1818

1919
constructor(ast: ast.YulIfStatement, options: ParserOptions<AstNode>) {
2020
super(ast);
2121

22-
this.condition = new YulExpression(ast.condition, options);
22+
this.condition = extractVariant(new YulExpression(ast.condition, options));
2323
this.body = new YulBlock(ast.body, options);
2424

2525
this.updateMetadata(this.condition, this.body);
@@ -28,7 +28,7 @@ export class YulIfStatement extends SlangNode {
2828
print(path: AstPath<YulIfStatement>, print: PrintFunction): Doc {
2929
return [
3030
'if ',
31-
path.call(printVariant(print), 'condition'),
31+
path.call(print, 'condition'),
3232
' ',
3333
path.call(print, 'body')
3434
];

src/slang-nodes/YulStatement.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as ast from '@nomicfoundation/slang/ast';
22
import { NonterminalKind } from '@nomicfoundation/slang/cst';
3+
import { extractVariant } from '../slang-utils/extract-variant.js';
34
import { SlangNode } from './SlangNode.js';
45
import { YulBlock } from './YulBlock.js';
56
import { YulFunctionDefinition } from './YulFunctionDefinition.js';
@@ -59,7 +60,7 @@ function createNonterminalVariant(
5960
return new YulLabel(variant);
6061
}
6162
if (variant instanceof ast.YulExpression) {
62-
return new YulExpression(variant, options);
63+
return extractVariant(new YulExpression(variant, options));
6364
}
6465
const exhaustiveCheck: never = variant;
6566
return exhaustiveCheck;
@@ -81,7 +82,7 @@ export class YulStatement extends SlangNode {
8182
| YulBreakStatement
8283
| YulContinueStatement
8384
| YulLabel
84-
| YulExpression;
85+
| YulExpression['variant'];
8586

8687
constructor(ast: ast.YulStatement, options: ParserOptions<AstNode>) {
8788
super(ast);

src/slang-nodes/YulSwitchStatement.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { doc } from 'prettier';
3-
import { printVariant } from '../slang-printers/print-variant.js';
3+
import { extractVariant } from '../slang-utils/extract-variant.js';
44
import { SlangNode } from './SlangNode.js';
55
import { YulExpression } from './YulExpression.js';
66
import { YulSwitchCases } from './YulSwitchCases.js';
@@ -15,14 +15,16 @@ const { hardline } = doc.builders;
1515
export class YulSwitchStatement extends SlangNode {
1616
readonly kind = NonterminalKind.YulSwitchStatement;
1717

18-
expression: YulExpression;
18+
expression: YulExpression['variant'];
1919

2020
cases: YulSwitchCases;
2121

2222
constructor(ast: ast.YulSwitchStatement, options: ParserOptions<AstNode>) {
2323
super(ast);
2424

25-
this.expression = new YulExpression(ast.expression, options);
25+
this.expression = extractVariant(
26+
new YulExpression(ast.expression, options)
27+
);
2628
this.cases = new YulSwitchCases(ast.cases, options);
2729

2830
this.updateMetadata(this.expression, this.cases);
@@ -31,7 +33,7 @@ export class YulSwitchStatement extends SlangNode {
3133
print(path: AstPath<YulSwitchStatement>, print: PrintFunction): Doc {
3234
return [
3335
'switch ',
34-
path.call(printVariant(print), 'expression'),
36+
path.call(print, 'expression'),
3537
hardline,
3638
path.call(print, 'cases')
3739
];

src/slang-nodes/YulVariableAssignmentStatement.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { doc } from 'prettier';
3-
import { printVariant } from '../slang-printers/print-variant.js';
43
import { extractVariant } from '../slang-utils/extract-variant.js';
54
import { SlangNode } from './SlangNode.js';
65
import { YulPaths } from './YulPaths.js';
@@ -21,7 +20,7 @@ export class YulVariableAssignmentStatement extends SlangNode {
2120

2221
assignment: YulAssignmentOperator['variant'];
2322

24-
expression: YulExpression;
23+
expression: YulExpression['variant'];
2524

2625
constructor(
2726
ast: ast.YulVariableAssignmentStatement,
@@ -31,7 +30,9 @@ export class YulVariableAssignmentStatement extends SlangNode {
3130

3231
this.variables = new YulPaths(ast.variables);
3332
this.assignment = extractVariant(new YulAssignmentOperator(ast.assignment));
34-
this.expression = new YulExpression(ast.expression, options);
33+
this.expression = extractVariant(
34+
new YulExpression(ast.expression, options)
35+
);
3536

3637
this.updateMetadata(this.variables, this.assignment, this.expression);
3738
}
@@ -43,7 +44,7 @@ export class YulVariableAssignmentStatement extends SlangNode {
4344
return join(' ', [
4445
path.call(print, 'variables'),
4546
path.call(print, 'assignment'),
46-
path.call(printVariant(print), 'expression')
47+
path.call(print, 'expression')
4748
]);
4849
}
4950
}

src/slang-nodes/YulVariableDeclarationValue.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
2-
import { printVariant } from '../slang-printers/print-variant.js';
32
import { extractVariant } from '../slang-utils/extract-variant.js';
43
import { SlangNode } from './SlangNode.js';
54
import { YulAssignmentOperator } from './YulAssignmentOperator.js';
@@ -15,7 +14,7 @@ export class YulVariableDeclarationValue extends SlangNode {
1514

1615
assignment: YulAssignmentOperator['variant'];
1716

18-
expression: YulExpression;
17+
expression: YulExpression['variant'];
1918

2019
constructor(
2120
ast: ast.YulVariableDeclarationValue,
@@ -24,7 +23,9 @@ export class YulVariableDeclarationValue extends SlangNode {
2423
super(ast);
2524

2625
this.assignment = extractVariant(new YulAssignmentOperator(ast.assignment));
27-
this.expression = new YulExpression(ast.expression, options);
26+
this.expression = extractVariant(
27+
new YulExpression(ast.expression, options)
28+
);
2829

2930
this.updateMetadata(this.assignment, this.expression);
3031
}
@@ -33,7 +34,7 @@ export class YulVariableDeclarationValue extends SlangNode {
3334
return [
3435
path.call(print, 'assignment'),
3536
' ',
36-
path.call(printVariant(print), 'expression')
37+
path.call(print, 'expression')
3738
];
3839
}
3940
}

src/slangPrinter.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import type { YulAssignmentOperator } from './slang-nodes/YulAssignmentOperator.
4040
import type { YulLiteral } from './slang-nodes/YulLiteral.js';
4141
import type { YulStackAssignmentOperator } from './slang-nodes/YulStackAssignmentOperator.js';
4242
import type { YulSwitchCase } from './slang-nodes/YulSwitchCase.js';
43+
import type { YulExpression } from './slang-nodes/YulExpression.js';
4344

4445
function hasNodeIgnoreComment({ comments }: StrictAstNode): boolean {
4546
// Prettier sets SourceUnit's comments to undefined after assigning comments
@@ -128,6 +129,7 @@ function genericPrint(
128129
| YulLiteral
129130
| YulStackAssignmentOperator
130131
| YulSwitchCase
132+
| YulExpression
131133
>
132134
>,
133135
options: ParserOptions<AstNode>,

0 commit comments

Comments
 (0)