Skip to content

Commit 7bf1a64

Browse files
committed
removing FunctionBody from the AST tree
1 parent 3092584 commit 7bf1a64

8 files changed

Lines changed: 25 additions & 28 deletions

src/slang-nodes/FallbackFunctionDefinition.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printFunctionWithBody } from '../slang-printers/print-function.js';
3+
import { extractVariant } from '../slang-utils/extract-variant.js';
34
import { SlangNode } from './SlangNode.js';
45
import { ParametersDeclaration } from './ParametersDeclaration.js';
56
import { FallbackFunctionAttributes } from './FallbackFunctionAttributes.js';
@@ -20,7 +21,7 @@ export class FallbackFunctionDefinition extends SlangNode {
2021

2122
returns?: ReturnsDeclaration;
2223

23-
body: FunctionBody;
24+
body: FunctionBody['variant'];
2425

2526
constructor(
2627
ast: ast.FallbackFunctionDefinition,
@@ -33,7 +34,7 @@ export class FallbackFunctionDefinition extends SlangNode {
3334
if (ast.returns) {
3435
this.returns = new ReturnsDeclaration(ast.returns, options);
3536
}
36-
this.body = new FunctionBody(ast.body, options);
37+
this.body = extractVariant(new FunctionBody(ast.body, options));
3738

3839
this.updateMetadata(
3940
this.parameters,

src/slang-nodes/FunctionBody.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import {
22
NonterminalKind,
33
TerminalNode as SlangTerminalNode
44
} from '@nomicfoundation/slang/cst';
5-
import { PolymorphicNode } from './PolymorphicNode.js';
5+
import { SlangNode } from './SlangNode.js';
66
import { Block } from './Block.js';
77
import { TerminalNode } from './TerminalNode.js';
88

99
import type * as ast from '@nomicfoundation/slang/ast';
1010
import type { ParserOptions } from 'prettier';
1111
import type { AstNode } from './types.d.ts';
1212

13-
export class FunctionBody extends PolymorphicNode {
13+
export class FunctionBody extends SlangNode {
1414
readonly kind = NonterminalKind.FunctionBody;
1515

1616
variant: Block | TerminalNode;

src/slang-nodes/FunctionDefinition.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { satisfies } from 'semver';
22
import { NonterminalKind } from '@nomicfoundation/slang/cst';
33
import { printFunctionWithBody } from '../slang-printers/print-function.js';
44
import { printVariant } from '../slang-printers/print-variant.js';
5+
import { extractVariant } from '../slang-utils/extract-variant.js';
56
import { SlangNode } from './SlangNode.js';
67
import { FunctionName } from './FunctionName.js';
78
import { ParametersDeclaration } from './ParametersDeclaration.js';
@@ -25,7 +26,7 @@ export class FunctionDefinition extends SlangNode {
2526

2627
returns?: ReturnsDeclaration;
2728

28-
body: FunctionBody;
29+
body: FunctionBody['variant'];
2930

3031
constructor(ast: ast.FunctionDefinition, options: ParserOptions<AstNode>) {
3132
super(ast);
@@ -36,7 +37,7 @@ export class FunctionDefinition extends SlangNode {
3637
if (ast.returns) {
3738
this.returns = new ReturnsDeclaration(ast.returns, options);
3839
}
39-
this.body = new FunctionBody(ast.body, options);
40+
this.body = extractVariant(new FunctionBody(ast.body, options));
4041

4142
this.updateMetadata(
4243
this.name,

src/slang-nodes/ModifierDefinition.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printFunctionWithBody } from '../slang-printers/print-function.js';
3+
import { extractVariant } from '../slang-utils/extract-variant.js';
34
import { SlangNode } from './SlangNode.js';
45
import { TerminalNode } from './TerminalNode.js';
56
import { ParametersDeclaration } from './ParametersDeclaration.js';
@@ -21,7 +22,7 @@ export class ModifierDefinition extends SlangNode {
2122

2223
attributes: ModifierAttributes;
2324

24-
body: FunctionBody;
25+
body: FunctionBody['variant'];
2526

2627
constructor(ast: ast.ModifierDefinition, options: ParserOptions<AstNode>) {
2728
super(ast);
@@ -31,7 +32,7 @@ export class ModifierDefinition extends SlangNode {
3132
this.parameters = new ParametersDeclaration(ast.parameters, options);
3233
}
3334
this.attributes = new ModifierAttributes(ast.attributes);
34-
this.body = new FunctionBody(ast.body, options);
35+
this.body = extractVariant(new FunctionBody(ast.body, options));
3536

3637
this.updateMetadata(this.parameters, this.attributes, this.body);
3738

src/slang-nodes/ReceiveFunctionDefinition.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printFunctionWithBody } from '../slang-printers/print-function.js';
3+
import { extractVariant } from '../slang-utils/extract-variant.js';
34
import { SlangNode } from './SlangNode.js';
45
import { ParametersDeclaration } from './ParametersDeclaration.js';
56
import { ReceiveFunctionAttributes } from './ReceiveFunctionAttributes.js';
@@ -17,7 +18,7 @@ export class ReceiveFunctionDefinition extends SlangNode {
1718

1819
attributes: ReceiveFunctionAttributes;
1920

20-
body: FunctionBody;
21+
body: FunctionBody['variant'];
2122

2223
constructor(
2324
ast: ast.ReceiveFunctionDefinition,
@@ -27,7 +28,7 @@ export class ReceiveFunctionDefinition extends SlangNode {
2728

2829
this.parameters = new ParametersDeclaration(ast.parameters, options);
2930
this.attributes = new ReceiveFunctionAttributes(ast.attributes, options);
30-
this.body = new FunctionBody(ast.body, options);
31+
this.body = extractVariant(new FunctionBody(ast.body, options));
3132

3233
this.updateMetadata(this.parameters, this.attributes, this.body);
3334

src/slang-nodes/UnnamedFunctionDefinition.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printFunctionWithBody } from '../slang-printers/print-function.js';
3+
import { extractVariant } from '../slang-utils/extract-variant.js';
34
import { SlangNode } from './SlangNode.js';
45
import { ParametersDeclaration } from './ParametersDeclaration.js';
56
import { UnnamedFunctionAttributes } from './UnnamedFunctionAttributes.js';
@@ -17,7 +18,7 @@ export class UnnamedFunctionDefinition extends SlangNode {
1718

1819
attributes: UnnamedFunctionAttributes;
1920

20-
body: FunctionBody;
21+
body: FunctionBody['variant'];
2122

2223
constructor(
2324
ast: ast.UnnamedFunctionDefinition,
@@ -27,7 +28,7 @@ export class UnnamedFunctionDefinition extends SlangNode {
2728

2829
this.parameters = new ParametersDeclaration(ast.parameters, options);
2930
this.attributes = new UnnamedFunctionAttributes(ast.attributes, options);
30-
this.body = new FunctionBody(ast.body, options);
31+
this.body = extractVariant(new FunctionBody(ast.body, options));
3132

3233
this.updateMetadata(this.parameters, this.attributes, this.body);
3334

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { doc } from 'prettier';
33
import { joinExisting } from '../slang-utils/join-existing.js';
4-
import { printVariant } from './print-variant.js';
54

65
import type { AstPath, Doc } from 'prettier';
7-
import type {
8-
FunctionLike,
9-
StrictPolymorphicNode
10-
} from '../slang-nodes/types.d.ts';
6+
import type { FunctionLike } from '../slang-nodes/types.d.ts';
117
import type { PrintFunction } from '../types.d.ts';
128
import type { FunctionBody } from '../slang-nodes/FunctionBody.js';
139

@@ -19,7 +15,9 @@ export function printFunction(
1915
path: AstPath<FunctionLike>,
2016
print: PrintFunction
2117
): Doc {
22-
const body = (node as Extract<FunctionLike, { body: FunctionBody }>).body;
18+
const body = (
19+
node as Extract<FunctionLike, { body: FunctionBody['variant'] }>
20+
).body;
2321

2422
return group([
2523
functionName,
@@ -30,9 +28,7 @@ export function printFunction(
3028
path.call(print, 'attributes'),
3129
path.call(print, 'returns')
3230
]),
33-
body && (!body.variant || body.variant.kind === NonterminalKind.Block)
34-
? dedent(line)
35-
: ''
31+
body && body.kind === NonterminalKind.Block ? dedent(line) : ''
3632
])
3733
)
3834
]);
@@ -46,12 +42,6 @@ export function printFunctionWithBody(
4642
): Doc {
4743
return [
4844
printFunction(functionName, node, path, print),
49-
node.kind !== NonterminalKind.ConstructorDefinition
50-
? (
51-
path as AstPath<
52-
Extract<FunctionLike, { body: StrictPolymorphicNode }>
53-
>
54-
).call(printVariant(print), 'body')
55-
: path.call(print, 'body')
45+
path.call(print, 'body')
5646
];
5747
}

src/slangPrinter.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import type { ExperimentalFeature } from './slang-nodes/ExperimentalFeature.js';
2323
import type { Expression } from './slang-nodes/Expression.js';
2424
import type { ForStatementInitialization } from './slang-nodes/ForStatementInitialization.js';
2525
import type { ForStatementCondition } from './slang-nodes/ForStatementCondition.js';
26+
import type { FunctionBody } from './slang-nodes/FunctionBody.js';
2627

2728
function hasNodeIgnoreComment({ comments }: StrictAstNode): boolean {
2829
// Prettier sets SourceUnit's comments to undefined after assigning comments
@@ -94,6 +95,7 @@ function genericPrint(
9495
| Expression
9596
| ForStatementInitialization
9697
| ForStatementCondition
98+
| FunctionBody
9799
>
98100
>,
99101
options: ParserOptions<AstNode>,

0 commit comments

Comments
 (0)