Skip to content

Commit 5bd6528

Browse files
authored
Improve plugin error handling (#1840)
1 parent 371744e commit 5bd6528

File tree

1 file changed

+37
-36
lines changed

1 file changed

+37
-36
lines changed

Sources/SwiftProtobufPluginLibrary/CodeGenerator.swift

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -135,19 +135,19 @@ extension CodeGenerator {
135135
extensionMap.insert(contentsOf: customOptionExtensions)
136136
}
137137

138-
let response: Google_Protobuf_Compiler_CodeGeneratorResponse
138+
let request: Google_Protobuf_Compiler_CodeGeneratorRequest
139139
do {
140-
let request = try Google_Protobuf_Compiler_CodeGeneratorRequest(
140+
request = try Google_Protobuf_Compiler_CodeGeneratorRequest(
141141
serializedBytes: FileHandle.standardInput.readDataToEndOfFile(),
142142
extensions: extensionMap
143143
)
144-
response = generateCode(request: request, generator: self)
145144
} catch let e {
146-
response = Google_Protobuf_Compiler_CodeGeneratorResponse(
147-
error: "Received an unparsable request from the compiler: \(e)"
148-
)
145+
var stderr = StandardErrorOutputStream()
146+
print("\(programName): Received an unparsable request from the compiler: \(e)", to: &stderr)
147+
return
149148
}
150149

150+
let response = generateCode(request: request, generator: self)
151151
let serializedResponse: Data
152152
do {
153153
serializedResponse = try response.serializedBytes()
@@ -216,38 +216,8 @@ public func generateCode(
216216
request: Google_Protobuf_Compiler_CodeGeneratorRequest,
217217
generator: any CodeGenerator
218218
) -> Google_Protobuf_Compiler_CodeGeneratorResponse {
219-
// TODO: This will need update to language specific features.
220-
221-
let descriptorSet = DescriptorSet(protos: request.protoFile)
222-
223-
var files = [FileDescriptor]()
224-
for name in request.fileToGenerate {
225-
guard let fileDescriptor = descriptorSet.fileDescriptor(named: name) else {
226-
return Google_Protobuf_Compiler_CodeGeneratorResponse(
227-
error:
228-
"protoc asked plugin to generate a file but did not provide a descriptor for the file: \(name)"
229-
)
230-
}
231-
files.append(fileDescriptor)
232-
}
233-
234-
let context = InternalProtoCompilerContext(request: request)
235-
let outputs = InternalGeneratorOutputs()
236-
let parameter = InternalCodeGeneratorParameter(request.parameter)
237-
238-
do {
239-
try generator.generate(
240-
files: files,
241-
parameter: parameter,
242-
protoCompilerContext: context,
243-
generatorOutputs: outputs
244-
)
245-
} catch let e {
246-
return Google_Protobuf_Compiler_CodeGeneratorResponse(error: String(describing: e))
247-
}
248219

249220
var response = Google_Protobuf_Compiler_CodeGeneratorResponse()
250-
response.file = outputs.files
251221

252222
// TODO: Could supportedFeatures be completely handled within library?
253223
// - The only "hard" part around hiding the proto3 optional support is making
@@ -277,6 +247,37 @@ public func generateCode(
277247
response.maximumEdition = Int32(supportedEditions.upperBound.rawValue)
278248
}
279249

250+
// TODO: This will need update to language specific features.
251+
252+
let descriptorSet = DescriptorSet(protos: request.protoFile)
253+
254+
var files = [FileDescriptor]()
255+
for name in request.fileToGenerate {
256+
guard let fileDescriptor = descriptorSet.fileDescriptor(named: name) else {
257+
response.error =
258+
"protoc asked plugin to generate a file but did not provide a descriptor for the file: \(name)"
259+
return response
260+
}
261+
files.append(fileDescriptor)
262+
}
263+
264+
let context = InternalProtoCompilerContext(request: request)
265+
let outputs = InternalGeneratorOutputs()
266+
let parameter = InternalCodeGeneratorParameter(request.parameter)
267+
268+
do {
269+
try generator.generate(
270+
files: files,
271+
parameter: parameter,
272+
protoCompilerContext: context,
273+
generatorOutputs: outputs
274+
)
275+
response.file = outputs.files
276+
} catch let e {
277+
// Use the description from whatever the Generator threw as the error message.
278+
response.error = String(describing: e)
279+
}
280+
280281
return response
281282
}
282283

0 commit comments

Comments
 (0)