1
+ use std:: borrow:: Cow ;
2
+
1
3
use arrayvec:: ArrayVec ;
2
4
use ra_db:: FileId ;
3
5
use ra_syntax:: { ast, SmolStr } ;
@@ -84,7 +86,7 @@ struct DefCollector<DB> {
84
86
global_macro_scope : FxHashMap < Name , MacroDefId > ,
85
87
86
88
/// Some macro use `$tt:tt which mean we have to handle the macro perfectly
87
- /// To prevent stackoverflow , we add a deep counter here for prevent that.
89
+ /// To prevent stack overflow , we add a deep counter here for prevent that.
88
90
macro_stack_monitor : MacroStackMonitor ,
89
91
}
90
92
@@ -649,7 +651,8 @@ fn resolve_submodule(
649
651
let file_dir_mod = dir_path. join ( format ! ( "{}/{}.rs" , mod_name, name) ) ;
650
652
let mut candidates = ArrayVec :: < [ _ ; 3 ] > :: new ( ) ;
651
653
let file_attr_mod = attr_path. map ( |file_path| {
652
- let file_attr_mod = dir_path. join ( file_path. to_string ( ) ) ;
654
+ let file_path = normalize_attribute_path ( file_path) ;
655
+ let file_attr_mod = dir_path. join ( file_path. as_ref ( ) ) . normalize ( ) ;
653
656
candidates. push ( file_attr_mod. clone ( ) ) ;
654
657
655
658
file_attr_mod
@@ -675,6 +678,21 @@ fn resolve_submodule(
675
678
}
676
679
}
677
680
681
+ fn normalize_attribute_path ( file_path : & SmolStr ) -> Cow < str > {
682
+ let current_dir = "./" ;
683
+ let windows_path_separator = r#"\"# ;
684
+ let current_dir_normalize = if file_path. starts_with ( current_dir) {
685
+ & file_path[ current_dir. len ( ) ..]
686
+ } else {
687
+ file_path. as_str ( )
688
+ } ;
689
+ if current_dir_normalize. contains ( windows_path_separator) {
690
+ Cow :: Owned ( current_dir_normalize. replace ( windows_path_separator, "/" ) )
691
+ } else {
692
+ Cow :: Borrowed ( current_dir_normalize)
693
+ }
694
+ }
695
+
678
696
#[ cfg( test) ]
679
697
mod tests {
680
698
use ra_db:: SourceDatabase ;
0 commit comments