Skip to content

Commit 0ef33d7

Browse files
committed
fix: apply logsLimit to compilation errors, remove useless timestamps
1 parent 4144bf9 commit 0ef33d7

File tree

1 file changed

+54
-77
lines changed

1 file changed

+54
-77
lines changed

Editor/Tools/RecompileScriptsTool.cs

Lines changed: 54 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Threading.Tasks;
5-
using McpUnity.Unity;
65
using McpUnity.Utils;
76
using Newtonsoft.Json.Linq;
87
using 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

Comments
 (0)