Skip to content

Commit fe66145

Browse files
committed
Support required in-place execution of jobs; Require it for the REPL and immediate mode
1 parent 8c81cb9 commit fe66145

File tree

5 files changed

+37
-4
lines changed

5 files changed

+37
-4
lines changed

Sources/SwiftDriver/Driver/Driver.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,11 @@ extension Driver {
575575
return
576576
}
577577

578+
if jobs.contains(where: { $0.requiresInPlaceExecution }) {
579+
assert(jobs.count == 1, "Cannot execute in place for multi-job build plans")
580+
return try executeJobInPlace(jobs[0], resolver: resolver)
581+
}
582+
578583
// Create and use the tool execution delegate if one is not provided explicitly.
579584
let executorDelegate = executorDelegate ?? createToolExecutionDelegate()
580585

@@ -606,6 +611,19 @@ extension Driver {
606611

607612
return ToolExecutionDelegate(mode: mode)
608613
}
614+
615+
/// Execute a single job in-place.
616+
private func executeJobInPlace(_ job: Job, resolver: ArgsResolver) throws {
617+
let tool = try resolver.resolve(.path(job.tool))
618+
let commandLine = try job.commandLine.map{ try resolver.resolve($0) }
619+
let arguments = [tool] + commandLine
620+
621+
for (envVar, value) in job.extraEnvironment {
622+
try ProcessEnv.setVar(envVar, value: value)
623+
}
624+
625+
return try exec(path: tool, args: arguments)
626+
}
609627
}
610628

611629
extension Diagnostic.Message {

Sources/SwiftDriver/Jobs/InterpretJob.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ extension Driver {
4646
commandLine: commandLine,
4747
inputs:inputs,
4848
outputs: [],
49-
extraEnvironment: extraEnvironment
49+
extraEnvironment: extraEnvironment,
50+
requiresInPlaceExecution: true
5051
)
5152
}
5253
}

Sources/SwiftDriver/Jobs/Job.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ public struct Job: Codable, Equatable {
5050
/// Any extra environment variables which should be set while running the job.
5151
public var extraEnvironment: [String: String]
5252

53+
/// Whether or not the job must be executed in place, replacing the current driver process.
54+
public var requiresInPlaceExecution: Bool
55+
5356
/// The kind of job.
5457
public var kind: Kind
5558

@@ -60,7 +63,8 @@ public struct Job: Codable, Equatable {
6063
displayInputs: [TypedVirtualPath]? = nil,
6164
inputs: [TypedVirtualPath],
6265
outputs: [TypedVirtualPath],
63-
extraEnvironment: [String: String] = [:]
66+
extraEnvironment: [String: String] = [:],
67+
requiresInPlaceExecution: Bool = false
6468
) {
6569
self.kind = kind
6670
self.tool = tool
@@ -69,6 +73,7 @@ public struct Job: Codable, Equatable {
6973
self.inputs = inputs
7074
self.outputs = outputs
7175
self.extraEnvironment = extraEnvironment
76+
self.requiresInPlaceExecution = requiresInPlaceExecution
7277
}
7378
}
7479

Sources/SwiftDriver/Jobs/ReplJob.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ extension Driver {
3232
tool: .absolute(try toolchain.getToolPath(.lldb)),
3333
commandLine: [Job.ArgTemplate.flag(lldbArg)],
3434
inputs: [],
35-
outputs: []
35+
outputs: [],
36+
requiresInPlaceExecution: true
3637
)
3738
} else {
3839
// Invoke the integrated REPL, which is part of the frontend.
@@ -43,7 +44,8 @@ extension Driver {
4344
tool: .absolute(try toolchain.getToolPath(.swiftCompiler)),
4445
commandLine: commandLine,
4546
inputs: [],
46-
outputs: []
47+
outputs: [],
48+
requiresInPlaceExecution: true
4749
)
4850
}
4951
}

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,7 @@ final class SwiftDriverTests: XCTestCase {
901901
XCTAssertEqual(plannedJobs.count, 1)
902902
let replJob = plannedJobs.first!
903903
XCTAssertTrue(replJob.tool.name.contains("lldb"))
904+
XCTAssertTrue(replJob.requiresInPlaceExecution)
904905
XCTAssert(replJob.commandLine.contains(where: { isLLDBREPLFlag($0) }))
905906
}
906907

@@ -910,6 +911,7 @@ final class SwiftDriverTests: XCTestCase {
910911
XCTAssertEqual(plannedJobs.count, 1)
911912
let replJob = plannedJobs.first!
912913
XCTAssertTrue(replJob.tool.name.contains("lldb"))
914+
XCTAssertTrue(replJob.requiresInPlaceExecution)
913915
XCTAssert(replJob.commandLine.contains(where: { isLLDBREPLFlag($0) }))
914916
}
915917

@@ -921,6 +923,7 @@ final class SwiftDriverTests: XCTestCase {
921923
XCTAssertEqual(plannedJobs.count, 1)
922924
let replJob = plannedJobs.first!
923925
XCTAssertTrue(replJob.tool.name.contains("lldb"))
926+
XCTAssertTrue(replJob.requiresInPlaceExecution)
924927
XCTAssert(replJob.commandLine.contains(where: { isLLDBREPLFlag($0) }))
925928
}
926929

@@ -930,6 +933,7 @@ final class SwiftDriverTests: XCTestCase {
930933
XCTAssertEqual(plannedJobs.count, 1)
931934
let replJob = plannedJobs.first!
932935
XCTAssertTrue(replJob.tool.name.contains("swift"))
936+
XCTAssertTrue(replJob.requiresInPlaceExecution)
933937
XCTAssertTrue(replJob.commandLine.count >= 2)
934938
XCTAssertEqual(replJob.commandLine[0], .flag("-frontend"))
935939
XCTAssertEqual(replJob.commandLine[1], .flag("-repl"))
@@ -950,6 +954,7 @@ final class SwiftDriverTests: XCTestCase {
950954
let plannedJobs = try driver.planBuild()
951955
XCTAssertEqual(plannedJobs.count, 1)
952956
let job = plannedJobs[0]
957+
XCTAssertTrue(job.requiresInPlaceExecution)
953958
XCTAssertEqual(job.inputs.count, 1)
954959
XCTAssertEqual(job.inputs[0].file, .relative(RelativePath("foo.swift")))
955960
XCTAssertEqual(job.outputs.count, 0)
@@ -967,6 +972,7 @@ final class SwiftDriverTests: XCTestCase {
967972
let plannedJobs = try driver.planBuild()
968973
XCTAssertEqual(plannedJobs.count, 1)
969974
let job = plannedJobs[0]
975+
XCTAssertTrue(job.requiresInPlaceExecution)
970976
XCTAssertEqual(job.inputs.count, 1)
971977
XCTAssertEqual(job.inputs[0].file, .relative(RelativePath("foo.swift")))
972978
XCTAssertEqual(job.outputs.count, 0)
@@ -985,6 +991,7 @@ final class SwiftDriverTests: XCTestCase {
985991
let plannedJobs = try driver.planBuild()
986992
XCTAssertEqual(plannedJobs.count, 1)
987993
let job = plannedJobs[0]
994+
XCTAssertTrue(job.requiresInPlaceExecution)
988995
XCTAssertEqual(job.inputs.count, 1)
989996
XCTAssertEqual(job.inputs[0].file, .relative(RelativePath("foo.swift")))
990997
XCTAssertEqual(job.outputs.count, 0)

0 commit comments

Comments
 (0)