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); } } } } }
/// <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)); }
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; }
private void ClassifyXmlElementEndTag(XmlElementEndTagSyntax node) { AddXmlClassification( node.LessThanSlashToken, ClassificationTypeNames.XmlDocCommentDelimiter ); ClassifyXmlName(node.Name); AddXmlClassification( node.GreaterThanToken, ClassificationTypeNames.XmlDocCommentDelimiter ); }
public override void VisitXmlElementEndTag(XmlElementEndTagSyntax node) { if (!PreVisit(node)) { return; } node.Name?.Accept(this); base.VisitXmlElementEndTag(node); PostVisit(node); }
/// <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)); }
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; } }
/// <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)); }
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)); }
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); }
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; }
public override void VisitXmlElementEndTag(XmlElementEndTagSyntax node) { throw new NotImplementedException(); }
/// <summary> /// /// </summary> /// <param name="node"></param> public override sealed void VisitXmlElementEndTag(XmlElementEndTagSyntax node) { this.OnNodeVisited(node); if (!this.traverseRootOnly) base.VisitXmlElementEndTag(node); }
public override void VisitXmlElementEndTag(XmlElementEndTagSyntax node) { }
internal XmlElementEndTagSyntax Visit(XmlElementEndTagSyntax node) { return(node); }
public override Evaluation VisitXmlElementEndTag(XmlElementEndTagSyntax node) { node.Name?.Accept <Evaluation>(this); return(base.VisitXmlElementEndTag(node)); }
public override SyntaxNode VisitXmlElementEndTag(XmlElementEndTagSyntax node) { node = (XmlElementEndTagSyntax)base.VisitXmlElementEndTag(node); Classes.Add(node); return(node); }
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);
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)); }
public TameXmlElementEndTagSyntax(XmlElementEndTagSyntax node) { Node = node; AddChildren(); }