[spirv-writer] Remove diag::List from Printer

The diagnostic list is no longer used, so have Printer::Generate()
return a tint::Result that either contains the SPIR-V binary or an
error string.

Change-Id: I60855c7f687855d513f54e76e35f9bbc3a5bb355
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/143424
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Auto-Submit: James Price <jrprice@google.com>
diff --git a/src/tint/lang/spirv/writer/common/helper_test.h b/src/tint/lang/spirv/writer/common/helper_test.h
index 0055a5c..38e5228 100644
--- a/src/tint/lang/spirv/writer/common/helper_test.h
+++ b/src/tint/lang/spirv/writer/common/helper_test.h
@@ -99,16 +99,17 @@
     /// @param writer the writer to use for SPIR-V generation
     /// @returns true if generation and validation succeeded
     bool Generate(Printer& writer) {
-        if (!writer.Generate()) {
-            err_ = writer.Diagnostics().str();
+        auto spirv = writer.Generate();
+        if (!spirv) {
+            err_ = spirv.Failure();
             return false;
         }
 
-        output_ = Disassemble(writer.Result(), SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES |
-                                                   SPV_BINARY_TO_TEXT_OPTION_INDENT |
-                                                   SPV_BINARY_TO_TEXT_OPTION_COMMENT);
+        output_ = Disassemble(spirv.Get(), SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES |
+                                               SPV_BINARY_TO_TEXT_OPTION_INDENT |
+                                               SPV_BINARY_TO_TEXT_OPTION_COMMENT);
 
-        if (!Validate(writer.Result())) {
+        if (!Validate(spirv.Get())) {
             return false;
         }
 
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index 9b7fc26..6e77738 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -167,11 +167,10 @@
 Printer::Printer(ir::Module* module, bool zero_init_workgroup_mem)
     : ir_(module), zero_init_workgroup_memory_(zero_init_workgroup_mem) {}
 
-bool Printer::Generate() {
+Result<std::vector<uint32_t>, std::string> Printer::Generate() {
     auto valid = ir::Validate(*ir_);
     if (!valid) {
-        diagnostics_ = valid.Failure();
-        return false;
+        return valid.Failure().str();
     }
 
     // Run the IR transformations to prepare for SPIR-V emission.
@@ -195,15 +194,11 @@
         EmitFunction(func);
     }
 
-    if (diagnostics_.contains_errors()) {
-        return false;
-    }
-
     // Serialize the module into binary SPIR-V.
-    writer_.WriteHeader(module_.IdBound(), kWriterVersion);
-    writer_.WriteModule(&module_);
-
-    return true;
+    BinaryWriter writer;
+    writer.WriteHeader(module_.IdBound(), kWriterVersion);
+    writer.WriteModule(&module_);
+    return std::move(writer.Result());
 }
 
 uint32_t Printer::Builtin(builtin::BuiltinValue builtin, builtin::AddressSpace addrspace) {
diff --git a/src/tint/lang/spirv/writer/printer/printer.h b/src/tint/lang/spirv/writer/printer/printer.h
index d036a75..7c292a7 100644
--- a/src/tint/lang/spirv/writer/printer/printer.h
+++ b/src/tint/lang/spirv/writer/printer/printer.h
@@ -15,6 +15,7 @@
 #ifndef SRC_TINT_LANG_SPIRV_WRITER_PRINTER_PRINTER_H_
 #define SRC_TINT_LANG_SPIRV_WRITER_PRINTER_PRINTER_H_
 
+#include <string>
 #include <vector>
 
 #include "src/tint/lang/core/builtin/address_space.h"
@@ -28,6 +29,7 @@
 #include "src/tint/utils/containers/hashmap.h"
 #include "src/tint/utils/containers/vector.h"
 #include "src/tint/utils/diagnostic/diagnostic.h"
+#include "src/tint/utils/result/result.h"
 #include "src/tint/utils/symbol/symbol.h"
 
 // Forward declarations
@@ -80,18 +82,12 @@
     ///                                   storage class with OpConstantNull
     Printer(ir::Module* module, bool zero_init_workgroup_memory);
 
-    /// @returns true on successful generation; false otherwise
-    bool Generate();
+    /// @returns the generated SPIR-V binary on success, or an error string on failure
+    tint::Result<std::vector<uint32_t>, std::string> Generate();
 
     /// @returns the module that this writer has produced
     writer::Module& Module() { return module_; }
 
-    /// @returns the generated SPIR-V binary data
-    const std::vector<uint32_t>& Result() const { return writer_.Result(); }
-
-    /// @returns the list of diagnostics raised by the writer
-    diag::List Diagnostics() const { return diagnostics_; }
-
     /// Get the result ID of the constant `constant`, emitting its instruction if necessary.
     /// @param constant the constant to get the ID for
     /// @returns the result ID of the constant
@@ -272,7 +268,6 @@
     ir::Module* ir_;
     writer::Module module_;
     BinaryWriter writer_;
-    diag::List diagnostics_;
 
     /// A function type used for an OpTypeFunction declaration.
     struct FunctionType {
diff --git a/src/tint/lang/spirv/writer/writer.cc b/src/tint/lang/spirv/writer/writer.cc
index 18889d9..4972769 100644
--- a/src/tint/lang/spirv/writer/writer.cc
+++ b/src/tint/lang/spirv/writer/writer.cc
@@ -49,10 +49,11 @@
         // Generate the SPIR-V code.
         auto ir = converted.Move();
         auto impl = std::make_unique<Printer>(&ir, zero_initialize_workgroup_memory);
-        if (!impl->Generate()) {
-            return impl->Diagnostics().str();
+        auto spirv = impl->Generate();
+        if (!spirv) {
+            return std::move(spirv.Failure());
         }
-        output.spirv = std::move(impl->Result());
+        output.spirv = std::move(spirv.Get());
     } else  // NOLINT(readability/braces)
 #endif
     {
diff --git a/src/tint/lang/spirv/writer/writer_test.cc b/src/tint/lang/spirv/writer/writer_test.cc
index 9f1c54e..a612f7c 100644
--- a/src/tint/lang/spirv/writer/writer_test.cc
+++ b/src/tint/lang/spirv/writer/writer_test.cc
@@ -22,8 +22,9 @@
 using namespace tint::number_suffixes;  // NOLINT
 
 TEST_F(SpirvWriterTest, ModuleHeader) {
-    ASSERT_TRUE(writer_.Generate()) << writer_.Diagnostics().str();
-    auto got = Disassemble(writer_.Result());
+    auto spirv = writer_.Generate();
+    ASSERT_TRUE(spirv) << spirv.Failure();
+    auto got = Disassemble(spirv.Get());
     EXPECT_THAT(got, testing::StartsWith(R"(OpCapability Shader
 OpMemoryModel Logical GLSL450
 )"));