private NTypeReference GetTypeReference(TypeReference typeDef) { if (typeDef == null) { return(null); } var typeReference = new NTypeReference(); this.FillMemberReference(typeReference, typeDef); return(typeReference); }
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)); } } }
/// <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("<"); 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(">"); } return(urlBuilder.ToString()); }