Skip to content

Commit 2793100

Browse files
committed
adding a factory for the same functionality
1 parent 72dbc72 commit 2793100

23 files changed

Lines changed: 409 additions & 666 deletions

src/slang-nodes/ArgumentsDeclaration.ts

Lines changed: 7 additions & 23 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 { createNonterminalVariantCreator } from '../slang-utils/create-nonterminal-variant-creator.js';
34
import { SlangNode } from './SlangNode.js';
45
import { PositionalArgumentsDeclaration } from './PositionalArgumentsDeclaration.js';
56
import { NamedArgumentsDeclaration } from './NamedArgumentsDeclaration.js';
@@ -8,31 +9,14 @@ import type { ParserOptions } from 'prettier';
89
import type { CollectedMetadata } from '../types.d.ts';
910
import type { AstNode } from './types.d.ts';
1011

11-
const keys = [
12-
ast.PositionalArgumentsDeclaration,
13-
ast.NamedArgumentsDeclaration
14-
];
15-
const constructors = [
16-
PositionalArgumentsDeclaration,
17-
NamedArgumentsDeclaration
18-
];
19-
20-
const variantConstructors = new Map<string, (typeof constructors)[number]>(
21-
keys.map((key, index) => [key.name, constructors[index]])
12+
const createNonterminalVariant = createNonterminalVariantCreator<
13+
ArgumentsDeclaration,
14+
ast.ArgumentsDeclaration
15+
>(
16+
[ast.PositionalArgumentsDeclaration, ast.NamedArgumentsDeclaration],
17+
[PositionalArgumentsDeclaration, NamedArgumentsDeclaration]
2218
);
2319

24-
function createNonterminalVariant(
25-
variant: ast.ArgumentsDeclaration['variant'],
26-
collected: CollectedMetadata,
27-
options: ParserOptions<AstNode>
28-
): ArgumentsDeclaration['variant'] {
29-
const variantConstructor = variantConstructors.get(variant.constructor.name);
30-
if (variantConstructor !== undefined)
31-
return new variantConstructor(variant as never, collected, options);
32-
33-
throw new Error(`Unexpected variant: ${JSON.stringify(variant)}`);
34-
}
35-
3620
export class ArgumentsDeclaration extends SlangNode {
3721
readonly kind = NonterminalKind.ArgumentsDeclaration;
3822

src/slang-nodes/ContractMember.ts

Lines changed: 35 additions & 45 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 { createNonterminalVariantCreator } from '../slang-utils/create-nonterminal-variant-creator.js';
34
import { SlangNode } from './SlangNode.js';
45
import { UsingDirective } from './UsingDirective.js';
56
import { FunctionDefinition } from './FunctionDefinition.js';
@@ -19,53 +20,42 @@ import type { ParserOptions } from 'prettier';
1920
import type { CollectedMetadata } from '../types.d.ts';
2021
import type { AstNode } from './types.d.ts';
2122

22-
const keys = [
23-
ast.UsingDirective,
24-
ast.FunctionDefinition,
25-
ast.ConstructorDefinition,
26-
ast.ReceiveFunctionDefinition,
27-
ast.FallbackFunctionDefinition,
28-
ast.UnnamedFunctionDefinition,
29-
ast.ModifierDefinition,
30-
ast.StructDefinition,
31-
ast.EnumDefinition,
32-
ast.EventDefinition,
33-
ast.StateVariableDefinition,
34-
ast.ErrorDefinition,
35-
ast.UserDefinedValueTypeDefinition
36-
];
37-
const constructors = [
38-
UsingDirective,
39-
FunctionDefinition,
40-
ConstructorDefinition,
41-
ReceiveFunctionDefinition,
42-
FallbackFunctionDefinition,
43-
UnnamedFunctionDefinition,
44-
ModifierDefinition,
45-
StructDefinition,
46-
EnumDefinition,
47-
EventDefinition,
48-
StateVariableDefinition,
49-
ErrorDefinition,
50-
UserDefinedValueTypeDefinition
51-
];
52-
53-
const variantConstructors = new Map<string, (typeof constructors)[number]>(
54-
keys.map((key, index) => [key.name, constructors[index]])
23+
const createNonterminalVariant = createNonterminalVariantCreator<
24+
ContractMember,
25+
ast.ContractMember
26+
>(
27+
[
28+
ast.UsingDirective,
29+
ast.FunctionDefinition,
30+
ast.ConstructorDefinition,
31+
ast.ReceiveFunctionDefinition,
32+
ast.FallbackFunctionDefinition,
33+
ast.UnnamedFunctionDefinition,
34+
ast.ModifierDefinition,
35+
ast.StructDefinition,
36+
ast.EnumDefinition,
37+
ast.EventDefinition,
38+
ast.StateVariableDefinition,
39+
ast.ErrorDefinition,
40+
ast.UserDefinedValueTypeDefinition
41+
],
42+
[
43+
UsingDirective,
44+
FunctionDefinition,
45+
ConstructorDefinition,
46+
ReceiveFunctionDefinition,
47+
FallbackFunctionDefinition,
48+
UnnamedFunctionDefinition,
49+
ModifierDefinition,
50+
StructDefinition,
51+
EnumDefinition,
52+
EventDefinition,
53+
StateVariableDefinition,
54+
ErrorDefinition,
55+
UserDefinedValueTypeDefinition
56+
]
5557
);
5658

57-
function createNonterminalVariant(
58-
variant: ast.ContractMember['variant'],
59-
collected: CollectedMetadata,
60-
options: ParserOptions<AstNode>
61-
): ContractMember['variant'] {
62-
const variantConstructor = variantConstructors.get(variant.constructor.name);
63-
if (variantConstructor !== undefined)
64-
return new variantConstructor(variant as never, collected, options);
65-
66-
throw new Error(`Unexpected variant: ${JSON.stringify(variant)}`);
67-
}
68-
6959
export class ContractMember extends SlangNode {
7060
readonly kind = NonterminalKind.ContractMember;
7161

src/slang-nodes/ContractSpecifier.ts

Lines changed: 7 additions & 17 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 { createNonterminalVariantCreator } from '../slang-utils/create-nonterminal-variant-creator.js';
34
import { SlangNode } from './SlangNode.js';
45
import { InheritanceSpecifier } from './InheritanceSpecifier.js';
56
import { StorageLayoutSpecifier } from './StorageLayoutSpecifier.js';
@@ -8,25 +9,14 @@ import type { ParserOptions } from 'prettier';
89
import type { CollectedMetadata } from '../types.d.ts';
910
import type { AstNode } from './types.d.ts';
1011

11-
const keys = [ast.InheritanceSpecifier, ast.StorageLayoutSpecifier];
12-
const constructors = [InheritanceSpecifier, StorageLayoutSpecifier];
13-
14-
const variantConstructors = new Map<string, (typeof constructors)[number]>(
15-
keys.map((key, index) => [key.name, constructors[index]])
12+
const createNonterminalVariant = createNonterminalVariantCreator<
13+
ContractSpecifier,
14+
ast.ContractSpecifier
15+
>(
16+
[ast.InheritanceSpecifier, ast.StorageLayoutSpecifier],
17+
[InheritanceSpecifier, StorageLayoutSpecifier]
1618
);
1719

18-
function createNonterminalVariant(
19-
variant: ast.ContractSpecifier['variant'],
20-
collected: CollectedMetadata,
21-
options: ParserOptions<AstNode>
22-
): ContractSpecifier['variant'] {
23-
const variantConstructor = variantConstructors.get(variant.constructor.name);
24-
if (variantConstructor !== undefined)
25-
return new variantConstructor(variant as never, collected, options);
26-
27-
throw new Error(`Unexpected variant: ${JSON.stringify(variant)}`);
28-
}
29-
3020
export class ContractSpecifier extends SlangNode {
3121
readonly kind = NonterminalKind.ContractSpecifier;
3222

src/slang-nodes/Expression.ts

Lines changed: 60 additions & 90 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 { extractVariant } from '../slang-utils/extract-variant.js';
6+
import { createNonterminalVariantCreator } from '../slang-utils/create-nonterminal-variant-creator.js';
77
import { SlangNode } from './SlangNode.js';
88
import { AssignmentExpression } from './AssignmentExpression.js';
99
import { ConditionalExpression } from './ConditionalExpression.js';
@@ -38,98 +38,68 @@ import type { ParserOptions } from 'prettier';
3838
import type { CollectedMetadata } from '../types.d.ts';
3939
import type { AstNode } from './types.d.ts';
4040

41-
const keys = [
42-
ast.AssignmentExpression,
43-
ast.ConditionalExpression,
44-
ast.OrExpression,
45-
ast.AndExpression,
46-
ast.EqualityExpression,
47-
ast.InequalityExpression,
48-
ast.BitwiseOrExpression,
49-
ast.BitwiseXorExpression,
50-
ast.BitwiseAndExpression,
51-
ast.ShiftExpression,
52-
ast.AdditiveExpression,
53-
ast.MultiplicativeExpression,
54-
ast.ExponentiationExpression,
55-
ast.PostfixExpression,
56-
ast.PrefixExpression,
57-
ast.FunctionCallExpression,
58-
ast.CallOptionsExpression,
59-
ast.MemberAccessExpression,
60-
ast.IndexAccessExpression,
61-
ast.NewExpression,
62-
ast.TupleExpression,
63-
ast.TypeExpression,
64-
ast.ArrayExpression,
65-
ast.HexNumberExpression,
66-
ast.DecimalNumberExpression
67-
];
68-
const constructors = [
69-
AssignmentExpression,
70-
ConditionalExpression,
71-
OrExpression,
72-
AndExpression,
73-
EqualityExpression,
74-
InequalityExpression,
75-
BitwiseOrExpression,
76-
BitwiseXorExpression,
77-
BitwiseAndExpression,
78-
ShiftExpression,
79-
AdditiveExpression,
80-
MultiplicativeExpression,
81-
ExponentiationExpression,
82-
PostfixExpression,
83-
PrefixExpression,
84-
FunctionCallExpression,
85-
CallOptionsExpression,
86-
MemberAccessExpression,
87-
IndexAccessExpression,
88-
NewExpression,
89-
TupleExpression,
90-
TypeExpression,
91-
ArrayExpression,
92-
HexNumberExpression,
93-
DecimalNumberExpression
94-
];
95-
96-
const variantConstructors = new Map<string, (typeof constructors)[number]>(
97-
keys.map((key, index) => [key.name, constructors[index]])
98-
);
99-
100-
const keysWithVariants = [ast.StringExpression, ast.ElementaryType];
101-
const constructorsWithVariants = [StringExpression, ElementaryType];
102-
103-
const variantWithVariantsConstructors = new Map<
104-
string,
105-
(typeof constructorsWithVariants)[number]
41+
const createNonterminalVariant = createNonterminalVariantCreator<
42+
Expression,
43+
ast.Expression
10644
>(
107-
keysWithVariants.map((key, index) => [
108-
key.name,
109-
constructorsWithVariants[index]
110-
])
45+
[
46+
ast.AssignmentExpression,
47+
ast.ConditionalExpression,
48+
ast.OrExpression,
49+
ast.AndExpression,
50+
ast.EqualityExpression,
51+
ast.InequalityExpression,
52+
ast.BitwiseOrExpression,
53+
ast.BitwiseXorExpression,
54+
ast.BitwiseAndExpression,
55+
ast.ShiftExpression,
56+
ast.AdditiveExpression,
57+
ast.MultiplicativeExpression,
58+
ast.ExponentiationExpression,
59+
ast.PostfixExpression,
60+
ast.PrefixExpression,
61+
ast.FunctionCallExpression,
62+
ast.CallOptionsExpression,
63+
ast.MemberAccessExpression,
64+
ast.IndexAccessExpression,
65+
ast.NewExpression,
66+
ast.TupleExpression,
67+
ast.TypeExpression,
68+
ast.ArrayExpression,
69+
ast.HexNumberExpression,
70+
ast.DecimalNumberExpression
71+
],
72+
[
73+
AssignmentExpression,
74+
ConditionalExpression,
75+
OrExpression,
76+
AndExpression,
77+
EqualityExpression,
78+
InequalityExpression,
79+
BitwiseOrExpression,
80+
BitwiseXorExpression,
81+
BitwiseAndExpression,
82+
ShiftExpression,
83+
AdditiveExpression,
84+
MultiplicativeExpression,
85+
ExponentiationExpression,
86+
PostfixExpression,
87+
PrefixExpression,
88+
FunctionCallExpression,
89+
CallOptionsExpression,
90+
MemberAccessExpression,
91+
IndexAccessExpression,
92+
NewExpression,
93+
TupleExpression,
94+
TypeExpression,
95+
ArrayExpression,
96+
HexNumberExpression,
97+
DecimalNumberExpression
98+
],
99+
[ast.StringExpression, ast.ElementaryType],
100+
[StringExpression, ElementaryType]
111101
);
112102

113-
function createNonterminalVariant(
114-
variant: Exclude<ast.Expression['variant'], SlangTerminalNode>,
115-
collected: CollectedMetadata,
116-
options: ParserOptions<AstNode>
117-
): Expression['variant'] {
118-
const variantConstructor = variantConstructors.get(variant.constructor.name);
119-
if (variantConstructor !== undefined)
120-
return new variantConstructor(variant as never, collected, options);
121-
122-
const variantWithVariantsConstructor = variantWithVariantsConstructors.get(
123-
variant.constructor.name
124-
);
125-
if (variantWithVariantsConstructor !== undefined)
126-
return extractVariant(
127-
new variantWithVariantsConstructor(variant as never, collected, options)
128-
);
129-
130-
throw new Error(`Unexpected variant: ${JSON.stringify(variant)}`);
131-
}
132-
133103
export class Expression extends SlangNode {
134104
readonly kind = NonterminalKind.Expression;
135105

src/slang-nodes/FallbackFunctionAttribute.ts

Lines changed: 7 additions & 17 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 { createNonterminalVariantCreator } from '../slang-utils/create-nonterminal-variant-creator.js';
67
import { SlangNode } from './SlangNode.js';
78
import { ModifierInvocation } from './ModifierInvocation.js';
89
import { OverrideSpecifier } from './OverrideSpecifier.js';
@@ -12,25 +13,14 @@ import type { ParserOptions } from 'prettier';
1213
import type { CollectedMetadata } from '../types.d.ts';
1314
import type { AstNode } from './types.d.ts';
1415

15-
const keys = [ast.ModifierInvocation, ast.OverrideSpecifier];
16-
const constructors = [ModifierInvocation, OverrideSpecifier];
17-
18-
const variantConstructors = new Map<string, (typeof constructors)[number]>(
19-
keys.map((key, index) => [key.name, constructors[index]])
16+
const createNonterminalVariant = createNonterminalVariantCreator<
17+
FallbackFunctionAttribute,
18+
ast.FallbackFunctionAttribute
19+
>(
20+
[ast.ModifierInvocation, ast.OverrideSpecifier],
21+
[ModifierInvocation, OverrideSpecifier]
2022
);
2123

22-
function createNonterminalVariant(
23-
variant: Exclude<ast.FallbackFunctionAttribute['variant'], SlangTerminalNode>,
24-
collected: CollectedMetadata,
25-
options: ParserOptions<AstNode>
26-
): Exclude<FallbackFunctionAttribute['variant'], TerminalNode> {
27-
const variantConstructor = variantConstructors.get(variant.constructor.name);
28-
if (variantConstructor !== undefined)
29-
return new variantConstructor(variant as never, collected, options);
30-
31-
throw new Error(`Unexpected variant: ${JSON.stringify(variant)}`);
32-
}
33-
3424
export class FallbackFunctionAttribute extends SlangNode {
3525
readonly kind = NonterminalKind.FallbackFunctionAttribute;
3626

0 commit comments

Comments
 (0)