Clean up generated code and implement strip_boilerplate

Remove redundant newlines and duplicate headers from generated files
and prevent the creation of empty sub-modules. Implement the
`strip_boilerplate` function to remove generated headers and
attributes, including a comprehensive test suite.
This commit is contained in:
2026-05-19 23:08:05 -07:00
parent 117cbf812b
commit 7e43e09f66
2 changed files with 68 additions and 10 deletions
+68 -6
View File
@@ -8,8 +8,7 @@ use std::collections::{HashMap, HashSet};
use std::str;
const DATA_IMPORTS: &str = "use roto_runtime::{ProtoAccessor, ProtoBuilder, Result, RotoError, read_varint, RepeatedFieldIterator, RotoMessage};\nuse core::str;\n#[cfg(feature = \"alloc\")]\nuse bytes::{Bytes, BytesMut, Buf, BufMut};\n";
const SERVICE_IMPORTS: &str =
"#[cfg(feature = \"alloc\")]\nuse tonic::{Request, Response, Status};\n\
const SERVICE_IMPORTS: &str = "#[cfg(feature = \"alloc\")]\nuse tonic::{Request, Response, Status};\n\
#[cfg(feature = \"alloc\")]\nuse tokio_stream::Stream;\n\
#[cfg(feature = \"alloc\")]\nuse std::pin::Pin;\n\
#[cfg(feature = \"alloc\")]\nuse std::sync::Arc;\n\
@@ -591,7 +590,7 @@ where
let mut output = String::new();
output.push_str("// @generated by protoc-gen-roto — do not edit\n");
output.push_str("#[allow(unused_imports)]\n\n");
output.push_str("#[allow(unused_imports)]\n");
output.push_str(imports);
for dep_res in file_proto.dependency() {
@@ -636,10 +635,12 @@ where
}
let mut root_mod_content = String::new();
root_mod_content.push_str("// @generated by protoc-gen-roto — do not edit\n");
root_mod_content.push_str("#![allow(unused_imports)]\n\n");
let mut sorted_root_mods: Vec<_> = root_mods.into_iter().collect();
sorted_root_mods.sort();
if sorted_root_mods.is_empty() {
root_mod_content.push_str("// @generated by protoc-gen-roto — do not edit\n");
root_mod_content.push_str("#![allow(unused_imports)]\n\n");
}
for m in sorted_root_mods {
root_mod_content.push_str(&format!("pub mod {};\n", m));
}
@@ -647,6 +648,9 @@ where
for (mod_path, sub_mods) in mod_files {
let mut content = String::new();
if sub_mods.is_empty() {
continue;
}
content.push_str("// @generated by protoc-gen-roto — do not edit\n");
content.push_str("#![allow(unused_imports)]\n\n");
let mut sorted_subs: Vec<_> = sub_mods.into_iter().collect();
@@ -759,7 +763,65 @@ pub fn generate_rust_code(
}
fn strip_boilerplate(content: &str) -> String {
content.to_string()
let mut stripped = content;
let header = "// @generated by protoc-gen-roto — do not edit\n";
if stripped.starts_with(header) {
stripped = &stripped[header.len()..];
let patterns = [
"#[allow(unused_imports)]\n",
"#![allow(unused_imports)]\n\n",
"#![allow(unused_imports)]\n",
];
for pattern in patterns {
if stripped.starts_with(pattern) {
stripped = &stripped[pattern.len()..];
break;
}
}
}
stripped.to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_strip_boilerplate_standard() {
let content = "// @generated by protoc-gen-roto — do not edit\n#[allow(unused_imports)]\nuse std::str;\n";
let stripped = strip_boilerplate(content);
assert_eq!(stripped, "use std::str;\n");
}
#[test]
fn test_strip_boilerplate_crate_level() {
let content = "// @generated by protoc-gen-roto — do not edit\n#![allow(unused_imports)]\n\nuse std::str;\n";
let stripped = strip_boilerplate(content);
assert_eq!(stripped, "use std::str;\n");
}
#[test]
fn test_strip_boilerplate_crate_level_single_newline() {
let content = "// @generated by protoc-gen-roto — do not edit\n#![allow(unused_imports)]\nuse std::str;\n";
let stripped = strip_boilerplate(content);
assert_eq!(stripped, "use std::str;\n");
}
#[test]
fn test_strip_boilerplate_no_boilerplate() {
let content = "use std::str;\n";
let stripped = strip_boilerplate(content);
assert_eq!(stripped, "use std::str;\n");
}
#[test]
fn test_strip_boilerplate_only_header() {
let content = "// @generated by protoc-gen-roto — do not edit\n";
let stripped = strip_boilerplate(content);
assert_eq!(stripped, "");
}
}
fn write_service(svc_proto: &ServiceDescriptorProto, package: &str, output: &mut String) {
-4
View File
@@ -1,6 +1,5 @@
// @generated by protoc-gen-roto — do not edit
#[allow(unused_imports)]
use roto_runtime::{ProtoAccessor, ProtoBuilder, Result, RotoError, read_varint, RepeatedFieldIterator, RotoMessage};
use core::str;
#[cfg(feature = "alloc")]
@@ -407,9 +406,6 @@ impl roto_runtime::RotoMessage for OwnedStreamingResponse {
}
// @generated by protoc-gen-roto — do not edit
#[allow(unused_imports)]
#[cfg(feature = "alloc")]
use tonic::{Request, Response, Status};