Skip to content

Commit 4149062

Browse files
authored
removing ContractSpecifier, ElementaryType, and ExperimentalFeature from the AST tree (#1287)
* removing `ContractSpecifier` from the AST tree * removing `ElementaryType` from the AST tree * removing `ExperimentalFeature` from the AST tree
1 parent 9843e1d commit 4149062

15 files changed

+55
-44
lines changed

src/slang-comments/handlers/handle-contract-definition-comments.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export default function handleContractDefinitionComments({
4848
return true;
4949
}
5050
const lastContractSpecifier =
51-
precedingNode.items[precedingNode.items.length - 1].variant;
51+
precedingNode.items[precedingNode.items.length - 1];
5252
// If the last ContractSpecifier's an InheritanceSpecifier, the comment
5353
// is appended to the last InheritanceType.
5454
if (lastContractSpecifier.kind === NonterminalKind.InheritanceSpecifier) {

src/slang-comments/handlers/handle-contract-specifiers-comments.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,13 @@ export default function handleContractSpecifiersComments({
1515
return false;
1616
}
1717

18-
if (
19-
precedingNode &&
20-
precedingNode.kind === NonterminalKind.ContractSpecifier
21-
) {
22-
if (precedingNode.variant.kind === NonterminalKind.InheritanceSpecifier) {
23-
addCollectionLastComment(precedingNode.variant.types, comment);
18+
if (precedingNode) {
19+
if (precedingNode.kind === NonterminalKind.InheritanceSpecifier) {
20+
addCollectionLastComment(precedingNode.types, comment);
2421
return true;
2522
}
26-
if (precedingNode.variant.kind === NonterminalKind.StorageLayoutSpecifier) {
27-
addTrailingComment(precedingNode.variant.expression, comment);
23+
if (precedingNode.kind === NonterminalKind.StorageLayoutSpecifier) {
24+
addTrailingComment(precedingNode.expression, comment);
2825
return true;
2926
}
3027
}

src/slang-nodes/ContractSpecifier.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 { InheritanceSpecifier } from './InheritanceSpecifier.js';
55
import { StorageLayoutSpecifier } from './StorageLayoutSpecifier.js';
66

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

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

2727
variant: InheritanceSpecifier | StorageLayoutSpecifier;

src/slang-nodes/ContractSpecifiers.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { doc } from 'prettier';
33
import { sortContractSpecifiers } from '../slang-utils/sort-contract-specifiers.js';
44
import { printSeparatedList } from '../slang-printers/print-separated-list.js';
5-
import { printVariant } from '../slang-printers/print-variant.js';
5+
import { extractVariant } from '../slang-utils/extract-variant.js';
66
import { SlangNode } from './SlangNode.js';
77
import { ContractSpecifier } from './ContractSpecifier.js';
88

@@ -16,18 +16,20 @@ const { group, ifBreak, line, softline } = doc.builders;
1616
export class ContractSpecifiers extends SlangNode {
1717
readonly kind = NonterminalKind.ContractSpecifiers;
1818

19-
items: ContractSpecifier[];
19+
items: ContractSpecifier['variant'][];
2020

2121
constructor(ast: ast.ContractSpecifiers, options: ParserOptions<AstNode>) {
2222
super(ast, true);
2323

24-
this.items = ast.items.map((item) => new ContractSpecifier(item, options));
24+
this.items = ast.items.map((item) =>
25+
extractVariant(new ContractSpecifier(item, options))
26+
);
2527

2628
this.items.sort(sortContractSpecifiers);
2729
}
2830

2931
print(path: AstPath<ContractSpecifiers>, print: PrintFunction): Doc {
30-
const [specifier1, specifier2] = path.map(printVariant(print), 'items');
32+
const [specifier1, specifier2] = path.map(print, 'items');
3133

3234
if (specifier1 === undefined) return '';
3335

src/slang-nodes/ElementaryType.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ 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 { AddressType } from './AddressType.js';
77
import { TerminalNode } from './TerminalNode.js';
88

99
import type * as ast from '@nomicfoundation/slang/ast';
1010

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

1414
variant: AddressType | TerminalNode;

src/slang-nodes/ExperimentalFeature.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 { StringLiteral } from './StringLiteral.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 ExperimentalFeature extends PolymorphicNode {
13+
export class ExperimentalFeature extends SlangNode {
1414
readonly kind = NonterminalKind.ExperimentalFeature;
1515

1616
variant: StringLiteral | TerminalNode;
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 { ExperimentalFeature } from './ExperimentalFeature.js';
55

@@ -11,17 +11,19 @@ import type { AstNode } from './types.d.ts';
1111
export class ExperimentalPragma extends SlangNode {
1212
readonly kind = NonterminalKind.ExperimentalPragma;
1313

14-
feature: ExperimentalFeature;
14+
feature: ExperimentalFeature['variant'];
1515

1616
constructor(ast: ast.ExperimentalPragma, options: ParserOptions<AstNode>) {
1717
super(ast);
1818

19-
this.feature = new ExperimentalFeature(ast.feature, options);
19+
this.feature = extractVariant(
20+
new ExperimentalFeature(ast.feature, options)
21+
);
2022

2123
this.updateMetadata(this.feature);
2224
}
2325

2426
print(path: AstPath<ExperimentalPragma>, print: PrintFunction): Doc {
25-
return ['experimental ', path.call(printVariant(print), 'feature')];
27+
return ['experimental ', path.call(print, 'feature')];
2628
}
2729
}

src/slang-nodes/Expression.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
NonterminalKind,
44
TerminalNode as SlangTerminalNode
55
} from '@nomicfoundation/slang/cst';
6+
import { extractVariant } from '../slang-utils/extract-variant.js';
67
import { PolymorphicNode } from './PolymorphicNode.js';
78
import { AssignmentExpression } from './AssignmentExpression.js';
89
import { ConditionalExpression } from './ConditionalExpression.js';
@@ -39,7 +40,7 @@ import type { AstNode } from './types.d.ts';
3940
function createNonterminalVariant(
4041
variant: Exclude<ast.Expression['variant'], SlangTerminalNode>,
4142
options: ParserOptions<AstNode>
42-
): Exclude<Expression['variant'], TerminalNode> {
43+
): Expression['variant'] {
4344
if (variant instanceof ast.AssignmentExpression) {
4445
return new AssignmentExpression(variant, options);
4546
}
@@ -119,7 +120,7 @@ function createNonterminalVariant(
119120
return new StringExpression(variant, options);
120121
}
121122
if (variant instanceof ast.ElementaryType) {
122-
return new ElementaryType(variant);
123+
return extractVariant(new ElementaryType(variant));
123124
}
124125
const exhaustiveCheck: never = variant;
125126
return exhaustiveCheck;
@@ -155,7 +156,7 @@ export class Expression extends PolymorphicNode {
155156
| HexNumberExpression
156157
| DecimalNumberExpression
157158
| StringExpression
158-
| ElementaryType
159+
| ElementaryType['variant']
159160
| TerminalNode;
160161

161162
constructor(ast: ast.Expression, options: ParserOptions<AstNode>) {

src/slang-nodes/MappingKeyType.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as ast from '@nomicfoundation/slang/ast';
22
import { NonterminalKind } from '@nomicfoundation/slang/cst';
3+
import { extractVariant } from '../slang-utils/extract-variant.js';
34
import { PolymorphicNode } from './PolymorphicNode.js';
45
import { ElementaryType } from './ElementaryType.js';
56
import { IdentifierPath } from './IdentifierPath.js';
@@ -8,7 +9,7 @@ function createNonterminalVariant(
89
variant: ast.MappingKeyType['variant']
910
): MappingKeyType['variant'] {
1011
if (variant instanceof ast.ElementaryType) {
11-
return new ElementaryType(variant);
12+
return extractVariant(new ElementaryType(variant));
1213
}
1314
if (variant instanceof ast.IdentifierPath) {
1415
return new IdentifierPath(variant);
@@ -20,7 +21,7 @@ function createNonterminalVariant(
2021
export class MappingKeyType extends PolymorphicNode {
2122
readonly kind = NonterminalKind.MappingKeyType;
2223

23-
variant: ElementaryType | IdentifierPath;
24+
variant: ElementaryType['variant'] | IdentifierPath;
2425

2526
constructor(ast: ast.MappingKeyType) {
2627
super(ast);

src/slang-nodes/SlangNode.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {
2+
TerminalNode as SlangTerminalNode,
23
TerminalKind,
3-
TerminalKindExtensions,
4-
TerminalNode
4+
TerminalKindExtensions
55
} from '@nomicfoundation/slang/cst';
66
import { MultiLineComment } from '../slang-nodes/MultiLineComment.js';
77
import { MultiLineNatSpecComment } from '../slang-nodes/MultiLineNatSpecComment.js';
@@ -10,6 +10,7 @@ import { SingleLineNatSpecComment } from '../slang-nodes/SingleLineNatSpecCommen
1010

1111
import type { Comment, StrictAstNode } from '../slang-nodes/types.d.ts';
1212
import type { AstLocation, SlangAstNode } from '../types.d.ts';
13+
import type { TerminalNode } from './TerminalNode.js';
1314

1415
const offsets = new Map<number, number>();
1516
const comments: Comment[] = [];
@@ -42,10 +43,10 @@ export class SlangNode {
4243
loc: AstLocation;
4344

4445
constructor(
45-
ast: SlangAstNode | TerminalNode,
46+
ast: SlangAstNode | SlangTerminalNode,
4647
enclosePeripheralComments = false
4748
) {
48-
if (ast instanceof TerminalNode) {
49+
if (ast instanceof SlangTerminalNode) {
4950
const offset = offsets.get(ast.id) || 0;
5051
this.loc = {
5152
start: offset,
@@ -121,7 +122,9 @@ export class SlangNode {
121122
};
122123
}
123124

124-
updateMetadata(...childNodes: (StrictAstNode | undefined)[]): void {
125+
updateMetadata(
126+
...childNodes: (StrictAstNode | TerminalNode | undefined)[]
127+
): void {
125128
const { loc } = this;
126129
// calculate correct loc object
127130
if (loc.leadingOffset === 0) {

0 commit comments

Comments
 (0)