Сбой модуля компиляции normalizewhitespace с проанализированными операторами For / Next

Я столкнулся с проблемой, при которой, когда я создаю фиктивное пространство имен, класс и подпрограмму и добавляю проанализированные операторы для цикла For / Next, он дает сбой в методе NormalizeWhitespace моего модуля компиляции.

IndexOutOfRangeException
Index was outside the bounds of the array.
at System.Collections.Immutable.ImmutableArray`1.Builder.get_Item(Int32 index)
at Microsoft.CodeAnalysis.VisualBasic.Syntax.SyntaxNormalizer.GetIdentation(Int32 count)
at Microsoft.CodeAnalysis.VisualBasic.Syntax.SyntaxNormalizer.RewriteTrivia(SyntaxTriviaList triviaList, Int32 depth, Boolean isTrailing, Boolean mustBeIndented, Boolean mustHaveSeparator, Int32 lineBreaksAfter, Int32 lineBreaksBefore)
at Microsoft.CodeAnalysis.VisualBasic.Syntax.SyntaxNormalizer.VisitToken(SyntaxToken token)
at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxRewriter.VisitEndBlockStatement(EndBlockStatementSyntax node)
at Microsoft.CodeAnalysis.VisualBasic.Syntax.SyntaxNormalizer.VisitEndBlockStatement(EndBlockStatementSyntax node)
at Microsoft.CodeAnalysis.VisualBasic.Syntax.EndBlockStatementSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxRewriter.Visit(SyntaxNode node)
at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxRewriter.VisitNamespaceBlock(NamespaceBlockSyntax node)
at Microsoft.CodeAnalysis.VisualBasic.Syntax.SyntaxNormalizer.VisitNamespaceBlock(NamespaceBlockSyntax node)
at Microsoft.CodeAnalysis.VisualBasic.Syntax.NamespaceBlockSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxRewriter.Visit(SyntaxNode node)
at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxRewriter.VisitListElement[TNode](TNode node)
at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxRewriter.VisitList[TNode](SyntaxList`1 list)
at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxRewriter.VisitCompilationUnit(CompilationUnitSyntax node)
at Microsoft.CodeAnalysis.VisualBasic.Syntax.SyntaxNormalizer.VisitCompilationUnit(CompilationUnitSyntax node)
at Microsoft.CodeAnalysis.VisualBasic.Syntax.CompilationUnitSyntax.Accept[TResult](VisualBasicSyntaxVisitor`1 visitor)
at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxRewriter.Visit(SyntaxNode node)
at Microsoft.CodeAnalysis.VisualBasic.Syntax.SyntaxNormalizer.Normalize[TNode](TNode node, String indentWhitespace, String eolWhitespace, Boolean useElasticTrivia, Boolean useDefaultCasing)
at Microsoft.CodeAnalysis.VisualBasic.SyntaxExtensions.NormalizeWhitespace[TNode](TNode node, Boolean useDefaultCasing, String indentation, Boolean elasticTrivia)
at UserQuery.Main()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

Вот код для воспроизведения:

public void Main()
{
   var compilationUnit = SyntaxFactory.CompilationUnit();
   compilationUnit = compilationUnit.AddMembers(this.CreateNamespaceDeclaration());
   compilationUnit = compilationUnit.NormalizeWhitespace(true, "\r\n", false);
   compilationUnit.ToFullString().Dump();
}

public string[] StatementList = { "For i As Integer = 0 To 10", "Dim v = 0", "Next" };

// Define other methods and classes here

private NamespaceBlockSyntax CreateNamespaceDeclaration()
{
    return SyntaxFactory.NamespaceBlock(
        SyntaxFactory.NamespaceStatement(
        SyntaxFactory.IdentifierName("Test")))
        .WithMembers(
            SyntaxFactory.SingletonList<StatementSyntax>(
                SyntaxFactory.ClassBlock(
                SyntaxFactory.ClassStatement("VBCrash")
                .WithModifiers(
                    SyntaxFactory.TokenList(
                        SyntaxFactory.Token(SyntaxKind.PublicKeyword))))
        .WithImplements(SyntaxFactory.List<ImplementsStatementSyntax>())
        .WithMembers(SyntaxFactory.List<StatementSyntax>(
                SyntaxFactory.List<StatementSyntax>()
                .Add(SyntaxFactory.SubBlock(
                SyntaxFactory.SubStatement("Main"))
            .AddStatements(this.AddStatements()))))));
}


private StatementSyntax[] AddStatements()
{
    var result = default(SyntaxList<StatementSyntax>);

    foreach (var statement in StatementList)
    {
        result = result.Add(SyntaxFactory.ParseExecutableStatement(statement));
    }

    return result.ToArray();
}

Я делаю что-то неправильно? Всякий раз, когда я комментирую цикл foreach для операторов, он работает.

Спасибо за помощь :)


person stongef    schedule 30.08.2016    source источник
comment
Он производит кальций VB ....   -  person stongef    schedule 30.08.2016


Ответы (1)


Ваше синтаксическое дерево имеет неправильную форму. Операторы блока синтаксического анализа имеют структуру; вы не можете разобрать такую ​​строку за раз, сгруппировать их вместе и ожидать, что из этого выйдет осмысленное дерево. (Я думаю, вы делали то же самое в своем другом вопросе, который собирался вызвать проблемы и там.) Вам следует анализировать все эти операторы за один раз, а не по одному. Опять же, используйте режим синтаксического анализа сценариев, если вам нужны операторы верхнего уровня.

Тем не менее, форматтер не должен так давать сбой. Сообщите об ошибке на GitHub.

person Jason Malinowski    schedule 30.08.2016