最初に結論
下記の設定をすると IDE**** のようなコードスタイルの分析結果を Vim 上から確認することができます。(OmniSharp-Vim と ALE を連携している前提です。)
{
"RoslynExtensionsOptions": {
"enableAnalyzersSupport": true
},
"FormattingOptions": {
"enableEditorConfigSupport": true
}
}
注意点
- ソリューションの規模によっては解析に時間がかかりCPUに負荷がかかる可能性があります
- editorconfig で解析ルールを設定しない場合は
enableEditorConfigSupport
の設定は不要です
背景
最近、Roslyn-API について調べていまして自作のアナライザーの結果を Vim で見れるのかな?と色々やっていたところ偶然 IDE****
の分析結果を Vim で表示する方法が分かりました。
方法
ALE と連携し分析結果を表示できるようにする
OmniSharp-Vim で分析結果を表示するために、まず、ALE と連携するように設定します。(ALE使わない方法は試してないので良く分かりません)
let g:ale_linters = {
\ 'cs': ['OmniSharp']
\}
ここで、動作確認用のコードを書きます。 CS****
系の指摘と IDE****
系の指摘がでるようなコードにします。
namespace Sample
{
internal class Class1
{
public Class1()
{
int hello = "hello";
var a = hello;
Console.WriteLine(hello);
}
}
}
このコードを VisualStudio で解析すると、CS0029
と IDE0059
が発生していることが分かります。
このコードを、ALE連携した Omnisharp-Vim を使ってみるとこのように見えます。(ガーター部分の表示はALEの設定によります)
CS0029
は表示されていますが、IDE0059
が表示されていません。
IDE**** の分析結果を表示する
IDE**** 系の分析結果を表示するには OmniSharp-Roslyn 側の設定が必要になります。
↑を参考に omnisharp.json
を作成しenableAnalyzersSupport
に true を設定します。
{
"RoslynExtensionsOptions": {
"enableAnalyzersSupport": true
}
}
この状態で先ほどのコードを vim で確認すると、IDE****
の分析結果が表示されるようになりました!
enableAnalyzersSupport
に true を設定するとNugetからインストールしたアナライザーを含めた全てのアナライザーで解析が行われるようです。
editorconfig でコードスタイルの設定を行う
さて、コードスタイルにはオプションなどの設定が存在します。例えば IDE0011 であれば中かっこを使用するかどうか、そして使用する場合は複数行のコード ブロックだけかどうかを指定できます。
この設定は editorconfig で設定できます。
確認のため、 IDE0011
が警告されるように中カッコが無い一行のコードを書きます。
public Class1()
{
var a = "hello";
if (a == "Hello") Console.WriteLine("hello");
}
IDE0011
のデフォルトは true
なので一行で中カッコを使っていない場合警告されます。
Vim 上で警告されることを確認しました。
次に、editorconfig で IDE0011
のオプション設定を false に変更します。これにより中カッコを使用していないときに警告が出なくなるはずです。
[*.cs]
csharp_prefer_braces = false
調べてみると、editorconfig
を使う場合は omnisharp.json に EnableEditorConfigSupport
を true にする必要がありました。
omnisharp.json を変更します。
{
"RoslynExtensionsOptions": {
"enableAnalyzersSupport": true
},
"FormattingOptions": {
"enableEditorConfigSupport": true
}
}
この状態で Vim で確認すると IDE0011
が消えていることを確認しました。
問題点
やったぜ!これで IDE****
も表示できるぜ!と思って、担当しているプロジェクトをひらきました。
すると IDE****
が表示されるまでに相当の時間がかかることが分かりました。そしてPCのファンが爆音で回ります。デフォルト設定だとCPU コア数の 75% をフルフルに使って解析をするようです。
If you want to run the analyzers sequentially instead of in parallel - set diagnosticWorkersThreadCount to 1. If no value is given for the thread count 75% of the cores will be used (i.e. 12 cores on a 16 core machine).
また OmniSharp のログを確認すると、解析が途中でタイムアウトしていることも分かりました。
タイムアウト自体を解決するには documentAnalysisTimeoutMs
の設定時間を増やすことで解決はできましたが、Vim の軽量な動作は死にます。
ソリューション全体ではなく、開いでいるファイルだけ解析できるオプションはないか調べたところあるにはありました。
analyzeOpenDocumentsOnly
を設定すれば開いているファイルだけ解析されます。
しかし、この場合は IDE****
の表示はされないことが分かりました。
analyzeOpenDocumentsOnly
の機能が入ったときのPR を見ると
just the base diagnostics provided by syntaxTree.GetDiagnostics()
とコメントがありました。 どうやら base diagnostics
の中には IDE****
系を出すコードアナライザーによる分析は含まれないようです。残念…
ということで担当プロジェクトについては、プロジェクトディレクトリに omnisharp.json
をさらに追加して、enableAnalyzersSupport
を false に設定し、基本的な分析のみ行うようにしました。なんだか負けた気分です。ぴえん。