@@ -7,6 +7,12 @@ import 'package:artemis/generator/helpers.dart';
77import 'package:artemis/generator/graphql_helpers.dart' as gql;
88import 'package:gql/ast.dart' ;
99
10+ /// class definition lazy generator
11+ typedef ClassDefinitionGenerator = ClassDefinition Function ();
12+
13+ /// class definition lazy generator
14+ typedef EnumDefinitionGenerator = EnumDefinition Function ();
15+
1016/// Visits canonical types Enums and InputObjects
1117class CanonicalVisitor extends RecursiveVisitor {
1218 /// Constructor
@@ -18,72 +24,76 @@ class CanonicalVisitor extends RecursiveVisitor {
1824 final Context context;
1925
2026 /// List of visited input objects
21- final List < ClassDefinition > inputObjects = [] ;
27+ final Map < String , ClassDefinitionGenerator > inputObjects = {} ;
2228
2329 /// List of visited enums
24- final List < EnumDefinition > enums = [] ;
30+ final Map < String , EnumDefinitionGenerator > enums = {} ;
2531
2632 @override
2733 void visitEnumTypeDefinitionNode (EnumTypeDefinitionNode node) {
28- final enumName = EnumName (name: node.name.value);
34+ enums[node.name.value] = () {
35+ final enumName = EnumName (name: node.name.value);
2936
30- final nextContext = context.sameTypeWithNoPath (
31- alias: enumName,
32- ofUnion: Nullable <TypeDefinitionNode ?>(null ),
33- );
37+ final nextContext = context.sameTypeWithNoPath (
38+ alias: enumName,
39+ ofUnion: Nullable <TypeDefinitionNode ?>(null ),
40+ );
3441
35- logFn (context, nextContext.align, '-> Enum' );
36- logFn (context, nextContext.align,
37- '<- Generated enum ${enumName .namePrintable }.' );
42+ logFn (context, nextContext.align, '-> Enum' );
43+ logFn (context, nextContext.align,
44+ '<- Generated enum ${enumName .namePrintable }.' );
3845
39- enums.add (EnumDefinition (
40- name: enumName,
41- values: node.values
42- .map ((ev) => EnumValueDefinition (
43- name: EnumValueName (name: ev.name.value),
44- annotations: proceedDeprecated (ev.directives),
45- ))
46- .toList ()
47- ..add (ARTEMIS_UNKNOWN ),
48- ));
46+ return EnumDefinition (
47+ name: enumName,
48+ values: node.values
49+ .map ((ev) => EnumValueDefinition (
50+ name: EnumValueName (name: ev.name.value),
51+ annotations: proceedDeprecated (ev.directives),
52+ ))
53+ .toList ()
54+ ..add (ARTEMIS_UNKNOWN ),
55+ );
56+ };
4957 }
5058
5159 @override
5260 void visitInputObjectTypeDefinitionNode (InputObjectTypeDefinitionNode node) {
53- final name = ClassName (name: node.name.value);
54- final nextContext = context.sameTypeWithNoPath (
55- alias: name,
56- ofUnion: Nullable <TypeDefinitionNode ?>(null ),
57- );
61+ inputObjects[node.name.value] = () {
62+ final name = ClassName (name: node.name.value);
63+ final nextContext = context.sameTypeWithNoPath (
64+ alias: name,
65+ ofUnion: Nullable <TypeDefinitionNode ?>(null ),
66+ );
5867
59- logFn (context, nextContext.align, '-> Input class' );
60- logFn (context, nextContext.align,
61- '┌ ${nextContext .path }[${node .name .value }]' );
62- final properties = < ClassProperty > [];
68+ logFn (context, nextContext.align, '-> Input class' );
69+ logFn (context, nextContext.align,
70+ '┌ ${nextContext .path }[${node .name .value }]' );
71+ final properties = < ClassProperty > [];
6372
64- properties.addAll (node.fields.map ((i) {
65- final nextType = gql.getTypeByName (nextContext.schema, i.type);
66- return createClassProperty (
67- fieldName: ClassPropertyName (name: i.name.value),
68- context: nextContext.nextTypeWithNoPath (
69- nextType: node,
70- nextClassName: ClassName (name: nextType.name.value),
71- nextFieldName: ClassName (name: i.name.value),
72- ofUnion: Nullable <TypeDefinitionNode ?>(null ),
73- ),
74- markAsUsed: false ,
75- );
76- }));
73+ properties.addAll (node.fields.map ((i) {
74+ final nextType = gql.getTypeByName (nextContext.schema, i.type);
75+ return createClassProperty (
76+ fieldName: ClassPropertyName (name: i.name.value),
77+ context: nextContext.nextTypeWithNoPath (
78+ nextType: node,
79+ nextClassName: ClassName (name: nextType.name.value),
80+ nextFieldName: ClassName (name: i.name.value),
81+ ofUnion: Nullable <TypeDefinitionNode ?>(null ),
82+ ),
83+ markAsUsed: false ,
84+ );
85+ }));
7786
78- logFn (context, nextContext.align,
79- '└ ${nextContext .path }[${node .name .value }]' );
80- logFn (context, nextContext.align,
81- '<- Generated input class ${name .namePrintable }.' );
87+ logFn (context, nextContext.align,
88+ '└ ${nextContext .path }[${node .name .value }]' );
89+ logFn (context, nextContext.align,
90+ '<- Generated input class ${name .namePrintable }.' );
8291
83- inputObjects.add (ClassDefinition (
84- isInput: true ,
85- name: name,
86- properties: properties,
87- ));
92+ return ClassDefinition (
93+ isInput: true ,
94+ name: name,
95+ properties: properties,
96+ );
97+ };
8898 }
8999}
0 commit comments