mirror of
https://github.com/BurntSushi/ripgrep.git
synced 2025-01-24 13:56:47 +02:00
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
This commit is contained in:
parent
d12bdf35a5
commit
301a3fd71d
@ -318,12 +318,29 @@ impl<'b, 's> Iterator for Iter<'b, 's> {
|
|||||||
|
|
||||||
fn has_uppercase_literal(expr: &Expr) -> bool {
|
fn has_uppercase_literal(expr: &Expr) -> bool {
|
||||||
use syntax::Expr::*;
|
use syntax::Expr::*;
|
||||||
|
fn byte_is_upper(b: u8) -> bool { b'A' <= b && b <= b'Z' }
|
||||||
match *expr {
|
match *expr {
|
||||||
Literal { ref chars, casei } => {
|
Literal { ref chars, casei } => {
|
||||||
casei || chars.iter().any(|c| c.is_uppercase())
|
casei || chars.iter().any(|c| c.is_uppercase())
|
||||||
}
|
}
|
||||||
LiteralBytes { ref bytes, casei } => {
|
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),
|
Group { ref e, .. } => has_uppercase_literal(e),
|
||||||
Repeat { ref e, .. } => has_uppercase_literal(e),
|
Repeat { ref e, .. } => has_uppercase_literal(e),
|
||||||
|
@ -929,6 +929,13 @@ clean!(regression_228, "test", ".", |wd: WorkDir, mut cmd: Command| {
|
|||||||
wd.assert_err(&mut cmd);
|
wd.assert_err(&mut cmd);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// See: https://github.com/BurntSushi/ripgrep/issues/229
|
||||||
|
clean!(regression_229, "[E]conomie", ".", |wd: WorkDir, mut cmd: Command| {
|
||||||
|
wd.create("foo", "economie");
|
||||||
|
cmd.arg("-S");
|
||||||
|
wd.assert_err(&mut cmd);
|
||||||
|
});
|
||||||
|
|
||||||
// See: https://github.com/BurntSushi/ripgrep/issues/7
|
// See: https://github.com/BurntSushi/ripgrep/issues/7
|
||||||
sherlock!(feature_7, "-fpat", "sherlock", |wd: WorkDir, mut cmd: Command| {
|
sherlock!(feature_7, "-fpat", "sherlock", |wd: WorkDir, mut cmd: Command| {
|
||||||
wd.create("pat", "Sherlock\nHolmes");
|
wd.create("pat", "Sherlock\nHolmes");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user