diff --git a/Assets/Tests/Editor/CompileSessionResultServiceTests.cs b/Assets/Tests/Editor/CompileSessionResultServiceTests.cs index dc6254d0c5..f0228c3ddd 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." }; @@ -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/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..c130d517c2 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,33 +30,29 @@ internal static UnityCliLoopCompileResult CreateCompileResult( if (result.IsIndeterminate) { - return new UnityCliLoopCompileResult - { - 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 UnityCliLoopCompileResult - { - 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( UnityCliLoopEditorSessionStateService sessionStateService, string requestId, bool forceRecompile, - UnityCliLoopCompileResult result, + CompileResponse result, string correlationId) { Debug.Assert(sessionStateService != null, "sessionStateService must not be null"); @@ -98,33 +94,26 @@ 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 - { - 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 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 - { - 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( @@ -193,7 +182,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..77cc5b0cbd 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,13 @@ public async Task CompileAsync(UnityCliLoopCompileReq preparation.ErrorMessage, BuildCompileLogContext(request), correlationId); - UnityCliLoopCompileResult response = CreateCompileResult( - false, - 1, - 0, - new[] { CreateIssue(preparation.ErrorMessage, "", 0) }, - Array.Empty(), - null); - UnityCliLoopCompileResult persistedResponse = + 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,14 +92,13 @@ public async Task CompileAsync(UnityCliLoopCompileReq correlationId); if (!exited) { - UnityCliLoopCompileResult response = CreateCompileResult( - false, - 1, - 0, - new[] { CreateIssue("Play Mode did not exit within 5 seconds; compilation aborted.", "", 0) }, - Array.Empty(), - null); - UnityCliLoopCompileResult persistedResponse = + 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,14 +115,13 @@ public async Task CompileAsync(UnityCliLoopCompileReq validation.ErrorMessage, BuildCompileLogContext(request), correlationId); - UnityCliLoopCompileResult response = CreateCompileResult( - false, - 1, - 0, - new[] { CreateIssue(validation.ErrorMessage, "", 0) }, - Array.Empty(), - null); - UnityCliLoopCompileResult persistedResponse = + 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; } @@ -135,42 +132,13 @@ 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( - bool? success, - int? errorCount, - int? warningCount, - UnityCliLoopCompileIssue[] errors, - UnityCliLoopCompileIssue[] warnings, - string message) - { - return new UnityCliLoopCompileResult - { - Success = success, - ErrorCount = errorCount, - WarningCount = warningCount, - Errors = errors, - Warnings = warnings, - Message = message, - }; - } - - private static UnityCliLoopCompileIssue CreateIssue(string message, string file, int line) - { - return new UnityCliLoopCompileIssue - { - Message = message, - File = file, - Line = line, - }; - } - private async Task WaitForPlayModeExitAsync(CancellationToken ct) { int waitedMs = 0; @@ -185,7 +153,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 +170,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 +203,7 @@ private UnityCliLoopCompileResult StoreResponseIfNeeded( } private void MarkPendingCompileRequestIfNeeded( - UnityCliLoopCompileRequest request, + CompileSchema request, DateTime markedAtUtc, string correlationId) { @@ -271,7 +239,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 +259,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 +271,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: