code: func (rule *overlappingFieldsCanBeMergedRule) findConflictsBetweenSubSelectionSets(areMutuallyExclusive bool, parentType1 Named, selectionSet1 *ast.SelectionSet, parentType2 Named, selectionSet2 *ast.SelectionSet) []conflict {
  	conflicts := []conflict{}
  
  	fieldsInfo1 := rule.getFieldsAndFragmentNames(parentType1, selectionSet1)
  	fieldsInfo2 := rule.getFieldsAndFragmentNames(parentType2, selectionSet2)
  
  	// (H) First, collect all conflicts between these two collections of field.
  	conflicts = rule.collectConflictsBetween(conflicts, areMutuallyExclusive, fieldsInfo1, fieldsInfo2)
  
  	// (I) Then collect conflicts between the first collection of fields and
  	// those referenced by each fragment name associated with the second.
  	for _, fragmentName2 := range fieldsInfo2.fragmentNames {
  		conflicts = rule.collectConflictsBetweenFieldsAndFragment(conflicts, areMutuallyExclusive, fieldsInfo1, fragmentName2)
  	}
  
  	// (I) Then collect conflicts between the second collection of fields and
  	// those referenced by each fragment name associated with the first.
  	for _, fragmentName1 := range fieldsInfo1.fragmentNames {
  		conflicts = rule.collectConflictsBetweenFieldsAndFragment(conflicts, areMutuallyExclusive, fieldsInfo2, fragmentName1)
  	}
  
  	// (J) Also collect conflicts between any fragment names by the first and
  	// fragment names by the second. This compares each item in the first set of
  	// names to each item in the second set of names.
  	for _, fragmentName1 := range fieldsInfo1.fragmentNames {
  		for _, fragmentName2 := range fieldsInfo2.fragmentNames {
  			conflicts = rule.collectConflictsBetweenFragments(conflicts, areMutuallyExclusive, fragmentName1, fragmentName2)
  		}
  	}
  	return conflicts
  }
docs: // Find all conflicts found between two selection sets, including those found
  // via spreading in fragments. Called when determining if conflicts exist
  // between the sub-fields of two overlapping fields.