Distinguish AddMessageForTesting vs AddUnanchoredMessage

This overload of AddMessage ignores the difference between UTF-8 and
UTF-16 and just passes linePos/offset/length through. This is fine for
testing (it used to be called AddMessageForTesting - the tests are just
making sure the values make it through), but it would produce incorrect
results if actually used anywhere.

There is one usage of AddMessage to add an unanchored error message.
This splits that functionality into a separately named method.

Bug: None
Change-Id: Ifbffa686cf6d81838f5ae450583204855f08b329
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/161460
Reviewed-by: Jiawei Shao <jiawei.shao@intel.com>
Auto-Submit: Kai Ninomiya <kainino@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
diff --git a/src/dawn/native/CompilationMessages.cpp b/src/dawn/native/CompilationMessages.cpp
index e4e1f1b..9d75e26 100644
--- a/src/dawn/native/CompilationMessages.cpp
+++ b/src/dawn/native/CompilationMessages.cpp
@@ -90,24 +90,23 @@
 
 OwnedCompilationMessages::~OwnedCompilationMessages() = default;
 
-void OwnedCompilationMessages::AddMessage(std::string message,
-                                          wgpu::CompilationMessageType type,
-                                          uint64_t lineNum,
-                                          uint64_t linePos,
-                                          uint64_t offset,
-                                          uint64_t length) {
-    // Cannot add messages after GetCompilationInfo has been called.
-    DAWN_ASSERT(mCompilationInfo.messages == nullptr);
+void OwnedCompilationMessages::AddUnanchoredMessage(std::string message,
+                                                    wgpu::CompilationMessageType type) {
+    AddMessage(message, {nullptr, nullptr, static_cast<WGPUCompilationMessageType>(type), 0, 0, 0,
+                         0, 0, 0, 0});
+}
 
-    mMessageStrings.push_back(message);
-    mMessages.push_back({nullptr, nullptr, static_cast<WGPUCompilationMessageType>(type), lineNum,
+void OwnedCompilationMessages::AddMessageForTesting(std::string message,
+                                                    wgpu::CompilationMessageType type,
+                                                    uint64_t lineNum,
+                                                    uint64_t linePos,
+                                                    uint64_t offset,
+                                                    uint64_t length) {
+    AddMessage(message, {nullptr, nullptr, static_cast<WGPUCompilationMessageType>(type), lineNum,
                          linePos, offset, length, linePos, offset, length});
 }
 
 MaybeError OwnedCompilationMessages::AddMessage(const tint::diag::Diagnostic& diagnostic) {
-    // Cannot add messages after GetCompilationInfo has been called.
-    DAWN_ASSERT(mCompilationInfo.messages == nullptr);
-
     // Tint line and column values are 1-based.
     uint64_t lineNum = diagnostic.source.range.begin.line;
     uint64_t linePosInBytes = diagnostic.source.range.begin.column;
@@ -161,15 +160,27 @@
                                            fileStart + offsetInBytes, lengthInBytes)));
     }
 
-    mMessageStrings.push_back(diagnostic.message);
-
-    mMessages.push_back({nullptr, nullptr, tintSeverityToMessageType(diagnostic.severity), lineNum,
-                         linePosInBytes, offsetInBytes, lengthInBytes, linePosInUTF16,
-                         offsetInUTF16, lengthInUTF16});
+    AddMessage(
+        diagnostic.message,
+        {nullptr, nullptr, tintSeverityToMessageType(diagnostic.severity), lineNum, linePosInBytes,
+         offsetInBytes, lengthInBytes, linePosInUTF16, offsetInUTF16, lengthInUTF16});
 
     return {};
 }
 
+void OwnedCompilationMessages::AddMessage(std::string messageString,
+                                          const WGPUCompilationMessage& message) {
+    // Cannot add messages after GetCompilationInfo has been called.
+    DAWN_ASSERT(mCompilationInfo.messages == nullptr);
+
+    DAWN_ASSERT(message.nextInChain == nullptr);
+    // The message string won't be populated until GetCompilationInfo.
+    DAWN_ASSERT(message.message == nullptr);
+
+    mMessageStrings.push_back(messageString);
+    mMessages.push_back(message);
+}
+
 MaybeError OwnedCompilationMessages::AddMessages(const tint::diag::List& diagnostics) {
     // Cannot add messages after GetCompilationInfo has been called.
     DAWN_ASSERT(mCompilationInfo.messages == nullptr);
diff --git a/src/dawn/native/CompilationMessages.h b/src/dawn/native/CompilationMessages.h
index 4897cee..187d2a4 100644
--- a/src/dawn/native/CompilationMessages.h
+++ b/src/dawn/native/CompilationMessages.h
@@ -50,12 +50,19 @@
     OwnedCompilationMessages();
     ~OwnedCompilationMessages();
 
-    void AddMessage(std::string message,
-                    wgpu::CompilationMessageType type = wgpu::CompilationMessageType::Info,
-                    uint64_t lineNum = 0,
-                    uint64_t linePos = 0,
-                    uint64_t offset = 0,
-                    uint64_t length = 0);
+    // Adds a message on line 0 (before the first line).
+    void AddUnanchoredMessage(
+        std::string message,
+        wgpu::CompilationMessageType type = wgpu::CompilationMessageType::Info);
+    // For testing only. Uses the linePos/offset/length for both utf8 and utf16
+    // (which is incorrect for non-ASCII strings).
+    void AddMessageForTesting(
+        std::string message,
+        wgpu::CompilationMessageType type = wgpu::CompilationMessageType::Info,
+        uint64_t lineNum = 0,
+        uint64_t linePos = 0,
+        uint64_t offset = 0,
+        uint64_t length = 0);
     MaybeError AddMessages(const tint::diag::List& diagnostics);
     void ClearMessages();
 
@@ -64,6 +71,7 @@
 
   private:
     MaybeError AddMessage(const tint::diag::Diagnostic& diagnostic);
+    void AddMessage(std::string messageString, const WGPUCompilationMessage& message);
     void AddFormattedTintMessages(const tint::diag::List& diagnostics);
 
     WGPUCompilationInfo mCompilationInfo;
diff --git a/src/dawn/native/Device.cpp b/src/dawn/native/Device.cpp
index adf2915..4e16763 100644
--- a/src/dawn/native/Device.cpp
+++ b/src/dawn/native/Device.cpp
@@ -1241,7 +1241,7 @@
         ShaderModuleBase::MakeError(this, descriptor ? descriptor->label : nullptr);
     std::unique_ptr<OwnedCompilationMessages> compilationMessages(
         std::make_unique<OwnedCompilationMessages>());
-    compilationMessages->AddMessage(errorMessage, wgpu::CompilationMessageType::Error);
+    compilationMessages->AddUnanchoredMessage(errorMessage, wgpu::CompilationMessageType::Error);
     result->InjectCompilationMessages(std::move(compilationMessages));
 
     std::unique_ptr<ErrorData> errorData =
diff --git a/src/dawn/tests/unittests/validation/ShaderModuleValidationTests.cpp b/src/dawn/tests/unittests/validation/ShaderModuleValidationTests.cpp
index d713d92..e50b9f0 100644
--- a/src/dawn/tests/unittests/validation/ShaderModuleValidationTests.cpp
+++ b/src/dawn/tests/unittests/validation/ShaderModuleValidationTests.cpp
@@ -263,10 +263,11 @@
     native::ShaderModuleBase* shaderModuleBase = native::FromAPI(shaderModule.Get());
     native::OwnedCompilationMessages* messages = shaderModuleBase->GetCompilationMessages();
     messages->ClearMessages();
-    messages->AddMessage("Info Message");
-    messages->AddMessage("Warning Message", wgpu::CompilationMessageType::Warning);
-    messages->AddMessage("Error Message", wgpu::CompilationMessageType::Error, 3, 4);
-    messages->AddMessage("Complete Message", wgpu::CompilationMessageType::Info, 3, 4, 5, 6);
+    messages->AddMessageForTesting("Info Message");
+    messages->AddMessageForTesting("Warning Message", wgpu::CompilationMessageType::Warning);
+    messages->AddMessageForTesting("Error Message", wgpu::CompilationMessageType::Error, 3, 4);
+    messages->AddMessageForTesting("Complete Message", wgpu::CompilationMessageType::Info, 3, 4, 5,
+                                   6);
 
     auto callback = [](WGPUCompilationInfoRequestStatus status, const WGPUCompilationInfo* info,
                        void* userdata) {