Esempio n. 1
0
 protected override IndentationResult?GetDesiredIndentationWorker(
     Indenter indenter,
     SyntaxToken?tokenOpt,
     SyntaxTrivia?triviaOpt
     ) =>
 TryGetDesiredIndentation(indenter, triviaOpt)
 ?? TryGetDesiredIndentation(indenter, tokenOpt);
Esempio n. 2
0
                public IEnumerable <SyntaxNode> Nodes(ISet <int> references, SyntaxTrivia?previous)
                {
                    SyntaxNode first  = null;
                    SyntaxNode second = null;

                    if (references.Contains(this.number))
                    {
                        first  = SyntaxFactory.LabeledStatement(Label(this.number), SyntaxFactory.EmptyStatement());
                        second = this.node;
                    }
                    else
                    {
                        first = this.node;
                    }

                    if (previous.HasValue)
                    {
                        first = first.WithLeadingTrivia(previous.Value);
                    }

                    yield return(first);

                    if (second != null)
                    {
                        yield return(second);
                    }
                }
Esempio n. 3
0
        internal static SyntaxTrivia EndOfLine(string text, bool elastic = false)
        {
            SyntaxTrivia?trivia = null;

            // use predefined trivia
            switch (text)
            {
            case "\r":
                trivia = elastic ? ElasticCarriageReturn : CarriageReturn;
                break;

            case "\n":
                trivia = elastic ? ElasticLineFeed : LineFeed;
                break;

            case "\r\n":
                trivia = elastic ? ElasticCarriageReturnLineFeed : CarriageReturnLineFeed;
                break;
            }

            // note: predefined trivia might not yet be defined during initialization
            if (trivia != null)
            {
                return(trivia);
            }

            trivia = SyntaxTrivia.Create(SyntaxKind.EndOfLineTrivia, text);
            if (!elastic)
            {
                return(trivia);
            }

            return(trivia.WithAnnotationsGreen(new[] { SyntaxAnnotation.ElasticAnnotation }));
        }
Esempio n. 4
0
        private static IndentationResult?TryGetDesiredIndentation(Indenter indenter, SyntaxTrivia?triviaOpt)
        {
            // If we have a // comment, and it's the only thing on the line, then if we hit enter, we should align to
            // that.  This helps for cases like:
            //
            //          int goo; // this comment
            //                   // continues
            //                   // onwards
            //
            // The user will have to manually indent `// continues`, but we'll respect that indentation from that point on.

            if (triviaOpt == null)
            {
                return(null);
            }

            var trivia = triviaOpt.Value;

            if (!trivia.IsSingleOrMultiLineComment() && !trivia.IsDocComment())
            {
                return(null);
            }

            var line = indenter.Text.Lines.GetLineFromPosition(trivia.FullSpan.Start);

            if (line.GetFirstNonWhitespacePosition() != trivia.FullSpan.Start)
            {
                return(null);
            }

            // Previous line just contained this single line comment.  Align us with it.
            return(new IndentationResult(trivia.FullSpan.Start, 0));
        }
Esempio n. 5
0
        public static SyntaxTrivia DetermineEndOfLine(SyntaxToken token, SyntaxTrivia?defaultValue = null)
        {
            SyntaxTrivia trivia = FindEndOfLine(token);

            return((trivia.IsEndOfLineTrivia())
                ? trivia
                : defaultValue ?? CSharpFactory.NewLine());
        }
        public static Document RewriteDocument(Document document, SyntaxNode root,
                                               SyntaxNode targetNode, SyntaxTrivia?replacementTrivia = null)
        {
            replacementTrivia = replacementTrivia ?? SyntaxFactory.ElasticMarker;

            var rewritten = new CommentRemovalRewriter(replacementTrivia.Value).Visit(targetNode);

            return(document.WithSyntaxRoot(root.ReplaceNode(targetNode, rewritten)));
        }
Esempio n. 7
0
        internal static SyntaxTrivia GetBestNewLineTrivia(SyntaxTriviaList list, SyntaxTrivia?defaultNewLineTrivia = null)
        {
            SyntaxTrivia trivia;

            if (TryGetExistingNewLine(list, out trivia))
            {
                return(trivia);
            }

            return(defaultNewLineTrivia ?? SyntaxFactory.CarriageReturnLineFeed);
        }
Esempio n. 8
0
        /// <summary>
        /// Look at the context of the node to determine the best possible new line trivia.  It will prefer
        /// existing new lines over creating a new one to help ensure the same new lines are preserved
        /// throughout the file.
        /// </summary>
        internal static SyntaxTrivia GetBestNewLineTrivia(SyntaxNode node, SyntaxTrivia?defaultNewLineTrivia = null)
        {
            SyntaxTrivia trivia;

            if (TryGetExistingNewLine(node.GetLeadingTrivia(), out trivia) ||
                TryGetExistingNewLine(node.GetTrailingTrivia(), out trivia))
            {
                return(trivia);
            }

            return(defaultNewLineTrivia ?? SyntaxFactory.CarriageReturnLineFeed);
        }
            private void AddEndOfLine(SyntaxTrivia?eolTrivia)
            {
                if (!eolTrivia.HasValue)
                {
                    return;
                }

                if (_residualTrivia.Count == 0 || !IsEndOfLine(_residualTrivia[_residualTrivia.Count - 1]))
                {
                    _residualTrivia.Add(eolTrivia.Value);
                }
            }
Esempio n. 10
0
        internal static SyntaxTrivia GetBestNewLineTrivia(SyntaxToken token, SyntaxTrivia?defaultNewLineTrivia = null)
        {
            SyntaxTrivia trivia;

            if (TryGetExistingNewLine(token.LeadingTrivia, out trivia) ||
                TryGetExistingNewLine(token.TrailingTrivia, out trivia))
            {
                return(trivia);
            }

            return(defaultNewLineTrivia ?? SyntaxFactory.CarriageReturnLineFeed);
        }
Esempio n. 11
0
        /// <inheritdoc />
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            SyntaxTrivia?v = (SyntaxTrivia?)value;

            if (value == null || !v.HasValue)
            {
                return(null);
            }
            var s = v.Value;

            return(s.Kind().ToString());
        }
Esempio n. 12
0
        public static SyntaxTriviaList ToSyntaxTriviaList(this IEnumerable <SyntaxTrivia> sequence)
        {
            SyntaxTrivia?first = sequence.FirstOrNullable();

            if (first == null)
            {
                return(default(SyntaxTriviaList));
            }
            else
            {
                return(((Syntax.InternalSyntax.InternalSyntaxNode)first.Value.UnderlyingNode).Language.SyntaxFactory.TriviaList(sequence));
            }
        }
Esempio n. 13
0
 public override void VisitSyntaxTrivia(SyntaxTrivia node)
 {
     // check if offset is inside the node's span
     if (CheckNodeContainsOffset(node))
     {
         // the node span contains the offset
         // check the predicate
         if (this.predicate(node))
         {
             // store the potential result
             this.Result = node;
         }
     }
 }
Esempio n. 14
0
 public static SyntaxTrivia DetermineEndOfLine(SyntaxNodeOrToken nodeOrToken, SyntaxTrivia?defaultValue = null)
 {
     if (nodeOrToken.IsNode)
     {
         return(DetermineEndOfLine(nodeOrToken.AsNode(), defaultValue));
     }
     else if (nodeOrToken.IsToken)
     {
         return(DetermineEndOfLine(nodeOrToken.AsToken(), defaultValue));
     }
     else
     {
         throw new ArgumentException("", nameof(nodeOrToken));
     }
 }
Esempio n. 15
0
        public static void CollectCommentBlockSpans(
            SyntaxTriviaList triviaList, ArrayBuilder <BlockSpan> spans)
        {
            if (triviaList.Count > 0)
            {
                SyntaxTrivia?startComment = null;
                SyntaxTrivia?endComment   = null;

                Action completeSingleLineCommentGroup = () =>
                {
                    if (startComment != null)
                    {
                        var singleLineCommentGroupRegion = CreateCommentBlockSpan(startComment.Value, endComment.Value);
                        spans.Add(singleLineCommentGroupRegion);
                        startComment = null;
                        endComment   = null;
                    }
                };

                // Iterate through trivia and collect the following:
                //    1. Groups of contiguous single-line comments that are only separated by whitespace
                //    2. Multi-line comments
                foreach (var trivia in triviaList)
                {
                    if (trivia.IsSingleLineComment())
                    {
                        startComment = startComment ?? trivia;
                        endComment   = trivia;
                    }
                    else if (trivia.IsMultiLineComment())
                    {
                        completeSingleLineCommentGroup();

                        var multilineCommentRegion = CreateCommentBlockSpan(trivia, trivia);
                        spans.Add(multilineCommentRegion);
                    }
                    else if (!trivia.MatchesKind(SyntaxKind.WhitespaceTrivia,
                                                 SyntaxKind.EndOfLineTrivia,
                                                 SyntaxKind.EndOfFileToken))
                    {
                        completeSingleLineCommentGroup();
                    }
                }

                completeSingleLineCommentGroup();
            }
        }
Esempio n. 16
0
            public IEnumerable <SyntaxNode> Statements()
            {
                SyntaxTrivia?previous = null;

                foreach (Line line in this.statements)
                {
                    SyntaxTrivia?next = line.Comment;
                    if (next == null)
                    {
                        foreach (SyntaxNode node in line.Nodes(this.references, previous))
                        {
                            yield return(node);
                        }
                    }

                    previous = next;
                }
            }
Esempio n. 17
0
 protected SyntaxNode GenerateAttribute(SyntaxNode syntaxNode, string name, SyntaxTrivia?leadingWhitespaceTrivia, SyntaxNode[] arguments)
 {
     return(GenerateAttribute(syntaxNode, name, leadingWhitespaceTrivia, arguments, null));
 }
Esempio n. 18
0
 private static T WithLeadingWhitespaceTrivia <T>(this T syntaxNode, SyntaxTrivia?leadingWhitespaceTrivia)
     where T : SyntaxNode
 {
     return(leadingWhitespaceTrivia.HasValue ? syntaxNode.WithLeadingTrivia(leadingWhitespaceTrivia.Value) : syntaxNode.WithoutLeadingTrivia());
 }
Esempio n. 19
0
 private static T WithLeadingTrivia <T>(this T attributeList, SyntaxList <T> attributeLists, SyntaxTriviaList leadingTrivia, SyntaxTrivia?leadingWhitespaceTrivia)
     where T : SyntaxNode
 {
     return(attributeLists.Count == 0 ? attributeList.WithLeadingTrivia(leadingTrivia) : attributeList.WithLeadingWhitespaceTrivia(leadingWhitespaceTrivia));
 }
Esempio n. 20
0
 private static T WithLeadingWhitespaceTrivia <T, TAttributeList>(this T syntaxNode, SyntaxList <TAttributeList> attributeLists, SyntaxTrivia?leadingWhitespaceTrivia)
     where T : SyntaxNode
     where TAttributeList : SyntaxNode
 {
     return(attributeLists.Count > 0 ? syntaxNode : syntaxNode.WithLeadingWhitespaceTrivia(leadingWhitespaceTrivia));
 }
Esempio n. 21
0
 protected SyntaxNode GenerateAttribute(SyntaxNode syntaxNode, string name, SyntaxTrivia?leadingWhitespaceTrivia, SyntaxAnnotation argumentListAnnotation)
 {
     SyntaxNode[] arguments = argumentListAnnotation == null ? null : Array.Empty <SyntaxNode>();
     return(GenerateAttribute(syntaxNode, name, leadingWhitespaceTrivia, arguments, argumentListAnnotation));
 }
Esempio n. 22
0
 public Line(int number, SyntaxNode node, SyntaxTrivia?comment)
 {
     this.number  = number;
     this.node    = node;
     this.comment = comment;
 }
        private void HandleDocumentedNode(SyntaxNodeAnalysisContext context)
        {
            DocumentationCommentTriviaSyntax documentationComment = context.Node.GetDocumentationCommentTriviaSyntax();

            if (documentationComment != null)
            {
                // The element already has a documentation comment.
                return;
            }

            SyntaxTrivia?firstComment  = null;
            SyntaxTrivia?lastComment   = null;
            bool         isAtEndOfLine = false;
            var          leadingTrivia = context.Node.GetLeadingTrivia();

            for (int i = leadingTrivia.Count - 1; i >= 0; i--)
            {
                switch (leadingTrivia[i].Kind())
                {
                case SyntaxKind.WhitespaceTrivia:
                    // Ignore indentation and/or trailing whitespace
                    continue;

                case SyntaxKind.EndOfLineTrivia:
                    if (isAtEndOfLine)
                    {
                        // Multiple newlines
                        break;
                    }

                    isAtEndOfLine = true;
                    continue;

                case SyntaxKind.SingleLineCommentTrivia:
                    firstComment  = leadingTrivia[i];
                    lastComment   = lastComment ?? firstComment;
                    isAtEndOfLine = false;
                    continue;

                case SyntaxKind.MultiLineCommentTrivia:
                    if (lastComment != null)
                    {
                        // Have a multiline comment preceding a single line comment. Only consider the latter for this
                        // refactoring.
                        break;
                    }

                    firstComment = leadingTrivia[i];
                    lastComment  = firstComment;
                    break;
                }

                // Reaching here means we don't want to continue the loop
                break;
            }

            if (firstComment is null)
            {
                return;
            }

            var location = Location.Create(context.Node.SyntaxTree, TextSpan.FromBounds(firstComment.Value.SpanStart, lastComment.Value.Span.End));

            context.ReportDiagnostic(Diagnostic.Create(Descriptor, location));
        }
Esempio n. 24
0
 protected abstract SyntaxNode GenerateAttribute(SyntaxNode syntaxNode, string name, SyntaxTrivia?leadingWhitespaceTrivia, SyntaxNode[] arguments, SyntaxAnnotation argumentListAnnotation);
Esempio n. 25
0
 public static SyntaxTrivia DetermineEndOfLine(SyntaxNode node, SyntaxTrivia?defaultValue = null)
 {
     return(DetermineEndOfLine(node.GetFirstToken(), defaultValue));
 }
Esempio n. 26
0
 protected abstract IndentationResult?GetDesiredIndentationWorker(
     Indenter indenter, SyntaxToken?token, SyntaxTrivia?trivia);
        public MethodTransformerResult Transform(IMethodOrAccessorTransformationResult transformResult,
                                                 ITypeTransformationMetadata typeMetadata, INamespaceTransformationMetadata namespaceMetadata)
        {
            var methodResult = transformResult.AnalyzationResult;

            if (!methodResult.Missing || !methodResult.Conversion.HasFlag(MethodConversion.ToAsync) || methodResult.Symbol.IsObsolete())
            {
                return(MethodTransformerResult.Skip);
            }
            var methodNode = transformResult.Transformed;

            var baseMethod = methodResult.RelatedMethods
                             .Where(o =>
                                    (methodResult.BaseOverriddenMethod != null && o.Symbol.Equals(methodResult.BaseOverriddenMethod)) ||
                                    methodResult.ImplementedInterfaces.Any(i => o.Symbol.Equals(i)))
                             .FirstOrDefault(o => o.AsyncCounterpartSymbol?.IsObsolete() == true);

            if (baseMethod == null)
            {
                return(MethodTransformerResult.Skip);
            }

            namespaceMetadata.AddUsing("System");
            AttributeListSyntax obsoleteAttribute = null;
            var          syntaxReference          = baseMethod.AsyncCounterpartSymbol.DeclaringSyntaxReferences.SingleOrDefault();
            SyntaxTrivia?documentationTrivia      = null;

            if (syntaxReference != null)
            {
                var baseMethodNode = syntaxReference.GetSyntax() as MethodDeclarationSyntax;
                obsoleteAttribute   = baseMethodNode?.AttributeLists.FirstOrDefault(o => o.Attributes.Count == 1 && o.Attributes.First().Name.ToString() == "Obsolete");
                obsoleteAttribute   = (AttributeListSyntax)_directiveRemover.VisitAttributeList(obsoleteAttribute);
                documentationTrivia = obsoleteAttribute.GetLeadingTrivia()
                                      .Select(o => o.IsKind(SyntaxKind.SingleLineDocumentationCommentTrivia) ? o : (SyntaxTrivia?)null)
                                      .FirstOrDefault(o => o.HasValue);
            }

            if (obsoleteAttribute == null)
            {
                obsoleteAttribute = AttributeList(SingletonSeparatedList(Attribute(IdentifierName("Obsolete"))))
                                    .WithOpenBracketToken(Token(TriviaList(transformResult.LeadingWhitespaceTrivia), SyntaxKind.OpenBracketToken, TriviaList()))
                                    .WithCloseBracketToken(Token(TriviaList(), SyntaxKind.CloseBracketToken, TriviaList(transformResult.EndOfLineTrivia)));
            }

            var inheritDocTrivia = Trivia(GetInheritdoc(transformResult.EndOfLineTrivia.ToFullString()));

            if (documentationTrivia.HasValue)
            {
                obsoleteAttribute = obsoleteAttribute.WithLeadingTrivia(obsoleteAttribute.GetLeadingTrivia()
                                                                        .Replace(documentationTrivia.Value, inheritDocTrivia));
            }
            else
            {
                // Append <inheritdoc />
                var leadingTrivia = obsoleteAttribute.GetLeadingTrivia();
                var trivias       = new List <SyntaxTrivia>();
                if (leadingTrivia.Count == 0 || !leadingTrivia.Last().IsKind(SyntaxKind.WhitespaceTrivia))
                {
                    trivias.Add(transformResult.LeadingWhitespaceTrivia);
                }

                trivias.Add(inheritDocTrivia);
                trivias.Add(transformResult.LeadingWhitespaceTrivia);
                obsoleteAttribute = obsoleteAttribute.WithLeadingTrivia(leadingTrivia.AddRange(trivias));
            }

            methodNode = methodNode
                         .WithLeadingTrivia(TriviaList(transformResult.LeadingWhitespaceTrivia))
                         .WithAttributeLists(methodNode.AttributeLists.Add(obsoleteAttribute));

            return(MethodTransformerResult.Update(methodNode));
        }
Esempio n. 28
0
        public static SyntaxNode CsGenerateAttribute(this SyntaxNode syntaxNode, string name, SyntaxTrivia?leadingWhitespaceTrivia, SyntaxNode[] arguments, SyntaxAnnotation argumentListAnnotation)
        {
            var leadingTrivia = syntaxNode.GetLeadingTrivia();
            var attribute     = CsGetAttributeSyntax(name, arguments, argumentListAnnotation);
            var attributeList = SyntaxFactory.AttributeList(SyntaxFactory.SeparatedList(new AttributeSyntax[] { attribute }))
                                .NormalizeWhitespace()
                                .WithTrailingTrivia(SyntaxFactory.EndOfLine(Environment.NewLine));

            if (syntaxNode is PropertyDeclarationSyntax propertySyntax)
            {
                return(propertySyntax.WithLeadingWhitespaceTrivia(propertySyntax.AttributeLists, leadingWhitespaceTrivia)
                       .AddAttributeLists(attributeList.WithLeadingTrivia(propertySyntax.AttributeLists, leadingTrivia, leadingWhitespaceTrivia)));
            }
            else if (syntaxNode is ClassDeclarationSyntax classSyntax)
            {
                return(classSyntax.WithLeadingWhitespaceTrivia(classSyntax.AttributeLists, leadingWhitespaceTrivia)
                       .AddAttributeLists(attributeList.WithLeadingTrivia(classSyntax.AttributeLists, leadingTrivia, leadingWhitespaceTrivia)));
            }
            else if (syntaxNode is MethodDeclarationSyntax methodSyntax)
            {
                return(methodSyntax.WithLeadingWhitespaceTrivia(methodSyntax.AttributeLists, leadingWhitespaceTrivia)
                       .AddAttributeLists(attributeList.WithLeadingTrivia(methodSyntax.AttributeLists, leadingTrivia, leadingWhitespaceTrivia)));
            }
            else
            {
                Debug.Fail("Only property or class syntax node supported.");
                return(null);
            }
        }
Esempio n. 29
0
 public static T AppendTrivia <T>(this T node, SyntaxTrivia?trivia)
     where T : SyntaxNode =>
 trivia is null ? node : node.WithLeadingTrivia(node.GetLeadingTrivia().Add(trivia.Value));
Esempio n. 30
0
 protected override SyntaxNode GenerateAttribute(SyntaxNode syntaxNode, string name, SyntaxTrivia?leadingWhitespaceTrivia, SyntaxNode[] arguments, SyntaxAnnotation argumentListAnnotation)
 {
     return(syntaxNode.CsGenerateAttribute(name, leadingWhitespaceTrivia, arguments, argumentListAnnotation));
 }