Skip to content

Commit dcde135

Browse files
authored
Polymorphic nodes (#1229)
* getting rid of all print functions of classes that only print a variant * Creating a hub class for PolymorphicNodes with a non-string variant so we can prepare to override the storing of comments * PolymorphicNode now has a `print` function so there's no need for printing variant logic in `genericPrint` * fixing extension
1 parent 75c8479 commit dcde135

42 files changed

Lines changed: 125 additions & 307 deletions

Some content is hidden

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

src/slang-comments/handlers/handle-source-unit-members-comments.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import addCollectionFirstComment from './add-collection-first-comment.js';
33
import addCollectionLastComment from './add-collection-last-comment.js';
44

5-
import type { HandlerParams } from './types.js';
5+
import type { HandlerParams } from './types.d.ts';
66

77
export default function handleSourceUnitMembersComments({
88
precedingNode,

src/slang-nodes/ArgumentsDeclaration.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import * as ast from '@nomicfoundation/slang/ast';
22
import { NonterminalKind } from '@nomicfoundation/slang/cst';
3-
import { SlangNode } from './SlangNode.js';
3+
import { PolymorphicNode } from './PolymorphicNode.js';
44
import { PositionalArgumentsDeclaration } from './PositionalArgumentsDeclaration.js';
55
import { NamedArgumentsDeclaration } from './NamedArgumentsDeclaration.js';
66

7-
import type { AstPath, Doc, ParserOptions } from 'prettier';
7+
import type { ParserOptions } from 'prettier';
88
import type { AstNode } from './types.d.ts';
9-
import type { PrintFunction } from '../types.d.ts';
109

1110
function createNonterminalVariant(
1211
variant: ast.ArgumentsDeclaration['variant'],
@@ -22,7 +21,7 @@ function createNonterminalVariant(
2221
return exhaustiveCheck;
2322
}
2423

25-
export class ArgumentsDeclaration extends SlangNode {
24+
export class ArgumentsDeclaration extends PolymorphicNode {
2625
readonly kind = NonterminalKind.ArgumentsDeclaration;
2726

2827
variant: PositionalArgumentsDeclaration | NamedArgumentsDeclaration;
@@ -34,8 +33,4 @@ export class ArgumentsDeclaration extends SlangNode {
3433

3534
this.updateMetadata(this.variant);
3635
}
37-
38-
print(path: AstPath<ArgumentsDeclaration>, print: PrintFunction): Doc {
39-
return path.call(print, 'variant');
40-
}
4136
}

src/slang-nodes/ConstructorAttribute.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@ import {
22
NonterminalKind,
33
TerminalNode as SlangTerminalNode
44
} from '@nomicfoundation/slang/cst';
5-
import { SlangNode } from './SlangNode.js';
5+
import { PolymorphicNode } from './PolymorphicNode.js';
66
import { ModifierInvocation } from './ModifierInvocation.js';
77
import { TerminalNode } from './TerminalNode.js';
88

99
import type * as ast from '@nomicfoundation/slang/ast';
10-
import type { AstPath, Doc, ParserOptions } from 'prettier';
10+
import type { ParserOptions } from 'prettier';
1111
import type { AstNode } from './types.d.ts';
12-
import type { PrintFunction } from '../types.d.ts';
1312

14-
export class ConstructorAttribute extends SlangNode {
13+
export class ConstructorAttribute extends PolymorphicNode {
1514
readonly kind = NonterminalKind.ConstructorAttribute;
1615

1716
variant: ModifierInvocation | TerminalNode;
@@ -28,8 +27,4 @@ export class ConstructorAttribute extends SlangNode {
2827

2928
this.updateMetadata(this.variant);
3029
}
31-
32-
print(path: AstPath<ConstructorAttribute>, print: PrintFunction): Doc {
33-
return path.call(print, 'variant');
34-
}
3530
}

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: member } of this.members.items) {
44+
for (const { variant } of this.members.items) {
4545
if (
46-
member.kind === NonterminalKind.FunctionDefinition &&
47-
member.name.variant.value !== this.name.value
46+
variant.kind === NonterminalKind.FunctionDefinition &&
47+
variant.name.variant.value !== this.name.value
4848
) {
49-
member.cleanModifierInvocationArguments();
49+
variant.cleanModifierInvocationArguments();
5050
}
5151
}
5252
}

src/slang-nodes/ContractMember.ts

Lines changed: 3 additions & 8 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 { SlangNode } from './SlangNode.js';
3+
import { PolymorphicNode } from './PolymorphicNode.js';
44
import { UsingDirective } from './UsingDirective.js';
55
import { FunctionDefinition } from './FunctionDefinition.js';
66
import { ConstructorDefinition } from './ConstructorDefinition.js';
@@ -15,9 +15,8 @@ import { StateVariableDefinition } from './StateVariableDefinition.js';
1515
import { ErrorDefinition } from './ErrorDefinition.js';
1616
import { UserDefinedValueTypeDefinition } from './UserDefinedValueTypeDefinition.js';
1717

18-
import type { AstPath, Doc, ParserOptions } from 'prettier';
18+
import type { ParserOptions } from 'prettier';
1919
import type { AstNode } from './types.d.ts';
20-
import type { PrintFunction } from '../types.d.ts';
2120

2221
function createNonterminalVariant(
2322
variant: ast.ContractMember['variant'],
@@ -66,7 +65,7 @@ function createNonterminalVariant(
6665
return exhaustiveCheck;
6766
}
6867

69-
export class ContractMember extends SlangNode {
68+
export class ContractMember extends PolymorphicNode {
7069
readonly kind = NonterminalKind.ContractMember;
7170

7271
variant:
@@ -91,8 +90,4 @@ export class ContractMember extends SlangNode {
9190

9291
this.updateMetadata(this.variant);
9392
}
94-
95-
print(path: AstPath<ContractMember>, print: PrintFunction): Doc {
96-
return path.call(print, 'variant');
97-
}
9893
}

src/slang-nodes/ContractSpecifier.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import * as ast from '@nomicfoundation/slang/ast';
22
import { NonterminalKind } from '@nomicfoundation/slang/cst';
3-
import { SlangNode } from './SlangNode.js';
3+
import { PolymorphicNode } from './PolymorphicNode.js';
44
import { InheritanceSpecifier } from './InheritanceSpecifier.js';
55
import { StorageLayoutSpecifier } from './StorageLayoutSpecifier.js';
66

7-
import type { AstPath, Doc, ParserOptions } from 'prettier';
7+
import type { ParserOptions } from 'prettier';
88
import type { AstNode } from './types.d.ts';
9-
import type { PrintFunction } from '../types.d.ts';
109

1110
function createNonterminalVariant(
1211
variant: ast.ContractSpecifier['variant'],
@@ -22,7 +21,7 @@ function createNonterminalVariant(
2221
return exhaustiveCheck;
2322
}
2423

25-
export class ContractSpecifier extends SlangNode {
24+
export class ContractSpecifier extends PolymorphicNode {
2625
readonly kind = NonterminalKind.ContractSpecifier;
2726

2827
variant: InheritanceSpecifier | StorageLayoutSpecifier;
@@ -34,8 +33,4 @@ export class ContractSpecifier extends SlangNode {
3433

3534
this.updateMetadata(this.variant);
3635
}
37-
38-
print(path: AstPath<ContractSpecifier>, print: PrintFunction): Doc {
39-
return path.call(print, 'variant');
40-
}
4136
}

src/slang-nodes/ElementaryType.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@ import {
22
NonterminalKind,
33
TerminalNode as SlangTerminalNode
44
} from '@nomicfoundation/slang/cst';
5-
import { SlangNode } from './SlangNode.js';
5+
import { PolymorphicNode } from './PolymorphicNode.js';
66
import { AddressType } from './AddressType.js';
77
import { TerminalNode } from './TerminalNode.js';
88

99
import type * as ast from '@nomicfoundation/slang/ast';
10-
import type { AstPath, Doc } from 'prettier';
11-
import type { PrintFunction } from '../types.d.ts';
1210

13-
export class ElementaryType extends SlangNode {
11+
export class ElementaryType extends PolymorphicNode {
1412
readonly kind = NonterminalKind.ElementaryType;
1513

1614
variant: AddressType | TerminalNode;
@@ -27,8 +25,4 @@ export class ElementaryType extends SlangNode {
2725

2826
this.updateMetadata(this.variant);
2927
}
30-
31-
print(path: AstPath<ElementaryType>, print: PrintFunction): Doc {
32-
return path.call(print, 'variant');
33-
}
3428
}

src/slang-nodes/ExperimentalFeature.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@ import {
22
NonterminalKind,
33
TerminalNode as SlangTerminalNode
44
} from '@nomicfoundation/slang/cst';
5-
import { SlangNode } from './SlangNode.js';
5+
import { PolymorphicNode } from './PolymorphicNode.js';
66
import { StringLiteral } from './StringLiteral.js';
77
import { TerminalNode } from './TerminalNode.js';
88

99
import type * as ast from '@nomicfoundation/slang/ast';
10-
import type { AstPath, Doc, ParserOptions } from 'prettier';
10+
import type { ParserOptions } from 'prettier';
1111
import type { AstNode } from './types.d.ts';
12-
import type { PrintFunction } from '../types.d.ts';
1312

14-
export class ExperimentalFeature extends SlangNode {
13+
export class ExperimentalFeature extends PolymorphicNode {
1514
readonly kind = NonterminalKind.ExperimentalFeature;
1615

1716
variant: StringLiteral | TerminalNode;
@@ -28,8 +27,4 @@ export class ExperimentalFeature extends SlangNode {
2827

2928
this.updateMetadata(this.variant);
3029
}
31-
32-
print(path: AstPath<ExperimentalFeature>, print: PrintFunction): Doc {
33-
return path.call(print, 'variant');
34-
}
3530
}

src/slang-nodes/Expression.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
NonterminalKind,
44
TerminalNode as SlangTerminalNode
55
} from '@nomicfoundation/slang/cst';
6-
import { SlangNode } from './SlangNode.js';
6+
import { PolymorphicNode } from './PolymorphicNode.js';
77
import { AssignmentExpression } from './AssignmentExpression.js';
88
import { ConditionalExpression } from './ConditionalExpression.js';
99
import { OrExpression } from './OrExpression.js';
@@ -33,9 +33,8 @@ import { StringExpression } from './StringExpression.js';
3333
import { ElementaryType } from './ElementaryType.js';
3434
import { TerminalNode } from './TerminalNode.js';
3535

36-
import type { AstPath, Doc, ParserOptions } from 'prettier';
36+
import type { ParserOptions } from 'prettier';
3737
import type { AstNode } from './types.d.ts';
38-
import type { PrintFunction } from '../types.d.ts';
3938

4039
function createNonterminalVariant(
4140
variant: Exclude<ast.Expression['variant'], SlangTerminalNode>,
@@ -126,7 +125,7 @@ function createNonterminalVariant(
126125
return exhaustiveCheck;
127126
}
128127

129-
export class Expression extends SlangNode {
128+
export class Expression extends PolymorphicNode {
130129
readonly kind = NonterminalKind.Expression;
131130

132131
variant:
@@ -171,8 +170,4 @@ export class Expression extends SlangNode {
171170

172171
this.updateMetadata(this.variant);
173172
}
174-
175-
print(path: AstPath<Expression>, print: PrintFunction): Doc {
176-
return path.call(print, 'variant');
177-
}
178173
}

src/slang-nodes/FallbackFunctionAttribute.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@ import {
33
NonterminalKind,
44
TerminalNode as SlangTerminalNode
55
} from '@nomicfoundation/slang/cst';
6-
import { SlangNode } from './SlangNode.js';
6+
import { PolymorphicNode } from './PolymorphicNode.js';
77
import { ModifierInvocation } from './ModifierInvocation.js';
88
import { OverrideSpecifier } from './OverrideSpecifier.js';
99
import { TerminalNode } from './TerminalNode.js';
1010

11-
import type { AstPath, Doc, ParserOptions } from 'prettier';
11+
import type { ParserOptions } from 'prettier';
1212
import type { AstNode } from './types.d.ts';
13-
import type { PrintFunction } from '../types.d.ts';
1413

1514
function createNonterminalVariant(
1615
variant: Exclude<ast.FallbackFunctionAttribute['variant'], SlangTerminalNode>,
@@ -26,7 +25,7 @@ function createNonterminalVariant(
2625
return exhaustiveCheck;
2726
}
2827

29-
export class FallbackFunctionAttribute extends SlangNode {
28+
export class FallbackFunctionAttribute extends PolymorphicNode {
3029
readonly kind = NonterminalKind.FallbackFunctionAttribute;
3130

3231
variant: ModifierInvocation | OverrideSpecifier | TerminalNode;
@@ -46,8 +45,4 @@ export class FallbackFunctionAttribute extends SlangNode {
4645

4746
this.updateMetadata(this.variant);
4847
}
49-
50-
print(path: AstPath<FallbackFunctionAttribute>, print: PrintFunction): Doc {
51-
return path.call(print, 'variant');
52-
}
5348
}

0 commit comments

Comments
 (0)