in Sources/Workspace/DefaultPluginScriptRunner.swift [397:470]
func handle(message: PluginToHostMessage) throws {
dispatchPrecondition(condition: .onQueue(callbackQueue))
switch message {
case .emitDiagnostic(let severity, let message, let file, let line):
let metadata: ObservabilityMetadata? = file.map {
var metadata = ObservabilityMetadata()
// FIXME: We should probably report some kind of protocol error if the path isn't valid.
metadata.fileLocation = try? .init(.init(validating: $0), line: line)
return metadata
}
let diagnostic: Basics.Diagnostic
switch severity {
case .error:
emittedAtLeastOneError = true
diagnostic = .error(message, metadata: metadata)
case .warning:
diagnostic = .warning(message, metadata: metadata)
case .remark:
diagnostic = .info(message, metadata: metadata)
}
delegate.pluginEmittedDiagnostic(diagnostic)
case .defineBuildCommand(let config, let inputFiles, let outputFiles):
delegate.pluginDefinedBuildCommand(
displayName: config.displayName,
executable: try AbsolutePath(validating: config.executable),
arguments: config.arguments,
environment: config.environment,
workingDirectory: try config.workingDirectory.map{ try AbsolutePath(validating: $0) },
inputFiles: try inputFiles.map{ try AbsolutePath(validating: $0) },
outputFiles: try outputFiles.map{ try AbsolutePath(validating: $0) })
case .definePrebuildCommand(let config, let outputFilesDir):
delegate.pluginDefinedPrebuildCommand(
displayName: config.displayName,
executable: try AbsolutePath(validating: config.executable),
arguments: config.arguments,
environment: config.environment,
workingDirectory: try config.workingDirectory.map{ try AbsolutePath(validating: $0) },
outputFilesDirectory: try AbsolutePath(validating: outputFilesDir))
case .buildOperationRequest(let subset, let parameters):
delegate.pluginRequestedBuildOperation(subset: subset, parameters: parameters) {
switch $0 {
case .success(let result):
outputQueue.async { try? outputHandle.writePluginMessage(.buildOperationResponse(result: result)) }
case .failure(let error):
outputQueue.async { try? outputHandle.writePluginMessage(.errorResponse(error: String(describing: error))) }
}
}
case .testOperationRequest(let subset, let parameters):
delegate.pluginRequestedTestOperation(subset: subset, parameters: parameters) {
switch $0 {
case .success(let result):
outputQueue.async { try? outputHandle.writePluginMessage(.testOperationResponse(result: result)) }
case .failure(let error):
outputQueue.async { try? outputHandle.writePluginMessage(.errorResponse(error: String(describing: error))) }
}
}
case .symbolGraphRequest(let targetName, let options):
// The plugin requested symbol graph information for a target. We ask the delegate and then send a response.
delegate.pluginRequestedSymbolGraph(forTarget: targetName, options: options) {
switch $0 {
case .success(let result):
outputQueue.async { try? outputHandle.writePluginMessage(.symbolGraphResponse(result: result)) }
case .failure(let error):
outputQueue.async { try? outputHandle.writePluginMessage(.errorResponse(error: String(describing: error))) }
}
}
}
}