Case Insensitive Unicode Text Search: Fallback To Regex (#28752)
Closes #9980 Release Notes: - Fixed: case insensitive text search with unicode characters
This commit is contained in:
parent
616d17f517
commit
d4a985a6e3
2 changed files with 96 additions and 0 deletions
|
@ -5425,6 +5425,87 @@ async fn test_search_in_gitignored_dirs(cx: &mut gpui::TestAppContext) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[gpui::test]
|
||||||
|
async fn test_search_with_unicode(cx: &mut gpui::TestAppContext) {
|
||||||
|
init_test(cx);
|
||||||
|
|
||||||
|
let fs = FakeFs::new(cx.executor());
|
||||||
|
fs.insert_tree(
|
||||||
|
path!("/dir"),
|
||||||
|
json!({
|
||||||
|
"one.rs": "// ПРИВЕТ? привет!",
|
||||||
|
"two.rs": "// ПРИВЕТ.",
|
||||||
|
"three.rs": "// привет",
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
let project = Project::test(fs.clone(), [path!("/dir").as_ref()], cx).await;
|
||||||
|
|
||||||
|
let unicode_case_sensitive_query = SearchQuery::text(
|
||||||
|
"привет",
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
Default::default(),
|
||||||
|
Default::default(),
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
assert_matches!(unicode_case_sensitive_query, Ok(SearchQuery::Text { .. }));
|
||||||
|
assert_eq!(
|
||||||
|
search(&project, unicode_case_sensitive_query.unwrap(), cx)
|
||||||
|
.await
|
||||||
|
.unwrap(),
|
||||||
|
HashMap::from_iter([
|
||||||
|
(separator!("dir/one.rs").to_string(), vec![17..29]),
|
||||||
|
(separator!("dir/three.rs").to_string(), vec![3..15]),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
let unicode_case_insensitive_query = SearchQuery::text(
|
||||||
|
"привет",
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
Default::default(),
|
||||||
|
Default::default(),
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
assert_matches!(
|
||||||
|
unicode_case_insensitive_query,
|
||||||
|
Ok(SearchQuery::Regex { .. })
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
search(&project, unicode_case_insensitive_query.unwrap(), cx)
|
||||||
|
.await
|
||||||
|
.unwrap(),
|
||||||
|
HashMap::from_iter([
|
||||||
|
(separator!("dir/one.rs").to_string(), vec![3..15, 17..29]),
|
||||||
|
(separator!("dir/two.rs").to_string(), vec![3..15]),
|
||||||
|
(separator!("dir/three.rs").to_string(), vec![3..15]),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
search(
|
||||||
|
&project,
|
||||||
|
SearchQuery::text(
|
||||||
|
"привет.",
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
Default::default(),
|
||||||
|
Default::default(),
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.unwrap(),
|
||||||
|
cx
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap(),
|
||||||
|
HashMap::from_iter([(separator!("dir/two.rs").to_string(), vec![3..16]),])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
async fn test_create_entry(cx: &mut gpui::TestAppContext) {
|
async fn test_create_entry(cx: &mut gpui::TestAppContext) {
|
||||||
init_test(cx);
|
init_test(cx);
|
||||||
|
|
|
@ -93,6 +93,21 @@ impl SearchQuery {
|
||||||
buffers: Option<Vec<Entity<Buffer>>>,
|
buffers: Option<Vec<Entity<Buffer>>>,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
let query = query.to_string();
|
let query = query.to_string();
|
||||||
|
if !case_sensitive && !query.is_ascii() {
|
||||||
|
// AhoCorasickBuilder doesn't support case-insensitive search with unicode characters
|
||||||
|
// Fallback to regex search as recommended by
|
||||||
|
// https://docs.rs/aho-corasick/1.1/aho_corasick/struct.AhoCorasickBuilder.html#method.ascii_case_insensitive
|
||||||
|
return Self::regex(
|
||||||
|
regex::escape(&query),
|
||||||
|
whole_word,
|
||||||
|
case_sensitive,
|
||||||
|
include_ignored,
|
||||||
|
false,
|
||||||
|
files_to_include,
|
||||||
|
files_to_exclude,
|
||||||
|
buffers,
|
||||||
|
);
|
||||||
|
}
|
||||||
let search = AhoCorasickBuilder::new()
|
let search = AhoCorasickBuilder::new()
|
||||||
.ascii_case_insensitive(!case_sensitive)
|
.ascii_case_insensitive(!case_sensitive)
|
||||||
.build([&query])?;
|
.build([&query])?;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue