Skip to content
This repository was archived by the owner on Oct 2, 2024. It is now read-only.

Commit b0fefa9

Browse files
authored
Merge pull request #329 from comigor/performance_fix
performance
2 parents e029be1 + d581d4b commit b0fefa9

5 files changed

Lines changed: 107 additions & 91 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# CHANGELOG
22

3+
## 7.0.0-beta.16
4+
5+
- lazy canonical visitors
6+
37
## 7.0.0-beta.15
48

59
- Update build_runner version in examples

lib/generator.dart

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -179,14 +179,14 @@ Iterable<QueryDefinition> generateDefinitions(
179179

180180
final rootTypeName =
181181
(schemaVisitor.schemaDefinitionNode?.operationTypes ?? [])
182-
.firstWhereOrNull((e) => e.operation == operation.type)
183-
?.type
184-
.name
185-
.value ??
182+
.firstWhereOrNull((e) => e.operation == operation.type)
183+
?.type
184+
.name
185+
.value ??
186186
suffix;
187187

188188
final TypeDefinitionNode parentType =
189-
objectVisitor.getByName(rootTypeName)!;
189+
objectVisitor.getByName(rootTypeName)!;
190190

191191
final name = QueryName.fromPath(
192192
path: createPathName([
@@ -222,11 +222,13 @@ Iterable<QueryDefinition> generateDefinitions(
222222
operationName: operationName,
223223
document: documentDefinitions,
224224
classes: [
225-
...canonicalVisitor.enums
226-
.where((e) => context.usedEnums.contains(e.name)),
225+
...context.usedEnums
226+
.map((e) => canonicalVisitor.enums[e.name]?.call())
227+
.whereType<Definition>(),
227228
...visitor.context.generatedClasses,
228-
...canonicalVisitor.inputObjects
229-
.where((i) => context.usedInputObjects.contains(i.name)),
229+
...context.usedInputObjects
230+
.map((e) => canonicalVisitor.inputObjects[e.name]?.call())
231+
.whereType<Definition>(),
230232
],
231233
inputs: visitor.context.inputsClasses,
232234
generateHelpers: options.generateHelpers,

lib/visitor/canonical_visitor.dart

Lines changed: 61 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ import 'package:artemis/generator/helpers.dart';
77
import 'package:artemis/generator/graphql_helpers.dart' as gql;
88
import '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
1117
class 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
}

pubspec.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: artemis
2-
version: 7.0.0-beta.15
2+
version: 7.0.0-beta.16
33

44
description: Build dart types from GraphQL schemas and queries (using Introspection Query).
55
homepage: https://github.com/comigor/artemis
@@ -13,7 +13,7 @@ dependencies:
1313
build: ^2.0.2
1414
collection: ^1.15.0
1515
dart_style: ^2.0.1
16-
equatable: ^2.0.2
16+
equatable: ^2.0.3
1717
glob: ^2.0.1
1818
gql_code_builder: ^0.2.0
1919
gql_dedupe_link: ^2.0.0
@@ -25,7 +25,7 @@ dependencies:
2525
json_annotation: ^4.0.1
2626
path: ^1.8.0
2727
recase: ^4.0.0
28-
source_gen: ^1.0.1
28+
source_gen: ^1.0.2
2929
yaml: ^3.1.0
3030

3131
dev_dependencies:
@@ -34,7 +34,7 @@ dev_dependencies:
3434
build_test: ^2.1.0
3535
json_serializable: ^4.1.3
3636
build_resolvers: ^2.0.3
37-
pedantic: ^1.11.0
38-
test: ^1.17.5
37+
pedantic: ^1.11.1
38+
test: ^1.17.8
3939
logging: ^1.0.1
4040

test/query_generator/ast_schema/input_types_test.dart

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -103,17 +103,6 @@ final LibraryDefinition libraryDefinition =
103103
factoryPossibilities: {},
104104
typeNameField: ClassPropertyName(name: r'__typename'),
105105
isInput: false),
106-
ClassDefinition(
107-
name: ClassName(name: r'OtherObjectInput'),
108-
properties: [
109-
ClassProperty(
110-
type: TypeName(name: r'String', isNonNull: true),
111-
name: ClassPropertyName(name: r'id'),
112-
isResolveType: false)
113-
],
114-
factoryPossibilities: {},
115-
typeNameField: ClassPropertyName(name: r'__typename'),
116-
isInput: true),
117106
ClassDefinition(
118107
name: ClassName(name: r'CreateThingInput'),
119108
properties: [
@@ -135,6 +124,17 @@ final LibraryDefinition libraryDefinition =
135124
],
136125
factoryPossibilities: {},
137126
typeNameField: ClassPropertyName(name: r'__typename'),
127+
isInput: true),
128+
ClassDefinition(
129+
name: ClassName(name: r'OtherObjectInput'),
130+
properties: [
131+
ClassProperty(
132+
type: TypeName(name: r'String', isNonNull: true),
133+
name: ClassPropertyName(name: r'id'),
134+
isResolveType: false)
135+
],
136+
factoryPossibilities: {},
137+
typeNameField: ClassPropertyName(name: r'__typename'),
138138
isInput: true)
139139
],
140140
inputs: [
@@ -207,21 +207,6 @@ class CreateThing$MutationRoot extends JsonSerializable with EquatableMixin {
207207
Map<String, dynamic> toJson() => _$CreateThing$MutationRootToJson(this);
208208
}
209209
210-
@JsonSerializable(explicitToJson: true)
211-
class OtherObjectInput extends JsonSerializable with EquatableMixin {
212-
OtherObjectInput({required this.id});
213-
214-
factory OtherObjectInput.fromJson(Map<String, dynamic> json) =>
215-
_$OtherObjectInputFromJson(json);
216-
217-
late String id;
218-
219-
@override
220-
List<Object?> get props => [id];
221-
@override
222-
Map<String, dynamic> toJson() => _$OtherObjectInputToJson(this);
223-
}
224-
225210
@JsonSerializable(explicitToJson: true)
226211
class CreateThingInput extends JsonSerializable with EquatableMixin {
227212
CreateThingInput({required this.clientId, this.message, this.shares});
@@ -240,4 +225,19 @@ class CreateThingInput extends JsonSerializable with EquatableMixin {
240225
@override
241226
Map<String, dynamic> toJson() => _$CreateThingInputToJson(this);
242227
}
228+
229+
@JsonSerializable(explicitToJson: true)
230+
class OtherObjectInput extends JsonSerializable with EquatableMixin {
231+
OtherObjectInput({required this.id});
232+
233+
factory OtherObjectInput.fromJson(Map<String, dynamic> json) =>
234+
_$OtherObjectInputFromJson(json);
235+
236+
late String id;
237+
238+
@override
239+
List<Object?> get props => [id];
240+
@override
241+
Map<String, dynamic> toJson() => _$OtherObjectInputToJson(this);
242+
}
243243
''';

0 commit comments

Comments
 (0)