about summary refs log tree commit diff
path: root/src/libstd/path
diff options
context:
space:
mode:
authorKevin Butler <haqkrs@gmail.com>2014-04-08 03:13:23 +0100
committerKevin Butler <haqkrs@gmail.com>2014-04-11 20:31:46 +0100
commit9b9ad9b741bcab9669b9a64dd8004382290dfa47 (patch)
tree070e2af7cb4dc6d98499f826ff5330eede5ee318 /src/libstd/path
parentd1e20488a5d1258b1582caa2db77e5210b8bd28f (diff)
downloadrust-9b9ad9b741bcab9669b9a64dd8004382290dfa47.tar.gz
rust-9b9ad9b741bcab9669b9a64dd8004382290dfa47.zip
Simplify GenericPath::set_extension.
Diffstat (limited to 'src/libstd/path')
-rw-r--r--src/libstd/path/mod.rs55
1 files changed, 21 insertions, 34 deletions
diff --git a/src/libstd/path/mod.rs b/src/libstd/path/mod.rs
index 54a8d813137..660f92d8f7b 100644
--- a/src/libstd/path/mod.rs
+++ b/src/libstd/path/mod.rs
@@ -287,42 +287,29 @@ pub trait GenericPath: Clone + GenericPathUnsafe {
     /// Fails the task if the extension contains a NUL.
     fn set_extension<T: BytesContainer>(&mut self, extension: T) {
         assert!(!contains_nul(&extension));
-        // borrowck causes problems here too
-        let val = {
-            match self.filename() {
-                None => None,
-                Some(name) => {
-                    let dot = '.' as u8;
-                    match name.rposition_elem(&dot) {
-                        None | Some(0) => {
-                            if extension.container_as_bytes().is_empty() {
-                                None
-                            } else {
-                                let mut v;
-                                let extension = extension.container_as_bytes();
-                                v = slice::with_capacity(name.len() + extension.len() + 1);
-                                v.push_all(name);
-                                v.push(dot);
-                                v.push_all(extension);
-                                Some(v)
-                            }
-                        }
-                        Some(idx) => {
-                            if extension.container_as_bytes().is_empty() {
-                                Some(name.slice_to(idx).to_owned())
-                            } else {
-                                let mut v;
-                                let extension = extension.container_as_bytes();
-                                v = slice::with_capacity(idx + extension.len() + 1);
-                                v.push_all(name.slice_to(idx+1));
-                                v.push_all(extension);
-                                Some(v)
-                            }
-                        }
-                    }
+
+        let val = self.filename().and_then(|name| {
+            let dot = '.' as u8;
+            let extlen = extension.container_as_bytes().len();
+            match (name.rposition_elem(&dot), extlen) {
+                (None, 0) | (Some(0), 0) => None,
+                (Some(idx), 0) => Some(name.slice_to(idx).to_owned()),
+                (idx, extlen) => {
+                    let idx = match idx {
+                        None | Some(0) => name.len(),
+                        Some(val) => val
+                    };
+
+                    let mut v;
+                    v = slice::with_capacity(idx + extlen + 1);
+                    v.push_all(name.slice_to(idx));
+                    v.push(dot);
+                    v.push_all(extension.container_as_bytes());
+                    Some(v)
                 }
             }
-        };
+        });
+
         match val {
             None => (),
             Some(v) => unsafe { self.set_filename_unchecked(v) }