addDefinition method
void
addDefinition(
- Node? type, {
- bool forceInclude = true,
})
Implementation
void addDefinition(Node? type, {bool forceInclude = true}) {
if (type == null) return;
if (type is ListTypeNode) {
addType(type.type, forceInclude: forceInclude, parentType: null);
return;
}
if (type is NamedTypeNode) {
type = doc.findType(type);
}
if (type is InputObjectTypeDefinitionNode) {
if (checkDone(type.name.value) &&
(forceInclude || isIncluded(type.name.value))) addInputType(type);
} else if (type is ObjectTypeDefinitionNode) {
if (type.name.value == 'Query') {
type.fields
.where((query) =>
checkDone(query.name.value) && isIncluded(query.name.value))
.forEach((element) => addQuery(element));
} else if (type.name.value == 'Mutation') {
type.fields
.where((query) =>
checkDone(query.name.value) && isIncluded(query.name.value))
.forEach((element) => addMutation(element));
} else {
if (checkDone(type.name.value) &&
(forceInclude || isIncluded(type.name.value))) {
addObjectType(type);
}
}
} else if (type is EnumTypeDefinitionNode) {
if (checkDone(type.name.value) &&
(forceInclude || isIncluded(type.name.value)))
enumTypes[type.name.value] = type;
} else if (type is InterfaceTypeDefinitionNode) {
if (checkDone(type.name.value) &&
(forceInclude || isIncluded(type.name.value))) addInterface(type);
} else if (type is FragmentDefinitionNode) {
if (checkDone(type.name.value) &&
(forceInclude || isIncluded(type.name.value))) addFragment(type);
} else if (type is ScalarTypeDefinitionNode) {
checkDone(type.name.value);
} else if (type is UnionTypeDefinitionNode) {
checkDone(type.name.value);
unionTypes[type.name.value] = type;
type.types.forEach((unionType) {
extraInterfaces.putIfAbsent(unionType.name.value, () => {}).add(
NamedTypeNode(
name: NameNode(
value: (type as UnionTypeDefinitionNode).name.value),
),
);
var fragmentName = '${type.name.value}Fragment';
UnionTypeDefinitionNode utype = type;
if (utype.directives.hasDirective("selection")) {
final prefix = utype.directives
.getDirectiveValue("selection", "prefix")
.stringValue;
final fields = utype.directives
.getDirectiveValue("selection", "fields")
.getList<String>();
var fragmentName = '${type.name.value}${prefix}Fragment';
fragments.putIfAbsent(
fragmentName,
() => FragmentDefinitionNode(
name: fragmentName.toNameNode(),
typeCondition:
TypeConditionNode(on: utype.name.value.toNamedType()),
selectionSet: SelectionSetNode(selections: [
for (final u in utype.types)
InlineFragmentNode(
typeCondition: TypeConditionNode(on: u),
selectionSet: SelectionSetNode(
selections: [
for (var field in fields) fieldNode(field),
],
),
)
]),
),
);
nestedFragments[utype.name.value] =
'${type.name.value}${prefix}Fragment';
// fragmentDepends.addAll(fragmentName, utype.types.map((t) => "${t.name.value}Fragment").toSet());
}
fragments.putIfAbsent(
fragmentName,
() => FragmentDefinitionNode(
name: fragmentName.toNameNode(),
typeCondition:
TypeConditionNode(on: utype.name.value.toNamedType()),
selectionSet: SelectionSetNode(selections: [
for (final u in utype.types)
InlineFragmentNode(
typeCondition: TypeConditionNode(on: u),
selectionSet: SelectionSetNode(selections: [
FragmentSpreadNode(
name: '${u.name.value}Fragment'.toNameNode()),
]))
]),
),
);
fragmentDepends.addAll(fragmentName,
utype.types.map((t) => "${t.name.value}Fragment").toSet());
});
} else if (type is DirectiveDefinitionNode) {
// We ignore these on purpose
} else {
_log.warning('Skipping type ${type}');
}
}