12
12
html_favicon_url = "https://doc.rust-lang.org/favicon.ico" ,
13
13
html_root_url = "https://doc.rust-lang.org/nightly/" ) ]
14
14
15
+ #![ feature( crate_visibility_modifier) ]
15
16
#![ feature( rustc_diagnostic_macros) ]
16
17
#![ feature( slice_sort_by_cached_key) ]
17
18
@@ -1655,11 +1656,11 @@ impl<'a> Resolver<'a> {
1655
1656
. map ( |seg| Ident :: new ( seg. name , span) )
1656
1657
. collect ( ) ;
1657
1658
// FIXME (Manishearth): Intra doc links won't get warned of epoch changes
1658
- match self . resolve_path ( & path, Some ( namespace) , true , span, None ) {
1659
+ match self . resolve_path ( & path, Some ( namespace) , true , span, CrateLint :: No ) {
1659
1660
PathResult :: Module ( module) => * def = module. def ( ) . unwrap ( ) ,
1660
1661
PathResult :: NonModule ( path_res) if path_res. unresolved_segments ( ) == 0 =>
1661
1662
* def = path_res. base_def ( ) ,
1662
- PathResult :: NonModule ( ..) => match self . resolve_path ( & path, None , true , span, None ) {
1663
+ PathResult :: NonModule ( ..) => match self . resolve_path ( & path, None , true , span, CrateLint :: No ) {
1663
1664
PathResult :: Failed ( span, msg, _) => {
1664
1665
error_callback ( self , span, ResolutionError :: FailedToResolve ( & msg) ) ;
1665
1666
}
@@ -2378,8 +2379,13 @@ impl<'a> Resolver<'a> {
2378
2379
if def != Def :: Err {
2379
2380
new_id = Some ( def. def_id ( ) ) ;
2380
2381
let span = trait_ref. path . span ;
2381
- if let PathResult :: Module ( module) = self . resolve_path ( & path, None , false , span,
2382
- Some ( trait_ref. ref_id ) ) {
2382
+ if let PathResult :: Module ( module) = self . resolve_path (
2383
+ & path,
2384
+ None ,
2385
+ false ,
2386
+ span,
2387
+ CrateLint :: SimplePath ( trait_ref. ref_id ) ,
2388
+ ) {
2383
2389
new_val = Some ( ( module, trait_ref. clone ( ) ) ) ;
2384
2390
}
2385
2391
}
@@ -2839,7 +2845,7 @@ impl<'a> Resolver<'a> {
2839
2845
} else {
2840
2846
let mod_path = & path[ ..path. len ( ) - 1 ] ;
2841
2847
let mod_prefix = match this. resolve_path ( mod_path, Some ( TypeNS ) ,
2842
- false , span, None ) {
2848
+ false , span, CrateLint :: No ) {
2843
2849
PathResult :: Module ( module) => module. def ( ) ,
2844
2850
_ => None ,
2845
2851
} . map_or ( format ! ( "" ) , |def| format ! ( "{} " , def. kind_name( ) ) ) ;
@@ -3169,7 +3175,7 @@ impl<'a> Resolver<'a> {
3169
3175
) ) ;
3170
3176
}
3171
3177
3172
- let result = match self . resolve_path ( & path, Some ( ns) , true , span, Some ( id) ) {
3178
+ let result = match self . resolve_path ( & path, Some ( ns) , true , span, CrateLint :: SimplePath ( id) ) {
3173
3179
PathResult :: NonModule ( path_res) => path_res,
3174
3180
PathResult :: Module ( module) if !module. is_normal ( ) => {
3175
3181
PathResolution :: new ( module. def ( ) . unwrap ( ) )
@@ -3206,7 +3212,7 @@ impl<'a> Resolver<'a> {
3206
3212
path[ 0 ] . name != keywords:: CrateRoot . name ( ) &&
3207
3213
path[ 0 ] . name != keywords:: DollarCrate . name ( ) {
3208
3214
let unqualified_result = {
3209
- match self . resolve_path ( & [ * path. last ( ) . unwrap ( ) ] , Some ( ns) , false , span, None ) {
3215
+ match self . resolve_path ( & [ * path. last ( ) . unwrap ( ) ] , Some ( ns) , false , span, CrateLint :: No ) {
3210
3216
PathResult :: NonModule ( path_res) => path_res. base_def ( ) ,
3211
3217
PathResult :: Module ( module) => module. def ( ) . unwrap ( ) ,
3212
3218
_ => return Some ( result) ,
@@ -3221,14 +3227,14 @@ impl<'a> Resolver<'a> {
3221
3227
Some ( result)
3222
3228
}
3223
3229
3224
- fn resolve_path ( & mut self ,
3225
- path : & [ Ident ] ,
3226
- opt_ns : Option < Namespace > , // `None` indicates a module path
3227
- record_used : bool ,
3228
- path_span : Span ,
3229
- node_id : Option < NodeId > ) // None indicates that we don't care about linting
3230
- // `::module` paths
3231
- -> PathResult < ' a > {
3230
+ fn resolve_path (
3231
+ & mut self ,
3232
+ path : & [ Ident ] ,
3233
+ opt_ns : Option < Namespace > , // `None` indicates a module path
3234
+ record_used : bool ,
3235
+ path_span : Span ,
3236
+ crate_lint : CrateLint ,
3237
+ ) -> PathResult < ' a > {
3232
3238
let mut module = None ;
3233
3239
let mut allow_super = true ;
3234
3240
let mut second_binding = None ;
@@ -3347,7 +3353,7 @@ impl<'a> Resolver<'a> {
3347
3353
return PathResult :: NonModule ( err_path_resolution ( ) ) ;
3348
3354
} else if opt_ns. is_some ( ) && ( is_last || maybe_assoc) {
3349
3355
self . lint_if_path_starts_with_module (
3350
- node_id ,
3356
+ crate_lint ,
3351
3357
path,
3352
3358
path_span,
3353
3359
second_binding,
@@ -3392,19 +3398,22 @@ impl<'a> Resolver<'a> {
3392
3398
}
3393
3399
}
3394
3400
3395
- self . lint_if_path_starts_with_module ( node_id , path, path_span, second_binding) ;
3401
+ self . lint_if_path_starts_with_module ( crate_lint , path, path_span, second_binding) ;
3396
3402
3397
3403
PathResult :: Module ( module. unwrap_or ( self . graph_root ) )
3398
3404
}
3399
3405
3400
- fn lint_if_path_starts_with_module ( & self ,
3401
- id : Option < NodeId > ,
3402
- path : & [ Ident ] ,
3403
- path_span : Span ,
3404
- second_binding : Option < & NameBinding > ) {
3405
- let id = match id {
3406
- Some ( id) => id,
3407
- None => return ,
3406
+ fn lint_if_path_starts_with_module (
3407
+ & self ,
3408
+ crate_lint : CrateLint ,
3409
+ path : & [ Ident ] ,
3410
+ path_span : Span ,
3411
+ second_binding : Option < & NameBinding > ,
3412
+ ) {
3413
+ let ( diag_id, diag_span) = match crate_lint {
3414
+ CrateLint :: No => return ,
3415
+ CrateLint :: SimplePath ( id) => ( id, path_span) ,
3416
+ CrateLint :: UsePath { root_id, root_span } => ( root_id, root_span) ,
3408
3417
} ;
3409
3418
3410
3419
let first_name = match path. get ( 0 ) {
@@ -3440,7 +3449,7 @@ impl<'a> Resolver<'a> {
3440
3449
}
3441
3450
}
3442
3451
3443
- self . lint_path_starts_with_module ( id , path_span ) ;
3452
+ self . lint_path_starts_with_module ( diag_id , diag_span ) ;
3444
3453
}
3445
3454
3446
3455
fn lint_path_starts_with_module ( & self , id : NodeId , span : Span ) {
@@ -3676,7 +3685,7 @@ impl<'a> Resolver<'a> {
3676
3685
// Search in module.
3677
3686
let mod_path = & path[ ..path. len ( ) - 1 ] ;
3678
3687
if let PathResult :: Module ( module) = self . resolve_path ( mod_path, Some ( TypeNS ) ,
3679
- false , span, None ) {
3688
+ false , span, CrateLint :: No ) {
3680
3689
add_module_candidates ( module, & mut names) ;
3681
3690
}
3682
3691
}
@@ -4475,4 +4484,19 @@ pub enum MakeGlobMap {
4475
4484
No ,
4476
4485
}
4477
4486
4487
+ enum CrateLint {
4488
+ /// Do not issue the lint
4489
+ No ,
4490
+
4491
+ /// This lint applies to some random path like `impl ::foo::Bar`
4492
+ /// or whatever. In this case, we can take the span of that path.
4493
+ SimplePath ( NodeId ) ,
4494
+
4495
+ /// This lint comes from a `use` statement. In this case, what we
4496
+ /// care about really is the *root* `use` statement; e.g., if we
4497
+ /// have nested things like `use a::{b, c}`, we care about the
4498
+ /// `use a` part.
4499
+ UsePath { root_id : NodeId , root_span : Span } ,
4500
+ }
4501
+
4478
4502
__build_diagnostic_array ! { librustc_resolve, DIAGNOSTICS }
0 commit comments