@@ -15,6 +15,24 @@ import Foundation
1515import SWBProtocol
1616import SWBUtil
1717
18+ typealias ExecuteOperation = ( _ startInfo: SwiftBuildMessage . BuildStartedInfo , _ session: SWBBuildServiceSession , _ sessionCreationDiagnostics: [ SwiftBuildMessage . DiagnosticInfo ] , _ request: SWBBuildRequest ) async -> SWBCommandResult
19+
20+ class SWBServiceConsoleCreateBuildDescriptionCommand : SWBServiceConsoleCommand {
21+ static let name = " createBuildDescription "
22+
23+ static func usage( ) -> String {
24+ return name + " [options] <container-path> "
25+ }
26+
27+ static func validate( invocation: SWBServiceConsoleCommandInvocation ) -> SWBServiceConsoleError ? {
28+ return nil
29+ }
30+
31+ static func perform( invocation: SWBServiceConsoleCommandInvocation ) async -> SWBCommandResult {
32+ return await SWBServiceConsoleBuildCommand . perform ( invocation: invocation, operationFunc: generateBuildDescription)
33+ }
34+ }
35+
1836class SWBServiceConsoleBuildCommand : SWBServiceConsoleCommand {
1937 static let name = " build "
2038
@@ -27,6 +45,10 @@ class SWBServiceConsoleBuildCommand: SWBServiceConsoleCommand {
2745 }
2846
2947 static func perform( invocation: SWBServiceConsoleCommandInvocation ) async -> SWBCommandResult {
48+ return await Self . perform ( invocation: invocation, operationFunc: doBuildOperation)
49+ }
50+
51+ static func perform( invocation: SWBServiceConsoleCommandInvocation , operationFunc: ExecuteOperation ) async -> SWBCommandResult {
3052 // Parse the arguments.
3153 var positionalArgs = [ String] ( )
3254 var configuredTargetNames = [ String] ( )
@@ -187,7 +209,7 @@ class SWBServiceConsoleBuildCommand: SWBServiceConsoleCommand {
187209 return . failure( . failedCommandError( description: error. localizedDescription) )
188210 }
189211
190- return await doBuildOperation ( startInfo : . init( baseDirectory: baseDirectory, derivedDataPath: absoluteDerivedDataPath) , session: session , sessionCreationDiagnostics : diagnostics, request : request)
212+ return await operationFunc ( . init( baseDirectory: baseDirectory, derivedDataPath: absoluteDerivedDataPath) , session, diagnostics, request)
191213 }
192214 }
193215}
@@ -370,7 +392,19 @@ extension SWBBuildService {
370392 }
371393}
372394
395+ fileprivate func generateBuildDescription( startInfo: SwiftBuildMessage . BuildStartedInfo , session: SWBBuildServiceSession , sessionCreationDiagnostics: [ SwiftBuildMessage . DiagnosticInfo ] , request: SWBBuildRequest ) async -> SWBCommandResult {
396+ await runBuildOperation ( startInfo: startInfo, session: session, sessionCreationDiagnostics: sessionCreationDiagnostics, request: request) {
397+ return try await session. createBuildOperationForBuildDescriptionOnly ( request: request, delegate: PlanningOperationDelegate ( ) )
398+ }
399+ }
400+
373401fileprivate func doBuildOperation( startInfo: SwiftBuildMessage . BuildStartedInfo , session: SWBBuildServiceSession , sessionCreationDiagnostics: [ SwiftBuildMessage . DiagnosticInfo ] , request: SWBBuildRequest ) async -> SWBCommandResult {
402+ await runBuildOperation ( startInfo: startInfo, session: session, sessionCreationDiagnostics: sessionCreationDiagnostics, request: request) {
403+ return try await session. createBuildOperation ( request: request, delegate: PlanningOperationDelegate ( ) )
404+ }
405+ }
406+
407+ fileprivate func runBuildOperation( startInfo: SwiftBuildMessage . BuildStartedInfo , session: SWBBuildServiceSession , sessionCreationDiagnostics: [ SwiftBuildMessage . DiagnosticInfo ] , request: SWBBuildRequest , createOperation: ( ) async throws -> SWBBuildOperation ) async -> SWBCommandResult {
374408 let systemInfo : SWBSystemInfo
375409 do {
376410 systemInfo = try . default( )
@@ -409,7 +443,7 @@ fileprivate func doBuildOperation(startInfo: SwiftBuildMessage.BuildStartedInfo,
409443
410444 // Start a build operation. We set ourself as the delegate, so we will hear about output and completion.
411445 do {
412- let operation = try await session . createBuildOperation ( request : request , delegate : PlanningOperationDelegate ( ) )
446+ let operation = try await createOperation ( )
413447 for try await event in try await operation. start ( ) {
414448 switch event {
415449 case . buildStarted:
@@ -463,7 +497,8 @@ private final class PlanningOperationDelegate: SWBPlanningOperationDelegate, Sen
463497func registerBuildCommands( ) {
464498 for commandClass in ( [
465499 SWBServiceConsoleBuildCommand . self,
466- SWBServiceConsolePrepareForIndexCommand . self
500+ SWBServiceConsolePrepareForIndexCommand . self,
501+ SWBServiceConsoleCreateBuildDescriptionCommand . self,
467502 ] as [ any SWBServiceConsoleCommand . Type ] ) { SWBServiceConsoleCommandRegistry . registerCommandClass ( commandClass) }
468503}
469504
0 commit comments