anchor.diff:              if selection.FragmentSpreadName.IsSome then visitedFragments := selection.FragmentSpreadName.Value :: !visitedFragments
               match selection.FieldType with
               | Some _ ->
  -                let argumentsValid = selection.Field.Arguments |> checkVariableUsageAllowedOnArguments inputs varNamesAndTypeRefs selection.Path
  -                let selectionValid = selection.SelectionSet |> collectResults (checkVariableUsageAllowedOnSelection varNamesAndTypeRefs visitedFragments)
  +                let argumentsValid = 
  +                    selection.Field.Arguments 
  +                    |> checkVariableUsageAllowedOnArguments inputs varNamesAndTypeRefs selection.Path
  +                let selectionValid = 
  +                    selection.NonCyclicSelectionSet 
  +                    |> collectResults (checkVariableUsageAllowedOnSelection varNamesAndTypeRefs visitedFragments)
                   argumentsValid
                   @@ selectionValid
                   @@ (selection.Field.Directives |> collectResults (fun directive -> directive.Arguments |> checkVariableUsageAllowedOnArguments inputs varNamesAndTypeRefs selection.Path))
  
positive.code:                         if fieldA.Field.Name <> fieldB.Field.Name then hasSameShape @@ AstError.AsResult(sprintf "Field name or alias '%s' is referring to fields '%s' and '%s', but they are different fields in the scope of the parent type." aliasOrName fieldA.Field.Name fieldB.Field.Name, fieldA.Path)
                          else if fieldA.Field.Arguments <> fieldB.Field.Arguments then hasSameShape @@ AstError.AsResult(sprintf "Field name or alias '%s' refers to field '%s' two times, but each reference has different argument sets." aliasOrName fieldA.Field.Name, fieldA.Path)
                          else
                              let mergedSet = fieldA.SelectionSet |> List.append fieldB.SelectionSet
                              hasSameShape @@ (fieldsInSetCanMerge mergedSet)
                      else hasSameShape))
  
      let internal validateFieldSelectionMerging (ctx : ValidationContext) =
          ctx.Definitions |> collectResults (fun def -> fieldsInSetCanMerge def.SelectionSet)
  
      let rec private checkLeafFieldSelection (selection : SelectionInfo) =
          let rec validateByKind (fieldType : IntrospectionTypeRef) (selectionSetLength : int) =
  
negative.code:                     metaTypeFields.TryFind(selection.Field.Name)
                      |> Option.map (fun x -> x.ArgumentNames)
                      |> Option.orElseWith (fun () -> selection.InputValues |> Option.map (Array.map (fun x -> x.Name)))
                  match schemaArgumentNames |> tryFindInArrayOption (fun x -> x = arg.Name) with
                  | Some _ -> Success
                  | None -> AstError.AsResult(sprintf "Field '%s' of type '%s' does not have an input named '%s' in its definition." selection.Field.Name selection.FragmentOrParentType.Name arg.Name, selection.Path))
          let directivesValid =
  