Неправильный синтаксис генерируется при создании UsingDirective из фабрики в Roslyn

Я использую Roslyn, чтобы сгенерировать дерево из другого. Итак, мы имеем дело с преобразованием AST. Я использую SyntaxFactory для создания узлов.

В конкретном случае я хочу создать директиву u using, которая должна выглядеть так:

using MyNamespace.SubNamespace;

So I do:

var usingDirective = SyntaxFactory.UsingDirective(SyntaxFactory.ParseName("MyNamespace.SubNamespace"));
var newNode = mynode.AddUsings(new[] { usingDirective });

Но если я проверю окончательное дерево newNode, которое сгенерировано (исходный код строки, сгенерированный простым вызовом newNode.ToString()), я вижу, что моя директива была добавлена ​​следующим образом:

usingMyNamespace.SubNamespace;

Я могу увидеть то же самое, если просто сделаю: usingDirective.ToString(). Это кажется очень неправильным, требуется пробел, и это должно вызвать синтаксическую ошибку. Что здесь происходит?


person Andry    schedule 27.11.2016    source источник


Ответы (1)


Добавьте это, чтобы исправить проблему:

SyntaxFactory.UsingDirective(
    SyntaxFactory.ParseName("MyNamespace.SubNamespace")).NormalizeWhitespace();
person Dudi Keleti    schedule 27.11.2016
comment
Спасибо чувак! Значит, этот пробел - просто визуальная мелочь, поэтому он на самом деле ничего не меняет (не вреден как для синтаксического анализа, так и для семантического анализа) или вызывает какой-либо ущерб? - person Andry; 27.11.2016
comment
Дерево синтаксиса Roslyn не абстрактное, а конкретное, это означает, что весь исходный код включен в тройку (например, пробелы, комментарии, xml-документ, все). Это сделано для того, чтобы можно было превратить эти три обратно в исходные три. В вашем случае три сгенерированных файла на самом деле недействительны и требуют соответствующего пробела (хотя я ожидаю, что он сгенерирует действительный IL), что делает NormalizeWhitespace. В качестве альтернативы вы можете добавить WithAdditionalAnnotations (Formatter.Annotation), если это находится в CodeFix, чтобы указать, что результирующий узел требует соответствующего форматирования пробелов. - person Ties; 28.11.2016
comment
Как выяснилось здесь: stackoverflow.com/questions/40578806/;) В вики-странице Roslyn вы можете найти дополнительную информацию об узлах, токах и мелочах (эта тема): github.com/dotnet/roslyn/wiki/Roslyn%20Overview#syntax- мелочи - person Ties; 28.11.2016