@@ -543,35 +543,36 @@ fn create_tooltip(
543
543
/// ```
544
544
/// # use std::path::Path;
545
545
///
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")) );
549
549
///
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")) );
553
553
///
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);
557
561
/// ```
558
562
fn skip_path_components < P : AsRef < Path > > (
559
- path : PathBuf ,
563
+ path : & Path ,
560
564
prefix : P ,
561
565
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
+ } )
575
576
}
576
577
577
578
/// Collapse parent directory references inside of paths.
@@ -647,23 +648,26 @@ fn racer_match_to_def(ctx: &InitActionContext, m: &racer::Match) -> Option<Def>
647
648
648
649
let home = env:: var ( "HOME" )
649
650
. 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" ) ) ;
652
659
653
660
let contextstr = m. contextstr . replacen ( "\\ \\ ?\\ " , "" , 1 ) ;
654
661
let contextstr_path = PathBuf :: from ( & contextstr) ;
655
662
let contextstr_path = collapse_parents ( contextstr_path) ;
656
663
657
664
// 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 ( ) ) )
667
671
. and_then ( |path| path. to_str ( ) . map ( |s| s. to_string ( ) ) )
668
672
. unwrap_or_else ( || contextstr. to_string ( ) )
669
673
} else {
0 commit comments