2013-06-26 1 views
4

그냥 Roslyn을 발견 했으니 참아주십시오.Roslyn을 사용하여 지시어를 사용하여 클래스를 업데이트하려면 어떻게해야합니까?

내가 예를 들어 추가 한 Statment 포함하도록 내 클래스의 상단에있는 사용 지침을 업데이 트하려는 :

using System; 

public class Foo { 

} 

이 될해야 :

using System; 
using Custom.Bar; 

public class Foo { 

} 

내가 오버라이드 (override) 할 수있는 참조 SyntaxRewriter 및 메서드 수준 코드를 해결하려면이 작업을 수행 한 있지만 이러한 지시문을 사용하여 액세스 권한을 부여 할 수있는 재정의 볼 수 없습니다?

감사합니다.

편집 :

나는이 속성을 발견했다,하지만 난 그것을 수정하는 방법을 모르겠어요.

var tree = document.GetSyntaxTree().GetRoot() as SyntaxNode; 

var compilationUnitSyntax = (CompilationUnitSyntax) (tree); 

if (compilationUnitSyntax != null) 
     compilationUnitSyntax.Usings.Add(); 

불행히도 UsingDirectiveSyntax는 내부 용이므로 어떻게 추가 할 수 있습니까? : D

+0

덕분에 그에 맞게 업데이트했습니다. – shenku

답변

9

SyntaxNodes을 만들려면 방법의 경우 Syntax 클래스 팩토리 메소드를 사용해야합니다.

그리고 당신은

if (compilationUnitSyntax != null) 
{ 
    var name = Syntax.QualifiedName(Syntax.IdentifierName("Custom"), 
            Syntax.IdentifierName("Bar")); 
    compilationUnitSyntax = compilationUnitSyntax 
     .AddUsings(Syntax.UsingDirective(name).NormalizeWhitespace()); 
} 

주 같은 AddUsings 방법 뭔가를 사용하여 새를 추가 할 수 있기 때문에의 불변성의 CompilationUnitSyntax 당신이 AddUsings 호출의 결과로 compilationUnitSyntax 변수를 재 할당해야합니다.

+0

챔피언에게 감사드립니다! – shenku

+3

'QualifiedNameSyntax'와 같은 것을 만들기 위해서는 모든 파트를 직접 구축하는 대신 Syntax.ParseName을 사용하는 것이 더 쉽습니다. –

+0

나는 왜 개체에 뭔가를 추가 할 수있는 인상을주는 3 가지 방법이 있는지 알지 못한다. ('cus.Usings.Add() cus.AddUsings() cus.WithUsings()') 그들 중의 하나만 실제로 객체가 변경되지 않는다는 힌트를 제공합니다 .. – StingyJack