なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

Roslyn の IMethodSymbol で拡張メソッドを扱いたい

C# / VB.NET のコンパイラーである Roslyn はライブラリとして扱うこともでき、コード解析などを行うことができる。 その中でメソッドについての情報が格納されるのが IMethodSymbol だが、以下のような拡張メソッドの場合は、拡張メソッドそのものでは無く、展開した状態のメソッドが返される。

// SyntaxToken は外部依存 (Microsoft.CodeAnalysis) のもの
public static bool ToHaveHexadecimalLikeString(this SyntaxToken obj, string prefix = "_", string suffix = "")
{
    // ...
}

IMethodSymbol symbol = ...;
symbol.Dump();
// Microsoft.CodeAnalysis.SyntaxToken.ToHaveHexadecimalLikeString(string, string)

書いている本人としては、 token.ToHaveHexadecimalLikeString() としているので、自然な表現ではあるのだが、展開したメソッドでは無く、実装しているメソッドそのものが欲しい場合は ReducedFrom を使うと得られる。

symbol.ReducedFrom.Dump();
// SyntaxTokenExtensions.ToHaveHexadecimalLikeString(Microsoft.CodeAnalysis.SyntaxToken, string, string)

ちなみに (おそらく) すべてがコンパイル対象に含まれている場合は、 ReducedFrom せずとも実装しているメソッドそのものが得られる。 というメモでした。