@@ -51,6 +51,10 @@ impl Visibility {
51
51
Visibility :: PubCrate ( krate) => return from_module. krate ( db) == krate,
52
52
Visibility :: Public => return true ,
53
53
} ;
54
+ if from_module == to_module {
55
+ // if the modules are the same, visibility is trivially satisfied
56
+ return true ;
57
+ }
54
58
// if they're not in the same crate, it can't be visible
55
59
if from_module. krate ( db) != to_module. krate ( db) {
56
60
return false ;
@@ -73,6 +77,10 @@ impl Visibility {
73
77
Visibility :: PubCrate ( krate) => return from_module. krate ( db) == krate,
74
78
Visibility :: Public => return true ,
75
79
} ;
80
+ if from_module == to_module {
81
+ // if the modules are the same, visibility is trivially satisfied
82
+ return true ;
83
+ }
76
84
// if they're not in the same crate, it can't be visible
77
85
if def_map. krate ( ) != to_module. krate ( db) {
78
86
return false ;
@@ -161,6 +169,21 @@ impl Visibility {
161
169
if mod_. krate ( db) == krate { Some ( Visibility :: PubCrate ( krate) ) } else { None }
162
170
}
163
171
( Visibility :: Module ( mod_a, expl_a) , Visibility :: Module ( mod_b, expl_b) ) => {
172
+ if mod_a == mod_b {
173
+ // Most module visibilities are `pub(self)`, and assuming no errors
174
+ // this will be the common and thus fast path.
175
+ return Some ( Visibility :: Module (
176
+ mod_a,
177
+ match ( expl_a, expl_b) {
178
+ ( VisibilityExplicitness :: Explicit , _)
179
+ | ( _, VisibilityExplicitness :: Explicit ) => {
180
+ VisibilityExplicitness :: Explicit
181
+ }
182
+ _ => VisibilityExplicitness :: Implicit ,
183
+ } ,
184
+ ) ) ;
185
+ }
186
+
164
187
if mod_a. krate ( db) != def_map. krate ( ) || mod_b. krate ( db) != def_map. krate ( ) {
165
188
return None ;
166
189
}
@@ -212,6 +235,21 @@ impl Visibility {
212
235
if mod_. krate ( db) == krate { Some ( Visibility :: Module ( mod_, exp) ) } else { None }
213
236
}
214
237
( Visibility :: Module ( mod_a, expl_a) , Visibility :: Module ( mod_b, expl_b) ) => {
238
+ if mod_a == mod_b {
239
+ // Most module visibilities are `pub(self)`, and assuming no errors
240
+ // this will be the common and thus fast path.
241
+ return Some ( Visibility :: Module (
242
+ mod_a,
243
+ match ( expl_a, expl_b) {
244
+ ( VisibilityExplicitness :: Explicit , _)
245
+ | ( _, VisibilityExplicitness :: Explicit ) => {
246
+ VisibilityExplicitness :: Explicit
247
+ }
248
+ _ => VisibilityExplicitness :: Implicit ,
249
+ } ,
250
+ ) ) ;
251
+ }
252
+
215
253
if mod_a. krate ( db) != def_map. krate ( ) || mod_b. krate ( db) != def_map. krate ( ) {
216
254
return None ;
217
255
}
0 commit comments