Fix filters syntax parsing matching tokens after end of filter

This commit is contained in:
NGnius (Graham) 2022-03-04 11:00:24 -05:00
parent da0596cc10
commit 9dd70f2004
2 changed files with 8 additions and 4 deletions

View file

@ -474,7 +474,7 @@ impl<P: MpsFilterPredicate + 'static, F: MpsFilterFactory<P> + 'static> BoxedMps
{ {
fn is_op_boxed(&self, tokens: &VecDeque<MpsToken>) -> bool { fn is_op_boxed(&self, tokens: &VecDeque<MpsToken>) -> bool {
let tokens_len = tokens.len(); let tokens_len = tokens.len();
if last_open_bracket_is_after_dot(tokens) { if is_correct_format(tokens) {
let start_of_predicate = last_dot_before_open_bracket(tokens) + 2; // .(predicate) let start_of_predicate = last_dot_before_open_bracket(tokens) + 2; // .(predicate)
if start_of_predicate > tokens_len - 1 { if start_of_predicate > tokens_len - 1 {
false false
@ -615,11 +615,15 @@ impl<P: MpsFilterPredicate + 'static, F: MpsFilterFactory<P> + 'static> BoxedMps
} }
} }
fn last_open_bracket_is_after_dot(tokens: &VecDeque<MpsToken>) -> bool { fn is_correct_format(tokens: &VecDeque<MpsToken>) -> bool {
let mut inside_brackets = 0; let mut inside_brackets = 0;
let mut open_bracket_found = false; let mut open_bracket_found = false;
let mut close_bracket = 0;
for i in (0..tokens.len()).rev() { for i in (0..tokens.len()).rev() {
if tokens[i].is_close_bracket() { if tokens[i].is_close_bracket() {
if inside_brackets == 0 {
close_bracket = i;
}
inside_brackets += 1; inside_brackets += 1;
} else if tokens[i].is_open_bracket() { } else if tokens[i].is_open_bracket() {
if inside_brackets == 1 { if inside_brackets == 1 {
@ -628,7 +632,7 @@ fn last_open_bracket_is_after_dot(tokens: &VecDeque<MpsToken>) -> bool {
inside_brackets -= 1; inside_brackets -= 1;
} }
} else if open_bracket_found { } else if open_bracket_found {
return tokens[i].is_dot(); return tokens[i].is_dot() && (close_bracket == 0 || close_bracket == tokens.len() - 1);
} }
} }
false false

View file

@ -677,7 +677,7 @@ fn execute_compareitemop_line() -> Result<(), Box<dyn MpsLanguageError>> {
#[test] #[test]
fn execute_computeitemop_line() -> Result<(), Box<dyn MpsLanguageError>> { fn execute_computeitemop_line() -> Result<(), Box<dyn MpsLanguageError>> {
execute_single_line( execute_single_line(
"files(`~/Music/MusicFlac/Bruno Mars/24K Magic/`).{ "files(`~/Music/MusicFlac/Bruno Mars/24K Magic/`).(artist? like `Bruno`).{
let count = 1, let count = 1,
item.track = count, item.track = count,
item.title = ~`Song #{track}` item, item.title = ~`Song #{track}` item,