今日は 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 に任意の値を渡した状態でテスト可能です。
ということで、メモでした。