Skip to content

Commit 56db4e4

Browse files
authored
removing ArgumentsDeclaration from the AST tree (#1270)
1 parent dfa83a2 commit 56db4e4

File tree

9 files changed

+49
-39
lines changed

9 files changed

+49
-39
lines changed

src/slang-comments/handlers/handle-modifier-invocation-comments.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,12 @@ export default function handleModifierInvocationComments({
2727
if (
2828
precedingNode?.kind === NonterminalKind.IdentifierPath &&
2929
nextCharacter === '(' &&
30-
followingNode?.kind === NonterminalKind.ArgumentsDeclaration &&
31-
followingNode.variant.kind ===
32-
NonterminalKind.PositionalArgumentsDeclaration
30+
followingNode?.kind === NonterminalKind.PositionalArgumentsDeclaration
3331
) {
34-
if (followingNode.variant.arguments.items.length === 0) {
32+
if (followingNode.arguments.items.length === 0) {
3533
addTrailingComment(enclosingNode, comment);
3634
} else {
37-
addCollectionFirstComment(followingNode.variant.arguments, comment);
35+
addCollectionFirstComment(followingNode.arguments, comment);
3836
}
3937
return true;
4038
}

src/slang-nodes/ArgumentsDeclaration.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 { PositionalArgumentsDeclaration } from './PositionalArgumentsDeclaration.js';
55
import { NamedArgumentsDeclaration } from './NamedArgumentsDeclaration.js';
66

@@ -21,7 +21,7 @@ function createNonterminalVariant(
2121
return exhaustiveCheck;
2222
}
2323

24-
export class ArgumentsDeclaration extends PolymorphicNode {
24+
export class ArgumentsDeclaration extends SlangNode {
2525
readonly kind = NonterminalKind.ArgumentsDeclaration;
2626

2727
variant: PositionalArgumentsDeclaration | NamedArgumentsDeclaration;

src/slang-nodes/EmitStatement.ts

Lines changed: 6 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 { IdentifierPath } from './IdentifierPath.js';
55
import { ArgumentsDeclaration } from './ArgumentsDeclaration.js';
@@ -14,13 +14,15 @@ export class EmitStatement extends SlangNode {
1414

1515
event: IdentifierPath;
1616

17-
arguments: ArgumentsDeclaration;
17+
arguments: ArgumentsDeclaration['variant'];
1818

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

2222
this.event = new IdentifierPath(ast.event);
23-
this.arguments = new ArgumentsDeclaration(ast.arguments, options);
23+
this.arguments = extractVariant(
24+
new ArgumentsDeclaration(ast.arguments, options)
25+
);
2426

2527
this.updateMetadata(this.event, this.arguments);
2628
}
@@ -29,7 +31,7 @@ export class EmitStatement extends SlangNode {
2931
return [
3032
'emit ',
3133
path.call(print, 'event'),
32-
path.call(printVariant(print), 'arguments'),
34+
path.call(print, 'arguments'),
3335
';'
3436
];
3537
}

src/slang-nodes/FunctionCallExpression.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { doc } from 'prettier';
33
import { isLabel } from '../slang-utils/is-label.js';
44
import { printGroupAndIndentIfBreakPair } from '../slang-printers/print-group-and-indent-if-break-pair.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 { Expression } from './Expression.js';
89
import { ArgumentsDeclaration } from './ArgumentsDeclaration.js';
@@ -19,7 +20,7 @@ export class FunctionCallExpression extends SlangNode {
1920

2021
operand: Expression;
2122

22-
arguments: ArgumentsDeclaration;
23+
arguments: ArgumentsDeclaration['variant'];
2324

2425
constructor(
2526
ast: ast.FunctionCallExpression,
@@ -28,14 +29,16 @@ export class FunctionCallExpression extends SlangNode {
2829
super(ast);
2930

3031
this.operand = new Expression(ast.operand, options);
31-
this.arguments = new ArgumentsDeclaration(ast.arguments, options);
32+
this.arguments = extractVariant(
33+
new ArgumentsDeclaration(ast.arguments, options)
34+
);
3235

3336
this.updateMetadata(this.operand, this.arguments);
3437
}
3538

3639
print(path: AstPath<FunctionCallExpression>, print: PrintFunction): Doc {
3740
const operand = path.call(printVariant(print), 'operand');
38-
const argumentsDoc = path.call(printVariant(print), 'arguments');
41+
const argumentsDoc = path.call(print, 'arguments');
3942

4043
// If we are at the end of a MemberAccessChain we should indent the
4144
// arguments accordingly.

src/slang-nodes/InheritanceType.ts

Lines changed: 6 additions & 7 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 { IdentifierPath } from './IdentifierPath.js';
55
import { ArgumentsDeclaration } from './ArgumentsDeclaration.js';
@@ -14,23 +14,22 @@ export class InheritanceType extends SlangNode {
1414

1515
typeName: IdentifierPath;
1616

17-
arguments?: ArgumentsDeclaration;
17+
arguments?: ArgumentsDeclaration['variant'];
1818

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

2222
this.typeName = new IdentifierPath(ast.typeName);
2323
if (ast.arguments) {
24-
this.arguments = new ArgumentsDeclaration(ast.arguments, options);
24+
this.arguments = extractVariant(
25+
new ArgumentsDeclaration(ast.arguments, options)
26+
);
2527
}
2628

2729
this.updateMetadata(this.typeName, this.arguments);
2830
}
2931

3032
print(path: AstPath<InheritanceType>, print: PrintFunction): Doc {
31-
return [
32-
path.call(print, 'typeName'),
33-
path.call(printVariant(print), 'arguments')
34-
];
33+
return [path.call(print, 'typeName'), path.call(print, 'arguments')];
3534
}
3635
}
Lines changed: 9 additions & 12 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 { IdentifierPath } from './IdentifierPath.js';
55
import { ArgumentsDeclaration } from './ArgumentsDeclaration.js';
@@ -14,35 +14,32 @@ export class ModifierInvocation extends SlangNode {
1414

1515
name: IdentifierPath;
1616

17-
arguments?: ArgumentsDeclaration;
17+
arguments?: ArgumentsDeclaration['variant'];
1818

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

2222
this.name = new IdentifierPath(ast.name);
2323
if (ast.arguments) {
24-
this.arguments = new ArgumentsDeclaration(ast.arguments, options);
24+
this.arguments = extractVariant(
25+
new ArgumentsDeclaration(ast.arguments, options)
26+
);
2527
}
2628

2729
this.updateMetadata(this.name, this.arguments);
2830
}
2931

3032
cleanModifierInvocationArguments(): void {
31-
const argumentsVariant = this.arguments?.variant;
3233
if (
33-
argumentsVariant &&
34-
argumentsVariant.kind ===
35-
NonterminalKind.PositionalArgumentsDeclaration &&
36-
argumentsVariant.isEmpty
34+
this.arguments &&
35+
this.arguments.kind === NonterminalKind.PositionalArgumentsDeclaration &&
36+
this.arguments.isEmpty
3737
) {
3838
delete this.arguments;
3939
}
4040
}
4141

4242
print(path: AstPath<ModifierInvocation>, print: PrintFunction): Doc {
43-
return [
44-
path.call(print, 'name'),
45-
path.call(printVariant(print), 'arguments')
46-
];
43+
return [path.call(print, 'name'), path.call(print, 'arguments')];
4744
}
4845
}

src/slang-nodes/RevertStatement.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 { joinExisting } from '../slang-utils/join-existing.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 { IdentifierPath } from './IdentifierPath.js';
66
import { ArgumentsDeclaration } from './ArgumentsDeclaration.js';
@@ -15,23 +15,25 @@ export class RevertStatement extends SlangNode {
1515

1616
error?: IdentifierPath;
1717

18-
arguments: ArgumentsDeclaration;
18+
arguments: ArgumentsDeclaration['variant'];
1919

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

2323
if (ast.error) {
2424
this.error = new IdentifierPath(ast.error);
2525
}
26-
this.arguments = new ArgumentsDeclaration(ast.arguments, options);
26+
this.arguments = extractVariant(
27+
new ArgumentsDeclaration(ast.arguments, options)
28+
);
2729

2830
this.updateMetadata(this.error, this.arguments);
2931
}
3032

3133
print(path: AstPath<RevertStatement>, print: PrintFunction): Doc {
3234
return [
3335
joinExisting(' ', ['revert', path.call(print, 'error')]),
34-
path.call(printVariant(print), 'arguments'),
36+
path.call(print, 'arguments'),
3537
';'
3638
];
3739
}

src/slang-utils/extract-variant.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import type { StrictPolymorphicNode } from '../slang-nodes/types.ts';
2+
3+
export function extractVariant<T extends StrictPolymorphicNode>({
4+
variant,
5+
loc
6+
}: T): T['variant'] {
7+
variant.loc = loc;
8+
return variant;
9+
}

src/slangPrinter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { locEnd, locStart } from './slang-utils/loc.js';
44
import type { AstPath, Doc, ParserOptions } from 'prettier';
55
import type { AstNode, StrictAstNode } from './slang-nodes/types.d.ts';
66
import type { PrintFunction } from './types.d.ts';
7+
import type { ArgumentsDeclaration } from './slang-nodes/ArgumentsDeclaration.js';
78

89
function hasNodeIgnoreComment({ comments }: StrictAstNode): boolean {
910
// Prettier sets SourceUnit's comments to undefined after assigning comments
@@ -30,7 +31,6 @@ function ignoreComments(path: AstPath<AstNode>): void {
3031
// parser. `updateMetadata` is an internal function.
3132
case 'kind':
3233
case 'loc':
33-
case 'print':
3434
case 'updateMetadata':
3535
break;
3636
// The key `comments` will contain every comment for this node.
@@ -54,7 +54,7 @@ function ignoreComments(path: AstPath<AstNode>): void {
5454
// Nodes take care of undefined and string properties so we can restrict path
5555
// to AstPath<StrictAstNode>
5656
function genericPrint(
57-
path: AstPath<StrictAstNode>,
57+
path: AstPath<Exclude<StrictAstNode, ArgumentsDeclaration>>,
5858
options: ParserOptions<AstNode>,
5959
print: PrintFunction
6060
): Doc {

0 commit comments

Comments
 (0)