22using System . Collections . Generic ;
33using System . Linq ;
44using System . Threading . Tasks ;
5- using McpUnity . Unity ;
65using McpUnity . Utils ;
76using Newtonsoft . Json . Linq ;
87using UnityEditor ;
@@ -15,7 +14,8 @@ namespace McpUnity.Tools {
1514 /// </summary>
1615 public class RecompileScriptsTool : McpToolBase
1716 {
18- private class CompilationRequest {
17+ private class CompilationRequest
18+ {
1919 public readonly bool ReturnWithLogs ;
2020 public readonly int LogsLimit ;
2121 public readonly TaskCompletionSource < JObject > CompletionSource ;
@@ -28,6 +28,22 @@ public CompilationRequest(bool returnWithLogs, int logsLimit, TaskCompletionSour
2828 }
2929 }
3030
31+ private class CompilationResult
32+ {
33+ public readonly List < CompilerMessage > SortedLogs ;
34+ public readonly int WarningsCount ;
35+ public readonly int ErrorsCount ;
36+
37+ public bool HasErrors => ErrorsCount > 0 ;
38+
39+ public CompilationResult ( List < CompilerMessage > sortedLogs , int warningsCount , int errorsCount )
40+ {
41+ SortedLogs = sortedLogs ;
42+ WarningsCount = warningsCount ;
43+ ErrorsCount = errorsCount ;
44+ }
45+ }
46+
3147 private readonly List < CompilationRequest > _pendingRequests = new List < CompilationRequest > ( ) ;
3248 private readonly List < CompilerMessage > _compilationLogs = new List < CompilerMessage > ( ) ;
3349 private int _processedAssemblies = 0 ;
@@ -69,7 +85,7 @@ public override void ExecuteAsync(JObject parameters, TaskCompletionSource<JObje
6985
7086 if ( EditorApplication . isCompiling == false )
7187 {
72- McpLogger . LogInfo ( $ "Recompiling all scripts in the Unity project (logsLimit: { logsLimit } ) ") ;
88+ McpLogger . LogInfo ( "Recompiling all scripts in the Unity project" ) ;
7389 CompilationPipeline . RequestScriptCompilation ( ) ;
7490 }
7591 }
@@ -97,26 +113,24 @@ private void StopCompilationTracking()
97113 /// <summary>
98114 /// Record compilation logs for every single assembly
99115 /// </summary>
100- /// <param name="assemblyPath"></param>
101- /// <param name="messages"></param>
102116 private void OnAssemblyCompilationFinished ( string assemblyPath , CompilerMessage [ ] messages )
103117 {
104118 _processedAssemblies ++ ;
105119 _compilationLogs . AddRange ( messages ) ;
106120 }
107121
108122 /// <summary>
109- /// Complete all pending requests and stop tracking
123+ /// Stop tracking and complete all pending requests
110124 /// </summary>
111- /// <param name="_"></param>
112125 private void OnCompilationFinished ( object _ )
113126 {
114127 McpLogger . LogInfo ( $ "Recompilation completed. Processed { _processedAssemblies } assemblies with { _compilationLogs . Count } compiler messages") ;
115128
116- // Separate errors, warnings, and other messages
117- List < CompilerMessage > errors = _compilationLogs . Where ( m => m . type == CompilerMessageType . Error ) . ToList ( ) ;
118- List < CompilerMessage > warnings = _compilationLogs . Where ( m => m . type == CompilerMessageType . Warning ) . ToList ( ) ;
119- List < CompilerMessage > others = _compilationLogs . Where ( m => m . type != CompilerMessageType . Error && m . type != CompilerMessageType . Warning ) . ToList ( ) ;
129+ // Sort logs by type: first errors, then warnings and info
130+ List < CompilerMessage > sortedLogs = _compilationLogs . OrderBy ( x => x . type ) . ToList ( ) ;
131+ int errorsCount = _compilationLogs . Count ( l => l . type == CompilerMessageType . Error ) ;
132+ int warningsCount = _compilationLogs . Count ( l => l . type == CompilerMessageType . Warning ) ;
133+ CompilationResult result = new CompilationResult ( sortedLogs , warningsCount , errorsCount ) ;
120134
121135 // Stop tracking before completing requests
122136 StopCompilationTracking ( ) ;
@@ -132,89 +146,52 @@ private void OnCompilationFinished(object _)
132146
133147 foreach ( var request in requestsToComplete )
134148 {
135- CompleteRequest ( request , errors , warnings , others ) ;
149+ CompleteRequest ( request , result ) ;
136150 }
137151 }
138152
139153 /// <summary>
140154 /// Process a completed compilation request
141155 /// </summary>
142- private static void CompleteRequest ( CompilationRequest request , List < CompilerMessage > errors , List < CompilerMessage > warnings , List < CompilerMessage > others )
156+ private static void CompleteRequest ( CompilationRequest request , CompilationResult result )
143157 {
144- try {
145- JArray logsArray = new JArray ( ) ;
158+ JArray logsArray = new JArray ( ) ;
159+ IEnumerable < CompilerMessage > logsToReturn = request . ReturnWithLogs ? result . SortedLogs . Take ( request . LogsLimit ) : Enumerable . Empty < CompilerMessage > ( ) ;
146160
147- // Sort logs and apply logsLimit - prioritize errors if logsLimit is restrictive
148- IEnumerable < CompilerMessage > sortedLogs ;
149- if ( ! request . ReturnWithLogs || request . LogsLimit <= 0 )
161+ foreach ( var message in logsToReturn )
162+ {
163+ var logObject = new JObject
150164 {
151- sortedLogs = Enumerable . Empty < CompilerMessage > ( ) ;
152- }
153- else {
154- // Always include all errors, then warnings, then other messages up to the logsLimit
155- var selectedLogs = errors . ToList ( ) ;
156- var remainingSlots = request . LogsLimit - selectedLogs . Count ;
157-
158- if ( remainingSlots > 0 )
159- {
160- selectedLogs . AddRange ( warnings . Take ( remainingSlots ) ) ;
161- remainingSlots = request . LogsLimit - selectedLogs . Count ;
162- }
163-
164- if ( remainingSlots > 0 )
165- {
166- selectedLogs . AddRange ( others . Take ( remainingSlots ) ) ;
167- }
168-
169- sortedLogs = selectedLogs ;
170- }
165+ [ "message" ] = message . message ,
166+ [ "type" ] = message . type . ToString ( )
167+ } ;
171168
172- foreach ( var message in sortedLogs )
169+ // Add file information if available
170+ if ( ! string . IsNullOrEmpty ( message . file ) )
173171 {
174- var logObject = new JObject
175- {
176- [ "message" ] = message . message ,
177- [ "type" ] = message . type . ToString ( ) ,
178- [ "timestamp" ] = DateTime . Now . ToString ( "yyyy-MM-dd HH:mm:ss.fff" )
179- } ;
180-
181- // Add file information if available
182- if ( ! string . IsNullOrEmpty ( message . file ) )
183- {
184- logObject [ "file" ] = message . file ;
185- logObject [ "line" ] = message . line ;
186- logObject [ "column" ] = message . column ;
187- }
188-
189- logsArray . Add ( logObject ) ;
172+ logObject [ "file" ] = message . file ;
173+ logObject [ "line" ] = message . line ;
174+ logObject [ "column" ] = message . column ;
190175 }
191176
192- bool hasErrors = errors . Count > 0 ;
193- string summaryMessage = hasErrors
194- ? $ "Recompilation completed with { errors . Count } error(s) and { warnings . Count } warning(s)"
195- : $ "Successfully recompiled all scripts with { warnings . Count } warning(s)";
177+ logsArray . Add ( logObject ) ;
178+ }
196179
197- summaryMessage += $ " (returnWithLogs: { request . ReturnWithLogs } , logsLimit: { request . LogsLimit } )";
180+ string summaryMessage = result . HasErrors
181+ ? $ "Recompilation completed with { result . ErrorsCount } error(s) and { result . WarningsCount } warning(s)"
182+ : $ "Successfully recompiled all scripts with { result . WarningsCount } warning(s)";
198183
199- var response = new JObject
200- {
201- [ "success" ] = true ,
202- [ "type" ] = "text" ,
203- [ "message" ] = summaryMessage ,
204- [ "logs" ] = logsArray
205- } ;
184+ summaryMessage += $ " (returnWithLogs: { request . ReturnWithLogs } , logsLimit: { request . LogsLimit } )";
206185
207- McpLogger . LogInfo ( $ "Setting recompilation result: success={ ! hasErrors } , errors={ errors . Count } , warnings={ warnings . Count } ") ;
208- request . CompletionSource . SetResult ( response ) ;
209- }
210- catch ( Exception ex )
186+ var response = new JObject
211187 {
212- McpLogger . LogError ( $ "Error creating recompilation response: { ex . Message } \n { ex . StackTrace } ") ;
213- request . CompletionSource . SetResult ( McpUnitySocketHandler . CreateErrorResponse (
214- $ "Error creating recompilation response: { ex . Message } ",
215- "response_creation_error"
216- ) ) ;
217- }
188+ [ "success" ] = true ,
189+ [ "type" ] = "text" ,
190+ [ "message" ] = summaryMessage ,
191+ [ "logs" ] = logsArray
192+ } ;
193+
194+ request . CompletionSource . SetResult ( response ) ;
218195 }
219196
220197 /// <summary>
0 commit comments