Upgrade rust/crates/protobuf-codegen to 2.18.0

* Revert local change, remove patches/*.diff
* Add echo version in post_update.sh

Bug: 170256643
Test: atest -c --include-subdirs external/rust/crates
Test: atest -c --host --include-subdirs external/crosvm
Change-Id: I701b9b2a36f6e8e2ec0a37f47fe85cbb68f2866b
diff --git a/src/code_writer.rs b/src/code_writer.rs
index 855b785..8b53bc6 100644
--- a/src/code_writer.rs
+++ b/src/code_writer.rs
@@ -58,8 +58,7 @@
         self.write_line("#![allow(clippy::all)]");
         self.write_line("");
         self.write_line("#![allow(unused_attributes)]");
-        // ANDROID CHANGE: comment out rustfmt::skip to fix compilation error.
-        //self.write_line("#![rustfmt::skip]");
+        self.write_line("#![rustfmt::skip]");
         self.write_line("");
         self.write_line("#![allow(box_pointers)]");
         self.write_line("#![allow(dead_code)]");
diff --git a/src/customize.rs b/src/customize.rs
index c55fb07..f8e73aa 100644
--- a/src/customize.rs
+++ b/src/customize.rs
@@ -22,6 +22,12 @@
     pub serde_derive_cfg: Option<String>,
     /// Enable lite runtime
     pub lite_runtime: Option<bool>,
+    /// Generate `mod.rs` in the output directory.
+    ///
+    /// This option allows inclusion of generated files from cargo output directory.
+    ///
+    /// This option will likely be on by default in rust-protobuf version 3.
+    pub gen_mod_rs: Option<bool>,
     /// Used internally to generate protos bundled in protobuf crate
     /// like `descriptor.proto`
     pub inside_protobuf: Option<bool>,
@@ -68,6 +74,9 @@
         if let Some(v) = that.lite_runtime {
             self.lite_runtime = Some(v);
         }
+        if let Some(v) = that.gen_mod_rs {
+            self.gen_mod_rs = Some(v);
+        }
         if let Some(v) = that.inside_protobuf {
             self.inside_protobuf = Some(v);
         }
@@ -113,6 +122,8 @@
                 r.serde_derive_cfg = Some(v.to_owned());
             } else if n == "lite_runtime" {
                 r.lite_runtime = Some(parse_bool(v)?);
+            } else if n == "gen_mod_rs" {
+                r.gen_mod_rs = Some(parse_bool(v)?);
             } else if n == "inside_protobuf" {
                 r.inside_protobuf = Some(parse_bool(v)?);
             } else {
@@ -134,6 +145,7 @@
     let serde_derive = rustproto::exts::serde_derive.get(source);
     let serde_derive_cfg = rustproto::exts::serde_derive_cfg.get(source);
     let lite_runtime = None;
+    let gen_mod_rs = None;
     let inside_protobuf = None;
     Customize {
         expose_oneof,
@@ -144,6 +156,7 @@
         serde_derive,
         serde_derive_cfg,
         lite_runtime,
+        gen_mod_rs,
         inside_protobuf,
         _future_options: (),
     }
@@ -159,6 +172,7 @@
     let serde_derive = None;
     let serde_derive_cfg = None;
     let lite_runtime = None;
+    let gen_mod_rs = None;
     let inside_protobuf = None;
     Customize {
         expose_oneof,
@@ -169,6 +183,7 @@
         serde_derive,
         serde_derive_cfg,
         lite_runtime,
+        gen_mod_rs,
         inside_protobuf,
         _future_options: (),
     }
@@ -183,6 +198,7 @@
     let serde_derive = rustproto::exts::serde_derive_all.get(source);
     let serde_derive_cfg = rustproto::exts::serde_derive_cfg_all.get(source);
     let lite_runtime = rustproto::exts::lite_runtime_all.get(source);
+    let gen_mod_rs = None;
     let inside_protobuf = None;
     Customize {
         expose_oneof,
@@ -194,6 +210,7 @@
         serde_derive_cfg,
         lite_runtime,
         inside_protobuf,
+        gen_mod_rs,
         _future_options: (),
     }
 }
diff --git a/src/lib.rs b/src/lib.rs
index cff1da2..6c33538 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -61,11 +61,12 @@
 use self::enums::*;
 use self::extensions::*;
 use self::message::*;
-use file::proto_path_to_rust_mod;
 use inside::protobuf_crate_path;
 use scope::FileScope;
 use scope::RootScope;
 
+use crate::file::proto_path_to_rust_mod;
+
 #[doc(hidden)]
 pub use protobuf_name::ProtobufAbsolutePath;
 #[doc(hidden)]
@@ -162,12 +163,17 @@
     );
 }
 
+struct GenFileResult {
+    compiler_plugin_result: compiler_plugin::GenResult,
+    mod_name: String,
+}
+
 fn gen_file(
     file: &FileDescriptorProto,
     _files_map: &HashMap<&str, &FileDescriptorProto>,
     root_scope: &RootScope,
     customize: &Customize,
-) -> Option<compiler_plugin::GenResult> {
+) -> GenFileResult {
     // TODO: use it
     let mut customize = customize.clone();
     // options specified in invocation have precedence over options specified in file
@@ -186,7 +192,7 @@
     {
         let mut w = CodeWriter::new(&mut v);
 
-        w.write_generated_by("rust-protobuf", "2.17.0"); // ANDROID ported version
+        w.write_generated_by("rust-protobuf", "2.18.0"); // ANDROID ported version
         w.write_line(&format!("//! Generated file from `{}`", file.get_name()));
         if customize.inside_protobuf != Some(true) {
             w.write_line("");
@@ -221,10 +227,28 @@
         }
     }
 
-    Some(compiler_plugin::GenResult {
-        name: format!("{}.rs", proto_path_to_rust_mod(file.get_name())),
+    GenFileResult {
+        compiler_plugin_result: compiler_plugin::GenResult {
+            name: format!("{}.rs", proto_path_to_rust_mod(file.get_name())),
+            content: v,
+        },
+        mod_name: proto_path_to_rust_mod(file.get_name()).into_string(),
+    }
+}
+
+fn gen_mod_rs(mods: &[String]) -> compiler_plugin::GenResult {
+    let mut v = Vec::new();
+    let mut w = CodeWriter::new(&mut v);
+    w.comment("@generated");
+    w.write_line("");
+    for m in mods {
+        w.write_line(&format!("pub mod {};", m));
+    }
+    drop(w);
+    compiler_plugin::GenResult {
+        name: "mod.rs".to_owned(),
         content: v,
-    })
+    }
 }
 
 // This function is also used externally by cargo plugin
@@ -246,13 +270,23 @@
 
     let all_file_names: Vec<&str> = file_descriptors.iter().map(|f| f.get_name()).collect();
 
+    let mut mods = Vec::new();
+
     for file_name in files_to_generate {
         let file = files_map.get(&file_name[..]).expect(&format!(
             "file not found in file descriptors: {:?}, files: {:?}",
             file_name, all_file_names
         ));
-        results.extend(gen_file(file, &files_map, &root_scope, customize));
+
+        let gen_file_result = gen_file(file, &files_map, &root_scope, customize);
+        results.push(gen_file_result.compiler_plugin_result);
+        mods.push(gen_file_result.mod_name);
     }
+
+    if customize.gen_mod_rs.unwrap_or(false) {
+        results.push(gen_mod_rs(&mods));
+    }
+
     results
 }