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);
        }