Skip to content

Commit ff2ac6c

Browse files
authored
removing ContractMember, SourceUnitMember, Statement, and YulStatement from the AST tree (#1284)
1 parent 072a826 commit ff2ac6c

22 files changed

+90
-66
lines changed

src/slang-comments/handlers/handle-else-branch-comments.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,12 @@ export default function handleElseBranchComments({
1717

1818
if (
1919
followingNode === enclosingNode.body &&
20-
followingNode.variant.kind === NonterminalKind.IfStatement
20+
followingNode.kind === NonterminalKind.IfStatement
2121
) {
22-
if (followingNode.variant.body.variant.kind === NonterminalKind.Block) {
23-
addCollectionFirstComment(
24-
followingNode.variant.body.variant.statements,
25-
comment
26-
);
22+
if (followingNode.body.kind === NonterminalKind.Block) {
23+
addCollectionFirstComment(followingNode.body.statements, comment);
2724
} else {
28-
addLeadingComment(followingNode.variant.body.variant, comment);
25+
addLeadingComment(followingNode.body, comment);
2926
}
3027
return true;
3128
}

src/slang-comments/handlers/handle-if-statement-comments.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ export default function handleIfStatementComments({
3939
precedingNode === enclosingNode.body &&
4040
followingNode === enclosingNode.elseBranch
4141
) {
42-
addTrailingComment(precedingNode.variant, comment);
42+
addTrailingComment(precedingNode, comment);
4343
return true;
4444
}
4545

4646
if (followingNode.kind === NonterminalKind.IfStatement) {
47-
if (followingNode.body.variant.kind === NonterminalKind.Block) {
48-
addCollectionFirstComment(followingNode.body.variant.statements, comment);
47+
if (followingNode.body.kind === NonterminalKind.Block) {
48+
addCollectionFirstComment(followingNode.body.statements, comment);
4949
} else {
50-
addLeadingComment(followingNode.body.variant, comment);
50+
addLeadingComment(followingNode.body, comment);
5151
}
5252
return true;
5353
}
@@ -56,8 +56,8 @@ export default function handleIfStatementComments({
5656
// before the consequent without brackets on, such as
5757
// if (a) /* comment */ true
5858
if (enclosingNode.body === followingNode) {
59-
if (followingNode.variant.kind === NonterminalKind.Block) {
60-
addCollectionFirstComment(followingNode.variant.statements, comment);
59+
if (followingNode.kind === NonterminalKind.Block) {
60+
addCollectionFirstComment(followingNode.statements, comment);
6161
} else {
6262
addLeadingComment(followingNode, comment);
6363
}

src/slang-comments/handlers/handle-while-statement-comments.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ export default function handleWhileStatementComments({
3636
}
3737

3838
if (enclosingNode.body === followingNode) {
39-
if (followingNode.variant.kind === NonterminalKind.Block) {
40-
addCollectionFirstComment(followingNode.variant.statements, comment);
39+
if (followingNode.kind === NonterminalKind.Block) {
40+
addCollectionFirstComment(followingNode.statements, comment);
4141
} else {
4242
addLeadingComment(followingNode, comment);
4343
}

src/slang-nodes/ContractDefinition.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ export class ContractDefinition extends SlangNode {
4141
// Older versions of Solidity defined a constructor as a function having
4242
// the same name as the contract.
4343
if (!satisfies(options.compiler, '>=0.5.0')) {
44-
for (const { variant } of this.members.items) {
44+
for (const member of this.members.items) {
4545
if (
46-
variant.kind === NonterminalKind.FunctionDefinition &&
47-
variant.name.variant.value !== this.name.value
46+
member.kind === NonterminalKind.FunctionDefinition &&
47+
member.name.variant.value !== this.name.value
4848
) {
49-
variant.cleanModifierInvocationArguments();
49+
member.cleanModifierInvocationArguments();
5050
}
5151
}
5252
}

src/slang-nodes/ContractMember.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as ast from '@nomicfoundation/slang/ast';
22
import { NonterminalKind } from '@nomicfoundation/slang/cst';
3-
import { PolymorphicNode } from './PolymorphicNode.js';
3+
import { SlangNode } from './SlangNode.js';
44
import { UsingDirective } from './UsingDirective.js';
55
import { FunctionDefinition } from './FunctionDefinition.js';
66
import { ConstructorDefinition } from './ConstructorDefinition.js';
@@ -65,7 +65,7 @@ function createNonterminalVariant(
6565
return exhaustiveCheck;
6666
}
6767

68-
export class ContractMember extends PolymorphicNode {
68+
export class ContractMember extends SlangNode {
6969
readonly kind = NonterminalKind.ContractMember;
7070

7171
variant:

src/slang-nodes/ContractMembers.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { doc } from 'prettier';
33
import { printSeparatedItem } from '../slang-printers/print-separated-item.js';
44
import { printPreservingEmptyLines } from '../slang-printers/print-preserving-empty-lines.js';
5+
import { extractVariant } from '../slang-utils/extract-variant.js';
56
import { SlangNode } from './SlangNode.js';
67
import { ContractMember } from './ContractMember.js';
78

@@ -15,12 +16,14 @@ const { hardline } = doc.builders;
1516
export class ContractMembers extends SlangNode {
1617
readonly kind = NonterminalKind.ContractMembers;
1718

18-
items: ContractMember[];
19+
items: ContractMember['variant'][];
1920

2021
constructor(ast: ast.ContractMembers, options: ParserOptions<AstNode>) {
2122
super(ast, true);
2223

23-
this.items = ast.items.map((item) => new ContractMember(item, options));
24+
this.items = ast.items.map((item) =>
25+
extractVariant(new ContractMember(item, options))
26+
);
2427
}
2528

2629
print(

src/slang-nodes/DoWhileStatement.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { doc } from 'prettier';
33
import { printSeparatedItem } from '../slang-printers/print-separated-item.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 { Statement } from './Statement.js';
78
import { Expression } from './Expression.js';
@@ -16,24 +17,24 @@ const { line } = doc.builders;
1617
export class DoWhileStatement extends SlangNode {
1718
readonly kind = NonterminalKind.DoWhileStatement;
1819

19-
body: Statement;
20+
body: Statement['variant'];
2021

2122
condition: Expression;
2223

2324
constructor(ast: ast.DoWhileStatement, options: ParserOptions<AstNode>) {
2425
super(ast);
2526

26-
this.body = new Statement(ast.body, options);
27+
this.body = extractVariant(new Statement(ast.body, options));
2728
this.condition = new Expression(ast.condition, options);
2829

2930
this.updateMetadata(this.body, this.condition);
3031
}
3132

3233
print(path: AstPath<DoWhileStatement>, print: PrintFunction): Doc {
33-
const body = path.call(printVariant(print), 'body');
34+
const body = path.call(print, 'body');
3435
return [
3536
'do',
36-
this.body.variant.kind === NonterminalKind.Block
37+
this.body.kind === NonterminalKind.Block
3738
? [' ', body, ' ']
3839
: printSeparatedItem(body, { firstSeparator: line }),
3940
'while (',

src/slang-nodes/ElseBranch.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js';
33
import { printIndentedGroupOrSpacedDocument } from '../slang-printers/print-indented-group-or-spaced-document.js';
4-
import { printVariant } from '../slang-printers/print-variant.js';
4+
import { extractVariant } from '../slang-utils/extract-variant.js';
55
import { SlangNode } from './SlangNode.js';
66
import { Statement } from './Statement.js';
77

@@ -18,12 +18,12 @@ const isIfStatementOrBlock = createKindCheckFunction([
1818
export class ElseBranch extends SlangNode {
1919
readonly kind = NonterminalKind.ElseBranch;
2020

21-
body: Statement;
21+
body: Statement['variant'];
2222

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

26-
this.body = new Statement(ast.body, options);
26+
this.body = extractVariant(new Statement(ast.body, options));
2727

2828
this.updateMetadata(this.body);
2929
}
@@ -32,8 +32,8 @@ export class ElseBranch extends SlangNode {
3232
return [
3333
'else',
3434
printIndentedGroupOrSpacedDocument(
35-
path.call(printVariant(print), 'body'),
36-
!isIfStatementOrBlock(this.body.variant)
35+
path.call(print, 'body'),
36+
!isIfStatementOrBlock(this.body)
3737
)
3838
];
3939
}

src/slang-nodes/ForStatement.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { doc } from 'prettier';
33
import { printSeparatedList } from '../slang-printers/print-separated-list.js';
44
import { printIndentedGroupOrSpacedDocument } from '../slang-printers/print-indented-group-or-spaced-document.js';
55
import { printVariant } from '../slang-printers/print-variant.js';
6+
import { extractVariant } from '../slang-utils/extract-variant.js';
67
import { SlangNode } from './SlangNode.js';
78
import { ForStatementInitialization } from './ForStatementInitialization.js';
89
import { ForStatementCondition } from './ForStatementCondition.js';
@@ -25,7 +26,7 @@ export class ForStatement extends SlangNode {
2526

2627
iterator?: Expression;
2728

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

3031
constructor(ast: ast.ForStatement, options: ParserOptions<AstNode>) {
3132
super(ast);
@@ -38,7 +39,7 @@ export class ForStatement extends SlangNode {
3839
if (ast.iterator) {
3940
this.iterator = new Expression(ast.iterator, options);
4041
}
41-
this.body = new Statement(ast.body, options);
42+
this.body = extractVariant(new Statement(ast.body, options));
4243

4344
this.updateMetadata(
4445
this.initialization,
@@ -63,8 +64,8 @@ export class ForStatement extends SlangNode {
6364
}),
6465
')',
6566
printIndentedGroupOrSpacedDocument(
66-
path.call(printVariant(print), 'body'),
67-
this.body.variant.kind !== NonterminalKind.Block
67+
path.call(print, 'body'),
68+
this.body.kind !== NonterminalKind.Block
6869
)
6970
];
7071
}

src/slang-nodes/IfStatement.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { printSeparatedItem } from '../slang-printers/print-separated-item.js';
44
import { printIndentedGroupOrSpacedDocument } from '../slang-printers/print-indented-group-or-spaced-document.js';
55
import { isBlockComment } from '../slang-utils/is-comment.js';
66
import { printVariant } from '../slang-printers/print-variant.js';
7+
import { extractVariant } from '../slang-utils/extract-variant.js';
78
import { SlangNode } from './SlangNode.js';
89
import { Expression } from './Expression.js';
910
import { Statement } from './Statement.js';
@@ -21,15 +22,15 @@ export class IfStatement extends SlangNode {
2122

2223
condition: Expression;
2324

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

2627
elseBranch?: ElseBranch;
2728

2829
constructor(ast: ast.IfStatement, options: ParserOptions<AstNode>) {
2930
super(ast);
3031

3132
this.condition = new Expression(ast.condition, options);
32-
this.body = new Statement(ast.body, options);
33+
this.body = extractVariant(new Statement(ast.body, options));
3334
if (ast.elseBranch) {
3435
this.elseBranch = new ElseBranch(ast.elseBranch, options);
3536
}
@@ -38,13 +39,13 @@ export class IfStatement extends SlangNode {
3839
}
3940

4041
print(path: AstPath<IfStatement>, print: PrintFunction): Doc {
41-
const { kind: bodyKind, comments: bodyComments } = this.body.variant;
42+
const { kind: bodyKind, comments: bodyComments } = this.body;
4243
return [
4344
'if (',
4445
printSeparatedItem(path.call(printVariant(print), 'condition')),
4546
')',
4647
printIndentedGroupOrSpacedDocument(
47-
path.call(printVariant(print), 'body'),
48+
path.call(print, 'body'),
4849
bodyKind !== NonterminalKind.Block,
4950
// `if` within `if`
5051
{ shouldBreak: bodyKind === NonterminalKind.IfStatement }

0 commit comments

Comments
 (0)