public override object VisitSimpleType(SimpleType simpleType, object data)
            {
                // Handle type arguments first, so that the fixed-up type arguments get moved over to the MemberType,
                // if we're also creating one here.
                base.VisitSimpleType(simpleType, data);
                ITypeDefOrRef tr = simpleType.Annotation <ITypeDefOrRef>();

                // Fully qualify any ambiguous type names.
                if (tr == null)
                {
                    return(null);
                }
                var nss = GetNamespace(tr).ToString();

                if (IsAmbiguous(nss, null, GetName(tr)))
                {
                    AstType ns;
                    if (string.IsNullOrEmpty(nss))
                    {
                        ns = new SimpleType("global").WithAnnotation(TextTokenKind.Keyword);
                    }
                    else
                    {
                        string[] parts = nss.Split('.');
                        if (IsAmbiguous(string.Empty, parts[0], null))
                        {
                            // conflict between namespace and type name/member name
                            ns = new MemberType {
                                Target = new SimpleType("global").WithAnnotation(TextTokenKind.Keyword), IsDoubleColon = true, MemberNameToken = Identifier.Create(parts[0]).WithAnnotation(TextTokenKind.NamespacePart)
                            }.WithAnnotation(TextTokenKind.NamespacePart);
                        }
                        else
                        {
                            ns = new SimpleType(parts[0]).WithAnnotation(TextTokenKind.NamespacePart);
                        }
                        for (int i = 1; i < parts.Length; i++)
                        {
                            ns = new MemberType {
                                Target = ns, MemberNameToken = Identifier.Create(parts[i]).WithAnnotation(TextTokenKind.NamespacePart)
                            }.WithAnnotation(TextTokenKind.NamespacePart);
                        }
                    }
                    MemberType mt = new MemberType();
                    mt.Target          = ns;
                    mt.IsDoubleColon   = string.IsNullOrEmpty(nss);
                    mt.MemberNameToken = (Identifier)simpleType.IdentifierToken.Clone();
                    mt.CopyAnnotationsFrom(simpleType);
                    simpleType.TypeArguments.MoveTo(mt.TypeArguments);
                    simpleType.ReplaceWith(mt);
                }
                return(null);
            }
            public override object VisitSimpleType(SimpleType simpleType, object data)
            {
                // Handle type arguments first, so that the fixed-up type arguments get moved over to the MemberType,
                // if we're also creating one here.
                base.VisitSimpleType(simpleType, data);
                TypeReference tr = simpleType.Annotation <TypeReference>();

                // Fully qualify any ambiguous type names.
                if (tr != null && IsAmbiguous(tr.Namespace, tr.Name))
                {
                    AstType ns;
                    if (string.IsNullOrEmpty(tr.Namespace))
                    {
                        ns = new SimpleType("global");
                    }
                    else
                    {
                        string[] parts = tr.Namespace.Split('.');
                        if (IsAmbiguous(string.Empty, parts[0]))
                        {
                            // conflict between namespace and type name/member name
                            ns = new MemberType {
                                Target = new SimpleType("global"), IsDoubleColon = true, MemberName = parts[0]
                            };
                        }
                        else
                        {
                            ns = new SimpleType(parts[0]);
                        }
                        for (int i = 1; i < parts.Length; i++)
                        {
                            ns = new MemberType {
                                Target = ns, MemberName = parts[i]
                            };
                        }
                    }
                    MemberType mt = new MemberType();
                    mt.Target        = ns;
                    mt.IsDoubleColon = string.IsNullOrEmpty(tr.Namespace);
                    mt.MemberName    = simpleType.Identifier;
                    mt.CopyAnnotationsFrom(simpleType);
                    simpleType.TypeArguments.MoveTo(mt.TypeArguments);
                    simpleType.ReplaceWith(mt);
                }
                return(null);
            }