RoslynAnalyzer
詳しくはググれば色々出てきますが、1つ参考リンクを貼っておきます。
要するに、本来のC#コンパイラでは異常と判断されない書き方を、いや俺はそんな書き方は許さない!としたい場合に、禁止ルールとして定義してコードエディタやUnityエディタ上で警告できるみたいなやつです。
IDisposableAnalyzers
IDisposable
を実装してるインスタンスは漏れなくDispose
を呼んでほしいものですが、人間なので忘れることもあります。
そういう時はRoslynAnalyzerの出番で、こちらのIDisposableAnalyzersを導入すると、Dispose
漏れを教えてくれます。
問題点?(自分は困ってる点)
ref structに対応してない
こちらは以前紹介したCodeCrackerと違い、比較的最近まで更新が入っており、using変数宣言でもちゃんとDispose
してると判断してくれます。
ただ、Dispose
してほしいのは今の時代はIDisposable
実装の型だけの話ではないんですよね。
はい、ref struct
です。
残念ながらref struct
のDispose
はこのアナライザは検知してくれません。
Issueには挙がっているようなので、対応してくれないかなぁ……(自分で改修できない。いやCodeCrackerの現状を見てたらこういうのちゃんと対応したくなって、で勉強してたら見つけたアナライザなので……)
Unityコンソールに表示されない(追記で解決済み)
何故かこのアナライザの警告がUnityのコンソール上に表示されません。
CodeCrackerは表示されたんですが……
ちょっと理由がわからず困っています。コンパイラのバージョンとかそういう話なのかなぁ。
環境は以下の通りです。
Unity: 2021.3.15 IDisposableRoslynAnalyzer: v4.0.2
答えを知っていたら教えてほしいです……
追記 Unityコンソールに表示できた
ちなみにエラーになってるのはrulesetファイルでそのように定義しているためです。
<?xml version="1.0" encoding="utf-8"?> <RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0"> <Rules AnalyzerId="IDisposableAnalyzers" RuleNamespace="IDisposableAnalyzers"> <Rule Id="IDISP001" Action="Error" /> </Rules> </RuleSet>
Unityコンソールに表示されなかった原因は恐らく、Unityが内包しているMicrosoft.CodeAnalysis.CSharp
のバージョンが、IDisposableAnalyzersの使用している同パッケージのバージョンよりも古かったためです。
とりあえずIDisposableAnalyzersに関しては以下のようにバージョンを変更してもビルドはできました。なんかビルド時に警告は出たけど。
同様のケースが他のアナライザで起きた場合はcsprojの記述変えて手元でビルドしたら解決できるかもしれないですね。
<ItemGroup> <PackageReference Include="Gu.Analyzers" Version="2.0.2" PrivateAssets="all" /> - <PackageReference Include="Gu.Roslyn.Extensions.Source" Version="0.16.6" /> - <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.0.1" /> + <PackageReference Include="Gu.Roslyn.Extensions.Source" Version="0.15.7" /> + <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.8.0-5.final" /> <PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.435" PrivateAssets="all" /> </ItemGroup>
このバージョンに意味は無いです。Unityが内包してるMicrosoft.CodeAnalysis.CSharp
のバージョンが自分の環境では3.9.0ぽかったのでそれより下げて、そしたらGu.Roslyn.Extension.Source
も下げないといけなかったからテキトーに下げただけです。成功するまで試してやろうと思っただけでマジで意味は無いです。
ref struct
のDispose
検知はできないけど、IDisposable
のDispose
漏れがログに出てくれるのは嬉しいので、使ってみていいんじゃないでしょうか。