@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

Roslynを使ってC#のクラス名を変更する

Roslynを使ってC#のソースコードを編集する - @ledsun blog でRoslynをつかうとC#ソースコードが編集出来るとわかりました。 編集内容を変えて練習します。 クラス名を変えてみます。

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

var st = CSharpSyntaxTree.ParseText(@"
public class TargetClass 
{
    // This is a comment
    public void M() {
        1 + 1;
    }
}
");
var root = st.GetRoot();
var klass = root.DescendantNodes().OfType<ClassDeclarationSyntax>().Single();
var rewriten = root.ReplaceNode(klass, klass.WithIdentifier(
    SyntaxFactory.ParseToken("Abc")
    )
);
Console.WriteLine(rewriten);

全体の流れはfor文の編集と同じです。 クラス名の変更ではつぎのようなコードが出てきます。

klass.WithIdentifier(
    SyntaxFactory.ParseToken("Abc")
)

変更したいノード毎に定義されているWithXxxxメソッドで変更したい項目を変更します。 WithXxxxメソッド毎に受け取るSyntaxXxxx型が決まっています。 SyntaxFactory.ParseXxxxメソッドを使って、渡すインスタンスを作ります。

このメソッドの組み合わせの勘が効くようになるまでは練習が必要そうです。

実行結果です。

実行結果

クラス名の後ろの改行は消えました。 この辺を保持しつつ変更する方法もあるのかもしれません。