Skip to content

SyntaxToken.GetLocation().GetLineSpan() crashes with an ArgumentOutOfRangeException when visiting XmlTextLiteralNewLineToken #57413

@siegfriedpammer

Description

@siegfriedpammer

Version Used: Roslyn 3.11.0 nuget packages

Steps to Reproduce:

  1. Create new console project
  2. Add references to Roslyn 3.11.0
  3. Add to Program.cs:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using System;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            var tokens = SyntaxFactory.ParseTokens("\t\t/// <summary>\r\n\t\t/// Creates an immutable snapshot of this document.\r\n\t\t/// </summary>\r\n\t\tIDocument CreateDocumentSnapshot();\r\n");

            var visitor = new TestWalker();

            foreach (var token in tokens)
            {
                visitor.VisitToken(token);
            }
        }
    }

    class TestWalker : CSharpSyntaxWalker
    {
        public TestWalker()
            : base(SyntaxWalkerDepth.StructuredTrivia)
        {
        }

        public override void VisitToken(SyntaxToken token)
        {
            base.VisitToken(token);

            var span = token.GetLocation().GetLineSpan();
            Console.WriteLine(token.Kind() + " " + span);
        }
    }
}

Expected Behavior:

Prints a list of tokens and their line spans.

Actual Behavior:

token.GetLocation().GetLineSpan() crashes with a

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. (Parameter 'position')
   at Microsoft.CodeAnalysis.Text.SourceText.LineInfo.IndexOf(Int32 position)
   at Microsoft.CodeAnalysis.Text.SourceText.LineInfo.GetLineFromPosition(Int32 position)
   at Microsoft.CodeAnalysis.Text.TextLineCollection.GetLinePosition(Int32 position)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxTree.GetLinePosition(Int32 position)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxTree.GetLineSpan(TextSpan span, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.SourceLocation.GetLineSpan()
   at ConsoleApp3.TestWalker.VisitToken(SyntaxToken token) in Program.cs:line 35
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxWalker.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor.VisitXmlText(XmlTextSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.XmlTextSyntax.Accept(CSharpSyntaxVisitor visitor)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxWalker.Visit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxWalker.DefaultVisit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor.VisitDocumentationCommentTrivia(DocumentationCommentTriviaSyntax node)
   at Microsoft.CodeAnalysis.CSharp.Syntax.DocumentationCommentTriviaSyntax.Accept(CSharpSyntaxVisitor visitor)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxWalker.Visit(SyntaxNode node)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxWalker.VisitTrivia(SyntaxTrivia trivia)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxWalker.VisitLeadingTrivia(SyntaxToken token)
   at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxWalker.VisitToken(SyntaxToken token)
   at ConsoleApp3.TestWalker.VisitToken(SyntaxToken token) in Program.cs:line 33
   at ConsoleApp3.Program.Main(String[] args) in Program.cs:line 19

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions