From ba1776808df5658beb4b014173dcb69e9cc3c48e Mon Sep 17 00:00:00 2001 From: PoiScript Date: Fri, 17 Nov 2023 18:08:47 +0800 Subject: [PATCH] fix(object): fix edge case (#69) --- src/syntax/object.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/syntax/object.rs b/src/syntax/object.rs index 6b294ad..50074e1 100644 --- a/src/syntax/object.rs +++ b/src/syntax/object.rs @@ -38,7 +38,7 @@ impl<'a> Iterator for ObjectPositions<'a> { type Item = (Input<'a>, Input<'a>); fn next(&mut self) -> Option { - if self.input.input_len() < 3 { + if self.input.input_len() < 3 || self.pos >= self.input.input_len() { return None; } @@ -46,10 +46,6 @@ impl<'a> Iterator for ObjectPositions<'a> { return Some(self.input.take_split(p)); } - if self.pos >= self.input.input_len() { - return None; - } - let bytes = &self.input.as_bytes()[self.pos..]; let previous = self.pos; let i = self.finder.find(bytes)?; @@ -57,7 +53,9 @@ impl<'a> Iterator for ObjectPositions<'a> { let p = match bytes[i] { b'{' => { - self.next = Some(self.pos); + if self.input.s.len() - self.pos > 3 { + self.next = Some(self.pos); + } self.pos - 1 } b' ' | b'(' | b'\'' | b'"' | b'\n' => self.pos, @@ -155,6 +153,13 @@ fn positions() { let vec = ObjectPositions::new(("*{", &config).into()).collect::>(); assert!(vec.is_empty()); + // https://github.com/PoiScript/orgize/issues/69 + let vec = ObjectPositions::new(("{3}", &config).into()).collect::>(); + assert_eq!(vec.len(), 2); + assert_eq!(vec[0].0.s, "{3}"); + // FIXME: + assert_eq!(vec[1].0.s, "{3}"); + let vec = ObjectPositions::new(("*{()}//s\nc<<", &config).into()).collect::>(); assert_eq!(vec.len(), 5); assert_eq!(vec[0].0.s, "*{()}//s\nc<<");