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