]> git.lizzy.rs Git - rust.git/commitdiff
Add opt_span_before() to SpanUtils trait
authorSeiichi Uchida <seuchida@gmail.com>
Tue, 6 Mar 2018 10:46:03 +0000 (19:46 +0900)
committerSeiichi Uchida <seuchida@gmail.com>
Tue, 6 Mar 2018 10:46:03 +0000 (19:46 +0900)
With some refactorings to avoid duplicated code.

src/codemap.rs

index 224b20835618cbf54fd3c39f2b8c169fcb608823..f6c05f5be40ae9deedeba9ba4883e0ca6f74d3f4 100644 (file)
@@ -22,6 +22,7 @@ pub trait SpanUtils {
     fn span_after_last(&self, original: Span, needle: &str) -> BytePos;
     fn span_before(&self, original: Span, needle: &str) -> BytePos;
     fn opt_span_after(&self, original: Span, needle: &str) -> Option<BytePos>;
+    fn opt_span_before(&self, original: Span, needle: &str) -> Option<BytePos>;
 }
 
 pub trait LineRangeUtils {
@@ -35,10 +36,7 @@ pub trait LineRangeUtils {
 
 impl<'a> SpanUtils for SnippetProvider<'a> {
     fn span_after(&self, original: Span, needle: &str) -> BytePos {
-        let snippet = self.span_to_snippet(original).expect("Bad snippet");
-        let offset = snippet.find_uncommented(needle).expect("Bad offset") + needle.len();
-
-        original.lo() + BytePos(offset as u32)
+        self.opt_span_after(original, needle).expect("bad span")
     }
 
     fn span_after_last(&self, original: Span, needle: &str) -> BytePos {
@@ -53,15 +51,17 @@ fn span_after_last(&self, original: Span, needle: &str) -> BytePos {
     }
 
     fn span_before(&self, original: Span, needle: &str) -> BytePos {
-        let snippet = self.span_to_snippet(original).unwrap();
-        let offset = snippet.find_uncommented(needle).unwrap();
-
-        original.lo() + BytePos(offset as u32)
+        self.opt_span_before(original, needle).expect("bad span")
     }
 
     fn opt_span_after(&self, original: Span, needle: &str) -> Option<BytePos> {
+        self.opt_span_before(original, needle)
+            .map(|bytepos| bytepos + BytePos(needle.len() as u32))
+    }
+
+    fn opt_span_before(&self, original: Span, needle: &str) -> Option<BytePos> {
         let snippet = self.span_to_snippet(original)?;
-        let offset = snippet.find_uncommented(needle)? + needle.len();
+        let offset = snippet.find_uncommented(needle)?;
 
         Some(original.lo() + BytePos(offset as u32))
     }