2014-10-20 4 views

ответ

3

Вы можете создать SyntaxNode с помощью SyntaxFactory.

И вы не можете изменить существующее синтаксическое дерево (поскольку оно является неизменным), но вы можете создать новый, содержащий ваш узел. Посмотрите на With- и Add- методы, ReplaceNode и CSharpSyntaxVisitor. Трудно сказать, какой из них наиболее подходит вашим потребностям.

+0

Благодарим за ответ. Я нашел NodeOrTokenList. Как сделать NodeOrTokenList для SyntaxNode? – user3382135

+1

@ user3382135 У вас нет, и я не понимаю, почему вы хотите это сделать. Я думаю, вы должны задать новый вопрос, объясняя, что вы хотите сделать, и почему вы думаете, что для этого вам нужен NodeOrTokenList. – svick

2

Как ответвил 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. Вместо модификации новые объекты создаются на основе заданных различий со старыми. Вы примените эту концепцию к синтаксическим деревьям для создания преобразований деревьев!

+0

Я предполагаю, что для этого кода требуется использовать оператор using 'using Syntax = Microsoft.CodeAnalysis.CSharp.SyntaxFactory;' для компиляции. – Anssssss

Смежные вопросы