public virtual SyntaxTriviaList VisitList(SyntaxTriviaList list)
        {
            var count = list.Count;

            if (count != 0)
            {
                SyntaxTriviaListBuilder alternate = null;
                var index = -1;

                foreach (var item in list)
                {
                    index++;
                    var visited = this.VisitListElement(item);

                    //skip the null check since SyntaxTrivia is a value type
                    if (visited != item && alternate == null)
                    {
                        alternate = new SyntaxTriviaListBuilder(count);
                        alternate.Add(list, 0, index);
                    }

                    if (alternate != null && visited.CSharpKind() != SyntaxKind.None)
                    {
                        alternate.Add(visited);
                    }
                }

                if (alternate != null)
                {
                    return(alternate.ToList());
                }
            }

            return(list);
        }
Exemplo n.º 2
0
 public SyntaxRemover(
     SyntaxNode[] nodesToRemove,
     SyntaxRemoveOptions options)
     : base(nodesToRemove.Any(n => n.IsPartOfStructuredTrivia()))
 {
     _nodesToRemove  = new HashSet <SyntaxNode>(nodesToRemove);
     _options        = options;
     _searchSpan     = ComputeTotalSpan(nodesToRemove);
     _residualTrivia = SyntaxTriviaListBuilder.Create();
 }
Exemplo n.º 3
0
        private static GreenNode CreateNode(SyntaxTrivia[] trivias)
        {
            if (trivias == null)
            {
                return(null);
            }

            var builder = new SyntaxTriviaListBuilder(trivias.Length);

            builder.Add(trivias);
            return(builder.ToList().Node);
        }
Exemplo n.º 4
0
        private static void ClearAndFreeBuilder(SyntaxTriviaListBuilder builder)
        {
            // It's possible someone might create a list with a huge amount of trivia
            // in it.  We don't want to hold onto such items forever.  So only cache
            // reasonably sized lists.  In IDE testing, around 99% of all trivia lists
            // were 16 or less elements.
            const int MaxBuilderCount = 16;

            if (builder.Count <= MaxBuilderCount)
            {
                builder.Clear();
                s_builderPool.Free(builder);
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Creates a new <see cref="SyntaxTriviaList"/> with the specified trivia inserted at the index.
        /// </summary>
        /// <param name="index">The index in the list to insert the trivia at.</param>
        /// <param name="trivia">The trivia to insert.</param>
        public SyntaxTriviaList InsertRange(int index, IEnumerable <SyntaxTrivia> trivia)
        {
            int thisCount = this.Count;

            if (index < 0 || index > thisCount)
            {
                throw new ArgumentOutOfRangeException(nameof(index));
            }

            if (trivia == null)
            {
                throw new ArgumentNullException(nameof(trivia));
            }

            // Just return ourselves if we're not being asked to add anything.
            ICollection <SyntaxTrivia> triviaCollection = trivia as ICollection <SyntaxTrivia>;

            if (triviaCollection != null && triviaCollection.Count == 0)
            {
                return(this);
            }

            SyntaxTriviaListBuilder builder = GetBuilder();

            try
            {
                for (int i = 0; i < index; i++)
                {
                    builder.Add(this[i]);
                }

                builder.AddRange(trivia);

                for (int i = index; i < thisCount; i++)
                {
                    builder.Add(this[i]);
                }

                return(builder.Count == thisCount ? this : builder.ToList());
            }
            finally
            {
                ClearAndFreeBuilder(builder);
            }
        }
        public void TestStructuredTrivia()
        {
            var spaceTrivia = SyntaxTriviaListBuilder.Create().Add(SyntaxFactory.Whitespace(" ")).ToList();
            var emptyTrivia = SyntaxTriviaListBuilder.Create().ToList();

            var name            = "goo";
            var xmlStartElement = SyntaxFactory.XmlElementStartTag(
                SyntaxFactory.Token(spaceTrivia, SyntaxKind.LessThanToken, default(SyntaxTriviaList)),
                SyntaxFactory.XmlName(null,
                                      SyntaxFactory.Identifier(name)),
                default(SyntaxList <XmlAttributeSyntax>),
                SyntaxFactory.Token(default(SyntaxTriviaList), SyntaxKind.GreaterThanToken, spaceTrivia));

            var xmlEndElement = SyntaxFactory.XmlElementEndTag(
                SyntaxFactory.Token(SyntaxKind.LessThanSlashToken),
                SyntaxFactory.XmlName(null,
                                      SyntaxFactory.Identifier(name)),
                SyntaxFactory.Token(default(SyntaxTriviaList), SyntaxKind.GreaterThanToken, spaceTrivia));

            var xmlElement = SyntaxFactory.XmlElement(xmlStartElement, default(SyntaxList <XmlNodeSyntax>), xmlEndElement);

            Assert.Equal(" <goo> </goo> ", xmlElement.ToFullString());
            Assert.Equal("<goo> </goo>", xmlElement.ToString());

            var docComment = SyntaxFactory.DocumentationCommentTrivia(SyntaxKind.SingleLineDocumentationCommentTrivia).WithContent(new SyntaxList <XmlNodeSyntax>(xmlElement));

            Assert.Equal(" <goo> </goo> ", docComment.ToFullString());
            // Assert.Equal("<goo> </goo>", docComment.GetText());
            var child = (XmlElementSyntax)docComment.ChildNodesAndTokens()[0];

            Assert.Equal(" <goo> </goo> ", child.ToFullString());
            Assert.Equal("<goo> </goo>", child.ToString());
            Assert.Equal(" <goo> ", child.StartTag.ToFullString());
            Assert.Equal("<goo>", child.StartTag.ToString());

            var sTrivia = SyntaxFactory.Trivia(docComment);

            Assert.NotEqual(default(SyntaxTrivia), sTrivia);
            var ident = SyntaxFactory.Identifier(SyntaxTriviaList.Create(sTrivia), "banana", spaceTrivia);

            Assert.Equal(" <goo> </goo> banana ", ident.ToFullString());
            Assert.Equal("banana", ident.ToString());
            Assert.Equal(" <goo> </goo> ", ident.LeadingTrivia[0].ToFullString());
            // Assert.Equal("<goo> </goo>", ident.LeadingTrivia[0].GetText());

            var identExpr = SyntaxFactory.IdentifierName(ident);

            // make sure FindLeaf digs into the structured trivia.
            var result = identExpr.FindToken(3, true);

            Assert.Equal(SyntaxKind.IdentifierToken, result.Kind());
            Assert.Equal("goo", result.ToString());

            var trResult = identExpr.FindTrivia(6, SyntaxTrivia.Any);

            Assert.Equal(SyntaxKind.WhitespaceTrivia, trResult.Kind());
            Assert.Equal(" ", trResult.ToString());

            var foundDocComment = result.Parent.Parent.Parent.Parent;

            Assert.Null(foundDocComment.Parent);

            var identTrivia = identExpr.GetLeadingTrivia()[0];
            var foundTrivia = ((DocumentationCommentTriviaSyntax)foundDocComment).ParentTrivia;

            Assert.Equal(identTrivia, foundTrivia);

            // make sure FindLeafNodesOverlappingWithSpan does not dig into the structured trivia.
            var resultList = identExpr.DescendantTokens(t => t.FullSpan.OverlapsWith(new TextSpan(3, 18)));

            Assert.Equal(1, resultList.Count());
        }
Exemplo n.º 7
0
 /// <summary>
 /// Creates a list of trivia.
 /// </summary>
 /// <param name="trivias">A sequence of trivia.</param>
 public SyntaxTriviaList(IEnumerable <SyntaxTrivia> trivias)
     : this(default, SyntaxTriviaListBuilder.Create(trivias).Node, 0, 0)
 {
 }