protected override void WriteParameterName(ISymbol symbol, SymbolDisplayPart part)
        {
            if (DocumentationDisplayMode == DocumentationDisplayMode.ToolTip)
            {
                XElement element = DocumentationProvider?
                                   .GetXmlDocumentation(symbol)?
                                   .Element(WellKnownXmlTags.Param, "name", part.ToString());

                if (element != null)
                {
                    WriteStartElement("span");
                    WriteStartAttribute("title");
                    WriteDocumentationCommentToolTip(element);
                    WriteEndAttribute();
                }

                base.WriteParameterName(symbol, part);

                if (element != null)
                {
                    WriteEndElement();
                }
            }
            else
            {
                base.WriteParameterName(symbol, part);
            }
        }
Beispiel #2
0
        public override void WriteDocumentationComment(ISymbol symbol)
        {
            IEnumerable <string> elements = DocumentationProvider?.GetXmlDocumentation(symbol)?.GetElementsAsText(skipEmptyElement: true, makeSingleLine: true);

            if (elements == null)
            {
                return;
            }

            foreach (string element in elements)
            {
                WriteDocumentation(element);
            }

            void WriteDocumentation(string element)
            {
                using (var sr = new StringReader(element))
                {
                    string line = null;

                    while ((line = sr.ReadLine()) != null)
                    {
                        WriteLine(line);
                        WriteIndentation();
                    }
                }
            }
        }
        public override void WriteDocumentationComment(ISymbol symbol)
        {
            IEnumerable <string> elements = DocumentationProvider?.GetXmlDocumentation(symbol)?.GetElementsAsText(skipEmptyElement: true, makeSingleLine: true);

            if (elements == null)
            {
                return;
            }

            using (IEnumerator <string> en = elements.GetEnumerator())
            {
                if (en.MoveNext())
                {
                    WriteStartElement("doc");
                    do
                    {
                        WriteDocumentation(en.Current);
                    }while (en.MoveNext());

                    _writer.WriteWhitespace(_writer.Settings.NewLineChars);

                    for (int i = 1; i < Depth; i++)
                    {
                        _writer.WriteWhitespace(_writer.Settings.IndentChars);
                    }

                    WriteEndElement();
                }
            }

            void WriteDocumentation(string element)
            {
                using (var sr = new StringReader(element))
                {
                    string line = null;
                    while ((line = sr.ReadLine()) != null)
                    {
                        _writer.WriteWhitespace(_writer.Settings.NewLineChars);

                        for (int i = 0; i < Depth; i++)
                        {
                            _writer.WriteWhitespace(_writer.Settings.IndentChars);
                        }

                        _writer.WriteRaw(line);
                    }
                }
            }
        }
        private void WriteDocumentationCommentToolTip(ISymbol symbol)
        {
            Debug.Assert(DocumentationDisplayMode == DocumentationDisplayMode.ToolTip, DocumentationDisplayMode.ToString());

            SymbolXmlDocumentation xmlDocumentation = DocumentationProvider?.GetXmlDocumentation(symbol);

            if (xmlDocumentation == null)
            {
                return;
            }

            XElement summaryElement = xmlDocumentation.Element(WellKnownXmlTags.Summary);

            if (summaryElement != null)
            {
                WriteStartAttribute("title");
                WriteDocumentationCommentToolTip(summaryElement);
            }

            var hasExceptions = false;

            using (IEnumerator <XElement> en = xmlDocumentation.Elements(WellKnownXmlTags.Exception).GetEnumerator())
            {
                if (en.MoveNext())
                {
                    hasExceptions = true;

                    if (summaryElement != null)
                    {
                        Write("\n\n");
                    }
                    else
                    {
                        WriteStartAttribute("title");
                    }

                    Write("Exceptions:");

                    do
                    {
                        Write("\n  ");

                        string commentId = en.Current.Attribute("cref").Value;

                        if (commentId != null)
                        {
                            ISymbol exceptionSymbol = DocumentationProvider.GetFirstSymbolForDeclarationId(commentId);

                            if (exceptionSymbol != null)
                            {
                                Write(exceptionSymbol.ToDisplayParts(Format.GetFormat()));
                            }
                            else
                            {
                                Write(TextUtility.RemovePrefixFromDocumentationCommentId(commentId));
                            }
                        }
                    } while (en.MoveNext());
                }
            }

            if (summaryElement != null ||
                hasExceptions)
            {
                WriteEndAttribute();
            }
        }
        public override void WriteDocumentationComment(ISymbol symbol)
        {
            Debug.Assert(DocumentationDisplayMode == DocumentationDisplayMode.Xml, DocumentationDisplayMode.ToString());

            IEnumerable <string> elementsText = DocumentationProvider?.GetXmlDocumentation(symbol)?.GetElementsAsText(skipEmptyElement: true, makeSingleLine: true);

            if (elementsText == null)
            {
                return;
            }

            foreach (string elementText in elementsText)
            {
                XElement element = XElement.Parse(elementText, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);

                Dictionary <int, List <XElement> > elementsByLine = null;

                foreach (XElement e in element.Descendants())
                {
                    switch (XmlTagMapper.GetTagOrDefault(e.Name.LocalName))
                    {
                    case XmlTag.See:
                    case XmlTag.ParamRef:
                    case XmlTag.TypeParamRef:
                    {
                        int lineNumber = ((IXmlLineInfo)e).LineNumber;

                        if (elementsByLine == null)
                        {
                            elementsByLine = new Dictionary <int, List <XElement> >();
                        }

                        if (elementsByLine.ContainsKey(lineNumber))
                        {
                            elementsByLine[lineNumber].Add(e);
                        }
                        else
                        {
                            elementsByLine.Add(lineNumber, new List <XElement>()
                                {
                                    e
                                });
                        }

                        break;
                    }
                    }
                }

                using (var sr = new StringReader(elementText))
                {
                    int lineNumber = 1;

                    string line = null;

                    while ((line = sr.ReadLine()) != null)
                    {
                        Write("/// ");

                        if (elementsByLine != null &&
                            elementsByLine.TryGetValue(lineNumber, out List <XElement> elements))
                        {
                            int lastPos = 0;

                            foreach (XElement e in elements.OrderBy(e => ((IXmlLineInfo)e).LinePosition))
                            {
                                int linePos = ((IXmlLineInfo)e).LinePosition - 2;

                                switch (XmlTagMapper.GetTagOrDefault(e.Name.LocalName))
                                {
                                case XmlTag.ParamRef:
                                case XmlTag.TypeParamRef:
                                {
                                    string name = e.Attribute("name")?.Value;

                                    if (name != null)
                                    {
                                        Write(line.Substring(lastPos, linePos - lastPos));
                                        Write(name);
                                    }

                                    lastPos = linePos + e.ToString().Length;
                                    break;
                                }

                                case XmlTag.See:
                                {
                                    string commentId = e.Attribute("cref")?.Value;

                                    if (commentId != null)
                                    {
                                        Write(line.Substring(lastPos, linePos - lastPos));

                                        ISymbol s = DocumentationProvider.GetFirstSymbolForDeclarationId(commentId)?.OriginalDefinition;

                                        if (s != null)
                                        {
                                            if (s.Kind == SymbolKind.Field &&
                                                s.ContainingType.TypeKind == TypeKind.Enum)
                                            {
                                                WriteSymbol(s.ContainingType);
                                                Write(".");
                                                Write(s.Name);
                                            }
                                            else
                                            {
                                                WriteParts(s, s.ToDisplayParts(TypeSymbolDisplayFormats.Name_ContainingTypes_Namespaces_GlobalNamespace_TypeParameters));
                                                WriteSymbol(s);
                                            }
                                        }
                                        else
                                        {
                                            Debug.Fail(commentId);
                                            Write(TextUtility.RemovePrefixFromDocumentationCommentId(commentId));
                                        }
                                    }
                                    else
                                    {
                                        string langword = e.Attribute("langword")?.Value;

                                        if (langword != null)
                                        {
                                            Write(line.Substring(lastPos, linePos - lastPos));
                                            Write(langword);
                                        }
                                    }

                                    lastPos = linePos + e.ToString().Length;
                                    break;
                                }
                                }
                            }

                            WriteLine(line.Substring(lastPos));
                        }
                        else
                        {
                            WriteLine(line);
                        }

                        WriteIndentation();

                        lineNumber++;
                    }
                }
            }
        }