diff options
author | Andrew Gallant <jamslam@gmail.com> | 2016-11-28 17:57:26 -0500 |
---|---|---|
committer | Andrew Gallant <jamslam@gmail.com> | 2016-11-28 17:57:26 -0500 |
commit | 301a3fd71d3a923419d6d3e7604979b314121801 (patch) | |
tree | 9e473a9b2d7aea40ba0b9c78d10b0fb5243fb7a5 /grep | |
parent | d12bdf35a57733184f5db897f685d8626a1a4b18 (diff) |
Detect more uppercase literals for --smart-case.
This changes the uppercase literal detection for the "smart case"
functionality. In particular, a character class is considered to have an
uppercase literal if at least one of its ranges starts or stops with an
uppercase literal.
Fixes #229
Diffstat (limited to 'grep')
-rw-r--r-- | grep/src/search.rs | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/grep/src/search.rs b/grep/src/search.rs index 4e4c48e9..850c8d62 100644 --- a/grep/src/search.rs +++ b/grep/src/search.rs @@ -318,12 +318,29 @@ impl<'b, 's> Iterator for Iter<'b, 's> { fn has_uppercase_literal(expr: &Expr) -> bool { use syntax::Expr::*; + fn byte_is_upper(b: u8) -> bool { b'A' <= b && b <= b'Z' } match *expr { Literal { ref chars, casei } => { casei || chars.iter().any(|c| c.is_uppercase()) } LiteralBytes { ref bytes, casei } => { - casei || bytes.iter().any(|&b| b'A' <= b && b <= b'Z') + casei || bytes.iter().any(|&b| byte_is_upper(b)) + } + Class(ref ranges) => { + for r in ranges { + if r.start.is_uppercase() || r.end.is_uppercase() { + return true; + } + } + false + } + ClassBytes(ref ranges) => { + for r in ranges { + if byte_is_upper(r.start) || byte_is_upper(r.end) { + return true; + } + } + false } Group { ref e, .. } => has_uppercase_literal(e), Repeat { ref e, .. } => has_uppercase_literal(e), |