From d99ca69cf7207e31d7ddffe849a4235cc63899d7 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 8 Aug 2012 15:05:49 -0700 Subject: [PATCH] lint: Allow trailing underscores in camel case idents --- src/rustc/middle/lint.rs | 13 ++++++++++++- ...lint-non-camel-case-with-trailing-underscores.rs | 6 ++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/test/run-pass/lint-non-camel-case-with-trailing-underscores.rs diff --git a/src/rustc/middle/lint.rs b/src/rustc/middle/lint.rs index 638c583ba9a..0bfda8798fa 100644 --- a/src/rustc/middle/lint.rs +++ b/src/rustc/middle/lint.rs @@ -452,10 +452,21 @@ fn check_item_path_statement(cx: ty::ctxt, it: @ast::item) { fn check_item_non_camel_case_types(cx: ty::ctxt, it: @ast::item) { fn is_camel_case(ident: ast::ident) -> bool { assert ident.is_not_empty(); - char::is_uppercase(str::char_at(*ident, 0)) && + let ident = ident_without_trailing_underscores(ident); + char::is_uppercase(str::char_at(ident, 0)) && !ident.contains_char('_') } + fn ident_without_trailing_underscores(ident: ast::ident) -> ~str { + match str::rfind(*ident, |c| c != '_') { + some(idx) => (*ident).slice(0, idx + 1), + none => { + // all underscores + *ident + } + } + } + fn check_case(cx: ty::ctxt, ident: ast::ident, expr_id: ast::node_id, item_id: ast::node_id, span: span) { diff --git a/src/test/run-pass/lint-non-camel-case-with-trailing-underscores.rs b/src/test/run-pass/lint-non-camel-case-with-trailing-underscores.rs new file mode 100644 index 00000000000..276a15a4d66 --- /dev/null +++ b/src/test/run-pass/lint-non-camel-case-with-trailing-underscores.rs @@ -0,0 +1,6 @@ +// This is ok because we often use the trailing underscore to mean 'prime' + +#[forbid(non_camel_case_types)] +type Foo_ = int; + +fn main() { }