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

Commit 3c847f8

Browse files
committed
feat: Improve support for inline-fragments in fragments
1 parent 25ad3aa commit 3c847f8

File tree

7 files changed

+326
-29
lines changed

7 files changed

+326
-29
lines changed

lib/generator.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ Make sure your query is correct and your schema is updated.''');
329329
nextFieldName: nextFieldName,
330330
nextClassName: ClassName(name: nextType.name.value),
331331
alias: fieldAlias,
332-
ofUnion: Nullable<TypeDefinitionNode?>(null),
332+
ofUnion: Nullable<Name?>(null),
333333
),
334334
);
335335
}

lib/generator/data/class_definition.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class ClassDefinition extends Definition with DataPrinter {
1111
final Iterable<ClassProperty> properties;
1212

1313
/// The type this class extends from, or [null].
14-
final Name? extension;
14+
final ClassName? extension;
1515

1616
/// The types this class implements.
1717
final Iterable<String> implementations;

lib/generator/data/fragment_class_definition.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ class FragmentClassDefinition extends Definition with DataPrinter {
1515
/// Instantiate a fragment class definition.
1616
FragmentClassDefinition({
1717
required this.name,
18-
required this.properties,
19-
}) : assert(hasValue(name) && hasValue(properties)),
18+
this.properties = const [],
19+
}) : assert(hasValue(name.name)),
2020
super(name: name);
2121

2222
@override

lib/generator/ephemeral_data.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class Context {
7474
final Name? currentFieldName;
7575

7676
/// If part of an union type, which [TypeDefinitionNode] it represents.
77-
final TypeDefinitionNode? ofUnion;
77+
final Name? ofUnion;
7878

7979
/// A string to replace the current class name.
8080
final Name? alias;
@@ -114,7 +114,7 @@ class Context {
114114
required TypeDefinitionNode nextType,
115115
required Name? nextFieldName,
116116
required Name? nextClassName,
117-
Nullable<TypeDefinitionNode?>? ofUnion,
117+
Nullable<Name?>? ofUnion,
118118
Name? alias,
119119
List<Definition>? generatedClasses,
120120
List<QueryInput>? inputsClasses,
@@ -143,7 +143,7 @@ class Context {
143143
Name? nextFieldName,
144144
Name? nextClassName,
145145
Name? alias,
146-
Nullable<TypeDefinitionNode?>? ofUnion,
146+
Nullable<Name?>? ofUnion,
147147
List<Definition>? generatedClasses,
148148
List<QueryInput>? inputsClasses,
149149
List<FragmentDefinitionNode>? fragments,
@@ -203,7 +203,7 @@ class Context {
203203
Name? nextFieldName,
204204
Name? nextClassName,
205205
Name? alias,
206-
Nullable<TypeDefinitionNode?>? ofUnion,
206+
Nullable<Name?>? ofUnion,
207207
List<Definition>? generatedClasses,
208208
List<QueryInput>? inputsClasses,
209209
List<FragmentDefinitionNode>? fragments,
@@ -261,7 +261,7 @@ class Context {
261261
/// Returns a copy of this context, with the same type, but on the first path.
262262
Context sameTypeWithNoPath({
263263
Name? alias,
264-
Nullable<TypeDefinitionNode?>? ofUnion,
264+
Nullable<Name?>? ofUnion,
265265
List<Definition>? generatedClasses,
266266
List<QueryInput>? inputsClasses,
267267
List<FragmentDefinitionNode>? fragments,
@@ -289,7 +289,7 @@ class Context {
289289
required TypeDefinitionNode nextType,
290290
required Name nextFieldName,
291291
required Name nextClassName,
292-
Nullable<TypeDefinitionNode?>? ofUnion,
292+
Nullable<Name?>? ofUnion,
293293
Name? alias,
294294
List<Definition>? generatedClasses,
295295
List<QueryInput>? inputsClasses,

lib/visitor/canonical_visitor.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class CanonicalVisitor extends RecursiveVisitor {
2929

3030
final nextContext = context.sameTypeWithNoPath(
3131
alias: enumName,
32-
ofUnion: Nullable<TypeDefinitionNode?>(null),
32+
ofUnion: Nullable<Name?>(null),
3333
);
3434

3535
logFn(context, nextContext.align, '-> Enum');
@@ -53,7 +53,7 @@ class CanonicalVisitor extends RecursiveVisitor {
5353
final name = ClassName(name: node.name.value);
5454
final nextContext = context.sameTypeWithNoPath(
5555
alias: name,
56-
ofUnion: Nullable<TypeDefinitionNode?>(null),
56+
ofUnion: Nullable<Name?>(null),
5757
);
5858

5959
logFn(context, nextContext.align, '-> Input class');
@@ -69,7 +69,7 @@ class CanonicalVisitor extends RecursiveVisitor {
6969
nextType: node,
7070
nextClassName: ClassName(name: nextType.name.value),
7171
nextFieldName: ClassName(name: i.name.value),
72-
ofUnion: Nullable<TypeDefinitionNode?>(null),
72+
ofUnion: Nullable<Name?>(null),
7373
),
7474
markAsUsed: false,
7575
);

lib/visitor/generator_visitor.dart

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,20 @@ class GeneratorVisitor extends RecursiveVisitor {
5252
possibleTypes.addAll(Map.fromIterables(keys, values));
5353
}
5454

55-
final partOfUnion = nextContext.ofUnion != null;
56-
if (partOfUnion) {}
57-
5855
final name = ClassName.fromPath(path: nextContext.fullPathName());
5956
logFn(context, nextContext.align,
6057
'└ ${nextContext.path}[${nextContext.currentType!.name.value}][${nextContext.currentClassName} ${nextContext.currentFieldName}] (${nextContext.alias ?? ''})');
6158
logFn(context, nextContext.align,
6259
'<- Generated class ${name.namePrintable}.');
63-
60+
final ofUnion = context.ofUnion;
61+
if (ofUnion is FragmentName) {
62+
_mixins.add(ofUnion);
63+
}
6464
nextContext.generatedClasses.add(ClassDefinition(
6565
name: name,
6666
properties: _classProperties,
6767
mixins: _mixins,
68-
extension: partOfUnion
69-
? ClassName.fromPath(path: nextContext.rollbackPath().fullPathName())
70-
: null,
68+
extension: ofUnion is ClassName ? ofUnion : null,
7169
factoryPossibilities: possibleTypes,
7270
));
7371
}
@@ -94,15 +92,16 @@ class GeneratorVisitor extends RecursiveVisitor {
9492
void visitInlineFragmentNode(InlineFragmentNode node) {
9593
logFn(context, context.align + 1,
9694
'${context.path}: ... on ${node.typeCondition!.on.name.value}');
95+
final ofUnion = context.ofUnion ??
96+
ClassName.fromPath(path: context.rollbackPath().fullPathName());
9797
final nextType = gql.getTypeByName(context.schema, node.typeCondition!.on);
98-
9998
if (nextType.name.value == context.currentType!.name.value) {
10099
final visitor = GeneratorVisitor(
101100
context: context.nextTypeWithSamePath(
102101
nextType: nextType,
103102
nextClassName: null,
104103
nextFieldName: null,
105-
ofUnion: Nullable<TypeDefinitionNode?>(context.currentType),
104+
ofUnion: Nullable<Name?>(ofUnion),
106105
inputsClasses: [],
107106
fragments: [],
108107
),
@@ -114,7 +113,7 @@ class GeneratorVisitor extends RecursiveVisitor {
114113
nextType: nextType,
115114
nextClassName: ClassName(name: nextType.name.value),
116115
nextFieldName: ClassPropertyName(name: nextType.name.value),
117-
ofUnion: Nullable<TypeDefinitionNode?>(context.currentType),
116+
ofUnion: Nullable<Name?>(ofUnion),
118117
inputsClasses: [],
119118
fragments: [],
120119
),
@@ -149,7 +148,7 @@ class GeneratorVisitor extends RecursiveVisitor {
149148
nextType: leafType,
150149
nextClassName: ClassName(name: leafType.name.value),
151150
nextFieldName: ClassName(name: node.variable.name.value),
152-
ofUnion: Nullable<TypeDefinitionNode?>(null),
151+
ofUnion: Nullable<Name?>(null),
153152
)
154153
.fullPathName();
155154

@@ -234,15 +233,15 @@ class GeneratorVisitor extends RecursiveVisitor {
234233
path: context
235234
.sameTypeWithNoPath(
236235
alias: FragmentName(name: node.name.value),
237-
ofUnion: Nullable<TypeDefinitionNode?>(null),
236+
ofUnion: Nullable<Name?>(null),
238237
)
239238
.fullPathName());
240239

241240
final visitor = GeneratorVisitor(
242241
context: context.sameTypeWithNextPath(
243242
alias: fragmentName,
244243
generatedClasses: [],
245-
ofUnion: Nullable<TypeDefinitionNode?>(null),
244+
ofUnion: Nullable<Name?>(null),
246245
log: false,
247246
),
248247
);
@@ -260,7 +259,7 @@ class GeneratorVisitor extends RecursiveVisitor {
260259
final partName = FragmentName(name: node.name.value);
261260
final nextContext = context.sameTypeWithNoPath(
262261
alias: partName,
263-
ofUnion: Nullable<TypeDefinitionNode?>(null),
262+
ofUnion: Nullable<Name?>(null),
264263
);
265264

266265
logFn(context, nextContext.align, '-> Fragment');
@@ -270,6 +269,8 @@ class GeneratorVisitor extends RecursiveVisitor {
270269

271270
final nextType =
272271
gql.getTypeByName(nextContext.schema, node.typeCondition.on);
272+
final fragmentName =
273+
FragmentName.fromPath(path: nextContext.fullPathName());
273274

274275
final visitorContext = Context(
275276
schema: context.schema,
@@ -285,6 +286,7 @@ class GeneratorVisitor extends RecursiveVisitor {
285286
fragments: [],
286287
usedEnums: nextContext.usedEnums,
287288
usedInputObjects: nextContext.usedInputObjects,
289+
ofUnion: fragmentName,
288290
);
289291

290292
final visitor = GeneratorVisitor(context: visitorContext);
@@ -298,8 +300,6 @@ class GeneratorVisitor extends RecursiveVisitor {
298300
.expand((a) => a)
299301
.mergeDuplicatesBy((a) => a.name, (a, b) => a);
300302

301-
final fragmentName =
302-
FragmentName.fromPath(path: nextContext.fullPathName());
303303
logFn(context, nextContext.align,
304304
'└ ${nextContext.path}[${node.name.value}]');
305305
logFn(context, nextContext.align,

0 commit comments

Comments
 (0)