1+ import * as ast from '@nomicfoundation/slang/ast' ;
12import { NonterminalKind } from '@nomicfoundation/slang/cst' ;
23import { SlangNode } from './SlangNode.js' ;
34import { UsingDirective } from './UsingDirective.js' ;
@@ -14,11 +15,57 @@ import { StateVariableDefinition } from './StateVariableDefinition.js';
1415import { ErrorDefinition } from './ErrorDefinition.js' ;
1516import { UserDefinedValueTypeDefinition } from './UserDefinedValueTypeDefinition.js' ;
1617
17- import type * as ast from '@nomicfoundation/slang/ast' ;
1818import type { AstPath , Doc , ParserOptions } from 'prettier' ;
1919import type { AstNode } from './types.d.ts' ;
2020import type { PrintFunction } from '../types.d.ts' ;
2121
22+ function createNonterminalVariant (
23+ variant : ast . ContractMember [ 'variant' ] ,
24+ options : ParserOptions < AstNode >
25+ ) : ContractMember [ 'variant' ] {
26+ if ( variant instanceof ast . UsingDirective ) {
27+ return new UsingDirective ( variant , options ) ;
28+ }
29+ if ( variant instanceof ast . FunctionDefinition ) {
30+ return new FunctionDefinition ( variant , options ) ;
31+ }
32+ if ( variant instanceof ast . ConstructorDefinition ) {
33+ return new ConstructorDefinition ( variant , options ) ;
34+ }
35+ if ( variant instanceof ast . ReceiveFunctionDefinition ) {
36+ return new ReceiveFunctionDefinition ( variant , options ) ;
37+ }
38+ if ( variant instanceof ast . FallbackFunctionDefinition ) {
39+ return new FallbackFunctionDefinition ( variant , options ) ;
40+ }
41+ if ( variant instanceof ast . UnnamedFunctionDefinition ) {
42+ return new UnnamedFunctionDefinition ( variant , options ) ;
43+ }
44+ if ( variant instanceof ast . ModifierDefinition ) {
45+ return new ModifierDefinition ( variant , options ) ;
46+ }
47+ if ( variant instanceof ast . StructDefinition ) {
48+ return new StructDefinition ( variant , options ) ;
49+ }
50+ if ( variant instanceof ast . EnumDefinition ) {
51+ return new EnumDefinition ( variant ) ;
52+ }
53+ if ( variant instanceof ast . EventDefinition ) {
54+ return new EventDefinition ( variant , options ) ;
55+ }
56+ if ( variant instanceof ast . StateVariableDefinition ) {
57+ return new StateVariableDefinition ( variant , options ) ;
58+ }
59+ if ( variant instanceof ast . ErrorDefinition ) {
60+ return new ErrorDefinition ( variant , options ) ;
61+ }
62+ if ( variant instanceof ast . UserDefinedValueTypeDefinition ) {
63+ return new UserDefinedValueTypeDefinition ( variant ) ;
64+ }
65+ const exhaustiveCheck : never = variant ;
66+ return exhaustiveCheck ;
67+ }
68+
2269export class ContractMember extends SlangNode {
2370 readonly kind = NonterminalKind . ContractMember ;
2471
@@ -40,84 +87,7 @@ export class ContractMember extends SlangNode {
4087 constructor ( ast : ast . ContractMember , options : ParserOptions < AstNode > ) {
4188 super ( ast ) ;
4289
43- switch ( ast . variant . cst . kind ) {
44- case NonterminalKind . UsingDirective :
45- this . variant = new UsingDirective (
46- ast . variant as ast . UsingDirective ,
47- options
48- ) ;
49- break ;
50- case NonterminalKind . FunctionDefinition :
51- this . variant = new FunctionDefinition (
52- ast . variant as ast . FunctionDefinition ,
53- options
54- ) ;
55- break ;
56- case NonterminalKind . ConstructorDefinition :
57- this . variant = new ConstructorDefinition (
58- ast . variant as ast . ConstructorDefinition ,
59- options
60- ) ;
61- break ;
62- case NonterminalKind . ReceiveFunctionDefinition :
63- this . variant = new ReceiveFunctionDefinition (
64- ast . variant as ast . ReceiveFunctionDefinition ,
65- options
66- ) ;
67- break ;
68- case NonterminalKind . FallbackFunctionDefinition :
69- this . variant = new FallbackFunctionDefinition (
70- ast . variant as ast . FallbackFunctionDefinition ,
71- options
72- ) ;
73- break ;
74- case NonterminalKind . UnnamedFunctionDefinition :
75- this . variant = new UnnamedFunctionDefinition (
76- ast . variant as ast . UnnamedFunctionDefinition ,
77- options
78- ) ;
79- break ;
80- case NonterminalKind . ModifierDefinition :
81- this . variant = new ModifierDefinition (
82- ast . variant as ast . ModifierDefinition ,
83- options
84- ) ;
85- break ;
86- case NonterminalKind . StructDefinition :
87- this . variant = new StructDefinition (
88- ast . variant as ast . StructDefinition ,
89- options
90- ) ;
91- break ;
92- case NonterminalKind . EnumDefinition :
93- this . variant = new EnumDefinition ( ast . variant as ast . EnumDefinition ) ;
94- break ;
95- case NonterminalKind . EventDefinition :
96- this . variant = new EventDefinition (
97- ast . variant as ast . EventDefinition ,
98- options
99- ) ;
100- break ;
101- case NonterminalKind . StateVariableDefinition :
102- this . variant = new StateVariableDefinition (
103- ast . variant as ast . StateVariableDefinition ,
104- options
105- ) ;
106- break ;
107- case NonterminalKind . ErrorDefinition :
108- this . variant = new ErrorDefinition (
109- ast . variant as ast . ErrorDefinition ,
110- options
111- ) ;
112- break ;
113- case NonterminalKind . UserDefinedValueTypeDefinition :
114- this . variant = new UserDefinedValueTypeDefinition (
115- ast . variant as ast . UserDefinedValueTypeDefinition
116- ) ;
117- break ;
118- default :
119- throw new Error ( `Unexpected variant: ${ ast . variant . cst . kind } ` ) ;
120- }
90+ this . variant = createNonterminalVariant ( ast . variant , options ) ;
12191
12292 this . updateMetadata ( this . variant ) ;
12393 }
0 commit comments