@@ -287,42 +287,29 @@ pub trait GenericPath: Clone + GenericPathUnsafe {
287
287
/// Fails the task if the extension contains a NUL.
288
288
fn set_extension < T : BytesContainer > ( & mut self , extension : T ) {
289
289
assert ! ( !contains_nul( & extension) ) ;
290
- // borrowck causes problems here too
291
- let val = {
292
- match self . filename ( ) {
293
- None => None ,
294
- Some ( name) => {
295
- let dot = '.' as u8 ;
296
- match name. rposition_elem ( & dot) {
297
- None | Some ( 0 ) => {
298
- if extension. container_as_bytes ( ) . is_empty ( ) {
299
- None
300
- } else {
301
- let mut v;
302
- let extension = extension. container_as_bytes ( ) ;
303
- v = slice:: with_capacity ( name. len ( ) + extension. len ( ) + 1 ) ;
304
- v. push_all ( name) ;
305
- v. push ( dot) ;
306
- v. push_all ( extension) ;
307
- Some ( v)
308
- }
309
- }
310
- Some ( idx) => {
311
- if extension. container_as_bytes ( ) . is_empty ( ) {
312
- Some ( name. slice_to ( idx) . to_owned ( ) )
313
- } else {
314
- let mut v;
315
- let extension = extension. container_as_bytes ( ) ;
316
- v = slice:: with_capacity ( idx + extension. len ( ) + 1 ) ;
317
- v. push_all ( name. slice_to ( idx+1 ) ) ;
318
- v. push_all ( extension) ;
319
- Some ( v)
320
- }
321
- }
322
- }
290
+
291
+ let val = self . filename ( ) . and_then ( |name| {
292
+ let dot = '.' as u8 ;
293
+ let extlen = extension. container_as_bytes ( ) . len ( ) ;
294
+ match ( name. rposition_elem ( & dot) , extlen) {
295
+ ( None , 0 ) | ( Some ( 0 ) , 0 ) => None ,
296
+ ( Some ( idx) , 0 ) => Some ( name. slice_to ( idx) . to_owned ( ) ) ,
297
+ ( idx, extlen) => {
298
+ let idx = match idx {
299
+ None | Some ( 0 ) => name. len ( ) ,
300
+ Some ( val) => val
301
+ } ;
302
+
303
+ let mut v;
304
+ v = slice:: with_capacity ( idx + extlen + 1 ) ;
305
+ v. push_all ( name. slice_to ( idx) ) ;
306
+ v. push ( dot) ;
307
+ v. push_all ( extension. container_as_bytes ( ) ) ;
308
+ Some ( v)
323
309
}
324
310
}
325
- } ;
311
+ } ) ;
312
+
326
313
match val {
327
314
None => ( ) ,
328
315
Some ( v) => unsafe { self . set_filename_unchecked ( v) }
0 commit comments