Exemplo n.º 1
0
        public static void Analyze(SyntaxNodeAnalysisContext context, DocumentationCommentTriviaSyntax documentationComment)
        {
            XmlElementSyntax summaryElement = FormatSummaryRefactoring.GetSummaryElement(documentationComment);

            if (summaryElement != null)
            {
                XmlElementStartTagSyntax startTag = summaryElement?.StartTag;

                if (startTag?.IsMissing == false)
                {
                    XmlElementEndTagSyntax endTag = summaryElement.EndTag;

                    if (endTag?.IsMissing == false &&
                        startTag.GetSpanEndLine() < endTag.GetSpanStartLine())
                    {
                        Match match = FormatSummaryRefactoring.Regex.Match(
                            summaryElement.ToString(),
                            startTag.Span.End - summaryElement.Span.Start,
                            endTag.Span.Start - startTag.Span.End);

                        if (match.Success)
                        {
                            context.ReportDiagnostic(
                                DiagnosticDescriptors.FormatDocumentationSummaryOnSingleLine,
                                summaryElement.GetLocation());
                        }
                    }
                }
            }
        }
        private static async Task <Document> FormatSummaryOnSingleLineAsync(
            Document document,
            DocumentationCommentTriviaSyntax documentationComment,
            CancellationToken cancellationToken)
        {
            SourceText sourceText = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);

            XmlElementSyntax summaryElement = documentationComment.SummaryElement();

            XmlElementStartTagSyntax startTag = summaryElement.StartTag;
            XmlElementEndTagSyntax   endTag   = summaryElement.EndTag;

            Match match = _formatSummaryOnSingleLineRegex.Match(
                summaryElement.ToString(),
                startTag.Span.End - summaryElement.SpanStart,
                endTag.SpanStart - startTag.Span.End);

            var textChange = new TextChange(
                new TextSpan(startTag.Span.End, match.Length),
                match.Groups[1].Value);

            SourceText newSourceText = sourceText.WithChanges(textChange);

            return(document.WithText(newSourceText));
        }
        private static void AnalyzeSingleLineDocumentationCommentTrivia(SyntaxNodeAnalysisContext context)
        {
            var documentationComment = (DocumentationCommentTriviaSyntax)context.Node;

            XmlElementSyntax summaryElement = documentationComment.SummaryElement();

            if (summaryElement != null)
            {
                XmlElementStartTagSyntax startTag = summaryElement?.StartTag;

                if (startTag?.IsMissing == false)
                {
                    XmlElementEndTagSyntax endTag = summaryElement.EndTag;

                    if (endTag?.IsMissing == false &&
                        startTag.GetSpanEndLine() < endTag.GetSpanStartLine())
                    {
                        Match match = _regex.Match(
                            summaryElement.ToString(),
                            startTag.Span.End - summaryElement.SpanStart,
                            endTag.SpanStart - startTag.Span.End);

                        if (match.Success)
                        {
                            DiagnosticHelpers.ReportDiagnostic(context,
                                                               DiagnosticDescriptors.FormatDocumentationSummaryOnSingleLine,
                                                               summaryElement);
                        }
                    }
                }
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Creates summary element syntax.
        /// </summary>
        /// <param name="content">The content.</param>
        /// <returns>A XmlElementSyntax.</returns>
        private static XmlElementSyntax CreateSummaryElementSyntax(string content)
        {
            XmlNameSyntax            xmlName         = SyntaxFactory.XmlName(SyntaxFactory.Identifier(DocumentationHeaderHelper.Summary));
            XmlElementStartTagSyntax summaryStartTag = SyntaxFactory.XmlElementStartTag(xmlName);
            XmlElementEndTagSyntax   summaryEndTag   = SyntaxFactory.XmlElementEndTag(xmlName);

            return(SyntaxFactory.XmlElement(
                       summaryStartTag,
                       SyntaxFactory.SingletonList <XmlNodeSyntax>(CreateSummaryTextSyntax(content)),
                       summaryEndTag));
        }
Exemplo n.º 5
0
 public new void AddChildren()
 {
     base.AddChildren();
     Kind               = Node.Kind();
     _startTag          = ((XmlElementSyntax)Node).StartTag;
     _startTagIsChanged = false;
     _content           = ((XmlElementSyntax)Node).Content;
     _contentIsChanged  = false;
     _contentCount      = _content.Count;
     _endTag            = ((XmlElementSyntax)Node).EndTag;
     _endTagIsChanged   = false;
 }
Exemplo n.º 6
0
 private void ClassifyXmlElementEndTag(XmlElementEndTagSyntax node)
 {
     AddXmlClassification(
         node.LessThanSlashToken,
         ClassificationTypeNames.XmlDocCommentDelimiter
         );
     ClassifyXmlName(node.Name);
     AddXmlClassification(
         node.GreaterThanToken,
         ClassificationTypeNames.XmlDocCommentDelimiter
         );
 }
Exemplo n.º 7
0
        public override void VisitXmlElementEndTag(XmlElementEndTagSyntax node)
        {
            if (!PreVisit(node))
            {
                return;
            }

            node.Name?.Accept(this);

            base.VisitXmlElementEndTag(node);

            PostVisit(node);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Creates return element syntax.
        /// </summary>
        /// <param name="content">The content.</param>
        /// <returns>A XmlElementSyntax.</returns>
        private static XmlElementSyntax CreateReturnElementSyntax(string content)
        {
            XmlNameSyntax xmlName = SyntaxFactory.XmlName("returns");
            /// <returns>[0]xxx[1]</returns>[2]

            XmlElementStartTagSyntax startTag = SyntaxFactory.XmlElementStartTag(xmlName);

            XmlTextSyntax contentText = SyntaxFactory.XmlText(content);

            XmlElementEndTagSyntax endTag = SyntaxFactory.XmlElementEndTag(xmlName);

            return(SyntaxFactory.XmlElement(startTag, SyntaxFactory.SingletonList <XmlNodeSyntax>(contentText), endTag));
        }
Exemplo n.º 9
0
        private void FormatXmlElementEndTag(XmlElementEndTagSyntax node, ElementFormatting formatting)
        {
            if (formatting.HasFlag(ElementFormatting.SnugEnd))
            {
                Break(BreakMode.SuppressWordBreak);
            }
            else if (formatting.HasFlag(ElementFormatting.Block))
            {
                Break(BreakMode.LineBreak);
            }

            // A snug-end element normally causes unindentation to happen after the end tag, but
            // there is a special case for when the content of a snug block element forced a line
            // break before the end tag (presumably because the content was a block element).
            // This makes a snug block element that contains a block element behave like a block
            // element.
            bool unsnug           = formatting.HasFlag(ElementFormatting.Block | ElementFormatting.Snug) && _breakMode.HasFlag(BreakMode.LineBreak);
            bool unindentAfterTag = formatting.HasFlag(ElementFormatting.SnugEnd) && !unsnug;

            if (formatting.HasFlag(ElementFormatting.Indent) && !unindentAfterTag)
            {
                _interiorIndent -= _indentSize;
            }

            if (node.HasLeadingTrivia)
            {
                AddTrivia(node.GetLeadingTrivia());
            }

            if (formatting.HasFlag(ElementFormatting.Preserve))
            {
                _preserve -= 1;
            }

            FormatElementEndTag(node);

            if (node.HasTrailingTrivia)
            {
                AddTrivia(node.GetTrailingTrivia());
            }

            if (formatting.HasFlag(ElementFormatting.Block))
            {
                Break(BreakMode.LineBreak);
            }

            if (formatting.HasFlag(ElementFormatting.Indent) && unindentAfterTag)
            {
                _interiorIndent -= _indentSize;
            }
        }
Exemplo n.º 10
0
        /// <summary>
        /// Creates parameter element syntax.
        /// </summary>
        /// <param name="parameterName">The parameter name.</param>
        /// <param name="parameterContent">The parameter content.</param>
        /// <returns>A XmlElementSyntax.</returns>
        private static XmlElementSyntax CreateParameterElementSyntax(string parameterName, string parameterContent)
        {
            XmlNameSyntax paramName = SyntaxFactory.XmlName("param");

            /// <param name="parameterName">[0][1]</param>[2]

            // [0] -- param start tag with attribute
            XmlNameAttributeSyntax   paramAttribute = SyntaxFactory.XmlNameAttribute(parameterName);
            XmlElementStartTagSyntax startTag       = SyntaxFactory.XmlElementStartTag(paramName, SyntaxFactory.SingletonList <XmlAttributeSyntax>(paramAttribute));

            // [1] -- content
            XmlTextSyntax content = SyntaxFactory.XmlText(parameterContent);

            // [2] -- end tag
            XmlElementEndTagSyntax endTag = SyntaxFactory.XmlElementEndTag(paramName);

            return(SyntaxFactory.XmlElement(startTag, SyntaxFactory.SingletonList <SyntaxNode>(content), endTag));
        }
Exemplo n.º 11
0
        private static Task <Document> FormatSummaryOnSingleLineAsync(
            Document document,
            DocumentationCommentTriviaSyntax documentationComment,
            CancellationToken cancellationToken)
        {
            XmlElementSyntax summaryElement = documentationComment.SummaryElement();

            XmlElementStartTagSyntax startTag = summaryElement.StartTag;
            XmlElementEndTagSyntax   endTag   = summaryElement.EndTag;

            Match match = _formatSummaryOnSingleLineRegex.Match(
                summaryElement.ToString(),
                startTag.Span.End - summaryElement.SpanStart,
                endTag.SpanStart - startTag.Span.End);

            return(document.WithTextChangeAsync(
                       new TextSpan(startTag.Span.End, match.Length),
                       match.Groups[1].Value,
                       cancellationToken));
        }
Exemplo n.º 12
0
        private void FormatElementEndTag(XmlElementEndTagSyntax node)
        {
            if (node.ContainsSkippedText)
            {
                AddWord(node.Span);
            }
            else
            {
                AddWord(node.LessThanSlashToken.Span);

                EnqueueTrailingTriviaChange(node.LessThanSlashToken, string.Empty);

                EnqueueLeadingTriviaChange(node.Name, string.Empty);

                FormatTagName(node.Name);

                EnqueueTrailingTriviaChange(node.Name, string.Empty);

                EnqueueLeadingTriviaChange(node.GreaterThanToken, string.Empty);

                AddWord(node.GreaterThanToken.Span);
            }
        }
        private static bool IsFirstOnLine(XmlElementEndTagSyntax xmlElementEndTag)
        {
            // Need to examine the last content text
            SyntaxList <XmlNodeSyntax> parentContent;

            if (xmlElementEndTag.Parent is XmlElementSyntax xmlElement)
            {
                parentContent = xmlElement.Content;
            }
            else
            {
                return(false);
            }

            for (int i = parentContent.Count - 1; i >= 0; i--)
            {
                if (!(parentContent[i] is XmlTextSyntax xmlText))
                {
                    return(false);
                }

                for (int j = xmlText.TextTokens.Count - 1; j >= 0; j--)
                {
                    if (xmlText.TextTokens[j].IsKind(SyntaxKind.XmlTextLiteralNewLineToken))
                    {
                        return(true);
                    }
                    else if (!string.IsNullOrWhiteSpace(xmlText.TextTokens[j].ValueText))
                    {
                        return(false);
                    }
                }
            }

            return(false);
        }
Exemplo n.º 14
0
 public override SyntaxNode VisitXmlElementEndTag(XmlElementEndTagSyntax node)
 => IsValueName(node.Name)
         ? node.ReplaceNode(node.Name, ConvertToReturns(node.Name))
         : base.VisitXmlElementEndTag(node);
 /// <summary>
 /// 
 /// </summary>
 /// <param name="node"></param>
 public override sealed void VisitXmlElementEndTag(XmlElementEndTagSyntax node)
 {
     this.OnNodeVisited(node, this.type.IsInstanceOfType(node));
     base.VisitXmlElementEndTag(node);
 }
 private void ClassifyXmlElementEndTag(XmlElementEndTagSyntax node)
 {
     AddXmlClassification(node.LessThanSlashToken, ClassificationTypeNames.XmlDocCommentDelimiter);
     ClassifyXmlName(node.Name);
     AddXmlClassification(node.GreaterThanToken, ClassificationTypeNames.XmlDocCommentDelimiter);
 }
 internal XmlElementEndTagSyntax Visit(XmlElementEndTagSyntax node)
 {
     return node;
 }
Exemplo n.º 18
0
 public override void VisitXmlElementEndTag(XmlElementEndTagSyntax node)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 19
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="node"></param>
 public override sealed void VisitXmlElementEndTag(XmlElementEndTagSyntax node)
 {
     this.OnNodeVisited(node);
     if (!this.traverseRootOnly) base.VisitXmlElementEndTag(node);
 }
Exemplo n.º 20
0
 public override void VisitXmlElementEndTag(XmlElementEndTagSyntax node)
 {
 }
Exemplo n.º 21
0
 internal XmlElementEndTagSyntax Visit(XmlElementEndTagSyntax node)
 {
     return(node);
 }
Exemplo n.º 22
0
        public override Evaluation VisitXmlElementEndTag(XmlElementEndTagSyntax node)
        {
            node.Name?.Accept <Evaluation>(this);

            return(base.VisitXmlElementEndTag(node));
        }
Exemplo n.º 23
0
 public override SyntaxNode VisitXmlElementEndTag(XmlElementEndTagSyntax node)
 {
     node = (XmlElementEndTagSyntax)base.VisitXmlElementEndTag(node);
     Classes.Add(node);
     return(node);
 }
Exemplo n.º 24
0
        public override void VisitXmlElementEndTag(XmlElementEndTagSyntax node)
        {
            node.Name?.Accept(this);

            base.VisitXmlElementEndTag(node);
        }
 //
 // Summary:
 //     Called when the visitor visits a XmlElementEndTagSyntax node.
 public virtual void VisitXmlElementEndTag(XmlElementEndTagSyntax node);
Exemplo n.º 26
0
 public override void VisitXmlElementEndTag(XmlElementEndTagSyntax node)
 {
     Debug.Fail(node.ToString());
     base.VisitXmlElementEndTag(node);
 }
 private static bool IsLastOnLine(XmlElementEndTagSyntax xmlElementEndTag)
 {
     // Need to examine the following sibling of the parent
     return(xmlElementEndTag.Parent is XmlElementSyntax xmlElement &&
            IsLastOnLine(xmlElement));
 }
Exemplo n.º 28
0
 public TameXmlElementEndTagSyntax(XmlElementEndTagSyntax node)
 {
     Node = node;
     AddChildren();
 }