Include member function information in the IR.

This *only* affects the IR, the metadata is not yet used in any way. Yet!

PiperOrigin-RevId: 402912942
diff --git a/rs_bindings_from_cc/ast_visitor.cc b/rs_bindings_from_cc/ast_visitor.cc
index 03618a8..504e78f 100644
--- a/rs_bindings_from_cc/ast_visitor.cc
+++ b/rs_bindings_from_cc/ast_visitor.cc
@@ -136,6 +136,59 @@
             function_decl->getReturnTypeSourceRange().getBegin())});
     success = false;
   }
+
+  std::optional<MemberFuncMetadata> member_func_metadata;
+  if (auto* method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(function_decl)) {
+    if (method_decl->isVirtual()) {
+      // TODO(b/202853028): implement virtual functions.
+      ir_.items.push_back(UnsupportedItem{
+          .name = function_decl->getQualifiedNameAsString(),
+          .message = "Virtual functions are not supported",
+          .source_loc = ConvertSourceLoc(
+              function_decl->getReturnTypeSourceRange().getBegin())});
+      success = false;
+    } else {
+      std::optional<MemberFuncMetadata::InstanceMethodMetadata>
+          instance_metadata;
+      if (method_decl->isInstance()) {
+        MemberFuncMetadata::ReferenceQualification reference;
+        switch (method_decl->getRefQualifier()) {
+          case clang::RQ_LValue:
+            reference = MemberFuncMetadata::kLValue;
+            break;
+          case clang::RQ_RValue:
+            reference = MemberFuncMetadata::kRValue;
+            break;
+          case clang::RQ_None:
+            reference = MemberFuncMetadata::kUnqualified;
+            break;
+        }
+        instance_metadata = MemberFuncMetadata::InstanceMethodMetadata{
+            .reference = reference,
+            .is_const = method_decl->isConst(),
+            .is_virtual =
+                false,  // TODO(b/202853028): implement virtual functions.
+        };
+      }
+
+      std::optional<Identifier> record_identifier =
+          GetTranslatedIdentifier(method_decl->getParent());
+      if (!record_identifier.has_value()) {
+        ir_.items.push_back(UnsupportedItem{
+            .name = function_decl->getQualifiedNameAsString(),
+            .message = absl::Substitute(
+                "The Record for method '$0' could not be found",
+                function_decl->getQualifiedNameAsString()),
+            .source_loc = ConvertSourceLoc(function_decl->getSourceRange())});
+        success = false;
+      } else {
+        member_func_metadata =
+            MemberFuncMetadata{.for_type = *record_identifier,
+                               .instance_method_metadata = instance_metadata};
+      }
+    }
+  }
+
   std::optional<UnqualifiedIdentifier> translated_name =
       GetTranslatedName(function_decl);
   if (success && translated_name.has_value()) {
@@ -146,6 +199,7 @@
         .return_type = *return_type,
         .params = std::move(params),
         .is_inline = function_decl->isInlined(),
+        .member_func_metadata = std::move(member_func_metadata),
     });
   }