From d18c978f318d7a155980207ff777deb51701d1c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Kongstad?= Date: Tue, 13 Jun 2023 13:30:58 +0200 Subject: [PATCH] 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 --- tools/aconfig/src/codegen.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/aconfig/src/codegen.rs b/tools/aconfig/src/codegen.rs index fea9961ccd..d96d4f9391 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 @@ mod tests { 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 @@ mod tests { 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 @@ mod tests { 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]