Replace json dependency with llvm::json

PiperOrigin-RevId: 434896655
diff --git a/rs_bindings_from_cc/importer.cc b/rs_bindings_from_cc/importer.cc
index 05bb5dd..aad9d40 100644
--- a/rs_bindings_from_cc/importer.cc
+++ b/rs_bindings_from_cc/importer.cc
@@ -47,6 +47,7 @@
 #include "third_party/llvm/llvm-project/llvm/include/llvm/ADT/Optional.h"
 #include "third_party/llvm/llvm-project/llvm/include/llvm/ADT/SmallPtrSet.h"
 #include "third_party/llvm/llvm-project/llvm/include/llvm/Support/Casting.h"
+#include "third_party/llvm/llvm-project/llvm/include/llvm/Support/ErrorHandling.h"
 #include "third_party/llvm/llvm-project/llvm/include/llvm/Support/Regex.h"
 #include "util/task/status_macros.h"
 
@@ -154,10 +155,10 @@
       }
       const clang::CXXRecordDecl* base_record_decl =
           ABSL_DIE_IF_NULL(base_specifier.getType()->getAsCXXRecordDecl());
-      std::optional<int64_t> offset = {0};
+      llvm::Optional<int64_t> offset = {0};
       for (const clang::CXXBasePathElement& base_path_element : path) {
         if (base_path_element.Base->isVirtual()) {
-          offset = std::nullopt;
+          offset.reset();
           break;
         }
         *offset +=
@@ -166,7 +167,7 @@
                      base_path_element.Base->getType()->getAsCXXRecordDecl()))
                  .getQuantity()};
       }
-      DCHECK(!offset.has_value() || *offset >= 0)
+      DCHECK(!offset.hasValue() || *offset >= 0)
           << "Concrete base classes should have non-negative offsets.";
       bases.push_back(
           BaseClass{.base_record_id = GenerateDeclId(base_record_decl),
@@ -414,20 +415,18 @@
     if (i > 0) {
       const auto& prev = items[i - 1];
       if (are_equal(item, prev)) {
-        std::string prev_json =
-            std::visit([&](auto&& item) { return item.ToJson().dump(); },
-                       std::get<2>(prev));
-        std::string curr_json =
-            std::visit([&](auto&& item) { return item.ToJson().dump(); },
-                       std::get<2>(item));
+        llvm::json::Value prev_json = std::visit(
+            [&](auto&& item) { return item.ToJson(); }, std::get<2>(prev));
+        llvm::json::Value curr_json = std::visit(
+            [&](auto&& item) { return item.ToJson(); }, std::get<2>(item));
         if (prev_json != curr_json) {
-          LOG(FATAL) << "Non-deterministic order of IR items: " << prev_json
-                     << " -VS- " << curr_json;
+          llvm::report_fatal_error(
+              llvm::formatv("Non-deterministic order of IR items: {0} -VS- {1}",
+                            prev_json, curr_json));
         } else {
           // TODO(lukasza): Avoid generating duplicate IR items.  Currently
           // known example: UnsupportedItem: name=std::signbit; message=
           // Items contained in namespaces are not supported yet.
-          LOG(WARNING) << "Duplicated IR item: " << curr_json;
           continue;
         }
       }
@@ -612,7 +611,7 @@
       lifetime_params.begin(), lifetime_params.end(),
       [](const Lifetime& l1, const Lifetime& l2) { return l1.name < l2.name; });
 
-  std::optional<MemberFuncMetadata> member_func_metadata;
+  llvm::Optional<MemberFuncMetadata> member_func_metadata;
   if (auto* method_decl =
           clang::dyn_cast<clang::CXXMethodDecl>(function_decl)) {
     switch (method_decl->getAccess()) {
@@ -625,7 +624,8 @@
         // TODO(lukasza): Revisit this for protected methods.
         return LookupResult();
     }
-    std::optional<MemberFuncMetadata::InstanceMethodMetadata> instance_metadata;
+    llvm::Optional<MemberFuncMetadata::InstanceMethodMetadata>
+        instance_metadata;
     if (method_decl->isInstance()) {
       MemberFuncMetadata::ReferenceQualification reference;
       switch (method_decl->getRefQualifier()) {
@@ -749,7 +749,7 @@
 
   const clang::ASTRecordLayout& layout = ctx_.getASTRecordLayout(record_decl);
 
-  std::optional<size_t> base_size = std::nullopt;
+  llvm::Optional<size_t> base_size;
   bool override_alignment = record_decl->hasAttr<clang::AlignedAttr>();
   if (record_decl->getNumBases() != 0) {
     // The size of the base class subobjects is easy to compute, so long as we
@@ -907,7 +907,8 @@
   return !patterns_to_ignore.match(line);
 }
 
-std::optional<std::string> Importer::GetComment(const clang::Decl* decl) const {
+llvm::Optional<std::string> Importer::GetComment(
+    const clang::Decl* decl) const {
   // This does currently not distinguish between different types of comments.
   // In general it is not possible in C++ to reliably only extract doc comments.
   // This is going to be a heuristic that needs to be tuned over time.
@@ -923,9 +924,8 @@
       raw_comment->getFormattedText(sm, sm.getDiagnostics());
   std::string cleaned_comment_text = absl::StrJoin(
       absl::StrSplit(raw_comment_text, '\n', ShouldKeepCommentLine), "\n");
-  return cleaned_comment_text.empty()
-             ? std::nullopt
-             : std::optional<std::string>(std::move(cleaned_comment_text));
+  if (cleaned_comment_text.empty()) return {};
+  return cleaned_comment_text;
 }
 
 SourceLoc Importer::ConvertSourceLocation(clang::SourceLocation loc) const {