Как генерировать логический литерал, используя VisualBasi c .SyntaxFactory - PullRequest
0 голосов
/ 08 апреля 2020

В моем пакете Visual Studio я хочу использовать Roslyn, чтобы изменить

#Const USE_PROJECT_MLRUNTIME = True

на

#Const USE_PROJECT_MLRUNTIME = False

или наоборот, в Visual Basi c файл кода.

Я пытаюсь сгенерировать директиву Const, используя SyntaxFactory.ConstDirectiveTrivia .

Этот тип работает с использованием

var le = SyntaxFactory.LiteralExpression ( SyntaxKind.TrueLiteralExpression, SyntaxFactory.Literal("True") ) ;
var n  = SyntaxFactory.ConstDirectiveTrivia ( "USE_PROJECT_MLRUNTIME", le ) ;

, но это генерирует код

#Const USE_PROJECT_MLRUNTIME = "True"

, который является строкой, а не логическим.

Я могу сгенерировать логический литерал для C#, как описано здесь , используя

SyntaxFactory.LiteralExpression ( SyntaxKind.TrueLiteralExpression )

Это возможно, потому что Microsoft.CodeAnalysis.CSharp.SyntaxFactory содержит перегруженную версию LiteralExpression , которая принимает один параметр.

В Microsoft.CodeAnalysis.VisualBasi c .SyntaxFactory , существует только одна версия LiteralExpression , для которой требуется два параметра.

Как создать логический литерал, используя Microsoft.CodeAnalysis.VisualBasi c .SyntaxFactory ?


EDIT

У меня есть рабочее решение этой проблемы, которое состоит в том, чтобы сгенерировать дерево с помощью функции ParseText, а затем извлечь SyntaxToken или LiteralExpressionSyntax из дерева.

Я могу получить токен TrueKeyword, подобный этому ...

var TrueToken = VisualBasicSyntaxTree.ParseText ( "a = True" )
                                     .GetRoot()
                                     .DescendantTokens()
                                     .Where ( x => x.Kind() == SyntaxKind.TrueKeyword )
                                     .FirstOrDefault() ;

и использовать его для создания LiteralExpressionSyntax

var TrueLiteral = SyntaxFactory.LiteralExpression ( SyntaxKind.TrueLiteralExpression, TrueToken ) ;

Проще говоря, я могу получить LiteralExpressionSyntax за один шаг с ...

var TrueLiteral = VisualBasicSyntaxTree.ParseText ( "a = True" )
                                       .GetRoot()
                                       .DescendantNodes()
                                       .OfType<LiteralExpressionSyntax>()
                                       .FirstOrDefault() ;

Хотя это решает мою проблему, я не публикую его как ответ.

Должен быть способ создания логического литерала напрямую с использованием VisualBasi c .SyntaxFactory .

...