@@ -4,10 +4,10 @@ pub fn cmp_module_specifiers(a: &str, b: &str, cmp_text: impl Fn(&str, &str) ->
4
4
let a_info = get_module_specifier_info ( a) ;
5
5
let b_info = get_module_specifier_info ( b) ;
6
6
7
- match a_info. kind {
7
+ return match a_info. kind {
8
8
ModuleSpecifierKind :: Absolute => {
9
9
match b_info. kind {
10
- ModuleSpecifierKind :: Absolute => cmp_text ( a_info. comparison_text , b_info. comparison_text ) ,
10
+ ModuleSpecifierKind :: Absolute => compare_folder_items ( & a_info, & b_info, cmp_text ) ,
11
11
ModuleSpecifierKind :: Relative ( _) => Ordering :: Less ,
12
12
}
13
13
} ,
@@ -20,17 +20,42 @@ pub fn cmp_module_specifiers(a: &str, b: &str, cmp_text: impl Fn(&str, &str) ->
20
20
} else if a_relative_count < b_relative_count {
21
21
Ordering :: Greater
22
22
} else {
23
- cmp_text ( a_info. comparison_text , b_info. comparison_text )
23
+ compare_folder_items ( & a_info, & b_info, cmp_text )
24
24
}
25
25
} ,
26
26
}
27
27
}
28
+ } ;
29
+
30
+ fn compare_folder_items ( a_info : & ModuleSpecifierInfo , b_info : & ModuleSpecifierInfo , cmp_text : impl Fn ( & str , & str ) -> Ordering ) -> Ordering {
31
+ let max_len = std:: cmp:: min ( a_info. folder_items . len ( ) , b_info. folder_items . len ( ) ) ;
32
+ // compare the common items except for the potential file name at the end
33
+ for i in 0 ..max_len - 1 {
34
+ let a_text = a_info. folder_items [ i] ;
35
+ let b_text = b_info. folder_items [ i] ;
36
+ let ordering = cmp_text ( a_text, b_text) ;
37
+ if ordering != Ordering :: Equal {
38
+ return ordering;
39
+ }
40
+ }
41
+
42
+ if a_info. folder_items . len ( ) != b_info. folder_items . len ( ) {
43
+ // the import that has a folder name should appear before the one with a file name
44
+ if a_info. folder_items . len ( ) > b_info. folder_items . len ( ) {
45
+ Ordering :: Less
46
+ } else {
47
+ Ordering :: Greater
48
+ }
49
+ } else {
50
+ // compare the file names
51
+ cmp_text ( a_info. folder_items . last ( ) . unwrap ( ) , b_info. folder_items . last ( ) . unwrap ( ) )
52
+ }
28
53
}
29
54
}
30
55
31
56
struct ModuleSpecifierInfo < ' a > {
32
- comparison_text : & ' a str ,
33
57
kind : ModuleSpecifierKind ,
58
+ folder_items : Vec < & ' a str > ,
34
59
}
35
60
36
61
#[ derive( Debug , PartialEq ) ]
@@ -59,12 +84,12 @@ fn get_module_specifier_info<'a>(text: &'a str) -> ModuleSpecifierInfo<'a> {
59
84
}
60
85
61
86
ModuleSpecifierInfo {
62
- comparison_text : & no_quotes_text[ start_index..] ,
87
+ folder_items : no_quotes_text[ start_index..] . split ( '/' ) . collect ( ) ,
63
88
kind : ModuleSpecifierKind :: Relative ( relative_count) ,
64
89
}
65
90
} else {
66
91
ModuleSpecifierInfo {
67
- comparison_text : no_quotes_text,
92
+ folder_items : no_quotes_text. split ( '/' ) . collect ( ) ,
68
93
kind : ModuleSpecifierKind :: Absolute ,
69
94
}
70
95
}
@@ -93,39 +118,39 @@ mod test {
93
118
#[ test]
94
119
fn it_should_get_module_specifier_info_when_empty ( ) {
95
120
let result = get_module_specifier_info ( "''" ) ;
96
- assert_eq ! ( result. comparison_text , "" ) ;
121
+ assert_eq ! ( result. folder_items , vec! [ "" ] ) ;
97
122
assert_eq ! ( result. kind, ModuleSpecifierKind :: Absolute ) ;
98
123
}
99
124
100
125
#[ test]
101
126
fn it_should_get_module_specifier_info_for_absolute ( ) {
102
127
// double quotes
103
128
let result = get_module_specifier_info ( r#""testing/asdf""# ) ;
104
- assert_eq ! ( result. comparison_text , "testing/ asdf" ) ;
129
+ assert_eq ! ( result. folder_items , vec! [ "testing" , " asdf"] ) ;
105
130
assert_eq ! ( result. kind, ModuleSpecifierKind :: Absolute ) ;
106
131
107
132
// single quotes
108
133
let result = get_module_specifier_info ( "'testing'" ) ;
109
- assert_eq ! ( result. comparison_text , "testing" ) ;
134
+ assert_eq ! ( result. folder_items , vec! [ "testing" ] ) ;
110
135
assert_eq ! ( result. kind, ModuleSpecifierKind :: Absolute ) ;
111
136
}
112
137
113
138
#[ test]
114
139
fn it_should_get_module_specifier_info_for_relative ( ) {
115
140
let result = get_module_specifier_info ( "'./a'" ) ;
116
- assert_eq ! ( result. comparison_text , "a" ) ;
141
+ assert_eq ! ( result. folder_items , vec! [ "a" ] ) ;
117
142
assert_eq ! ( result. kind, ModuleSpecifierKind :: Relative ( 0 ) ) ;
118
143
119
144
let result = get_module_specifier_info ( "'./../testing-test/t'" ) ;
120
- assert_eq ! ( result. comparison_text , "testing-test/t" ) ;
145
+ assert_eq ! ( result. folder_items , vec! [ "testing-test" , "t" ] ) ;
121
146
assert_eq ! ( result. kind, ModuleSpecifierKind :: Relative ( 1 ) ) ;
122
147
123
148
let result = get_module_specifier_info ( "'../asdf'" ) ;
124
- assert_eq ! ( result. comparison_text , "asdf" ) ;
149
+ assert_eq ! ( result. folder_items , vec! [ "asdf" ] ) ;
125
150
assert_eq ! ( result. kind, ModuleSpecifierKind :: Relative ( 1 ) ) ;
126
151
127
152
let result = get_module_specifier_info ( "'../../../test'" ) ;
128
- assert_eq ! ( result. comparison_text , "test" ) ;
153
+ assert_eq ! ( result. folder_items , vec! [ "test" ] ) ;
129
154
assert_eq ! ( result. kind, ModuleSpecifierKind :: Relative ( 3 ) ) ;
130
155
}
131
156
}
0 commit comments