addDefinition method

void addDefinition(
  1. Node? type, {
  2. 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}');
  }
}