Exemplo n.º 1
0
 /// <summary>
 /// Serializes an <see cref="XmlCodeElement"/> to XML.
 /// </summary>
 /// <param name="comment">The XML code comment to serialize.</param>
 /// <param name="writer">The XmlWriter to serialize to.</param>
 protected void Serialize(XmlCodeElement comment, System.Xml.XmlWriter writer)
 {
     if (comment != XmlCodeComment.Empty)
     {
         if (XmlElementRenderer.IsHandled(comment))
         {
             XmlRenderer renderer = XmlElementRenderer.Create(this, this.AssociatedEntry, comment);
             renderer.Render(writer);
         }
         else
         {
             if (comment is XmlContainerCodeElement)
             {
                 writer.WriteStartElement(comment.Element.ToString().ToLower());
                 foreach (XmlCodeElement element in ((XmlContainerCodeElement)comment).Elements)
                 {
                     this.Serialize(element, writer);
                 }
                 writer.WriteEndElement();
             }
             else
             {
                 writer.WriteStartElement(comment.Element.ToString().ToLower());
                 writer.WriteString(comment.Text);
                 writer.WriteEndElement();
             }
         }
     }
 }
Exemplo n.º 2
0
 private void RenderXmlBlock(System.Xml.XmlWriter writer, XmlCodeElement element)
 {
     if (element != null)
     {
         Serialize(element, writer);
     }
 }
Exemplo n.º 3
0
        private void WriteEntry(System.Xml.XmlWriter writer, ReflectedMember entryMember, string displayName, string type)
        {
            CRefPath       currentPath    = CRefPath.Create(entryMember);
            XmlCodeComment currentComment = this._xmlComments.GetComment(currentPath);

            writer.WriteStartElement("entry");
            writer.WriteAttributeString("id", entryMember.GetGloballyUniqueId().ToString());
            writer.WriteAttributeString("subId", string.Empty);
            writer.WriteAttributeString("type", type);
            writer.WriteAttributeString("visibility", ReflectionHelper.GetVisibility(entryMember));
            writer.WriteAttributeString("cref", currentPath.ToString());

            writer.WriteStartElement("name");
            writer.WriteString(displayName);
            writer.WriteEndElement();

            // find and output the summary
            if (currentComment != XmlCodeComment.Empty && currentComment.Elements != null)
            {
                XmlCodeElement summary = currentComment.Elements.Find(currentBlock => currentBlock is SummaryXmlCodeElement);
                if (summary != null)
                {
                    Serialize(summary, writer);
                }
            }
            writer.WriteEndElement();
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="assembly"></param>
        /// <param name="element"></param>
        /// <param name="text"></param>
        private static void ConvertElement(AssemblyDef assembly, XmlCodeElement element, StringBuilder text)
        {
            switch (element.Element)
            {
            case XmlCodeElements.Text:
                text.Append(element.Text);
                break;

            default:
                break;
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Checks if the <paramref name="element"/> is handled by an XmlElementRenderer.
        /// </summary>
        /// <param name="element">The element to check.</param>
        /// <returns>True if it can be handled else false.</returns>
        public static bool IsHandled(XmlCodeElement element)
        {
            bool isHandled = false;

            switch (element.Element)
            {
            case XmlCodeElements.See:
            case XmlCodeElements.List:
                isHandled = true;
                break;
            }

            return(isHandled);
        }
 private void WriteAsText(StringBuilder builder, XmlCodeElement element)
 {
     builder.Append("{");
     builder.Append(element.Element.ToString());
     builder.Append(":");
     builder.Append(element.Text);
     if (element is XmlContainerCodeElement)
     {
         foreach (XmlCodeElement child in ((XmlContainerCodeElement)element).Elements)
         {
             this.WriteAsText(builder, child);
         }
     }
     builder.Append("}");
 }
Exemplo n.º 7
0
        private void RenderParameters(System.Xml.XmlWriter writer, XmlCodeComment comment)
        {
            if (_member.Parameters.Count > 0)
            {
                writer.WriteStartElement("parameters");
                for (int i = 0; i < _member.Parameters.Count; i++)
                {
                    if (_member.Parameters[i].Sequence == 0)
                    {
                        continue;
                    }

                    TypeRef parameterType = _member.ResolveParameter(_member.Parameters[i].Sequence);
                    TypeDef foundEntry    = _member.Assembly.FindType(parameterType.Namespace, parameterType.Name);

                    writer.WriteStartElement("parameter");
                    writer.WriteAttributeString("name", _member.Parameters[i].Name);
                    writer.WriteStartElement("type");
                    if (foundEntry != null)
                    {
                        writer.WriteAttributeString("key", foundEntry.GetGloballyUniqueId().ToString());
                        writer.WriteAttributeString("cref", CRefPath.Create(foundEntry).ToString());
                    }
                    writer.WriteString(parameterType.GetDisplayName(false));
                    writer.WriteEndElement(); // type

                    if (comment != XmlCodeComment.Empty)
                    {
                        XmlCodeElement paramEntry = comment.Elements.Find(currentBlock =>
                                                                          currentBlock is ParamXmlCodeElement &&
                                                                          ((ParamXmlCodeElement)currentBlock).Name == _member.Parameters[i].Name);
                        if (paramEntry != null)
                        {
                            writer.WriteStartElement("description");
                            ParamXmlCodeElement paraElement = (ParamXmlCodeElement)paramEntry;
                            for (int j = 0; j < paraElement.Elements.Count; j++)
                            {
                                Serialize(paraElement.Elements[j], writer);
                            }
                            writer.WriteEndElement();
                        }
                    }

                    writer.WriteEndElement(); // parameter
                }
                writer.WriteEndElement();
            }
        }
Exemplo n.º 8
0
        /// <summary>
        /// Factory method for instantiating correct XmlElementRenderers for the specified
        /// <paramref name="element"/>.
        /// </summary>
        /// <param name="associatedEntry">The entry this comment element was taken from.</param>
        /// <param name="element">The XML code comment element to handle.</param>
        /// <returns>A valid XmlRenderer for the <paramref name="element"/>.</returns>
        public static XmlRenderer Create(XmlRenderer from, Entry associatedEntry, XmlCodeElement element)
        {
            XmlElementRenderer renderer = null;

            switch (element.Element)
            {
            case XmlCodeElements.See:
                renderer = new SeeXmlElementRenderer(associatedEntry, (SeeXmlCodeElement)element);
                break;

            case XmlCodeElements.List:
                renderer = new ListXmlElementRenderer(associatedEntry, (ListXmlCodeElement)element);
                break;
            }
            renderer.Document = from.Document; // need to pass the reference over

            return(renderer);
        }
Exemplo n.º 9
0
 /// <summary>
 /// Renders the generic types in XML.
 /// </summary>
 /// <param name="genericTypes">The generic types to render.</param>
 /// <param name="writer">The writer to write to.</param>
 /// <param name="comment">The XmlCodeComment to read comments from.</param>
 protected virtual void RenderGenericTypeParameters(List <GenericTypeRef> genericTypes, System.Xml.XmlWriter writer, XmlCodeComment comment)
 {
     writer.WriteStartElement("genericparameters");
     for (int i = 0; i < genericTypes.Count; i++)
     {
         writer.WriteStartElement("parameter");
         writer.WriteElementString("name", genericTypes[i].Name);
         writer.WriteStartElement("description");
         // find and output the summary
         if (comment != XmlCodeComment.Empty)
         {
             XmlCodeElement paramEntry = comment.Elements.Find(currentBlock =>
                                                               currentBlock is TypeParamXmlCodeElement &&
                                                               ((TypeParamXmlCodeElement)currentBlock).Name == genericTypes[i].Name);
             if (paramEntry != null)
             {
                 writer.WriteString(paramEntry.Text);
             }
         }
         writer.WriteEndElement(); // description
         writer.WriteEndElement(); // parameter
     }
     writer.WriteEndElement();
 }
Exemplo n.º 10
0
        public override void Render(System.Xml.XmlWriter writer)
        {
            CRefPath       crefPath = new CRefPath(_member);
            XmlCodeComment comment  = _xmlComments.GetComment(crefPath);

            writer.WriteStartElement("member");
            writer.WriteAttributeString("id", this.AssociatedEntry.Key.ToString());
            writer.WriteAttributeString("subId", this.AssociatedEntry.SubKey);
            writer.WriteAttributeString("type", ReflectionHelper.GetType(_member));
            WriteCref(AssociatedEntry, writer);

            writer.WriteStartElement("assembly");
            writer.WriteAttributeString("file", System.IO.Path.GetFileName(_member.Assembly.FileName));
            writer.WriteString(_member.Assembly.Name);
            writer.WriteEndElement();

            string displayName = _member.GetDisplayName(false);

            writer.WriteStartElement("name");
            writer.WriteAttributeString("safename", Exporter.CreateSafeName(displayName));
            writer.WriteString(displayName);
            writer.WriteEndElement();

            writer.WriteStartElement("namespace");
            Entry namespaceEntry = this.AssociatedEntry.FindNamespace(_member.Namespace);

            writer.WriteAttributeString("id", namespaceEntry.Key.ToString());
            writer.WriteAttributeString("name", namespaceEntry.SubKey);
            writer.WriteAttributeString("cref", $"N:{_member.Namespace}");
            writer.WriteString(_member.Namespace);
            writer.WriteEndElement();

            if (_member.IsGeneric)
            {
                RenderGenericTypeParameters(_member.GetGenericTypes(), writer, comment);
            }

            // find and output the summary
            if (comment != XmlCodeComment.Empty)
            {
                XmlCodeElement summary = comment.Elements.Find(currentBlock => currentBlock is SummaryXmlCodeElement);
                if (summary != null)
                {
                    this.Serialize(summary, writer);
                }
            }

            RenderSyntaxBlocks(_member, writer);
            RenderPermissionBlock(_member, writer, comment);

            // find and output the remarks
            if (comment != XmlCodeComment.Empty)
            {
                XmlCodeElement remarks = comment.Elements.Find(currentBlock => currentBlock is RemarksXmlCodeElement);
                if (remarks != null)
                {
                    Serialize(remarks, writer);
                }
            }

            // find and output the examples
            if (comment != XmlCodeComment.Empty)
            {
                XmlCodeElement remarks = comment.Elements.Find(currentBlock => currentBlock is ExampleXmlCodeElement);
                if (remarks != null)
                {
                    Serialize(remarks, writer);
                }
            }

            RenderSeeAlsoBlock(_member, writer, comment);

            if (_member.IsEnumeration)
            {
                writer.WriteStartElement("values");
                List <FieldDef> fields = _member.Fields;
                for (int i = 0; i < fields.Count; i++)
                {
                    if (fields[i].IsSystemGenerated)
                    {
                        continue;
                    }
                    CRefPath       currentPath    = CRefPath.Create(fields[i]);
                    XmlCodeComment currentComment = _xmlComments.GetComment(currentPath);

                    writer.WriteStartElement("value");
                    writer.WriteStartElement("name");
                    writer.WriteString(fields[i].Name);
                    writer.WriteEndElement();
                    writer.WriteStartElement("description");
                    if (currentComment != XmlCodeComment.Empty && currentComment.Elements != null)
                    {
                        XmlCodeElement summary = currentComment.Elements.Find(currentBlock => currentBlock is SummaryXmlCodeElement);
                        if (summary != null)
                        {
                            Serialize(summary, writer);
                        }
                    }
                    writer.WriteEndElement();
                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
            }
            else
            {
                if (_member.HasMembers)
                {
                    OutputMembers(writer);
                }
            }

            if (!_member.IsDelegate && !_member.IsEnumeration && !_member.IsInterface && !_member.IsStructure)
            {
                AddInheritanceTree(_member, writer);
            }

            writer.WriteEndElement();   // member
        }
Exemplo n.º 11
0
        private static Inline ParseInline(AssemblyDef assembly, XmlCodeElement element, ParsingSession session)
        {
            TraceHelper.WriteLine("parsing-inline: e({0})", element.Element.ToString());

            switch (element.Element)
            {
            // Invalid elements
            case XmlCodeElements.Code:
            case XmlCodeElements.Example:
            case XmlCodeElements.Exception:
            case XmlCodeElements.List:
            case XmlCodeElements.ListHeader:
            case XmlCodeElements.ListItem:
            case XmlCodeElements.Include:
            case XmlCodeElements.Para:
            case XmlCodeElements.Param:
            case XmlCodeElements.Permission:
            case XmlCodeElements.Remarks:
            case XmlCodeElements.Returns:
            case XmlCodeElements.Summary:
            case XmlCodeElements.TypeParam:
            case XmlCodeElements.Value:
                InvalidOperationException ex = new InvalidOperationException(
                    "Found a block level element where an inline element was expected."
                    );
                ex.Data["element"] = element;
                throw ex;

            case XmlCodeElements.B:
                return(new Bold(new Run(element.Text)));

            case XmlCodeElements.C:
                return(new C(element.Text));

            case XmlCodeElements.I:
                return(new Italic(new Run(element.Text)));

            case XmlCodeElements.ParamRef:
                return(new Italic(new Run(element.Text)));

            case XmlCodeElements.See:
                SeeXmlCodeElement seeElement = element as SeeXmlCodeElement;
                string            displayName;
                CrefEntryKey      key;
                if (Parser.ResolveMember(seeElement.Text, seeElement.Member, assembly, out key, out displayName))
                {
                    return(new See(key, displayName));
                }
                else
                {
                    return(new Run(displayName));
                }

            case XmlCodeElements.SeeAlso:
                SeeAlsoXmlCodeElement seeAlsoElement = element as SeeAlsoXmlCodeElement;
                // key and displayname defined in see
                if (Parser.ResolveMember(seeAlsoElement.Text, seeAlsoElement.Member, assembly, out key, out displayName))
                {
                    return(new SeeAlso(key, displayName));
                }
                else
                {
                    return(new SeeAlso(displayName));
                }

            case XmlCodeElements.Text:
                return(new Run(element.Text));

            case XmlCodeElements.TypeParamRef:
                return(new Italic(new Run(element.Text)));
            }

            throw new Exception("Unknown inline parsing error.");
        }
Exemplo n.º 12
0
        private static Block ParseBlock(AssemblyDef assembly, XmlCodeElement element, ParsingSession session)
        {
            TraceHelper.WriteLine("parsing-block: e({0})", element.Element.ToString());

            CrefEntryKey crefEntryKey;
            Inline       link;
            string       displayName;

            switch (element.Element)
            {
            // Invalid inline elements
            case XmlCodeElements.C:
            case XmlCodeElements.ParamRef:
            case XmlCodeElements.See:
            case XmlCodeElements.SeeAlso:
            case XmlCodeElements.Text:
            case XmlCodeElements.TypeParamRef:
                InvalidOperationException ex = new InvalidOperationException(
                    "Found an inline element where a block level element was expected."
                    );
                ex.Data["element"] = element;
                throw ex;

            case XmlCodeElements.Include:
                InvalidOperationException includeEx = new InvalidOperationException(
                    "Found an include comment element, the c# parser has failed."
                    );
                includeEx.Data["element"] = element;
                throw includeEx;

            // End points
            case XmlCodeElements.Code:
                return(new Code(element.Text));

            case XmlCodeElements.Exception:
                ExceptionXmlCodeElement exceptionElement = element as ExceptionXmlCodeElement;

                if (Parser.ResolveMember(exceptionElement.Text, exceptionElement.Member, assembly, out crefEntryKey, out displayName))
                {
                    link = link = Parser.CreateHyperlink(crefEntryKey, exceptionElement.Member.TypeName);
                }
                else
                {
                    if (string.IsNullOrEmpty(displayName))
                    {
                        link = new Run(exceptionElement.Member.TypeName);
                    }
                    else
                    {
                        link = new Run(displayName);
                    }
                }

                return(new ExceptionEntry(link, Parser.Parse(assembly, element as ExceptionXmlCodeElement)));

            case XmlCodeElements.Example:
                ExampleXmlCodeElement exampleElement = element as ExampleXmlCodeElement;
                return(new Example(Parser.Parse(assembly, exampleElement)));

            case XmlCodeElements.Para:
                ParaXmlCodeElement paraElement = element as ParaXmlCodeElement;
                return(new Para(Parser.Parse(assembly, paraElement)));

            case XmlCodeElements.Permission:
                PermissionXmlCodeElement permissionElement = element as PermissionXmlCodeElement;

                if (Parser.ResolveMember(permissionElement.Text, permissionElement.Member, assembly, out crefEntryKey, out displayName))
                {
                    link = link = Parser.CreateHyperlink(crefEntryKey, permissionElement.Member.TypeName);
                }
                else
                {
                    if (string.IsNullOrEmpty(displayName))
                    {
                        link = new Run(permissionElement.Member.TypeName);
                    }
                    else
                    {
                        link = new Run(displayName);
                    }
                }

                return(new PermissionEntry(link, Parser.Parse(assembly, element as PermissionXmlCodeElement)));

            case XmlCodeElements.Remarks:
                return(new Remarks(Parser.Parse(assembly, element as RemarksXmlCodeElement)));

            case XmlCodeElements.Returns:
                return(new Returns(Parser.Parse(assembly, element as ReturnsXmlCodeElement)));

            case XmlCodeElements.Summary:
                return(new Summary(Parser.Parse(assembly, element as SummaryXmlCodeElement)));

            case XmlCodeElements.Value:
                return(new Value(Parser.Parse(assembly, element as ValueXmlCodeElement)));

            case XmlCodeElements.Param:
                return(new Param(((ParamXmlCodeElement)element).Name, Parser.Parse(assembly, element as ParamXmlCodeElement)));

            case XmlCodeElements.TypeParam:
                TypeParamXmlCodeElement typeParamElement = (TypeParamXmlCodeElement)element;
                return(new TypeParamEntry(typeParamElement.Name, typeParamElement.Text));

            case XmlCodeElements.List:
                ListXmlCodeElement listElement = (ListXmlCodeElement)element;
                return(Parser.ParseList(assembly, listElement));

            case XmlCodeElements.Term:
            case XmlCodeElements.Description:
                Section termOrDescription = new Section();
                termOrDescription.Blocks.AddRange(Parser.Parse(assembly, (XmlContainerCodeElement)element));
                return(termOrDescription);

                break;
            }

            throw new Exception("WTF, block parsing error");
        }
Exemplo n.º 13
0
        public override void Render(System.Xml.XmlWriter writer)
        {
            CRefPath       crefPath = new CRefPath(_member);
            XmlCodeComment comment  = _xmlComments.GetComment(crefPath);

            writer.WriteStartElement("member");
            writer.WriteAttributeString("id", AssociatedEntry.Key.ToString());
            writer.WriteAttributeString("subId", AssociatedEntry.SubKey);
            writer.WriteAttributeString("type", ReflectionHelper.GetType(_member));
            writer.WriteAttributeString("cref", crefPath.ToString());
            writer.WriteStartElement("name");
            writer.WriteAttributeString("safename", Exporter.CreateSafeName(_member.Name));
            writer.WriteString(_member.Name);
            writer.WriteEndElement();

            writer.WriteStartElement("namespace");
            Entry namespaceEntry = this.AssociatedEntry.FindNamespace(_member.Type.Namespace);

            writer.WriteAttributeString("id", namespaceEntry.Key.ToString());
            writer.WriteAttributeString("name", namespaceEntry.SubKey);
            writer.WriteAttributeString("cref", $"N:{_member.Type.Namespace}");
            writer.WriteString(_member.Type.Namespace);
            writer.WriteEndElement();
            writer.WriteStartElement("assembly");
            writer.WriteAttributeString("file", System.IO.Path.GetFileName(_member.Assembly.FileName));
            writer.WriteString(_member.Assembly.Name);
            writer.WriteEndElement();

            // find and output the summary
            if (comment != XmlCodeComment.Empty)
            {
                XmlCodeElement summary = comment.Elements.Find(currentBlock => currentBlock is SummaryXmlCodeElement);
                if (summary != null)
                {
                    Serialize(summary, writer);
                }
            }

            this.RenderPermissionBlock(_member, writer, comment);
            this.RenderSyntaxBlocks(_member, writer);

            // find and output the value
            if (comment != XmlCodeComment.Empty)
            {
                XmlCodeElement remarks = comment.Elements.Find(currentBlock => currentBlock is ValueXmlCodeElement);
                if (remarks != null)
                {
                    Serialize(remarks, writer);
                }
            }

            // find and output the summary
            if (comment != XmlCodeComment.Empty)
            {
                XmlCodeElement remarks = comment.Elements.Find(currentBlock => currentBlock is RemarksXmlCodeElement);
                if (remarks != null)
                {
                    Serialize(remarks, writer);
                }
            }

            // find and output the examples
            if (comment != XmlCodeComment.Empty)
            {
                XmlCodeElement remarks = comment.Elements.Find(currentBlock => currentBlock is ExampleXmlCodeElement);
                if (remarks != null)
                {
                    Serialize(remarks, writer);
                }
            }

            RenderSeeAlsoBlock(_member, writer, comment);

            writer.WriteEndElement();
        }
        public override void Render(System.Xml.XmlWriter writer)
        {
            CRefPath       crefPath    = new CRefPath(_member);
            XmlCodeComment comment     = _xmlComments.GetComment(crefPath);
            string         displayName = new DisplayNameSignitureConvertor(_member, false, true).Convert();

            writer.WriteStartElement("member");
            writer.WriteAttributeString("id", AssociatedEntry.Key.ToString());
            writer.WriteAttributeString("subId", AssociatedEntry.SubKey);
            writer.WriteAttributeString("type", ReflectionHelper.GetType(_member));
            WriteCref(AssociatedEntry, writer);
            writer.WriteStartElement("name");
            writer.WriteAttributeString("safename", displayName);
            writer.WriteString(displayName);
            writer.WriteEndElement();

            writer.WriteStartElement("namespace");
            Entry namespaceEntry = AssociatedEntry.FindNamespace(_member.OwningType.Namespace);

            writer.WriteAttributeString("id", namespaceEntry.Key.ToString());
            writer.WriteAttributeString("name", namespaceEntry.SubKey);
            writer.WriteAttributeString("cref", $"N:{_member.OwningType.Namespace}");
            writer.WriteString(_member.OwningType.Namespace);
            writer.WriteEndElement();
            writer.WriteStartElement("assembly");
            writer.WriteAttributeString("file", System.IO.Path.GetFileName(_member.Assembly.FileName));
            writer.WriteString(_member.Assembly.Name);
            writer.WriteEndElement();

            // find and output the summary
            if (comment != XmlCodeComment.Empty)
            {
                XmlCodeElement summary = comment.Elements.Find(currentBlock => currentBlock is SummaryXmlCodeElement);
                if (summary != null)
                {
                    Serialize(summary, writer);
                }
            }

            RenderExceptionBlock(_member, writer, comment);
            RenderPermissionBlock(_member, writer, comment);
            RenderSyntaxBlocks(_member, writer);

            MethodDef internalMethod = _member.Getter == null ? _member.Setter : _member.Getter;

            if (_member.IsIndexer() && internalMethod.Parameters.Count > 0)
            {
                writer.WriteStartElement("parameters");
                for (int i = 0; i < internalMethod.Parameters.Count; i++)
                {
                    if (internalMethod.Parameters[i].Sequence == 0)
                    {
                        continue;
                    }

                    TypeRef parameterType = internalMethod.ResolveParameter(internalMethod.Parameters[i].Sequence);
                    TypeDef foundEntry    = _member.Assembly.FindType(parameterType.Namespace, parameterType.Name);

                    writer.WriteStartElement("parameter");
                    writer.WriteAttributeString("name", internalMethod.Parameters[i].Name);
                    writer.WriteStartElement("type");
                    if (foundEntry != null)
                    {
                        writer.WriteAttributeString("key", foundEntry.GetGloballyUniqueId().ToString());
                        writer.WriteAttributeString("cref", CRefPath.Create(foundEntry).ToString());
                    }
                    writer.WriteString(parameterType.GetDisplayName(false));
                    writer.WriteEndElement(); // type

                    if (comment != XmlCodeComment.Empty)
                    {
                        XmlCodeElement paramEntry = comment.Elements.Find(currentBlock =>
                                                                          currentBlock is ParamXmlCodeElement &&
                                                                          ((ParamXmlCodeElement)currentBlock).Name == internalMethod.Parameters[i].Name);
                        if (paramEntry != null)
                        {
                            writer.WriteStartElement("description");
                            ParamXmlCodeElement paraElement = (ParamXmlCodeElement)paramEntry;
                            for (int j = 0; j < paraElement.Elements.Count; j++)
                            {
                                Serialize(paraElement.Elements[j], writer);
                            }
                            writer.WriteEndElement();
                        }
                    }

                    writer.WriteEndElement(); // parameter
                }
                writer.WriteEndElement();
            }

            // find and output the value
            if (comment != XmlCodeComment.Empty)
            {
                XmlCodeElement remarks = comment.Elements.Find(currentBlock => currentBlock is ValueXmlCodeElement);
                if (remarks != null)
                {
                    Serialize(remarks, writer);
                }
            }

            // find and output the remarks
            if (comment != XmlCodeComment.Empty)
            {
                XmlCodeElement remarks = comment.Elements.Find(currentBlock => currentBlock is RemarksXmlCodeElement);
                if (remarks != null)
                {
                    Serialize(remarks, writer);
                }
            }

            // find and output the examples
            if (comment != XmlCodeComment.Empty)
            {
                XmlCodeElement remarks = comment.Elements.Find(currentBlock => currentBlock is ExampleXmlCodeElement);
                if (remarks != null)
                {
                    Serialize(remarks, writer);
                }
            }

            RenderSeeAlsoBlock(_member, writer, comment);

            writer.WriteEndElement();
        }