なつねこメモ

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

Roslyn で EditorConfig を使ったテストをしたい

今日は Roslyn の記事です。また触っているのでね。
今回は、比較的最近対応していた (気がする)、 Roslyn 経由での EditorConfig の扱いについてお話しします。

Roslyn では、コード内で以下のようにすることで、 EditorConfig から設定を引っぱってくることが可能です。

public void AnalyzePropertyDeclaration(SyntaxNodeAnalysisContext context)
{
    var provider = context.Options.AnalyzerConfigOptionsProvider;
    var options = provider.GetOptions(context.Node.SyntaxTree);
    if (options.TryGetValue("some_analyzer.key", out var value))
    {
        // value に設定した値が入っている
    }
}

EditorConfig はいろんな言語のフォーマットについて記述できる便利なものなので、是非対応しておきたい。
コード自体の対応は上だけで可能なのですが、テストについていくつかハマる部分があったので、メモとして残しておきます。
基本的には、まず AnalyzerConfigDocument として、 Solution か Project へ EditorConfig を追加します。

var solution = ...

solution = solution.AddAnalyzerConfigDocument(DocumentId.CreateNewId(projectId), ".editorconfig", SourceText.From("[*.cs]\nkey = value"), null, "/root");

こんなかんじ。
このとき、最後のパスを指定しなかったら、この .editorconfig は存在しなかったものとして扱われます。なぜ?
次は、 Analyzer へと設定を渡します。
これはこんな感じのコードで可能です。

var compilation = await project.GetCompilationAsync(ct);
var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
var compilationWithAnalyzersOptions = compilation.WithAnalyzersOptions(project.AnalyzerOptions, default, true, false, false, null);
var compilationWithAnalyzers = compilation.WithOptions(compilationOptions).WithAnalyzers(ImmutableArray.Create<DiagnosticAnalyzer>(new TAnalyzer()), compilationWithAnalyzersOptions);

最後に、 WithOptions... で組み立てた compilationWithAnalyzers から GetAnalyzerDiagnosticsAsync を呼び出せば、 EditorConfig に任意の値を渡した状態でテスト可能です。
ということで、メモでした。