はじめに
LoslynAnalyzer を使用することで,
ソースコードをチェックし問題があれば
error や warning として表示する機能を独自に実装することができます。
Unity でも使用することができるので,
今回は簡単な Loslyn Analyzer プロジェクトを作成し,
Unity に適用するまでを試してみます。
環境
Windows 11 Home 24H2
Unity バージョン 6000.1.6f1
Visual Studio : 2022
Analyzer のソリューションを作成する
Visual Studio にて, 「新しいプロジェクトの作成」を行います。
C# の「Analyzer with Code Fix (.NET Standard)」テンプレートを選択し, 任意のディレクトリに作成します。
自分は Unity の Assets ディレクトリと同階層に SampleAnalyzer を作成し指定しました。
.NETFramework は 4.8 で作成しました。
他の記事だと .NETStandard 2.0 を選択していましたが,
作成した Analyzer の csproj に以下の記述があったのでよしとしました。
<TargetFramework>netstandard2.0</TargetFramework>
ソリューションを作成すると
いくつかのプロジェクトで構成されていることがわかるかと思います。
各プロジェクトの説明は以下です(GPT談)。
- Analyzer.csproj : コードアナライザーの本体を実装するプロジェクトで違反を検出するロジックを記述する
- Analyzer.CodeFixes.csproj : コードの問題を自動修正するためロジックを実装する
- Analyzer.Paclage.csproj : Analyzer と CodeFixes を NuGet パッケージとしてビルドするのに使用する
- Analyzer.Test.csproj : アナライザーとコードフィックスの単体テストを記述する
- Analyzer.Vsix.csproj : Visual Studio の拡張機能(VSIXファイル)としてビルドするのに使用する
今回はエラーだけ出せれば良いので,
Analyzer と Test 以外は削除してしまいました。
今回は確認用に以下のようなコードを用意しました。
Analyzer.csproj 以下の cs ファイルの内容を書き換えます。
このコードは Debug.Log を使用するとエラーにするものです。
using System.Collections.Immutable; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace SampleAnalyzer { [DiagnosticAnalyzer(LanguageNames.CSharp)] public sealed class SampleAnalyzerAnalyzer : DiagnosticAnalyzer { private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor( id: "SA0001", title: "SampleAnalyzer Error", messageFormat: "messageFormat", category: "Usage", defaultSeverity: DiagnosticSeverity.Error, isEnabledByDefault: true, description: "description"); public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule); public override void Initialize(AnalysisContext context) { context.EnableConcurrentExecution(); context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); context.RegisterSyntaxNodeAction(AnalyzeInvocation, SyntaxKind.InvocationExpression); } private static void AnalyzeInvocation(SyntaxNodeAnalysisContext ctx) { var invocation = (InvocationExpressionSyntax)ctx.Node; var symbolInfo = ctx.SemanticModel.GetSymbolInfo(invocation); if (!(symbolInfo.Symbol is IMethodSymbol methodSymbol)) { return; } var containingType = methodSymbol.ContainingType; if (containingType == null || containingType.ToDisplayString() != "UnityEngine.Debug") return; var methodName = methodSymbol.Name; if (methodName == "Log" || methodName == "LogWarning" || methodName == "LogError" || methodName == "LogException") { // Error. ctx.ReportDiagnostic(Diagnostic.Create(Rule, invocation.GetLocation())); } } } }
ビルド
Analyzer の準備ができたので dll を作成します。
Visual Studio のビルドメニューからバッチビルドを選択し, ビルドを実行します。
以下に dll が生成されるかと思います。
SampleAnalyzer\SampleAnalyzer\SampleAnalyzer\bin\Release\netstandard2.0\SampleAnalyzer.dll
Unity に配置する
以下の公式ドキュメントを参考に Unity のディレクトリに dll を複製して配置します。
(ちなみに explorer から D&D で Project View に移動させれば勝手に複製されます)
Unity - Manual: Create and use a source generator
添付画像のように設定して完了です。
添付画像のようにコンソールに Debug.Log を使用している箇所のエラーが出ていれば成功です。
Visual Studio Code でも, Debug.Log を使用するとエラーになることが確認できました。
おわりに
今後 AI にコードを書かせる機会が増えてくるので,
コンパイルエラーで気づけるようにしておくのは今後必要になるかもなと思いました。
Analyzer は既成のものを使用する手法もあるので, そちらも試していきたいです。
以上.