private bool EqualsRecursive(NativeType left, NativeType right) { // Quick sanity check if (!EqualsTopLevel(left, right)) { return(false); } NativeSymbolIterator it = new NativeSymbolIterator(); Dictionary <string, NativeDefinedType> leftMap = new Dictionary <string, NativeDefinedType>(); Dictionary <string, NativeDefinedType> rightMap = new Dictionary <string, NativeDefinedType>(); foreach (NativeDefinedType nt in it.FindAllReachableDefinedTypes(left)) { if (!leftMap.ContainsKey(nt.Name)) { leftMap.Add(nt.Name, nt); } } foreach (NativeDefinedType nt in it.FindAllReachableDefinedTypes(right)) { if (!rightMap.ContainsKey(nt.Name)) { rightMap.Add(nt.Name, nt); } } if (leftMap.Count != rightMap.Count) { return(false); } foreach (NativeDefinedType leftDefined in leftMap.Values) { NativeDefinedType rightDefined = null; if (!rightMap.TryGetValue(leftDefined.Name, out rightDefined) || !EqualsTopLevel(leftDefined, rightDefined)) { return(false); } } return(true); }