using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using UnityEngine; using UnityEditor; #pragma warning disable IDE0005 using Serilog = Meryel.Serilog; #pragma warning restore IDE0005 #nullable enable namespace Meryel.UnityCodeAssist.Editor { // according to documentation, https://docs.unity3d.com/2023.2/Documentation/Manual/roslyn-analyzers.html // if analyzers are under any asmdef file, they are bound to the asmdef's scope // to declare out analyzers globally, had to write custom AssetPostprocessor and don't use "RoslynAnalyzer" asset label public class AnalyzerPostProcessor : AssetPostprocessor { public static string OnGeneratedCSProject(string path, string content) { // do not add roslyn analyzers to Visual Studio projects for performance if (Assister.GetCodeEditor(false, out var isVisualStudio, out _, out _) && isVisualStudio) return content; var analyzerGroup = new StringBuilder(); analyzerGroup.Append(NewLine); analyzerGroup.Append(" "); analyzerGroup.Append(NewLine); analyzerGroup.Append(" "); var prefix = $"{NewLine} "; foreach (var analyzer in Analyzers) { analyzerGroup.Append(prefix); analyzerGroup.Append(analyzer); analyzerGroup.Append(suffix); } analyzerGroup.Append(NewLine); analyzerGroup.Append(" "); //analyzerGroup.Append(NewLine); //content = Regex.Replace(content, $"[{NewLine}]*[{NewLine}]*", $"{analyzerGroup.ToString()}$&"); var matches = Regex.Matches(content, $"[{NewLine}]*"); var index = matches.LastOrDefault(m => m.Success)?.Index ?? -1; //var index = content.LastIndexOf(""); if (index >= 0) content = content.Insert(index, analyzerGroup.ToString()); return content; } private const string NewLine = "\r\n"; private readonly static string[] Analyzers = new string[] { #if MERYEL_UCA_LITE_VERSION "Meryel.UnityCodeAssist.AnalyzersLite.dll", #else "Meryel.UnityCodeAssist.Analyzers.dll", #endif "Meryel.UnityCodeAssist.Common.dll", "Meryel.UnityCodeAssist.Completion.dll", "Meryel.UnityCodeAssist.CompletionInternals.dll", "Meryel.UnityCodeAssist.Logger.dll", "Meryel.UnityCodeAssist.MQTTnet.dll", "Meryel.UnityCodeAssist.MQTTnet.Extensions.ManagedClient.dll", "Meryel.UnityCodeAssist.Newtonsoft.Json.dll", "Meryel.UnityCodeAssist.ProjectData.dll", "Meryel.UnityCodeAssist.RoslynAnalyzerManager.dll", "Meryel.UnityCodeAssist.Synchronizer.dll", "Meryel.UnityCodeAssist.SynchronizerModel.dll", "Meryel.UnityCodeAssist.VSIXLibrary.dll", }; } }