Skip to content

Commit 61bbca4

Browse files
committed
removing ElementaryType from the AST tree
1 parent 61fd835 commit 61bbca4

7 files changed

Lines changed: 26 additions & 18 deletions

File tree

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/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) {

src/slang-nodes/TypeName.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 { ArrayTypeName } from './ArrayTypeName.js';
56
import { FunctionType } from './FunctionType.js';
@@ -24,7 +25,7 @@ function createNonterminalVariant(
2425
return new MappingType(variant, options);
2526
}
2627
if (variant instanceof ast.ElementaryType) {
27-
return new ElementaryType(variant);
28+
return extractVariant(new ElementaryType(variant));
2829
}
2930
if (variant instanceof ast.IdentifierPath) {
3031
return new IdentifierPath(variant);
@@ -40,7 +41,7 @@ export class TypeName extends PolymorphicNode {
4041
| ArrayTypeName
4142
| FunctionType
4243
| MappingType
43-
| ElementaryType
44+
| ElementaryType['variant']
4445
| IdentifierPath;
4546

4647
constructor(ast: ast.TypeName, options: ParserOptions<AstNode>) {

src/slang-nodes/UserDefinedValueTypeDefinition.ts

Lines changed: 4 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 { TerminalNode } from './TerminalNode.js';
55
import { ElementaryType } from './ElementaryType.js';
@@ -13,13 +13,13 @@ export class UserDefinedValueTypeDefinition extends SlangNode {
1313

1414
name: TerminalNode;
1515

16-
valueType: ElementaryType;
16+
valueType: ElementaryType['variant'];
1717

1818
constructor(ast: ast.UserDefinedValueTypeDefinition) {
1919
super(ast);
2020

2121
this.name = new TerminalNode(ast.name);
22-
this.valueType = new ElementaryType(ast.valueType);
22+
this.valueType = extractVariant(new ElementaryType(ast.valueType));
2323

2424
this.updateMetadata(this.valueType);
2525
}
@@ -32,7 +32,7 @@ export class UserDefinedValueTypeDefinition extends SlangNode {
3232
'type ',
3333
path.call(print, 'name'),
3434
' is ',
35-
path.call(printVariant(print), 'valueType'),
35+
path.call(print, 'valueType'),
3636
';'
3737
];
3838
}

src/slangPrinter.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import type { SourceUnitMember } from './slang-nodes/SourceUnitMember.js';
1818
import type { Statement } from './slang-nodes/Statement.js';
1919
import type { YulStatement } from './slang-nodes/YulStatement.js';
2020
import type { ContractSpecifier } from './slang-nodes/ContractSpecifier.js';
21+
import type { ElementaryType } from './slang-nodes/ElementaryType.js';
2122

2223
function hasNodeIgnoreComment({ comments }: StrictAstNode): boolean {
2324
// Prettier sets SourceUnit's comments to undefined after assigning comments
@@ -84,6 +85,7 @@ function genericPrint(
8485
| Statement
8586
| YulStatement
8687
| ContractSpecifier
88+
| ElementaryType
8789
>
8890
>,
8991
options: ParserOptions<AstNode>,

0 commit comments

Comments
 (0)