Skip to content

Commit d360b5f

Browse files
committed
using Map instead
1 parent bac1e0a commit d360b5f

22 files changed

Lines changed: 427 additions & 212 deletions

src/slang-nodes/ArgumentsDeclaration.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,25 @@ import type { ParserOptions } from 'prettier';
88
import type { CollectedMetadata } from '../types.d.ts';
99
import type { AstNode } from './types.d.ts';
1010

11-
const variantConstructors = {
12-
[ast.PositionalArgumentsDeclaration.name]: PositionalArgumentsDeclaration,
13-
[ast.NamedArgumentsDeclaration.name]: NamedArgumentsDeclaration
14-
};
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]])
22+
);
1523

1624
function createNonterminalVariant(
1725
variant: ast.ArgumentsDeclaration['variant'],
1826
collected: CollectedMetadata,
1927
options: ParserOptions<AstNode>
2028
): ArgumentsDeclaration['variant'] {
21-
const variantConstructor = variantConstructors[variant.constructor.name];
29+
const variantConstructor = variantConstructors.get(variant.constructor.name);
2230
if (variantConstructor !== undefined)
2331
return new variantConstructor(variant as never, collected, options);
2432

src/slang-nodes/ContractMember.ts

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,47 @@ import type { ParserOptions } from 'prettier';
1919
import type { CollectedMetadata } from '../types.d.ts';
2020
import type { AstNode } from './types.d.ts';
2121

22-
const variantConstructors = {
23-
[ast.UsingDirective.name]: UsingDirective,
24-
[ast.FunctionDefinition.name]: FunctionDefinition,
25-
[ast.ConstructorDefinition.name]: ConstructorDefinition,
26-
[ast.ReceiveFunctionDefinition.name]: ReceiveFunctionDefinition,
27-
[ast.FallbackFunctionDefinition.name]: FallbackFunctionDefinition,
28-
[ast.UnnamedFunctionDefinition.name]: UnnamedFunctionDefinition,
29-
[ast.ModifierDefinition.name]: ModifierDefinition,
30-
[ast.StructDefinition.name]: StructDefinition,
31-
[ast.EnumDefinition.name]: EnumDefinition,
32-
[ast.EventDefinition.name]: EventDefinition,
33-
[ast.StateVariableDefinition.name]: StateVariableDefinition,
34-
[ast.ErrorDefinition.name]: ErrorDefinition,
35-
[ast.UserDefinedValueTypeDefinition.name]: UserDefinedValueTypeDefinition
36-
};
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]])
55+
);
3756

3857
function createNonterminalVariant(
3958
variant: ast.ContractMember['variant'],
4059
collected: CollectedMetadata,
4160
options: ParserOptions<AstNode>
4261
): ContractMember['variant'] {
43-
const variantConstructor = variantConstructors[variant.constructor.name];
62+
const variantConstructor = variantConstructors.get(variant.constructor.name);
4463
if (variantConstructor !== undefined)
4564
return new variantConstructor(variant as never, collected, options);
4665

src/slang-nodes/ContractSpecifier.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,19 @@ import type { ParserOptions } from 'prettier';
88
import type { CollectedMetadata } from '../types.d.ts';
99
import type { AstNode } from './types.d.ts';
1010

11-
const variantConstructors = {
12-
[ast.InheritanceSpecifier.name]: InheritanceSpecifier,
13-
[ast.StorageLayoutSpecifier.name]: StorageLayoutSpecifier
14-
};
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]])
16+
);
1517

1618
function createNonterminalVariant(
1719
variant: ast.ContractSpecifier['variant'],
1820
collected: CollectedMetadata,
1921
options: ParserOptions<AstNode>
2022
): ContractSpecifier['variant'] {
21-
const variantConstructor = variantConstructors[variant.constructor.name];
23+
const variantConstructor = variantConstructors.get(variant.constructor.name);
2224
if (variantConstructor !== undefined)
2325
return new variantConstructor(variant as never, collected, options);
2426

src/slang-nodes/Expression.ts

Lines changed: 74 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -38,50 +38,90 @@ import type { ParserOptions } from 'prettier';
3838
import type { CollectedMetadata } from '../types.d.ts';
3939
import type { AstNode } from './types.d.ts';
4040

41-
const variantConstructors = {
42-
[ast.AssignmentExpression.name]: AssignmentExpression,
43-
[ast.ConditionalExpression.name]: ConditionalExpression,
44-
[ast.OrExpression.name]: OrExpression,
45-
[ast.AndExpression.name]: AndExpression,
46-
[ast.EqualityExpression.name]: EqualityExpression,
47-
[ast.InequalityExpression.name]: InequalityExpression,
48-
[ast.BitwiseOrExpression.name]: BitwiseOrExpression,
49-
[ast.BitwiseXorExpression.name]: BitwiseXorExpression,
50-
[ast.BitwiseAndExpression.name]: BitwiseAndExpression,
51-
[ast.ShiftExpression.name]: ShiftExpression,
52-
[ast.AdditiveExpression.name]: AdditiveExpression,
53-
[ast.MultiplicativeExpression.name]: MultiplicativeExpression,
54-
[ast.ExponentiationExpression.name]: ExponentiationExpression,
55-
[ast.PostfixExpression.name]: PostfixExpression,
56-
[ast.PrefixExpression.name]: PrefixExpression,
57-
[ast.FunctionCallExpression.name]: FunctionCallExpression,
58-
[ast.CallOptionsExpression.name]: CallOptionsExpression,
59-
[ast.MemberAccessExpression.name]: MemberAccessExpression,
60-
[ast.IndexAccessExpression.name]: IndexAccessExpression,
61-
[ast.NewExpression.name]: NewExpression,
62-
[ast.TupleExpression.name]: TupleExpression,
63-
[ast.TypeExpression.name]: TypeExpression,
64-
[ast.ArrayExpression.name]: ArrayExpression,
65-
[ast.HexNumberExpression.name]: HexNumberExpression,
66-
[ast.DecimalNumberExpression.name]: DecimalNumberExpression
67-
};
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+
];
6895

69-
const variantWithVariantsConstructors = {
70-
[ast.StringExpression.name]: StringExpression,
71-
[ast.ElementaryType.name]: ElementaryType
72-
};
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]
106+
>(
107+
keysWithVariants.map((key, index) => [
108+
key.name,
109+
constructorsWithVariants[index]
110+
])
111+
);
73112

74113
function createNonterminalVariant(
75114
variant: Exclude<ast.Expression['variant'], SlangTerminalNode>,
76115
collected: CollectedMetadata,
77116
options: ParserOptions<AstNode>
78117
): Expression['variant'] {
79-
const variantConstructor = variantConstructors[variant.constructor.name];
118+
const variantConstructor = variantConstructors.get(variant.constructor.name);
80119
if (variantConstructor !== undefined)
81120
return new variantConstructor(variant as never, collected, options);
82121

83-
const variantWithVariantsConstructor =
84-
variantWithVariantsConstructors[variant.constructor.name];
122+
const variantWithVariantsConstructor = variantWithVariantsConstructors.get(
123+
variant.constructor.name
124+
);
85125
if (variantWithVariantsConstructor !== undefined)
86126
return extractVariant(
87127
new variantWithVariantsConstructor(variant as never, collected, options)

src/slang-nodes/FallbackFunctionAttribute.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@ import type { ParserOptions } from 'prettier';
1212
import type { CollectedMetadata } from '../types.d.ts';
1313
import type { AstNode } from './types.d.ts';
1414

15-
const variantConstructors = {
16-
[ast.ModifierInvocation.name]: ModifierInvocation,
17-
[ast.OverrideSpecifier.name]: OverrideSpecifier
18-
};
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]])
20+
);
1921

2022
function createNonterminalVariant(
2123
variant: Exclude<ast.FallbackFunctionAttribute['variant'], SlangTerminalNode>,
2224
collected: CollectedMetadata,
2325
options: ParserOptions<AstNode>
2426
): Exclude<FallbackFunctionAttribute['variant'], TerminalNode> {
25-
const variantConstructor = variantConstructors[variant.constructor.name];
27+
const variantConstructor = variantConstructors.get(variant.constructor.name);
2628
if (variantConstructor !== undefined)
2729
return new variantConstructor(variant as never, collected, options);
2830

src/slang-nodes/ForStatementInitialization.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,20 @@ import type { ParserOptions } from 'prettier';
1313
import type { CollectedMetadata } from '../types.d.ts';
1414
import type { AstNode } from './types.d.ts';
1515

16-
const variantConstructors = {
17-
[ast.ExpressionStatement.name]: ExpressionStatement,
18-
[ast.VariableDeclarationStatement.name]: VariableDeclarationStatement,
19-
[ast.TupleDeconstructionStatement.name]: TupleDeconstructionStatement
20-
};
16+
const keys = [
17+
ast.ExpressionStatement,
18+
ast.VariableDeclarationStatement,
19+
ast.TupleDeconstructionStatement
20+
];
21+
const constructors = [
22+
ExpressionStatement,
23+
VariableDeclarationStatement,
24+
TupleDeconstructionStatement
25+
];
26+
27+
const variantConstructors = new Map<string, (typeof constructors)[number]>(
28+
keys.map((key, index) => [key.name, constructors[index]])
29+
);
2130

2231
function createNonterminalVariant(
2332
variant: Exclude<
@@ -27,7 +36,7 @@ function createNonterminalVariant(
2736
collected: CollectedMetadata,
2837
options: ParserOptions<AstNode>
2938
): Exclude<ForStatementInitialization['variant'], TerminalNode> {
30-
const variantConstructor = variantConstructors[variant.constructor.name];
39+
const variantConstructor = variantConstructors.get(variant.constructor.name);
3140
if (variantConstructor !== undefined)
3241
return new variantConstructor(variant as never, collected, options);
3342

src/slang-nodes/FunctionAttribute.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@ import type { ParserOptions } from 'prettier';
1212
import type { CollectedMetadata } from '../types.d.ts';
1313
import type { AstNode } from './types.d.ts';
1414

15-
const variantConstructors = {
16-
[ast.ModifierInvocation.name]: ModifierInvocation,
17-
[ast.OverrideSpecifier.name]: OverrideSpecifier
18-
};
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]])
20+
);
1921

2022
function createNonterminalVariant(
2123
variant: Exclude<ast.FunctionAttribute['variant'], SlangTerminalNode>,
2224
collected: CollectedMetadata,
2325
options: ParserOptions<AstNode>
2426
): Exclude<FunctionAttribute['variant'], TerminalNode> {
25-
const variantConstructor = variantConstructors[variant.constructor.name];
27+
const variantConstructor = variantConstructors.get(variant.constructor.name);
2628
if (variantConstructor !== undefined)
2729
return new variantConstructor(variant as never, collected, options);
2830

src/slang-nodes/ImportClause.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,19 @@ import type { ParserOptions } from 'prettier';
99
import type { CollectedMetadata } from '../types.d.ts';
1010
import type { AstNode } from './types.d.ts';
1111

12-
const variantConstructors = {
13-
[ast.PathImport.name]: PathImport,
14-
[ast.NamedImport.name]: NamedImport,
15-
[ast.ImportDeconstruction.name]: ImportDeconstruction
16-
};
12+
const keys = [ast.PathImport, ast.NamedImport, ast.ImportDeconstruction];
13+
const constructors = [PathImport, NamedImport, ImportDeconstruction];
14+
15+
const variantConstructors = new Map<string, (typeof constructors)[number]>(
16+
keys.map((key, index) => [key.name, constructors[index]])
17+
);
1718

1819
function createNonterminalVariant(
1920
variant: ast.ImportClause['variant'],
2021
collected: CollectedMetadata,
2122
options: ParserOptions<AstNode>
2223
): ImportClause['variant'] {
23-
const variantConstructor = variantConstructors[variant.constructor.name];
24+
const variantConstructor = variantConstructors.get(variant.constructor.name);
2425
if (variantConstructor !== undefined)
2526
return new variantConstructor(variant as never, collected, options);
2627

0 commit comments

Comments
 (0)