示例#1
0
        private NTypeReference GetTypeReference(TypeReference typeDef)
        {
            if (typeDef == null)
            {
                return(null);
            }

            var typeReference = new NTypeReference();

            this.FillMemberReference(typeReference, typeDef);
            return(typeReference);
        }
示例#2
0
        private void FillMemberReference(INMemberReference memberRef, MemberReference cecilMemberRef)
        {
            memberRef.Id       = DocIdHelper.GetXmlId(cecilMemberRef);
            memberRef.PageId   = PageIdFunction(memberRef);
            memberRef.Name     = ReplacePrimitive(cecilMemberRef.Name, cecilMemberRef.FullName);
            memberRef.FullName = cecilMemberRef.FullName;

            // Load system documentation if needed
            LoadSystemAssemblyDoc(memberRef, cecilMemberRef);

            var typeDef = cecilMemberRef as TypeReference;

            if (typeDef != null)
            {
                memberRef.IsGenericInstance  = typeDef.IsGenericInstance;
                memberRef.IsGenericParameter = typeDef.IsGenericParameter;
                memberRef.IsArray            = typeDef.IsArray;
                memberRef.IsPointer          = typeDef.IsPointer;
                memberRef.IsSentinel         = typeDef.IsSentinel;
                FillGenericParameters(memberRef, typeDef);

                // Handle generic instance
                var genericInstanceDef = typeDef as GenericInstanceType;

                if (genericInstanceDef != null)
                {
                    memberRef.ElementType = GetTypeReference(genericInstanceDef.ElementType);

                    if (genericInstanceDef.GenericArguments.Count > 0)
                    {
                        foreach (var genericArgumentDef in genericInstanceDef.GenericArguments)
                        {
                            var genericArgument = new NTypeReference();
                            FillMemberReference(genericArgument, genericArgumentDef);
                            memberRef.GenericArguments.Add(genericArgument);
                        }

                        // Remove `number from Name
                        memberRef.Name     = BuildGenericName(typeDef.Name, memberRef.GenericArguments);
                        memberRef.FullName = BuildGenericName(typeDef.FullName, memberRef.GenericArguments);
                    }
                }
                else if (memberRef.GenericParameters.Count > 0)
                {
                    // If generic parameters, than rewrite the name/fullname
                    memberRef.Name     = BuildGenericName(typeDef.Name, memberRef.GenericParameters);
                    memberRef.FullName = BuildGenericName(typeDef.FullName, memberRef.GenericParameters);
                }
            }
            else
            {
                var genericParameterProvider = cecilMemberRef as IGenericParameterProvider;
                if (genericParameterProvider != null)
                {
                    this.FillGenericParameters(memberRef, genericParameterProvider);
                    memberRef.Name     = BuildGenericName(memberRef.Name, memberRef.GenericParameters);
                    memberRef.FullName = BuildGenericName(memberRef.FullName, memberRef.GenericParameters);
                }
            }

            var member = memberRef as NMember;

            // Add custom attributes for this member
            if (member != null && cecilMemberRef is ICustomAttributeProvider)
            {
                var attributes = ((ICustomAttributeProvider)cecilMemberRef).CustomAttributes;
                foreach (var customAttribute in attributes)
                {
                    member.Attributes.Add(CustomAttributeToString(member, customAttribute));
                }
            }
        }
示例#3
0
        /// <summary>
        /// Resolve a document Id (ie. "T:System.Object") to an url.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <param name="linkName">Name of the link.</param>
        /// <param name="forceLocal">if set to <c>true</c> [force local].</param>
        /// <param name="attributes">The attributes.</param>
        /// <param name="localReference">The local reference.</param>
        /// <param name="useSelf"></param>
        /// <returns></returns>
        public string ToUrl(string id, string linkName = null, bool forceLocal = false, string attributes = null, IModelReference localReference = null, bool useSelf = true)
        {
            var linkDescriptor = new LinkDescriptor {
                Type = LinkType.None, Index = -1
            };
            var            typeReference      = localReference as NTypeReference;
            NTypeReference genericInstance    = null;
            bool           isGenericInstance  = typeReference != null && typeReference.IsGenericInstance;
            bool           isGenericParameter = typeReference != null && typeReference.IsGenericParameter;

            if (isGenericInstance)
            {
                var elementType = typeReference.ElementType;
                id = elementType.Id;
                genericInstance = typeReference;
                linkName        = elementType.Name.Substring(0, elementType.Name.IndexOf('<'));
            }

            linkDescriptor.LocalReference = FindLocalReference(id);

            if (isGenericParameter)
            {
                linkDescriptor.Name = typeReference.Name;
            }
            else if (linkDescriptor.LocalReference != null)
            {
                // For local references, use short name
                linkDescriptor.Name   = linkDescriptor.LocalReference.Name;
                linkDescriptor.PageId = linkDescriptor.LocalReference.PageId;
                linkDescriptor.Type   = LinkType.Local;
                linkDescriptor.Index  = linkDescriptor.LocalReference.Index;
                if (!forceLocal && CurrentContext != null && linkDescriptor.LocalReference is NMember)
                {
                    var declaringType = ((NMember)linkDescriptor.LocalReference).DeclaringType;
                    // If link is self referencing the current context, then use a self link
                    if ((id == CurrentContext.Id || (declaringType != null && declaringType.Id == CurrentContext.Id && (!id.StartsWith("T:") && !declaringType.Id.StartsWith("T:")))) && useSelf)
                    {
                        linkDescriptor.Type = LinkType.Self;
                    }
                }
            }
            else
            {
                linkDescriptor.Location = _msnRegistry.FindUrl(id);
                var reference = TextReferenceUtility.CreateReference(id);
                if (linkDescriptor.Location != null)
                {
                    linkDescriptor.Type = LinkType.Msdn;
                    linkDescriptor.Name = reference.FullName;
                    // Open MSDN documentation to a new window
                    attributes = (attributes ?? "") + " target='_blank'";
                }
                else
                {
                    linkDescriptor.Type = LinkType.None;
                    linkDescriptor.Name = reference.Name;
                }
            }

            if (LinkResolver == null)
            {
                Logger.Warning("Model.LinkResolver must be set");
                return(id);
            }

            if (linkName != null)
            {
                linkDescriptor.Name = linkName;
            }

            linkDescriptor.Id         = id;
            linkDescriptor.Attributes = attributes;

            var urlBuilder = new StringBuilder();

            urlBuilder.Append(LinkResolver(linkDescriptor));

            // Handle url for generic instance
            if (genericInstance != null)
            {
                urlBuilder.Append("&lt;");
                for (int i = 0; i < genericInstance.GenericArguments.Count; i++)
                {
                    if (i > 0)
                    {
                        urlBuilder.Append(", ");
                    }
                    var genericArgument = genericInstance.GenericArguments[i];
                    // Recursive call here
                    urlBuilder.Append(ToUrl(genericArgument));
                }
                urlBuilder.Append("&gt;");
            }
            return(urlBuilder.ToString());
        }