Как использовать Roslyn для изменения исходного кода? Я не могу создать SyntaxNode и вставить в SyntaxTree. Или используйте альтернативы (Antrl, NRefactory или что-то еще)?Как изменить исходный код с помощью Roslyn?
ответ
Вы можете создать SyntaxNode
с помощью SyntaxFactory
.
И вы не можете изменить существующее синтаксическое дерево (поскольку оно является неизменным), но вы можете создать новый, содержащий ваш узел. Посмотрите на With-
и Add-
методы, ReplaceNode
и CSharpSyntaxVisitor
. Трудно сказать, какой из них наиболее подходит вашим потребностям.
Как ответвил svick - вы не можете изменить существующее синтаксическое дерево. Дерево Sytnax является неизменным, но вы можете создать другое на основе существующего. Для этого вам нужно создать узел и заменить существующий. Ниже вы можете простой пример (изменить с помощью):
var name = Syntax.QualifiedName(Syntax.IdentifierName("System"), Syntax.IdentifierName("Collections"));
name = Syntax.QualifiedName(name, Syntax.IdentifierName("Generic"));
SyntaxTree tree = SyntaxTree.ParseText(
@"using System;
using System.Collections;
using System.Linq;
using System.Text;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(""Hello, World!"");
}
}
}");
var root = (CompilationUnitSyntax)tree.GetRoot();
var oldUsing = root.Usings[1];
var newUsing = oldUsing.WithName(name);
root = root.ReplaceNode(oldUsing, newUsing);
Console.WriteLine(root.GetText());
В случае неизменны здесь записка Начало работы документа:
Фундаментальным принципом АФИ Рослин является неизменность. Поскольку неизменяемые структуры данных не могут быть изменены после их создания, их можно безопасно разделить и проанализировать несколькими потребителями одновременно без опасности того, что один инструмент повлияет на другой непредсказуемым образом. Никаких блокировок или других параллельных мер не требуется. Это относится к синтаксическим деревьям, компиляциям, символам, семантическим моделям и каждой другой структуре данных в API Roslyn. Вместо модификации новые объекты создаются на основе заданных различий со старыми. Вы примените эту концепцию к синтаксическим деревьям для создания преобразований деревьев!
Я предполагаю, что для этого кода требуется использовать оператор using 'using Syntax = Microsoft.CodeAnalysis.CSharp.SyntaxFactory;' для компиляции. – Anssssss
- 1. Программно компилируя исходный код с использованием Roslyn
- 2. Изменить исходный код с помощью VBA
- 3. изменить исходный код hadoop
- 4. изменить исходный код онлайн
- 5. Как изменить исходный код redis?
- 6. Как изменить исходный код openCV?
- 7. Изменить исходный код timelineJS
- 8. Как изменить исходный код военного файла с помощью install4j?
- 9. Как изменить исходный код HTML с помощью плагина Eclipse?
- 10. Как изменить исходный код html (CTRL + U) с помощью JQuery?
- 11. Может ли Roslyn генерировать исходный код из экземпляра объекта?
- 12. Можно ли изменить исходный код с помощью ant?
- 13. Как изменить исходный код как ресурс программно?
- 14. Как изменить тип поля с помощью FieldTypeDeclaration (Roslyn)
- 15. изменить исходный код файла midi
- 16. Как изменить исходный код pos_tag в NLTK?
- 17. Как правильно изменить исходный код зависимости npm?
- 18. Как изменить импортированный исходный код на лету?
- 19. Как изменить исходный код стиля на локальный?
- 20. Как динамически изменить исходный код диаграммы доступа
- 21. Необходимо изменить исходный код установленной библиотеки
- 22. Сгенерировать исходный код с помощью цикла
- 23. Установить исходный код с помощью скрипта fontforge
- 24. Обфускать исходный код с помощью ProGuard
- 25. Как изменить исходный код страницы? с использованием селена и Java
- 26. Minecraft Forge Gradlew Как изменить исходный код Java с
- 27. Разбиение выражений с помощью Roslyn
- 28. Исходный код с помощью «Гиперссылки» для документации
- 29. Как отформатировать код и поддерживать ведущие мелочи с Roslyn?
- 30. Изменить Redmine Исходный код - Плагин или миграция
Благодарим за ответ. Я нашел NodeOrTokenList. Как сделать NodeOrTokenList для SyntaxNode? – user3382135
@ user3382135 У вас нет, и я не понимаю, почему вы хотите это сделать. Я думаю, вы должны задать новый вопрос, объясняя, что вы хотите сделать, и почему вы думаете, что для этого вам нужен NodeOrTokenList. – svick