Skip to content

Commit 0cf7f97

Browse files
committed
Migrating all variant values with the possibility to be a string to TerminalNode for easier printing logic
1 parent 341938b commit 0cf7f97

23 files changed

Lines changed: 199 additions & 150 deletions
Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst';
2-
import { printVariant } from '../slang-printers/print-variant.js';
1+
import {
2+
NonterminalKind,
3+
TerminalNode as SlangTerminalNode
4+
} from '@nomicfoundation/slang/cst';
35
import { SlangNode } from './SlangNode.js';
46
import { ModifierInvocation } from './ModifierInvocation.js';
7+
import { TerminalNode } from './TerminalNode.js';
58

69
import type * as ast from '@nomicfoundation/slang/ast';
710
import type { AstPath, Doc, ParserOptions } from 'prettier';
@@ -11,14 +14,14 @@ import type { PrintFunction } from '../types.d.ts';
1114
export class ConstructorAttribute extends SlangNode {
1215
readonly kind = NonterminalKind.ConstructorAttribute;
1316

14-
variant: ModifierInvocation | string;
17+
variant: ModifierInvocation | TerminalNode;
1518

1619
constructor(ast: ast.ConstructorAttribute, options: ParserOptions<AstNode>) {
1720
super(ast);
1821

1922
const variant = ast.variant;
20-
if (variant instanceof TerminalNode) {
21-
this.variant = variant.unparse();
23+
if (variant instanceof SlangTerminalNode) {
24+
this.variant = new TerminalNode(variant);
2225
return;
2326
}
2427
this.variant = new ModifierInvocation(variant, options);
@@ -27,6 +30,6 @@ export class ConstructorAttribute extends SlangNode {
2730
}
2831

2932
print(path: AstPath<ConstructorAttribute>, print: PrintFunction): Doc {
30-
return printVariant(this, path, print);
33+
return path.call(print, 'variant');
3134
}
3235
}

src/slang-nodes/ElementaryType.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst';
2-
import { printVariant } from '../slang-printers/print-variant.js';
1+
import {
2+
NonterminalKind,
3+
TerminalNode as SlangTerminalNode
4+
} from '@nomicfoundation/slang/cst';
35
import { SlangNode } from './SlangNode.js';
46
import { AddressType } from './AddressType.js';
7+
import { TerminalNode } from './TerminalNode.js';
58

69
import type * as ast from '@nomicfoundation/slang/ast';
710
import type { AstPath, Doc } from 'prettier';
@@ -10,14 +13,14 @@ import type { PrintFunction } from '../types.d.ts';
1013
export class ElementaryType extends SlangNode {
1114
readonly kind = NonterminalKind.ElementaryType;
1215

13-
variant: AddressType | string;
16+
variant: AddressType | TerminalNode;
1417

1518
constructor(ast: ast.ElementaryType) {
1619
super(ast);
1720

1821
const variant = ast.variant;
19-
if (variant instanceof TerminalNode) {
20-
this.variant = variant.unparse();
22+
if (variant instanceof SlangTerminalNode) {
23+
this.variant = new TerminalNode(variant);
2124
return;
2225
}
2326
this.variant = new AddressType(variant);
@@ -26,6 +29,6 @@ export class ElementaryType extends SlangNode {
2629
}
2730

2831
print(path: AstPath<ElementaryType>, print: PrintFunction): Doc {
29-
return printVariant(this, path, print);
32+
return path.call(print, 'variant');
3033
}
3134
}
Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
import * as ast from '@nomicfoundation/slang/ast';
2-
import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst';
3-
import { printVariant } from '../slang-printers/print-variant.js';
2+
import {
3+
NonterminalKind,
4+
TerminalNode as SlangTerminalNode
5+
} from '@nomicfoundation/slang/cst';
46
import { SlangNode } from './SlangNode.js';
57
import { ModifierInvocation } from './ModifierInvocation.js';
68
import { OverrideSpecifier } from './OverrideSpecifier.js';
9+
import { TerminalNode } from './TerminalNode.js';
710

811
import type { AstPath, Doc, ParserOptions } from 'prettier';
912
import type { AstNode } from './types.d.ts';
1013
import type { PrintFunction } from '../types.d.ts';
1114

1215
function createNonterminalVariant(
13-
variant: Exclude<ast.FallbackFunctionAttribute['variant'], TerminalNode>,
16+
variant: Exclude<ast.FallbackFunctionAttribute['variant'], SlangTerminalNode>,
1417
options: ParserOptions<AstNode>
15-
): Exclude<FallbackFunctionAttribute['variant'], string> {
18+
): Exclude<FallbackFunctionAttribute['variant'], TerminalNode> {
1619
if (variant instanceof ast.ModifierInvocation) {
1720
return new ModifierInvocation(variant, options);
1821
}
@@ -26,7 +29,7 @@ function createNonterminalVariant(
2629
export class FallbackFunctionAttribute extends SlangNode {
2730
readonly kind = NonterminalKind.FallbackFunctionAttribute;
2831

29-
variant: ModifierInvocation | OverrideSpecifier | string;
32+
variant: ModifierInvocation | OverrideSpecifier | TerminalNode;
3033

3134
constructor(
3235
ast: ast.FallbackFunctionAttribute,
@@ -35,8 +38,8 @@ export class FallbackFunctionAttribute extends SlangNode {
3538
super(ast);
3639

3740
const variant = ast.variant;
38-
if (variant instanceof TerminalNode) {
39-
this.variant = variant.unparse();
41+
if (variant instanceof SlangTerminalNode) {
42+
this.variant = new TerminalNode(variant);
4043
return;
4144
}
4245
this.variant = createNonterminalVariant(variant, options);
@@ -45,6 +48,6 @@ export class FallbackFunctionAttribute extends SlangNode {
4548
}
4649

4750
print(path: AstPath<FallbackFunctionAttribute>, print: PrintFunction): Doc {
48-
return printVariant(this, path, print);
51+
return path.call(print, 'variant');
4952
}
5053
}
Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
1-
import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst';
2-
import { printVariant } from '../slang-printers/print-variant.js';
1+
import {
2+
NonterminalKind,
3+
TerminalNode as SlangTerminalNode
4+
} from '@nomicfoundation/slang/cst';
35
import { SlangNode } from './SlangNode.js';
46
import { ExpressionStatement } from './ExpressionStatement.js';
57

68
import type * as ast from '@nomicfoundation/slang/ast';
79
import type { AstPath, Doc, ParserOptions } from 'prettier';
810
import type { AstNode } from './types.d.ts';
911
import type { PrintFunction } from '../types.d.ts';
12+
import { TerminalNode } from './TerminalNode.js';
1013

1114
export class ForStatementCondition extends SlangNode {
1215
readonly kind = NonterminalKind.ForStatementCondition;
1316

14-
variant: ExpressionStatement | string;
17+
variant: ExpressionStatement | TerminalNode;
1518

1619
constructor(ast: ast.ForStatementCondition, options: ParserOptions<AstNode>) {
1720
super(ast);
1821

1922
const variant = ast.variant;
20-
if (variant instanceof TerminalNode) {
21-
this.variant = variant.unparse();
23+
if (variant instanceof SlangTerminalNode) {
24+
this.variant = new TerminalNode(variant);
2225
return;
2326
}
2427
this.variant = new ExpressionStatement(variant, options);
@@ -27,6 +30,6 @@ export class ForStatementCondition extends SlangNode {
2730
}
2831

2932
print(path: AstPath<ForStatementCondition>, print: PrintFunction): Doc {
30-
return printVariant(this, path, print);
33+
return path.call(print, 'variant');
3134
}
3235
}

src/slang-nodes/ForStatementInitialization.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
import * as ast from '@nomicfoundation/slang/ast';
2-
import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst';
3-
import { printVariant } from '../slang-printers/print-variant.js';
2+
import {
3+
NonterminalKind,
4+
TerminalNode as SlangTerminalNode
5+
} from '@nomicfoundation/slang/cst';
46
import { SlangNode } from './SlangNode.js';
57
import { ExpressionStatement } from './ExpressionStatement.js';
68
import { VariableDeclarationStatement } from './VariableDeclarationStatement.js';
79
import { TupleDeconstructionStatement } from './TupleDeconstructionStatement.js';
10+
import { TerminalNode } from './TerminalNode.js';
811

912
import type { AstPath, Doc, ParserOptions } from 'prettier';
1013
import type { AstNode } from './types.d.ts';
1114
import type { PrintFunction } from '../types.d.ts';
1215

1316
function createNonterminalVariant(
14-
variant: Exclude<ast.ForStatementInitialization['variant'], TerminalNode>,
17+
variant: Exclude<
18+
ast.ForStatementInitialization['variant'],
19+
SlangTerminalNode
20+
>,
1521
options: ParserOptions<AstNode>
16-
): Exclude<ForStatementInitialization['variant'], string> {
22+
): Exclude<ForStatementInitialization['variant'], TerminalNode> {
1723
if (variant instanceof ast.ExpressionStatement) {
1824
return new ExpressionStatement(variant, options);
1925
}
@@ -34,7 +40,7 @@ export class ForStatementInitialization extends SlangNode {
3440
| ExpressionStatement
3541
| VariableDeclarationStatement
3642
| TupleDeconstructionStatement
37-
| string;
43+
| TerminalNode;
3844

3945
constructor(
4046
ast: ast.ForStatementInitialization,
@@ -43,8 +49,8 @@ export class ForStatementInitialization extends SlangNode {
4349
super(ast);
4450

4551
const variant = ast.variant;
46-
if (variant instanceof TerminalNode) {
47-
this.variant = variant.unparse();
52+
if (variant instanceof SlangTerminalNode) {
53+
this.variant = new TerminalNode(variant);
4854
return;
4955
}
5056
this.variant = createNonterminalVariant(variant, options);
@@ -53,6 +59,6 @@ export class ForStatementInitialization extends SlangNode {
5359
}
5460

5561
print(path: AstPath<ForStatementInitialization>, print: PrintFunction): Doc {
56-
return printVariant(this, path, print);
62+
return path.call(print, 'variant');
5763
}
5864
}
Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
import * as ast from '@nomicfoundation/slang/ast';
2-
import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst';
3-
import { printVariant } from '../slang-printers/print-variant.js';
2+
import {
3+
NonterminalKind,
4+
TerminalNode as SlangTerminalNode
5+
} from '@nomicfoundation/slang/cst';
46
import { SlangNode } from './SlangNode.js';
57
import { ModifierInvocation } from './ModifierInvocation.js';
68
import { OverrideSpecifier } from './OverrideSpecifier.js';
9+
import { TerminalNode } from './TerminalNode.js';
710

811
import type { AstPath, Doc, ParserOptions } from 'prettier';
912
import type { AstNode } from './types.d.ts';
1013
import type { PrintFunction } from '../types.d.ts';
1114

1215
function createNonterminalVariant(
13-
variant: Exclude<ast.FunctionAttribute['variant'], TerminalNode>,
16+
variant: Exclude<ast.FunctionAttribute['variant'], SlangTerminalNode>,
1417
options: ParserOptions<AstNode>
15-
): Exclude<FunctionAttribute['variant'], string> {
18+
): Exclude<FunctionAttribute['variant'], TerminalNode> {
1619
if (variant instanceof ast.ModifierInvocation) {
1720
return new ModifierInvocation(variant, options);
1821
}
@@ -26,14 +29,14 @@ function createNonterminalVariant(
2629
export class FunctionAttribute extends SlangNode {
2730
readonly kind = NonterminalKind.FunctionAttribute;
2831

29-
variant: ModifierInvocation | OverrideSpecifier | string;
32+
variant: ModifierInvocation | OverrideSpecifier | TerminalNode;
3033

3134
constructor(ast: ast.FunctionAttribute, options: ParserOptions<AstNode>) {
3235
super(ast);
3336

3437
const variant = ast.variant;
35-
if (variant instanceof TerminalNode) {
36-
this.variant = variant.unparse();
38+
if (variant instanceof SlangTerminalNode) {
39+
this.variant = new TerminalNode(variant);
3740
return;
3841
}
3942
this.variant = createNonterminalVariant(variant, options);
@@ -42,6 +45,6 @@ export class FunctionAttribute extends SlangNode {
4245
}
4346

4447
print(path: AstPath<FunctionAttribute>, print: PrintFunction): Doc {
45-
return printVariant(this, path, print);
48+
return path.call(print, 'variant');
4649
}
4750
}

src/slang-nodes/FunctionBody.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst';
2-
import { printVariant } from '../slang-printers/print-variant.js';
1+
import {
2+
NonterminalKind,
3+
TerminalNode as SlangTerminalNode
4+
} from '@nomicfoundation/slang/cst';
35
import { SlangNode } from './SlangNode.js';
46
import { Block } from './Block.js';
7+
import { TerminalNode } from './TerminalNode.js';
58

69
import type * as ast from '@nomicfoundation/slang/ast';
710
import type { AstPath, Doc, ParserOptions } from 'prettier';
@@ -11,14 +14,14 @@ import type { PrintFunction } from '../types.d.ts';
1114
export class FunctionBody extends SlangNode {
1215
readonly kind = NonterminalKind.FunctionBody;
1316

14-
variant: Block | string;
17+
variant: Block | TerminalNode;
1518

1619
constructor(ast: ast.FunctionBody, options: ParserOptions<AstNode>) {
1720
super(ast);
1821

1922
const variant = ast.variant;
20-
if (variant instanceof TerminalNode) {
21-
this.variant = variant.unparse();
23+
if (variant instanceof SlangTerminalNode) {
24+
this.variant = new TerminalNode(variant);
2225
return;
2326
}
2427
this.variant = new Block(variant, options);
@@ -27,6 +30,6 @@ export class FunctionBody extends SlangNode {
2730
}
2831

2932
print(path: AstPath<FunctionBody>, print: PrintFunction): Doc {
30-
return printVariant(this, path, print);
33+
return path.call(print, 'variant');
3134
}
3235
}
Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { SlangNode } from './SlangNode.js';
3+
import { TerminalNode } from './TerminalNode.js';
34

45
import type * as ast from '@nomicfoundation/slang/ast';
5-
import type { Doc } from 'prettier';
6+
import type { AstPath, Doc } from 'prettier';
7+
import type { PrintFunction } from '../types.d.ts';
68

79
export class FunctionTypeAttribute extends SlangNode {
810
readonly kind = NonterminalKind.FunctionTypeAttribute;
911

10-
variant: string;
12+
variant: TerminalNode;
1113

1214
constructor(ast: ast.FunctionTypeAttribute) {
1315
super(ast);
1416

15-
this.variant = ast.variant.unparse();
17+
this.variant = new TerminalNode(ast.variant);
1618
}
1719

18-
print(): Doc {
19-
return this.variant;
20+
print(path: AstPath<FunctionTypeAttribute>, print: PrintFunction): Doc {
21+
return path.call(print, 'variant');
2022
}
2123
}
Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst';
2-
import { printVariant } from '../slang-printers/print-variant.js';
1+
import {
2+
NonterminalKind,
3+
TerminalNode as SlangTerminalNode
4+
} from '@nomicfoundation/slang/cst';
35
import { SlangNode } from './SlangNode.js';
46
import { OverrideSpecifier } from './OverrideSpecifier.js';
7+
import { TerminalNode } from './TerminalNode.js';
58

69
import type * as ast from '@nomicfoundation/slang/ast';
710
import type { AstPath, Doc } from 'prettier';
@@ -10,14 +13,14 @@ import type { PrintFunction } from '../types.d.ts';
1013
export class ModifierAttribute extends SlangNode {
1114
readonly kind = NonterminalKind.ModifierAttribute;
1215

13-
variant: OverrideSpecifier | string;
16+
variant: OverrideSpecifier | TerminalNode;
1417

1518
constructor(ast: ast.ModifierAttribute) {
1619
super(ast);
1720

1821
const variant = ast.variant;
19-
if (variant instanceof TerminalNode) {
20-
this.variant = variant.unparse();
22+
if (variant instanceof SlangTerminalNode) {
23+
this.variant = new TerminalNode(variant);
2124
return;
2225
}
2326
this.variant = new OverrideSpecifier(variant);
@@ -26,6 +29,6 @@ export class ModifierAttribute extends SlangNode {
2629
}
2730

2831
print(path: AstPath<ModifierAttribute>, print: PrintFunction): Doc {
29-
return printVariant(this, path, print);
32+
return path.call(print, 'variant');
3033
}
3134
}

0 commit comments

Comments
 (0)