private void CollectFields(ExecutionContext context, IGraphType specificType, SelectionSet selectionSet, ref List <string> visitedFragmentNames) //TODO: can be completely eliminated? see Fields.Add { if (selectionSet != null) { foreach (var selection in selectionSet.SelectionsList) { if (selection is Field field) { if (!ExecutionHelper.ShouldIncludeNode(context, field.Directives)) { continue; } Add(field); } else if (selection is FragmentSpread spread) { if ((visitedFragmentNames != null && visitedFragmentNames.Contains(spread.Name)) || !ExecutionHelper.ShouldIncludeNode(context, spread.Directives)) { continue; } (visitedFragmentNames ??= new List <string>()).Add(spread.Name); var fragment = context.Fragments.FindDefinition(spread.Name); if (fragment == null || !ExecutionHelper.ShouldIncludeNode(context, fragment.Directives) || !ExecutionHelper.DoesFragmentConditionMatch(context, fragment.Type.Name, specificType)) { continue; } CollectFields(context, specificType, fragment.SelectionSet, ref visitedFragmentNames); } else if (selection is InlineFragment inline) { var name = inline.Type != null ? inline.Type.Name : specificType.Name; if (!ExecutionHelper.ShouldIncludeNode(context, inline.Directives) || !ExecutionHelper.DoesFragmentConditionMatch(context, name, specificType)) { continue; } CollectFields(context, specificType, inline.SelectionSet, ref visitedFragmentNames); } } } }