From 82e5315f23ef969ee631118e1d3f958d69586490 Mon Sep 17 00:00:00 2001 From: Sven Date: Mon, 24 Mar 2014 00:15:41 +0100 Subject: [PATCH 1/2] Fixed number after underscore in camel case --- src/librustc/middle/lint.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/librustc/middle/lint.rs b/src/librustc/middle/lint.rs index 2ba8121b479ea..d8fb21f1f705f 100644 --- a/src/librustc/middle/lint.rs +++ b/src/librustc/middle/lint.rs @@ -1127,13 +1127,27 @@ fn check_deprecated_owned_vector(cx: &Context, e: &ast::Expr) { fn check_item_non_camel_case_types(cx: &Context, it: &ast::Item) { fn is_camel_case(ident: ast::Ident) -> bool { + // Returns true if char after underscore is invalid. + // Accepts trailing underscores to separate types. + fn invalid_following_underscore(ident: &str) -> bool { + for i in range(0, ident.char_len() - 1) { + if ident.char_at(i) != '_' { continue; } + if !"_0123456789".contains_char(ident.char_at(i + 1)) { + return true; + } + } + + false + } + let ident = token::get_ident(ident); assert!(!ident.get().is_empty()); - let ident = ident.get().trim_chars(&'_'); + let ident = ident.get(); // start with a non-lowercase letter rather than non-uppercase // ones (some scripts don't have a concept of upper/lowercase) - !ident.char_at(0).is_lowercase() && !ident.contains_char('_') + !ident.char_at(0).is_lowercase() + && !invalid_following_underscore(ident) } fn check_case(cx: &Context, sort: &str, ident: ast::Ident, span: Span) { From 2bebe7ac467f235f3195d9d887e5bdab99f8fc0e Mon Sep 17 00:00:00 2001 From: Sven Date: Tue, 25 Mar 2014 09:18:47 +0100 Subject: [PATCH 2/2] Fixed camel case algorithm. --- src/librustc/middle/lint.rs | 10 +++++----- ...amel-case-with-numbers-after-underscore.rs | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 src/test/run-pass/lint-non-camel-case-with-numbers-after-underscore.rs diff --git a/src/librustc/middle/lint.rs b/src/librustc/middle/lint.rs index d8fb21f1f705f..6711ec4d1cd91 100644 --- a/src/librustc/middle/lint.rs +++ b/src/librustc/middle/lint.rs @@ -1130,19 +1130,19 @@ fn check_item_non_camel_case_types(cx: &Context, it: &ast::Item) { // Returns true if char after underscore is invalid. // Accepts trailing underscores to separate types. fn invalid_following_underscore(ident: &str) -> bool { - for i in range(0, ident.char_len() - 1) { - if ident.char_at(i) != '_' { continue; } - if !"_0123456789".contains_char(ident.char_at(i + 1)) { + let mut last_was_underscore = false; + for c in ident.chars() { + if last_was_underscore && !"_0123456789".contains_char(c) { return true; } + last_was_underscore = c == '_'; } - false } let ident = token::get_ident(ident); assert!(!ident.get().is_empty()); - let ident = ident.get(); + let ident = ident.get().trim_chars(&'_'); // start with a non-lowercase letter rather than non-uppercase // ones (some scripts don't have a concept of upper/lowercase) diff --git a/src/test/run-pass/lint-non-camel-case-with-numbers-after-underscore.rs b/src/test/run-pass/lint-non-camel-case-with-numbers-after-underscore.rs new file mode 100644 index 0000000000000..005da59dbe2fa --- /dev/null +++ b/src/test/run-pass/lint-non-camel-case-with-numbers-after-underscore.rs @@ -0,0 +1,19 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// This is ok because we often use underscores to separate numbers + +#[forbid(non_camel_case_types)]; + +type Foo_1_2 = int; +type _Bar = int; +type __Baz__1 = int; + +pub fn main() { }