This repository was archived by the owner on Oct 2, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 129
Expand file tree
/
Copy pathcanonical_visitor.dart
More file actions
89 lines (76 loc) · 2.72 KB
/
canonical_visitor.dart
File metadata and controls
89 lines (76 loc) · 2.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import 'package:artemis/generator.dart';
import 'package:artemis/generator/data/data.dart';
import 'package:artemis/generator/data/enum_value_definition.dart';
import 'package:artemis/generator/data/nullable.dart';
import 'package:artemis/generator/ephemeral_data.dart';
import 'package:artemis/generator/helpers.dart';
import 'package:artemis/generator/graphql_helpers.dart' as gql;
import 'package:gql/ast.dart';
/// Visits canonical types Enums and InputObjects
class CanonicalVisitor extends RecursiveVisitor {
/// Constructor
CanonicalVisitor({
required this.context,
});
/// Current context
final Context context;
/// List of visited input objects
final List<ClassDefinition> inputObjects = [];
/// List of visited enums
final List<EnumDefinition> enums = [];
@override
void visitEnumTypeDefinitionNode(EnumTypeDefinitionNode node) {
final enumName = EnumName(name: node.name.value);
final nextContext = context.sameTypeWithNoPath(
alias: enumName,
ofUnion: Nullable<Name?>(null),
);
logFn(context, nextContext.align, '-> Enum');
logFn(context, nextContext.align,
'<- Generated enum ${enumName.namePrintable}.');
enums.add(EnumDefinition(
name: enumName,
values: node.values
.map((ev) => EnumValueDefinition(
name: EnumValueName(name: ev.name.value),
annotations: proceedDeprecated(ev.directives),
))
.toList()
..add(ARTEMIS_UNKNOWN),
));
}
@override
void visitInputObjectTypeDefinitionNode(InputObjectTypeDefinitionNode node) {
final name = ClassName(name: node.name.value);
final nextContext = context.sameTypeWithNoPath(
alias: name,
ofUnion: Nullable<Name?>(null),
);
logFn(context, nextContext.align, '-> Input class');
logFn(context, nextContext.align,
'┌ ${nextContext.path}[${node.name.value}]');
final properties = <ClassProperty>[];
properties.addAll(node.fields.map((i) {
final nextType = gql.getTypeByName(nextContext.schema, i.type);
return createClassProperty(
fieldName: ClassPropertyName(name: i.name.value),
context: nextContext.nextTypeWithNoPath(
nextType: node,
nextClassName: ClassName(name: nextType.name.value),
nextFieldName: ClassName(name: i.name.value),
ofUnion: Nullable<Name?>(null),
),
markAsUsed: false,
);
}));
logFn(context, nextContext.align,
'└ ${nextContext.path}[${node.name.value}]');
logFn(context, nextContext.align,
'<- Generated input class ${name.namePrintable}.');
inputObjects.add(ClassDefinition(
isInput: true,
name: name,
properties: properties,
));
}
}