From 80fd464e6ee07b85236ad64a53e83efc9327106b Mon Sep 17 00:00:00 2001 From: hatayama Date: Sun, 5 Jul 2026 18:06:24 +0900 Subject: [PATCH 1/3] Collapse the Compile tool's intermediate DTO layer The Compile pipeline used to carry a redundant intermediate DTO layer (IUnityCliLoopCompilationService, UnityCliLoopCompileRequest, UnityCliLoopCompileIssue, UnityCliLoopCompileResult) that only performed field-for-field copies between the wire-facing CompileSchema / CompileResponse and the internal CompileResult. The intermediate types had no external consumers and added mapping code without changing behavior. Route CompileSchema and CompileResponse directly through CompileUseCase, CompilationExecutionService, CompileController, and CompileSessionResultService, and delete the intermediate types. The session-state JSON that StoreCompileResult writes stays byte-identical because CompileResponse has the same declaration order, nullability, and PascalCase property names as the old UnityCliLoopCompileResult, and both flow through the same JsonRpcResponseSerializer settings without a contract resolver rename. --- .../CompileSessionResultServiceTests.cs | 16 +++--- .../Compile/CompilationExecutionService.cs | 2 +- .../Compile/CompileController.cs | 2 +- .../Compile/CompileSessionResultService.cs | 18 +++--- .../FirstPartyTools/Compile/CompileTool.cs | 55 +----------------- .../FirstPartyTools/Compile/CompileUseCase.cs | 56 +++++++++---------- .../Compile/UnityCliLoopCompileTypes.cs | 48 ---------------- .../Compile/UnityCliLoopCompileTypes.cs.meta | 11 ---- 8 files changed, 48 insertions(+), 160 deletions(-) delete mode 100644 Packages/src/Editor/FirstPartyTools/Compile/UnityCliLoopCompileTypes.cs delete mode 100644 Packages/src/Editor/FirstPartyTools/Compile/UnityCliLoopCompileTypes.cs.meta diff --git a/Assets/Tests/Editor/CompileSessionResultServiceTests.cs b/Assets/Tests/Editor/CompileSessionResultServiceTests.cs index dc6254d0c5..1e3fee0c18 100644 --- a/Assets/Tests/Editor/CompileSessionResultServiceTests.cs +++ b/Assets/Tests/Editor/CompileSessionResultServiceTests.cs @@ -42,7 +42,7 @@ public void CreateCompileResult_WhenNormalCompileCompletes_MapsDetailedIssues() errors: new[] { error }, warnings: new[] { warning }); - UnityCliLoopCompileResult response = + CompileResponse response = CompileSessionResultService.CreateCompileResult(result, forceRecompile: false); Assert.That(response.Success, Is.False); @@ -75,7 +75,7 @@ public void CreateCompileResult_WhenForceCompileIsUnknown_ExplainsNullDetails() isIndeterminate: true, message: null); - UnityCliLoopCompileResult response = + CompileResponse response = CompileSessionResultService.CreateCompileResult(result, forceRecompile: true); Assert.That(response.Success, Is.Null); @@ -100,7 +100,7 @@ public void CreateCompileResult_WhenForceCompileHasOutcome_ExplainsNullDetails() warnings: Array.Empty(), message: "Internal force compile status message."); - UnityCliLoopCompileResult response = + CompileResponse response = CompileSessionResultService.CreateCompileResult(result, forceRecompile: true); Assert.That(response.Success, Is.True); @@ -133,7 +133,7 @@ public void CreateCompileResult_WhenForceCompileHasPreservedFailure_MapsDetailed message: "Compilation stopped because open Scene files changed externally.", preserveDetailsWhenForceRecompile: true); - UnityCliLoopCompileResult response = + CompileResponse response = CompileSessionResultService.CreateCompileResult(result, forceRecompile: true); Assert.That(response.Success, Is.False); @@ -163,7 +163,7 @@ public void CreateCompileResult_WhenUnityTestFrameworkSymbolIsMissing_AddsTestAs errors: new[] { error }, warnings: Array.Empty()); - UnityCliLoopCompileResult response = + CompileResponse response = CompileSessionResultService.CreateCompileResult(result, forceRecompile: false); Assert.That(response.Message, Does.Contain("TestAssemblies")); @@ -182,13 +182,13 @@ public void StoreCompileResult_WhenResultIsPersisted_UsesPascalCaseJson() try { - UnityCliLoopCompileResult response = new UnityCliLoopCompileResult + CompileResponse response = new CompileResponse { Success = true, ErrorCount = 0, WarningCount = 0, - Errors = Array.Empty(), - Warnings = Array.Empty(), + Errors = Array.Empty(), + Warnings = Array.Empty(), Message = "Compilation completed." }; diff --git a/Packages/src/Editor/FirstPartyTools/Compile/CompilationExecutionService.cs b/Packages/src/Editor/FirstPartyTools/Compile/CompilationExecutionService.cs index 5b8b4a0d25..9efb415612 100644 --- a/Packages/src/Editor/FirstPartyTools/Compile/CompilationExecutionService.cs +++ b/Packages/src/Editor/FirstPartyTools/Compile/CompilationExecutionService.cs @@ -29,7 +29,7 @@ public CompilationExecutionService(UnityCliLoopEditorSessionStateService session /// /// Compile request with force and delayed-result settings. /// Compilation result - public async Task ExecuteCompilationAsync(UnityCliLoopCompileRequest request, CancellationToken ct) + public async Task ExecuteCompilationAsync(CompileSchema request, CancellationToken ct) { if (request == null) { diff --git a/Packages/src/Editor/FirstPartyTools/Compile/CompileController.cs b/Packages/src/Editor/FirstPartyTools/Compile/CompileController.cs index f9f948e49e..c65dc99b29 100644 --- a/Packages/src/Editor/FirstPartyTools/Compile/CompileController.cs +++ b/Packages/src/Editor/FirstPartyTools/Compile/CompileController.cs @@ -516,7 +516,7 @@ private void RecordCompileResultIfNeeded( return; } - UnityCliLoopCompileResult response = + CompileResponse response = CompileSessionResultService.CreateCompileResult(result, _resultRecordingContext.ForceRecompile); CompileSessionResultService.StoreCompileResult( _sessionStateService, diff --git a/Packages/src/Editor/FirstPartyTools/Compile/CompileSessionResultService.cs b/Packages/src/Editor/FirstPartyTools/Compile/CompileSessionResultService.cs index 492f4ff61a..f7d91b4ecd 100644 --- a/Packages/src/Editor/FirstPartyTools/Compile/CompileSessionResultService.cs +++ b/Packages/src/Editor/FirstPartyTools/Compile/CompileSessionResultService.cs @@ -17,7 +17,7 @@ internal static class CompileSessionResultService private const string MissingTestFrameworkReferenceHint = "Possible test asmdef issue: Unity test framework symbols are missing. Make sure com.unity.test-framework is installed and add optionalUnityReferences: [\"TestAssemblies\"] or enable testAssemblies on the test asmdef."; - internal static UnityCliLoopCompileResult CreateCompileResult( + internal static CompileResponse CreateCompileResult( CompileResult result, bool forceRecompile) { @@ -30,7 +30,7 @@ internal static UnityCliLoopCompileResult CreateCompileResult( if (result.IsIndeterminate) { - return new UnityCliLoopCompileResult + return new CompileResponse { Success = result.Success, ErrorCount = result.ErrorCount, @@ -41,7 +41,7 @@ internal static UnityCliLoopCompileResult CreateCompileResult( }; } - return new UnityCliLoopCompileResult + return new CompileResponse { Success = result.Success, ErrorCount = result.Errors?.Length ?? 0, @@ -56,7 +56,7 @@ internal static void StoreCompileResult( UnityCliLoopEditorSessionStateService sessionStateService, string requestId, bool forceRecompile, - UnityCliLoopCompileResult result, + CompileResponse result, string correlationId) { Debug.Assert(sessionStateService != null, "sessionStateService must not be null"); @@ -98,10 +98,10 @@ internal static void StoreCompileResult( correlationId); } - private static UnityCliLoopCompileResult CreateForceCompileResult(CompileResult result) + private static CompileResponse CreateForceCompileResult(CompileResult result) { ForceCompileUnknownResult unknownResult = ForceCompileUnknownResult.Create(result.Success); - return new UnityCliLoopCompileResult + return new CompileResponse { Success = unknownResult.Success, ErrorCount = unknownResult.ErrorCount, @@ -112,14 +112,14 @@ private static UnityCliLoopCompileResult CreateForceCompileResult(CompileResult }; } - private static UnityCliLoopCompileIssue[] ToIssues(UnityEditor.Compilation.CompilerMessage[] messages) + private static CompileIssue[] ToIssues(UnityEditor.Compilation.CompilerMessage[] messages) { if (messages == null) { return null; } - return messages.Select(message => new UnityCliLoopCompileIssue + return messages.Select(message => new CompileIssue { Message = message.message, File = message.file, @@ -193,7 +193,7 @@ internal static CompileResultRecordingContext Disabled() return new CompileResultRecordingContext(false, "", false); } - internal static CompileResultRecordingContext Create(UnityCliLoopCompileRequest request) + internal static CompileResultRecordingContext Create(CompileSchema request) { Debug.Assert(request != null, "request must not be null"); diff --git a/Packages/src/Editor/FirstPartyTools/Compile/CompileTool.cs b/Packages/src/Editor/FirstPartyTools/Compile/CompileTool.cs index 309983e51f..9c8a824e7d 100644 --- a/Packages/src/Editor/FirstPartyTools/Compile/CompileTool.cs +++ b/Packages/src/Editor/FirstPartyTools/Compile/CompileTool.cs @@ -24,60 +24,7 @@ protected override async Task ExecuteAsync(CompileSchema parame UnityCliLoopEditorSessionStateService sessionStateService = UnityCliLoopEditorSessionStateFacade.Service; CompileUseCase useCase = new(sessionStateService); - UnityCliLoopCompileResult result = await useCase.CompileAsync(ToRequest(parameters), ct); - return ToResponse(result); - } - - private static UnityCliLoopCompileRequest ToRequest(CompileSchema parameters) - { - if (parameters == null) - { - throw new System.ArgumentNullException(nameof(parameters)); - } - - return new UnityCliLoopCompileRequest - { - ForceRecompile = parameters.ForceRecompile, - WaitForDomainReload = parameters.WaitForDomainReload, - ReloadExternalSceneChanges = parameters.ReloadExternalSceneChanges, - RequestId = parameters.RequestId, - }; - } - - private static CompileResponse ToResponse(UnityCliLoopCompileResult result) - { - if (result == null) - { - throw new System.ArgumentNullException(nameof(result)); - } - - CompileResponse response = new( - success: result.Success, - errorCount: result.ErrorCount, - warningCount: result.WarningCount, - errors: ToCompileIssues(result.Errors), - warnings: ToCompileIssues(result.Warnings), - message: result.Message); - - response.ProjectRoot = result.ProjectRoot; - return response; - } - - private static CompileIssue[] ToCompileIssues(UnityCliLoopCompileIssue[] issues) - { - if (issues == null) - { - return null; - } - - CompileIssue[] mappedIssues = new CompileIssue[issues.Length]; - for (int i = 0; i < issues.Length; i++) - { - UnityCliLoopCompileIssue issue = issues[i]; - mappedIssues[i] = new CompileIssue(issue.Message, issue.File, issue.Line); - } - - return mappedIssues; + return await useCase.CompileAsync(parameters, ct); } } } diff --git a/Packages/src/Editor/FirstPartyTools/Compile/CompileUseCase.cs b/Packages/src/Editor/FirstPartyTools/Compile/CompileUseCase.cs index 09dd4d287d..16ad949c2b 100644 --- a/Packages/src/Editor/FirstPartyTools/Compile/CompileUseCase.cs +++ b/Packages/src/Editor/FirstPartyTools/Compile/CompileUseCase.cs @@ -14,7 +14,7 @@ namespace io.github.hatayama.UnityCliLoop.FirstPartyTools /// Processing sequence: 1. Play Mode preparation, 2. Compilation state validation, 3. Compilation execution, 4. Result formatting /// Related classes: CompileTool, PlayModeCompilationPreparationService, CompilationStateValidationService, CompilationExecutionService /// - public class CompileUseCase : IUnityCliLoopCompilationService + public class CompileUseCase { private const int MAX_WAIT_MS = 5000; private const int POLL_INTERVAL_MS = 50; @@ -31,10 +31,10 @@ public CompileUseCase(UnityCliLoopEditorSessionStateService sessionStateService) /// /// Executes compilation processing /// - /// Compilation parameters + /// Compilation parameters /// Cancellation control token /// Compilation result - public async Task CompileAsync(UnityCliLoopCompileRequest request, CancellationToken ct) + public async Task CompileAsync(CompileSchema request, CancellationToken ct) { if (request == null) { @@ -61,14 +61,14 @@ public async Task CompileAsync(UnityCliLoopCompileReq preparation.ErrorMessage, BuildCompileLogContext(request), correlationId); - UnityCliLoopCompileResult response = CreateCompileResult( + CompileResponse response = CreateCompileResult( false, 1, 0, new[] { CreateIssue(preparation.ErrorMessage, "", 0) }, - Array.Empty(), + Array.Empty(), null); - UnityCliLoopCompileResult persistedResponse = + CompileResponse persistedResponse = StoreResponseIfNeeded(request, response, correlationId); return persistedResponse; } @@ -93,14 +93,14 @@ public async Task CompileAsync(UnityCliLoopCompileReq correlationId); if (!exited) { - UnityCliLoopCompileResult response = CreateCompileResult( + CompileResponse response = CreateCompileResult( false, 1, 0, new[] { CreateIssue("Play Mode did not exit within 5 seconds; compilation aborted.", "", 0) }, - Array.Empty(), + Array.Empty(), null); - UnityCliLoopCompileResult persistedResponse = + CompileResponse persistedResponse = StoreResponseIfNeeded(request, response, correlationId); return persistedResponse; } @@ -117,14 +117,14 @@ public async Task CompileAsync(UnityCliLoopCompileReq validation.ErrorMessage, BuildCompileLogContext(request), correlationId); - UnityCliLoopCompileResult response = CreateCompileResult( + CompileResponse response = CreateCompileResult( false, 1, 0, new[] { CreateIssue(validation.ErrorMessage, "", 0) }, - Array.Empty(), + Array.Empty(), null); - UnityCliLoopCompileResult persistedResponse = + CompileResponse persistedResponse = StoreResponseIfNeeded(request, response, correlationId); return persistedResponse; } @@ -135,22 +135,22 @@ public async Task CompileAsync(UnityCliLoopCompileReq CompileResult result = await executionService.ExecuteCompilationAsync(request, ct); // 4. Result formatting - UnityCliLoopCompileResult successResponse = + CompileResponse successResponse = CompileSessionResultService.CreateCompileResult(result, request.ForceRecompile); - UnityCliLoopCompileResult persistedSuccessResponse = + CompileResponse persistedSuccessResponse = StoreResponseIfNeeded(request, successResponse, correlationId); return persistedSuccessResponse; } - private static UnityCliLoopCompileResult CreateCompileResult( + private static CompileResponse CreateCompileResult( bool? success, int? errorCount, int? warningCount, - UnityCliLoopCompileIssue[] errors, - UnityCliLoopCompileIssue[] warnings, + CompileIssue[] errors, + CompileIssue[] warnings, string message) { - return new UnityCliLoopCompileResult + return new CompileResponse { Success = success, ErrorCount = errorCount, @@ -161,9 +161,9 @@ private static UnityCliLoopCompileResult CreateCompileResult( }; } - private static UnityCliLoopCompileIssue CreateIssue(string message, string file, int line) + private static CompileIssue CreateIssue(string message, string file, int line) { - return new UnityCliLoopCompileIssue + return new CompileIssue { Message = message, File = file, @@ -185,7 +185,7 @@ private async Task WaitForPlayModeExitAsync(CancellationToken ct) return !EditorApplication.isPlaying; } - private static void PrepareResultStorage(UnityCliLoopCompileRequest request) + private static void PrepareResultStorage(CompileSchema request) { Debug.Assert(request != null, "request must not be null"); @@ -202,9 +202,9 @@ private static void PrepareResultStorage(UnityCliLoopCompileRequest request) request.RequestId = CreateRequestId(); } - private UnityCliLoopCompileResult StoreResponseIfNeeded( - UnityCliLoopCompileRequest request, - UnityCliLoopCompileResult response, + private CompileResponse StoreResponseIfNeeded( + CompileSchema request, + CompileResponse response, string correlationId) { Debug.Assert(request != null, "request must not be null"); @@ -235,7 +235,7 @@ private UnityCliLoopCompileResult StoreResponseIfNeeded( } private void MarkPendingCompileRequestIfNeeded( - UnityCliLoopCompileRequest request, + CompileSchema request, DateTime markedAtUtc, string correlationId) { @@ -271,7 +271,7 @@ private void MarkPendingCompileRequestIfNeeded( } private static void LogCompileRequestReceived( - UnityCliLoopCompileRequest request, + CompileSchema request, string correlationId) { Debug.Assert(request != null, "request must not be null"); @@ -291,7 +291,7 @@ private static void LogCompileRequestReceived( correlationId); } - private static string ResolveCorrelationId(UnityCliLoopCompileRequest request) + private static string ResolveCorrelationId(CompileSchema request) { Debug.Assert(request != null, "request must not be null"); @@ -303,7 +303,7 @@ private static string ResolveCorrelationId(UnityCliLoopCompileRequest request) return VibeLogger.GenerateCorrelationId(); } - private static object BuildCompileLogContext(UnityCliLoopCompileRequest request) + private static object BuildCompileLogContext(CompileSchema request) { Debug.Assert(request != null, "request must not be null"); diff --git a/Packages/src/Editor/FirstPartyTools/Compile/UnityCliLoopCompileTypes.cs b/Packages/src/Editor/FirstPartyTools/Compile/UnityCliLoopCompileTypes.cs deleted file mode 100644 index 66deaa0acd..0000000000 --- a/Packages/src/Editor/FirstPartyTools/Compile/UnityCliLoopCompileTypes.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; - -namespace io.github.hatayama.UnityCliLoop.FirstPartyTools -{ - /// - /// Host capability that lets a bundled tool request Unity project compilation. - /// - public interface IUnityCliLoopCompilationService - { - Task CompileAsync(UnityCliLoopCompileRequest request, CancellationToken ct); - } - - /// - /// Compilation request snapshot shared across the tool boundary. - /// - public sealed class UnityCliLoopCompileRequest - { - public bool ForceRecompile { get; set; } - public bool WaitForDomainReload { get; set; } - public bool ReloadExternalSceneChanges { get; set; } = true; - public string RequestId { get; set; } = ""; - } - - /// - /// Compilation diagnostic snapshot shared across the tool boundary. - /// - public sealed class UnityCliLoopCompileIssue - { - public string Message { get; set; } - public string File { get; set; } - public int Line { get; set; } - } - - /// - /// Compilation result snapshot shared across the tool boundary. - /// - public sealed class UnityCliLoopCompileResult - { - public bool? Success { get; set; } - public int? ErrorCount { get; set; } - public int? WarningCount { get; set; } - public UnityCliLoopCompileIssue[] Errors { get; set; } - public UnityCliLoopCompileIssue[] Warnings { get; set; } - public string Message { get; set; } - public string ProjectRoot { get; set; } - } -} diff --git a/Packages/src/Editor/FirstPartyTools/Compile/UnityCliLoopCompileTypes.cs.meta b/Packages/src/Editor/FirstPartyTools/Compile/UnityCliLoopCompileTypes.cs.meta deleted file mode 100644 index afef9f7957..0000000000 --- a/Packages/src/Editor/FirstPartyTools/Compile/UnityCliLoopCompileTypes.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c2ceb67fdc86a45278ab9e40d2f7f23d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From f22494b31f9eaa7292c7689565f142cc5db5c45f Mon Sep 17 00:00:00 2001 From: hatayama Date: Sun, 5 Jul 2026 18:39:38 +0900 Subject: [PATCH 2/3] Address self-review findings on the collapsed DTO layer Use the existing CompileIssue constructor instead of the CreateIssue helper and object initializers, because the constructor only became available once the intermediate DTO (which had no constructor) was replaced by CompileIssue. Extend the PascalCase pinning test to cover all seven stored properties, since CompileResponse now doubles as the SessionState payload parsed by the CLI and no dedicated storage DTO guards that shape anymore. --- .../Editor/CompileSessionResultServiceTests.cs | 7 +++++++ .../Compile/CompileSessionResultService.cs | 7 +------ .../FirstPartyTools/Compile/CompileUseCase.cs | 16 +++------------- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/Assets/Tests/Editor/CompileSessionResultServiceTests.cs b/Assets/Tests/Editor/CompileSessionResultServiceTests.cs index 1e3fee0c18..f0228c3ddd 100644 --- a/Assets/Tests/Editor/CompileSessionResultServiceTests.cs +++ b/Assets/Tests/Editor/CompileSessionResultServiceTests.cs @@ -202,8 +202,15 @@ public void StoreCompileResult_WhenResultIsPersisted_UsesPascalCaseJson() UnityCliLoopStoredCompileResult storedResult = sessionStateService.GetCompileResult("compile_test_request"); + // Pins every property name of the stored payload because the CLI parses this JSON + // and CompileResponse no longer has a dedicated storage DTO guarding the shape. Assert.That(storedResult.ResultJson, Does.Contain("\"Success\":true")); Assert.That(storedResult.ResultJson, Does.Contain("\"ErrorCount\":0")); + Assert.That(storedResult.ResultJson, Does.Contain("\"WarningCount\":0")); + Assert.That(storedResult.ResultJson, Does.Contain("\"Errors\":[]")); + Assert.That(storedResult.ResultJson, Does.Contain("\"Warnings\":[]")); + Assert.That(storedResult.ResultJson, Does.Contain("\"Message\":\"Compilation completed.\"")); + Assert.That(storedResult.ResultJson, Does.Contain("\"ProjectRoot\":")); Assert.That(storedResult.ResultJson, Does.Not.Contain("\"success\"")); } finally diff --git a/Packages/src/Editor/FirstPartyTools/Compile/CompileSessionResultService.cs b/Packages/src/Editor/FirstPartyTools/Compile/CompileSessionResultService.cs index f7d91b4ecd..172b06f6c1 100644 --- a/Packages/src/Editor/FirstPartyTools/Compile/CompileSessionResultService.cs +++ b/Packages/src/Editor/FirstPartyTools/Compile/CompileSessionResultService.cs @@ -119,12 +119,7 @@ private static CompileIssue[] ToIssues(UnityEditor.Compilation.CompilerMessage[] return null; } - return messages.Select(message => new CompileIssue - { - Message = message.message, - File = message.file, - Line = message.line - }).ToArray(); + return messages.Select(message => new CompileIssue(message.message, message.file, message.line)).ToArray(); } private static string AddMissingTestFrameworkReferenceHint( diff --git a/Packages/src/Editor/FirstPartyTools/Compile/CompileUseCase.cs b/Packages/src/Editor/FirstPartyTools/Compile/CompileUseCase.cs index 16ad949c2b..5a78170f4d 100644 --- a/Packages/src/Editor/FirstPartyTools/Compile/CompileUseCase.cs +++ b/Packages/src/Editor/FirstPartyTools/Compile/CompileUseCase.cs @@ -65,7 +65,7 @@ public async Task CompileAsync(CompileSchema request, Cancellat false, 1, 0, - new[] { CreateIssue(preparation.ErrorMessage, "", 0) }, + new[] { new CompileIssue(preparation.ErrorMessage, "", 0) }, Array.Empty(), null); CompileResponse persistedResponse = @@ -97,7 +97,7 @@ public async Task CompileAsync(CompileSchema request, Cancellat false, 1, 0, - new[] { CreateIssue("Play Mode did not exit within 5 seconds; compilation aborted.", "", 0) }, + new[] { new CompileIssue("Play Mode did not exit within 5 seconds; compilation aborted.", "", 0) }, Array.Empty(), null); CompileResponse persistedResponse = @@ -121,7 +121,7 @@ public async Task CompileAsync(CompileSchema request, Cancellat false, 1, 0, - new[] { CreateIssue(validation.ErrorMessage, "", 0) }, + new[] { new CompileIssue(validation.ErrorMessage, "", 0) }, Array.Empty(), null); CompileResponse persistedResponse = @@ -161,16 +161,6 @@ private static CompileResponse CreateCompileResult( }; } - private static CompileIssue CreateIssue(string message, string file, int line) - { - return new CompileIssue - { - Message = message, - File = file, - Line = line, - }; - } - private async Task WaitForPlayModeExitAsync(CancellationToken ct) { int waitedMs = 0; From 3b62a61d0e8e981bc239a0a0918e2b319e598a7d Mon Sep 17 00:00:00 2001 From: hatayama Date: Sun, 5 Jul 2026 18:48:47 +0900 Subject: [PATCH 3/3] Build CompileResponse through its constructor everywhere CodeRabbit flagged that the CreateCompileResult helper and the remaining object initializers duplicate the CompileResponse constructor, mirroring the CreateIssue cleanup already applied. Named arguments keep the adjacent nullable counts and issue arrays from being swapped silently. --- .../Compile/CompileSessionResultService.cs | 48 +++++++-------- .../FirstPartyTools/Compile/CompileUseCase.cs | 58 ++++++------------- 2 files changed, 39 insertions(+), 67 deletions(-) diff --git a/Packages/src/Editor/FirstPartyTools/Compile/CompileSessionResultService.cs b/Packages/src/Editor/FirstPartyTools/Compile/CompileSessionResultService.cs index 172b06f6c1..c130d517c2 100644 --- a/Packages/src/Editor/FirstPartyTools/Compile/CompileSessionResultService.cs +++ b/Packages/src/Editor/FirstPartyTools/Compile/CompileSessionResultService.cs @@ -30,26 +30,22 @@ internal static CompileResponse CreateCompileResult( if (result.IsIndeterminate) { - return new CompileResponse - { - Success = result.Success, - ErrorCount = result.ErrorCount, - WarningCount = result.WarningCount, - Errors = null, - Warnings = null, - Message = result.Message ?? "Compilation status is unknown. Use get-logs to inspect the compiler output." - }; + return new CompileResponse( + success: result.Success, + errorCount: result.ErrorCount, + warningCount: result.WarningCount, + errors: null, + warnings: null, + message: result.Message ?? "Compilation status is unknown. Use get-logs to inspect the compiler output."); } - return new CompileResponse - { - Success = result.Success, - ErrorCount = result.Errors?.Length ?? 0, - WarningCount = result.Warnings?.Length ?? 0, - Errors = ToIssues(result.Errors), - Warnings = ToIssues(result.Warnings), - Message = AddMissingTestFrameworkReferenceHint(result.Message, result.Errors) - }; + return new CompileResponse( + success: result.Success, + errorCount: result.Errors?.Length ?? 0, + warningCount: result.Warnings?.Length ?? 0, + errors: ToIssues(result.Errors), + warnings: ToIssues(result.Warnings), + message: AddMissingTestFrameworkReferenceHint(result.Message, result.Errors)); } internal static void StoreCompileResult( @@ -101,15 +97,13 @@ internal static void StoreCompileResult( private static CompileResponse CreateForceCompileResult(CompileResult result) { ForceCompileUnknownResult unknownResult = ForceCompileUnknownResult.Create(result.Success); - return new CompileResponse - { - Success = unknownResult.Success, - ErrorCount = unknownResult.ErrorCount, - WarningCount = unknownResult.WarningCount, - Errors = null, - Warnings = null, - Message = unknownResult.Message - }; + return new CompileResponse( + success: unknownResult.Success, + errorCount: unknownResult.ErrorCount, + warningCount: unknownResult.WarningCount, + errors: null, + warnings: null, + message: unknownResult.Message); } private static CompileIssue[] ToIssues(UnityEditor.Compilation.CompilerMessage[] messages) diff --git a/Packages/src/Editor/FirstPartyTools/Compile/CompileUseCase.cs b/Packages/src/Editor/FirstPartyTools/Compile/CompileUseCase.cs index 5a78170f4d..77cc5b0cbd 100644 --- a/Packages/src/Editor/FirstPartyTools/Compile/CompileUseCase.cs +++ b/Packages/src/Editor/FirstPartyTools/Compile/CompileUseCase.cs @@ -61,13 +61,12 @@ public async Task CompileAsync(CompileSchema request, Cancellat preparation.ErrorMessage, BuildCompileLogContext(request), correlationId); - CompileResponse response = CreateCompileResult( - false, - 1, - 0, - new[] { new CompileIssue(preparation.ErrorMessage, "", 0) }, - Array.Empty(), - null); + CompileResponse response = new( + success: false, + errorCount: 1, + warningCount: 0, + errors: new[] { new CompileIssue(preparation.ErrorMessage, "", 0) }, + warnings: Array.Empty()); CompileResponse persistedResponse = StoreResponseIfNeeded(request, response, correlationId); return persistedResponse; @@ -93,13 +92,12 @@ public async Task CompileAsync(CompileSchema request, Cancellat correlationId); if (!exited) { - CompileResponse response = CreateCompileResult( - false, - 1, - 0, - new[] { new CompileIssue("Play Mode did not exit within 5 seconds; compilation aborted.", "", 0) }, - Array.Empty(), - null); + CompileResponse response = new( + success: false, + errorCount: 1, + warningCount: 0, + errors: new[] { new CompileIssue("Play Mode did not exit within 5 seconds; compilation aborted.", "", 0) }, + warnings: Array.Empty()); CompileResponse persistedResponse = StoreResponseIfNeeded(request, response, correlationId); return persistedResponse; @@ -117,13 +115,12 @@ public async Task CompileAsync(CompileSchema request, Cancellat validation.ErrorMessage, BuildCompileLogContext(request), correlationId); - CompileResponse response = CreateCompileResult( - false, - 1, - 0, - new[] { new CompileIssue(validation.ErrorMessage, "", 0) }, - Array.Empty(), - null); + CompileResponse response = new( + success: false, + errorCount: 1, + warningCount: 0, + errors: new[] { new CompileIssue(validation.ErrorMessage, "", 0) }, + warnings: Array.Empty()); CompileResponse persistedResponse = StoreResponseIfNeeded(request, response, correlationId); return persistedResponse; @@ -142,25 +139,6 @@ public async Task CompileAsync(CompileSchema request, Cancellat return persistedSuccessResponse; } - private static CompileResponse CreateCompileResult( - bool? success, - int? errorCount, - int? warningCount, - CompileIssue[] errors, - CompileIssue[] warnings, - string message) - { - return new CompileResponse - { - Success = success, - ErrorCount = errorCount, - WarningCount = warningCount, - Errors = errors, - Warnings = warnings, - Message = message, - }; - } - private async Task WaitForPlayModeExitAsync(CancellationToken ct) { int waitedMs = 0;