Refactoring: Separate `destructor_snippets` and `move_..._snippets`.

This CL splits `destructor_and_move_snippets` into separate
`destructor_snippets` and `move_ctor_and_assignment_snippets`.  Keeping
them separate helps to keep them somewhat readable (especially after
future CLs add extra cases to `move_ctor_and_assignment_snippets`).

PiperOrigin-RevId: 548244779
Change-Id: I7fd6caec3de6029d242eaa8c7a7ce54fcebb8f4e
diff --git a/cc_bindings_from_rs/bindings.rs b/cc_bindings_from_rs/bindings.rs
index 112e857..731271e 100644
--- a/cc_bindings_from_rs/bindings.rs
+++ b/cc_bindings_from_rs/bindings.rs
@@ -1878,7 +1878,7 @@
     });
 
     let needs_drop = core.self_ty.needs_drop(tcx, tcx.param_env(core.def_id));
-    let destructor_and_move_snippets = if needs_drop {
+    let destructor_snippets = if needs_drop {
         let drop_trait_id =
             tcx.lang_items().drop_trait().expect("`Drop` trait should be present if `needs_drop");
         let TraitThunks {
@@ -1894,9 +1894,47 @@
         let main_api = CcSnippet::new(quote! {
             __NEWLINE__ __COMMENT__ "Drop::drop"
             ~#adt_cc_name(); __NEWLINE__
+            __NEWLINE__
+        });
+        let cc_details = {
+            let mut prereqs = CcPrerequisites::default();
+            let cc_thunk_decls = cc_thunk_decls.into_tokens(&mut prereqs);
+            let tokens = quote! {
+                #cc_thunk_decls
+                inline #adt_cc_name::~#adt_cc_name() {
+                    __crubit_internal::#drop_thunk_name(*this);
+                }
+            };
+            CcSnippet { tokens, prereqs }
+        };
+        ApiSnippets { main_api, cc_details, rs_details }
+    } else {
+        ApiSnippets {
+            main_api: CcSnippet::new(quote! {
+                __NEWLINE__ __COMMENT__ "No custom `Drop` impl and no custom \"drop glue\" required"
+                ~#adt_cc_name() = default; __NEWLINE__
+            }),
+            ..Default::default()
+        }
+    };
+
+    let copy_ctor_and_assignment_snippets = format_copy_ctor_and_assignment_operator(input, core)
+        .unwrap_or_else(|err| {
+            let msg = format!("{err:#}");
+            ApiSnippets {
+                main_api: CcSnippet::new(quote! {
+                    __NEWLINE__ __COMMENT__ #msg
+                    #adt_cc_name(const #adt_cc_name&) = delete;  __NEWLINE__
+                    #adt_cc_name& operator=(const #adt_cc_name&) = delete;
+                }),
+                ..Default::default()
+            }
+        });
+
+    let move_ctor_and_assignment_snippets = if needs_drop {
+        let main_api = CcSnippet::new(quote! {
             #adt_cc_name(#adt_cc_name&&); __NEWLINE__
             #adt_cc_name& operator=(#adt_cc_name&&); __NEWLINE__
-            __NEWLINE__
         });
         let cc_details = {
             // Move constructor depends on presence of the default constructor.
@@ -1912,12 +1950,7 @@
             let mut prereqs = CcPrerequisites::default();
             prereqs.includes.insert(input.support_header("internal/memswap.h"));
             prereqs.includes.insert(CcInclude::utility()); // for `std::move`
-            let cc_thunk_decls = cc_thunk_decls.into_tokens(&mut prereqs);
             let tokens = quote! {
-                #cc_thunk_decls
-                inline #adt_cc_name::~#adt_cc_name() {
-                    __crubit_internal::#drop_thunk_name(*this);
-                }
                 inline #adt_cc_name::#adt_cc_name(#adt_cc_name&& other)
                         : #adt_cc_name() {
                     *this = std::move(other);
@@ -1929,12 +1962,10 @@
             };
             CcSnippet { tokens, prereqs }
         };
-        ApiSnippets { main_api, cc_details, rs_details }
+        ApiSnippets { main_api, cc_details, ..Default::default() }
     } else {
         ApiSnippets {
             main_api: CcSnippet::new(quote! {
-                __NEWLINE__ __COMMENT__ "No custom `Drop` impl and no custom \"drop glue\" required"
-                ~#adt_cc_name() = default; __NEWLINE__
                 // The generated bindings have to follow Rust move semantics:
                 // * All Rust types are memcpy-movable (e.g. <internal link>/constructors.html says
                 //   that "Every type must be ready for it to be blindly memcopied to somewhere
@@ -1971,19 +2002,6 @@
         }
     };
 
-    let copy_ctor_and_assignment_snippets = format_copy_ctor_and_assignment_operator(input, core)
-        .unwrap_or_else(|err| {
-            let msg = format!("{err:#}");
-            ApiSnippets {
-                main_api: CcSnippet::new(quote! {
-                    __NEWLINE__ __COMMENT__ #msg
-                    #adt_cc_name(const #adt_cc_name&) = delete;  __NEWLINE__
-                    #adt_cc_name& operator=(const #adt_cc_name&) = delete;
-                }),
-                ..Default::default()
-            }
-        });
-
     let impl_items_snippets = tcx
         .inherent_impls(core.def_id)
         .iter()
@@ -2015,7 +2033,8 @@
         rs_details: public_functions_rs_details,
     } = [
         default_ctor_snippets,
-        destructor_and_move_snippets,
+        destructor_snippets,
+        move_ctor_and_assignment_snippets,
         copy_ctor_and_assignment_snippets,
         impl_items_snippets,
     ]