2014-10-20 2 views

답변

3

SyntaxFactory을 사용하여 SyntaxNode을 만들 수 있습니다.

기존 구문 트리를 수정할 수 없으므로 (변경 불가능하기 때문에) 노드를 포함하는 새로운 구문 트리를 만들 수 있습니다. With-Add- 메서드는 ReplaceNodeCSharpSyntaxVisitor입니다. 이 중 어느 것이 당신의 필요를 가장 잘 충족시키는 지 말하기는 어렵습니다.

+0

답변 해 주셔서 감사합니다. NodeOrTokenList를 찾았습니다. NodeOrTokenList를 SyntaxNode로 어떻게 캐스트합니까? – user3382135

+1

@ user3382135 당신은 그렇게하지 않으려 고하고 왜 그렇게하고 싶지는 모르겠다. 나는 당신이 무엇을하고 싶은지 설명하고 왜 NodeOrTokenList가 필요하다고 생각하는지에 대해 새로운 질문을해야한다고 생각합니다. – svick

2

svick이 어떻게 대답했는지 - 기존 구문 트리를 수정할 수 없습니다. Sytnax 트리는 변경 불가능하지만 기존에 기반한 다른 트리를 작성할 수 있습니다. 이 목적을 위해 노드를 생성하고 기존 노드를 교체해야합니다. 당신이 간단한 예 (사용 변경)하실 수 있습니다 :

로슬린의 API의 기본적인 신조는 불변이다 : 여기 불변의 경우

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()); 

은 시작하기 문서에서 메모입니다. 불변의 데이터 구조는 작성 후에 변경 될 수 없기 때문에, 한 도구의 위험이 다른 도구에 예기치 않은 방식으로 영향을 미치지 않으면 서 여러 소비자가 안전하게 공유하고 분석 할 수 있습니다. 잠금 또는 다른 동시성 측정이 필요하지 않습니다. 이것은 Roslyn API의 구문 트리, 편집, 기호, 의미 모델 및 기타 모든 데이터 구조에 적용됩니다. 수정 대신 새 오브젝트는 이전 오브젝트와 지정된 차이를 기반으로 작성됩니다. 이 개념을 구문 트리에 적용하여 트리 변환을 만듭니다!

+0

이 코드에서는'using Syntax = Microsoft.CodeAnalysis.CSharp.SyntaxFactory; '와 같이 using 문을 사용해야한다고 가정합니다. – Anssssss

관련 문제