-
Notifications
You must be signed in to change notification settings - Fork 119
/
ast_builder.dart
89 lines (72 loc) · 2.1 KB
/
ast_builder.dart
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
library ast_builder;
import "dart:async";
import "package:build/build.dart";
import "package:code_builder/code_builder.dart";
import "package:dart_style/dart_style.dart";
import "package:gql/ast.dart";
import "package:gql/language.dart";
import "package:gql_code_gen/gql_code_gen.dart";
import "package:pedantic/pedantic.dart";
const astExtension = ".ast.g.dart";
/// Builder factory for AST Builder
Builder astBuilder(
BuilderOptions options,
) =>
_AstBuilder();
String _getName(DefinitionNode def) {
if (def.name != null && def.name.value != null) return def.name.value;
if (def is SchemaDefinitionNode) return "schema";
if (def is OperationDefinitionNode) {
if (def.type == OperationType.query) return "query";
if (def.type == OperationType.mutation) return "mutation";
if (def.type == OperationType.subscription) return "subscription";
}
return null;
}
class _AstBuilder implements Builder {
final DartFormatter _dartfmt = DartFormatter();
@override
Map<String, List<String>> get buildExtensions => {
".graphql": [astExtension],
};
@override
FutureOr<void> build(BuildStep buildStep) async {
final src = await buildStep.readAsString(buildStep.inputId);
final doc = parseString(src, url: buildStep.inputId.path);
final definitions = doc.definitions.map(
(def) => fromNode(def).assignConst(_getName(def)).statement,
);
final document = refer(
"DocumentNode",
"package:gql/ast.dart",
)
.call(
[],
{
"definitions": literalList(
doc.definitions.map(
(def) => refer(
_getName(def),
),
),
),
},
)
.assignConst("document")
.statement;
final library = Library(
(b) => b.body
..addAll(definitions)
..add(document),
);
final genSrc = _dartfmt.format("${library.accept(
DartEmitter.scoped(),
)}");
unawaited(
buildStep.writeAsString(
buildStep.inputId.changeExtension(astExtension),
genSrc,
),
);
}
}