@@ -543,35 +543,36 @@ fn create_tooltip(
543543/// ``` 
544544/// # use std::path::Path; 
545545/// 
546- /// let base_path = Path::from (".rustup/toolchains/nightly-x86_64-pc-windows-msvc/lib/rustlib/src/rust/src/liballoc/string.rs"); 
547- /// let tidy_path = skip_path_components(base_path.to_path_buf() , ".rustup", 8 ); 
548- /// assert_eq!("liballoc/string.rs", tidy_path ); 
546+ /// let base_path = Path::new (".rustup/toolchains/nightly-x86_64-pc-windows-msvc/lib/rustlib/src/rust/src/liballoc/string.rs"); 
547+ /// let tidy_path = skip_path_components(base_path, ".rustup", 7 ); 
548+ /// assert_eq!(tidy_path, Some(PathBuf::from( "liballoc/string.rs")) ); 
549549/// 
550- /// let base_path = Path::from(" .cargo/registry/src/github.com-1ecc6299db9ec823/smallvec-0.6.2/lib.rs"); 
551- /// let tidy_path = skip_path_components(base_path.to_path_buf() , ".cargo", 4 ); 
552- /// assert_eq!("smallvec-0.6.2/lib.rs", tidy_path ); 
550+ /// let base_path = Path::new("/home/user/ .cargo/registry/src/github.com-1ecc6299db9ec823/smallvec-0.6.2/lib.rs"); 
551+ /// let tidy_path = skip_path_components(base_path, "/home/user/ .cargo", 3 ); 
552+ /// assert_eq!(tidy_path, Some(PathBuf::from( "smallvec-0.6.2/lib.rs")) ); 
553553/// 
554- /// let base_path = Path::from("some/unknown/path/lib.rs"); 
555- /// let tidy_path = skip_path_components(base_path.to_path_buf(), ".rustup", 4); 
556- /// assert_eq!("some/unknown/path/lib.rs", tidy_path); 
554+ /// let base_path = Path::new("/home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/smallvec-0.6.2/lib.rs"); 
555+ /// let tidy_path = skip_path_components(base_path, ".cargo", 3); 
556+ /// assert_eq!(tidy_path, None); 
557+ /// 
558+ /// let base_path = Path::new("some/unknown/path/lib.rs"); 
559+ /// let tidy_path = skip_path_components(base_path, ".rustup", 4); 
560+ /// assert_eq!(tidy_path, None); 
557561/// ``` 
558562fn  skip_path_components < P :  AsRef < Path > > ( 
559-     path :  PathBuf , 
563+     path :  & Path , 
560564    prefix :  P , 
561565    skip_components :  usize , 
562- )  -> PathBuf  { 
563-     if  path. starts_with ( prefix)  { 
564-         let  comps:  PathBuf  =
565-             path. components ( ) 
566-                 . skip ( skip_components) 
567-                 . fold ( PathBuf :: new ( ) ,  |mut  comps,  comp| { 
568-                     comps. push ( comp) ; 
569-                     comps
570-                 } ) ; 
571-         comps
572-     }  else  { 
573-         path
574-     } 
566+ )  -> Option < PathBuf >  { 
567+     path. strip_prefix ( prefix) . ok ( ) . map ( |stripped| { 
568+         stripped
569+             . components ( ) 
570+             . skip ( skip_components) 
571+             . fold ( PathBuf :: new ( ) ,  |mut  comps,  comp| { 
572+                 comps. push ( comp) ; 
573+                 comps
574+             } ) 
575+     } ) 
575576} 
576577
577578/// Collapse parent directory references inside of paths. 
@@ -647,23 +648,26 @@ fn racer_match_to_def(ctx: &InitActionContext, m: &racer::Match) -> Option<Def>
647648
648649        let  home = env:: var ( "HOME" ) 
649650            . or_else ( |_| env:: var ( "USERPROFILE" ) ) 
650-             . map ( |dir| PathBuf :: from ( & dir) ) 
651-             . unwrap_or_else ( |_| PathBuf :: new ( ) ) ; 
651+             . map ( PathBuf :: from) 
652+             . unwrap_or_default ( ) ; 
653+         let  rustup_home = env:: var ( "RUSTUP_HOME" ) 
654+             . map ( PathBuf :: from) 
655+             . unwrap_or_else ( |_| home. join ( ".rustup" ) ) ; 
656+         let  cargo_home = env:: var ( "CARGO_HOME" ) 
657+             . map ( PathBuf :: from) 
658+             . unwrap_or_else ( |_| home. join ( ".cargo" ) ) ; 
652659
653660        let  contextstr = m. contextstr . replacen ( "\\ \\ ?\\ " ,  "" ,  1 ) ; 
654661        let  contextstr_path = PathBuf :: from ( & contextstr) ; 
655662        let  contextstr_path = collapse_parents ( contextstr_path) ; 
656663
657664        // Tidy up the module path 
658-         contextstr_path
659-             // Strip current project dir prefix 
660-             . strip_prefix ( & ctx. current_project ) 
661-             // Strip home directory prefix 
662-             . or_else ( |_| contextstr_path. strip_prefix ( & home) ) 
663-             . ok ( ) 
664-             . map ( |path| path. to_path_buf ( ) ) 
665-             . map ( |path| skip_path_components ( path,  ".rustup" ,  8 ) ) 
666-             . map ( |path| skip_path_components ( path,  ".cargo" ,  4 ) ) 
665+         // Skips toolchains/$TOOLCHAIN/lib/rustlib/src/rust/src 
666+         skip_path_components ( & contextstr_path,  rustup_home,  7 ) 
667+             // Skips /registry/src/github.com-1ecc6299db9ec823/ 
668+             . or_else ( || skip_path_components ( & contextstr_path,  cargo_home,  3 ) ) 
669+             // Make the path relative to the root of the project, if possible 
670+             . or_else ( || contextstr_path. strip_prefix ( & ctx. current_project ) . ok ( ) . map ( |x| x. to_owned ( ) ) ) 
667671            . and_then ( |path| path. to_str ( ) . map ( |s| s. to_string ( ) ) ) 
668672            . unwrap_or_else ( || contextstr. to_string ( ) ) 
669673    }  else  { 
0 commit comments