Skip to content

Commit f3310eb

Browse files
authored
Reviewing metadata (#1196)
* if metadata is a fixed array, then it can more easily be destructured into class attributes saving file size * avoid using the temporary variable `metadata` since it can be destructured directly * if `updateMetadata` modifies directly `comments` and `loc`, there's no need to destructure twice * since all calls to `getMetadata` had been standardised, it's much cleaner to have it as a constructor of a parent class and `updateMetadata` being a class function * by using rest parameters on `updateMetadata` we don't have to build arrays manually. * reordering the imports * avoiding an extra iteration over all children * using a reverse iterator instead of reversing the array
1 parent 1eca28a commit f3310eb

231 files changed

Lines changed: 1294 additions & 3033 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/slang-nodes/AbicoderPragma.ts

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,20 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
2-
import { getNodeMetadata } from '../slang-utils/metadata.js';
2+
import { SlangNode } from './SlangNode.js';
33
import { Identifier } from './Identifier.js';
44

55
import type * as ast from '@nomicfoundation/slang/ast';
66
import type { AstPath, Doc } from 'prettier';
7-
import type { PrintFunction, SlangNode } from '../types.d.ts';
7+
import type { PrintFunction } from '../types.d.ts';
88

9-
export class AbicoderPragma implements SlangNode {
9+
export class AbicoderPragma extends SlangNode {
1010
readonly kind = NonterminalKind.AbicoderPragma;
1111

12-
comments;
13-
14-
loc;
15-
1612
version: Identifier;
1713

1814
constructor(ast: ast.AbicoderPragma) {
19-
const metadata = getNodeMetadata(ast);
15+
super(ast);
2016

2117
this.version = new Identifier(ast.version);
22-
23-
this.comments = metadata.comments;
24-
this.loc = metadata.loc;
2518
}
2619

2720
print(path: AstPath<AbicoderPragma>, print: PrintFunction): Doc {

src/slang-nodes/AdditiveExpression.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printBinaryOperation } from '../slang-printers/print-binary-operation.js';
33
import { createHugFunction } from '../slang-utils/create-hug-function.js';
44
import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js';
5-
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
5+
import { SlangNode } from './SlangNode.js';
66
import { Expression } from './Expression.js';
77

88
import type * as ast from '@nomicfoundation/slang/ast';
99
import type { AstPath, Doc, ParserOptions } from 'prettier';
1010
import type { AstNode } from './types.d.ts';
11-
import type { PrintFunction, SlangNode } from '../types.d.ts';
11+
import type { PrintFunction } from '../types.d.ts';
1212

1313
const tryToHug = createHugFunction(['%']);
1414

@@ -25,30 +25,23 @@ const printAdditiveExpression = printBinaryOperation(
2525
])
2626
);
2727

28-
export class AdditiveExpression implements SlangNode {
28+
export class AdditiveExpression extends SlangNode {
2929
readonly kind = NonterminalKind.AdditiveExpression;
3030

31-
comments;
32-
33-
loc;
34-
3531
leftOperand: Expression;
3632

3733
operator: string;
3834

3935
rightOperand: Expression;
4036

4137
constructor(ast: ast.AdditiveExpression, options: ParserOptions<AstNode>) {
42-
let metadata = getNodeMetadata(ast);
38+
super(ast);
4339

4440
this.leftOperand = new Expression(ast.leftOperand, options);
4541
this.operator = ast.operator.unparse();
4642
this.rightOperand = new Expression(ast.rightOperand, options);
4743

48-
metadata = updateMetadata(metadata, [this.leftOperand, this.rightOperand]);
49-
50-
this.comments = metadata.comments;
51-
this.loc = metadata.loc;
44+
this.updateMetadata(this.leftOperand, this.rightOperand);
5245

5346
this.leftOperand = tryToHug(this.leftOperand);
5447
this.rightOperand = tryToHug(this.rightOperand);

src/slang-nodes/AddressType.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,19 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
2-
import { getNodeMetadata } from '../slang-utils/metadata.js';
32
import { joinExisting } from '../slang-utils/join-existing.js';
3+
import { SlangNode } from './SlangNode.js';
44

55
import type * as ast from '@nomicfoundation/slang/ast';
66
import type { Doc } from 'prettier';
7-
import type { SlangNode } from '../types.d.ts';
87

9-
export class AddressType implements SlangNode {
8+
export class AddressType extends SlangNode {
109
readonly kind = NonterminalKind.AddressType;
1110

12-
comments;
13-
14-
loc;
15-
1611
payableKeyword?: string;
1712

1813
constructor(ast: ast.AddressType) {
19-
const metadata = getNodeMetadata(ast);
14+
super(ast);
2015

2116
this.payableKeyword = ast.payableKeyword?.unparse();
22-
23-
this.comments = metadata.comments;
24-
this.loc = metadata.loc;
2517
}
2618

2719
print(): Doc {

src/slang-nodes/AndExpression.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,30 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printLogicalOperation } from '../slang-printers/print-logical-operation.js';
3-
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
3+
import { SlangNode } from './SlangNode.js';
44
import { Expression } from './Expression.js';
55

66
import type * as ast from '@nomicfoundation/slang/ast';
77
import type { AstPath, Doc, ParserOptions } from 'prettier';
88
import type { AstNode } from './types.d.ts';
9-
import type { PrintFunction, SlangNode } from '../types.d.ts';
9+
import type { PrintFunction } from '../types.d.ts';
1010

11-
export class AndExpression implements SlangNode {
11+
export class AndExpression extends SlangNode {
1212
readonly kind = NonterminalKind.AndExpression;
1313

14-
comments;
15-
16-
loc;
17-
1814
leftOperand: Expression;
1915

2016
operator: string;
2117

2218
rightOperand: Expression;
2319

2420
constructor(ast: ast.AndExpression, options: ParserOptions<AstNode>) {
25-
let metadata = getNodeMetadata(ast);
21+
super(ast);
2622

2723
this.leftOperand = new Expression(ast.leftOperand, options);
2824
this.operator = ast.operator.unparse();
2925
this.rightOperand = new Expression(ast.rightOperand, options);
3026

31-
metadata = updateMetadata(metadata, [this.leftOperand, this.rightOperand]);
32-
33-
this.comments = metadata.comments;
34-
this.loc = metadata.loc;
27+
this.updateMetadata(this.leftOperand, this.rightOperand);
3528
}
3629

3730
print(

src/slang-nodes/ArgumentsDeclaration.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
2-
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
2+
import { SlangNode } from './SlangNode.js';
33
import { PositionalArgumentsDeclaration } from './PositionalArgumentsDeclaration.js';
44
import { NamedArgumentsDeclaration } from './NamedArgumentsDeclaration.js';
55

66
import type * as ast from '@nomicfoundation/slang/ast';
77
import type { AstPath, Doc, ParserOptions } from 'prettier';
88
import type { AstNode } from './types.d.ts';
9-
import type { PrintFunction, SlangNode } from '../types.d.ts';
9+
import type { PrintFunction } from '../types.d.ts';
1010

11-
export class ArgumentsDeclaration implements SlangNode {
11+
export class ArgumentsDeclaration extends SlangNode {
1212
readonly kind = NonterminalKind.ArgumentsDeclaration;
1313

14-
comments;
15-
16-
loc;
17-
1814
variant: PositionalArgumentsDeclaration | NamedArgumentsDeclaration;
1915

2016
constructor(ast: ast.ArgumentsDeclaration, options: ParserOptions<AstNode>) {
21-
let metadata = getNodeMetadata(ast);
17+
super(ast);
2218

2319
switch (ast.variant.cst.kind) {
2420
case NonterminalKind.PositionalArgumentsDeclaration:
@@ -37,10 +33,7 @@ export class ArgumentsDeclaration implements SlangNode {
3733
throw new Error(`Unexpected variant: ${ast.variant.cst.kind}`);
3834
}
3935

40-
metadata = updateMetadata(metadata, [this.variant]);
41-
42-
this.comments = metadata.comments;
43-
this.loc = metadata.loc;
36+
this.updateMetadata(this.variant);
4437
}
4538

4639
print(path: AstPath<ArgumentsDeclaration>, print: PrintFunction): Doc {

src/slang-nodes/ArrayExpression.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,26 @@
11
import { doc } from 'prettier';
22
import { NonterminalKind } from '@nomicfoundation/slang/cst';
3-
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
3+
import { SlangNode } from './SlangNode.js';
44
import { ArrayValues } from './ArrayValues.js';
55

66
import type * as ast from '@nomicfoundation/slang/ast';
77
import type { AstPath, Doc, ParserOptions } from 'prettier';
88
import type { AstNode } from './types.d.ts';
9-
import type { PrintFunction, SlangNode } from '../types.d.ts';
9+
import type { PrintFunction } from '../types.d.ts';
1010

1111
const { group } = doc.builders;
1212

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

16-
comments;
17-
18-
loc;
19-
2016
items: ArrayValues;
2117

2218
constructor(ast: ast.ArrayExpression, options: ParserOptions<AstNode>) {
23-
let metadata = getNodeMetadata(ast);
19+
super(ast);
2420

2521
this.items = new ArrayValues(ast.items, options);
2622

27-
metadata = updateMetadata(metadata, [this.items]);
28-
29-
this.comments = metadata.comments;
30-
this.loc = metadata.loc;
23+
this.updateMetadata(this.items);
3124
}
3225

3326
print(path: AstPath<ArrayExpression>, print: PrintFunction): Doc {

src/slang-nodes/ArrayTypeName.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,29 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
2-
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
2+
import { SlangNode } from './SlangNode.js';
33
import { TypeName } from './TypeName.js';
44
import { Expression } from './Expression.js';
55

66
import type * as ast from '@nomicfoundation/slang/ast';
77
import type { AstPath, Doc, ParserOptions } from 'prettier';
88
import type { AstNode } from './types.d.ts';
9-
import type { PrintFunction, SlangNode } from '../types.d.ts';
9+
import type { PrintFunction } from '../types.d.ts';
1010

11-
export class ArrayTypeName implements SlangNode {
11+
export class ArrayTypeName extends SlangNode {
1212
readonly kind = NonterminalKind.ArrayTypeName;
1313

14-
comments;
15-
16-
loc;
17-
1814
operand: TypeName;
1915

2016
index?: Expression;
2117

2218
constructor(ast: ast.ArrayTypeName, options: ParserOptions<AstNode>) {
23-
let metadata = getNodeMetadata(ast);
19+
super(ast);
2420

2521
this.operand = new TypeName(ast.operand, options);
2622
if (ast.index) {
2723
this.index = new Expression(ast.index, options);
2824
}
2925

30-
metadata = updateMetadata(metadata, [this.operand, this.index]);
31-
32-
this.comments = metadata.comments;
33-
this.loc = metadata.loc;
26+
this.updateMetadata(this.operand, this.index);
3427
}
3528

3629
print(path: AstPath<ArrayTypeName>, print: PrintFunction): Doc {

src/slang-nodes/ArrayValues.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,24 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printSeparatedList } from '../slang-printers/print-separated-list.js';
3-
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
3+
import { SlangNode } from './SlangNode.js';
44
import { Expression } from './Expression.js';
55

66
import type * as ast from '@nomicfoundation/slang/ast';
77
import type { AstPath, Doc, ParserOptions } from 'prettier';
88
import type { AstNode } from './types.d.ts';
9-
import type { PrintFunction, SlangNode } from '../types.d.ts';
9+
import type { PrintFunction } from '../types.d.ts';
1010

11-
export class ArrayValues implements SlangNode {
11+
export class ArrayValues extends SlangNode {
1212
readonly kind = NonterminalKind.ArrayValues;
1313

14-
comments;
15-
16-
loc;
17-
1814
items: Expression[];
1915

2016
constructor(ast: ast.ArrayValues, options: ParserOptions<AstNode>) {
21-
let metadata = getNodeMetadata(ast, true);
17+
super(ast, true);
2218

2319
this.items = ast.items.map((item) => new Expression(item, options));
2420

25-
metadata = updateMetadata(metadata, [this.items]);
26-
27-
this.comments = metadata.comments;
28-
this.loc = metadata.loc;
21+
this.updateMetadata(this.items);
2922
}
3023

3124
print(path: AstPath<ArrayValues>, print: PrintFunction): Doc {

src/slang-nodes/AssemblyFlags.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,24 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printSeparatedList } from '../slang-printers/print-separated-list.js';
3-
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
3+
import { SlangNode } from './SlangNode.js';
44
import { StringLiteral } from './StringLiteral.js';
55

66
import type * as ast from '@nomicfoundation/slang/ast';
77
import type { AstPath, Doc, ParserOptions } from 'prettier';
88
import type { AstNode } from './types.d.ts';
9-
import type { PrintFunction, SlangNode } from '../types.d.ts';
9+
import type { PrintFunction } from '../types.d.ts';
1010

11-
export class AssemblyFlags implements SlangNode {
11+
export class AssemblyFlags extends SlangNode {
1212
readonly kind = NonterminalKind.AssemblyFlags;
1313

14-
comments;
15-
16-
loc;
17-
1814
items: StringLiteral[];
1915

2016
constructor(ast: ast.AssemblyFlags, options: ParserOptions<AstNode>) {
21-
let metadata = getNodeMetadata(ast, true);
17+
super(ast, true);
2218

2319
this.items = ast.items.map((item) => new StringLiteral(item, options));
2420

25-
metadata = updateMetadata(metadata, [this.items]);
26-
27-
this.comments = metadata.comments;
28-
this.loc = metadata.loc;
21+
this.updateMetadata(this.items);
2922
}
3023

3124
print(path: AstPath<AssemblyFlags>, print: PrintFunction): Doc {

src/slang-nodes/AssemblyFlagsDeclaration.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,26 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
2-
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
2+
import { SlangNode } from './SlangNode.js';
33
import { AssemblyFlags } from './AssemblyFlags.js';
44

55
import type * as ast from '@nomicfoundation/slang/ast';
66
import type { AstPath, Doc, ParserOptions } from 'prettier';
77
import type { AstNode } from './types.d.ts';
8-
import type { PrintFunction, SlangNode } from '../types.d.ts';
8+
import type { PrintFunction } from '../types.d.ts';
99

10-
export class AssemblyFlagsDeclaration implements SlangNode {
10+
export class AssemblyFlagsDeclaration extends SlangNode {
1111
readonly kind = NonterminalKind.AssemblyFlagsDeclaration;
1212

13-
comments;
14-
15-
loc;
16-
1713
flags: AssemblyFlags;
1814

1915
constructor(
2016
ast: ast.AssemblyFlagsDeclaration,
2117
options: ParserOptions<AstNode>
2218
) {
23-
let metadata = getNodeMetadata(ast);
19+
super(ast);
2420

2521
this.flags = new AssemblyFlags(ast.flags, options);
2622

27-
metadata = updateMetadata(metadata, [this.flags]);
28-
29-
this.comments = metadata.comments;
30-
this.loc = metadata.loc;
23+
this.updateMetadata(this.flags);
3124
}
3225

3326
print(path: AstPath<AssemblyFlagsDeclaration>, print: PrintFunction): Doc {

0 commit comments

Comments
 (0)