ノートの端の書き残し

UnityやらC#やら。設計が得意かもしれない。

Dispose漏れを検知してくれるRoslynAnalyzer「IDisposableAnalyzers」

RoslynAnalyzer

詳しくはググれば色々出てきますが、1つ参考リンクを貼っておきます。

note.com

要するに、本来のC#コンパイラでは異常と判断されない書き方を、いや俺はそんな書き方は許さない!としたい場合に、禁止ルールとして定義してコードエディタやUnityエディタ上で警告できるみたいなやつです。

IDisposableAnalyzers

IDisposableを実装してるインスタンスは漏れなくDisposeを呼んでほしいものですが、人間なので忘れることもあります。
そういう時はRoslynAnalyzerの出番で、こちらのIDisposableAnalyzersを導入すると、Dispose漏れを教えてくれます。

github.com

問題点?(自分は困ってる点)

ref structに対応してない

こちらは以前紹介したCodeCrackerと違い、比較的最近まで更新が入っており、using変数宣言でもちゃんとDisposeしてると判断してくれます。
ただ、Disposeしてほしいのは今の時代はIDisposable実装の型だけの話ではないんですよね。

はい、ref structです。

ufcpp.net

残念ながらref structDisposeはこのアナライザは検知してくれません。 Issueには挙がっているようなので、対応してくれないかなぁ……(自分で改修できない。いやCodeCrackerの現状を見てたらこういうのちゃんと対応したくなって、で勉強してたら見つけたアナライザなので……)

github.com

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 structDispose検知はできないけど、IDisposableDispose漏れがログに出てくれるのは嬉しいので、使ってみていいんじゃないでしょうか。