В моем пакете 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 .