code: func (rule *overlappingFieldsCanBeMergedRule) collectConflictsBetweenFragments(conflicts []conflict, areMutuallyExclusive bool, fragmentName1 string, fragmentName2 string) []conflict {
  	fragment1 := rule.context.Fragment(fragmentName1)
  	fragment2 := rule.context.Fragment(fragmentName2)
  
  	if fragment1 == nil || fragment2 == nil {
  		return conflicts
  	}
  
  	// No need to compare a fragment to itself.
  	if fragment1 == fragment2 {
  		return conflicts
  	}
  
  	// Memoize so two fragments are not compared for conflicts more than once.
  	if rule.comparedSet.Has(fragmentName1, fragmentName2, areMutuallyExclusive) {
  		return conflicts
  	}
  	rule.comparedSet.Add(fragmentName1, fragmentName2, areMutuallyExclusive)
  
  	fieldsInfo1 := rule.getReferencedFieldsAndFragmentNames(fragment1)
  	fieldsInfo2 := rule.getReferencedFieldsAndFragmentNames(fragment2)
  
  	// (F) First, collect all conflicts between these two collections of fields
  	// (not including any nested fragments).
  	conflicts = rule.collectConflictsBetween(conflicts, areMutuallyExclusive, fieldsInfo1, fieldsInfo2)
  
  	// (G) Then collect conflicts between the first fragment and any nested
  	// fragments spread in the second fragment.
  	for _, innerFragmentName2 := range fieldsInfo2.fragmentNames {
  		conflicts = rule.collectConflictsBetweenFragments(conflicts, areMutuallyExclusive, fragmentName1, innerFragmentName2)
  	}
  
  	// (G) Then collect conflicts between the second fragment and any nested
  	// fragments spread in the first fragment.
  	for _, innerFragmentName1 := range fieldsInfo1.fragmentNames {
  		conflicts = rule.collectConflictsBetweenFragments(conflicts, areMutuallyExclusive, innerFragmentName1, fragmentName2)
  	}
  
  	return conflicts
  }
docs: // Collect all conflicts found between two fragments, including via spreading in
  // any nested fragments.