aconfig: reject consecutive underscores in identifiers

The Java codegen may translate flag names (snake_case) to Java
camelCase, dropping the underscores. The flags a_b and a__b will
translate to the same camelCase form, which is ambiguous.

Circumvent this problem by disallowing consecutive underscores in flag
names, flag namespaces, and packages.

Bug: 284252015
Test: atest aconfig.test
Change-Id: I2586a38160723c06265a140193da8178655553e4
diff --git a/tools/aconfig/src/codegen.rs b/tools/aconfig/src/codegen.rs
index fea9961..d96d4f9 100644
--- a/tools/aconfig/src/codegen.rs
+++ b/tools/aconfig/src/codegen.rs
@@ -17,7 +17,10 @@
 use anyhow::{ensure, Result};
 
 pub fn is_valid_name_ident(s: &str) -> bool {
-    // Identifiers must match [a-z][a-z0-9_]*
+    // Identifiers must match [a-z][a-z0-9_]*, except consecutive underscores are not allowed
+    if s.contains("__") {
+        return false;
+    }
     let mut chars = s.chars();
     let Some(first) = chars.next() else {
         return false;
@@ -46,11 +49,14 @@
     fn test_is_valid_name_ident() {
         assert!(is_valid_name_ident("foo"));
         assert!(is_valid_name_ident("foo_bar_123"));
+        assert!(is_valid_name_ident("foo_"));
 
         assert!(!is_valid_name_ident(""));
         assert!(!is_valid_name_ident("123_foo"));
         assert!(!is_valid_name_ident("foo-bar"));
         assert!(!is_valid_name_ident("foo-b\u{00e5}r"));
+        assert!(!is_valid_name_ident("foo__bar"));
+        assert!(!is_valid_name_ident("_foo"));
     }
 
     #[test]
@@ -59,6 +65,7 @@
         assert!(is_valid_package_ident("foo_bar_123"));
         assert!(is_valid_package_ident("foo.bar"));
         assert!(is_valid_package_ident("foo.bar.a123"));
+        assert!(!is_valid_package_ident("foo._bar"));
 
         assert!(!is_valid_package_ident(""));
         assert!(!is_valid_package_ident("123_foo"));
@@ -69,6 +76,7 @@
         assert!(!is_valid_package_ident("foo.bar."));
         assert!(!is_valid_package_ident("."));
         assert!(!is_valid_package_ident("foo..bar"));
+        assert!(!is_valid_package_ident("foo.__bar"));
     }
 
     #[test]