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
@@ -1634,11 +1635,17 @@ impl<'a> Resolver<'a> {
1634
1635
. map ( |seg| Ident :: new ( seg. name , span) )
1635
1636
. collect ( ) ;
1636
1637
// FIXME (Manishearth): Intra doc links won't get warned of epoch changes
1637
- match self . resolve_path ( & path, Some ( namespace) , true , span, None ) {
1638
+ match self . resolve_path ( & path, Some ( namespace) , true , span, CrateLint :: No ) {
1638
1639
PathResult :: Module ( module) => * def = module. def ( ) . unwrap ( ) ,
1639
1640
PathResult :: NonModule ( path_res) if path_res. unresolved_segments ( ) == 0 =>
1640
1641
* def = path_res. base_def ( ) ,
1641
- PathResult :: NonModule ( ..) => match self . resolve_path ( & path, None , true , span, None ) {
1642
+ PathResult :: NonModule ( ..) => match self . resolve_path (
1643
+ & path,
1644
+ None ,
1645
+ true ,
1646
+ span,
1647
+ CrateLint :: No ,
1648
+ ) {
1642
1649
PathResult :: Failed ( span, msg, _) => {
1643
1650
error_callback ( self , span, ResolutionError :: FailedToResolve ( & msg) ) ;
1644
1651
}
@@ -2352,8 +2359,13 @@ impl<'a> Resolver<'a> {
2352
2359
if def != Def :: Err {
2353
2360
new_id = Some ( def. def_id ( ) ) ;
2354
2361
let span = trait_ref. path . span ;
2355
- if let PathResult :: Module ( module) = self . resolve_path ( & path, None , false , span,
2356
- Some ( trait_ref. ref_id ) ) {
2362
+ if let PathResult :: Module ( module) = self . resolve_path (
2363
+ & path,
2364
+ None ,
2365
+ false ,
2366
+ span,
2367
+ CrateLint :: SimplePath ( trait_ref. ref_id ) ,
2368
+ ) {
2357
2369
new_val = Some ( ( module, trait_ref. clone ( ) ) ) ;
2358
2370
}
2359
2371
}
@@ -2813,7 +2825,7 @@ impl<'a> Resolver<'a> {
2813
2825
} else {
2814
2826
let mod_path = & path[ ..path. len ( ) - 1 ] ;
2815
2827
let mod_prefix = match this. resolve_path ( mod_path, Some ( TypeNS ) ,
2816
- false , span, None ) {
2828
+ false , span, CrateLint :: No ) {
2817
2829
PathResult :: Module ( module) => module. def ( ) ,
2818
2830
_ => None ,
2819
2831
} . map_or ( format ! ( "" ) , |def| format ! ( "{} " , def. kind_name( ) ) ) ;
@@ -3143,7 +3155,13 @@ impl<'a> Resolver<'a> {
3143
3155
) ) ;
3144
3156
}
3145
3157
3146
- let result = match self . resolve_path ( & path, Some ( ns) , true , span, Some ( id) ) {
3158
+ let result = match self . resolve_path (
3159
+ & path,
3160
+ Some ( ns) ,
3161
+ true ,
3162
+ span,
3163
+ CrateLint :: SimplePath ( id) ,
3164
+ ) {
3147
3165
PathResult :: NonModule ( path_res) => path_res,
3148
3166
PathResult :: Module ( module) if !module. is_normal ( ) => {
3149
3167
PathResolution :: new ( module. def ( ) . unwrap ( ) )
@@ -3180,7 +3198,13 @@ impl<'a> Resolver<'a> {
3180
3198
path[ 0 ] . name != keywords:: CrateRoot . name ( ) &&
3181
3199
path[ 0 ] . name != keywords:: DollarCrate . name ( ) {
3182
3200
let unqualified_result = {
3183
- match self . resolve_path ( & [ * path. last ( ) . unwrap ( ) ] , Some ( ns) , false , span, None ) {
3201
+ match self . resolve_path (
3202
+ & [ * path. last ( ) . unwrap ( ) ] ,
3203
+ Some ( ns) ,
3204
+ false ,
3205
+ span,
3206
+ CrateLint :: No ,
3207
+ ) {
3184
3208
PathResult :: NonModule ( path_res) => path_res. base_def ( ) ,
3185
3209
PathResult :: Module ( module) => module. def ( ) . unwrap ( ) ,
3186
3210
_ => return Some ( result) ,
@@ -3195,14 +3219,14 @@ impl<'a> Resolver<'a> {
3195
3219
Some ( result)
3196
3220
}
3197
3221
3198
- fn resolve_path ( & mut self ,
3199
- path : & [ Ident ] ,
3200
- opt_ns : Option < Namespace > , // `None` indicates a module path
3201
- record_used : bool ,
3202
- path_span : Span ,
3203
- node_id : Option < NodeId > ) // None indicates that we don't care about linting
3204
- // `::module` paths
3205
- -> PathResult < ' a > {
3222
+ fn resolve_path (
3223
+ & mut self ,
3224
+ path : & [ Ident ] ,
3225
+ opt_ns : Option < Namespace > , // `None` indicates a module path
3226
+ record_used : bool ,
3227
+ path_span : Span ,
3228
+ crate_lint : CrateLint ,
3229
+ ) -> PathResult < ' a > {
3206
3230
let mut module = None ;
3207
3231
let mut allow_super = true ;
3208
3232
let mut second_binding = None ;
@@ -3321,7 +3345,7 @@ impl<'a> Resolver<'a> {
3321
3345
return PathResult :: NonModule ( err_path_resolution ( ) ) ;
3322
3346
} else if opt_ns. is_some ( ) && ( is_last || maybe_assoc) {
3323
3347
self . lint_if_path_starts_with_module (
3324
- node_id ,
3348
+ crate_lint ,
3325
3349
path,
3326
3350
path_span,
3327
3351
second_binding,
@@ -3366,19 +3390,22 @@ impl<'a> Resolver<'a> {
3366
3390
}
3367
3391
}
3368
3392
3369
- self . lint_if_path_starts_with_module ( node_id , path, path_span, second_binding) ;
3393
+ self . lint_if_path_starts_with_module ( crate_lint , path, path_span, second_binding) ;
3370
3394
3371
3395
PathResult :: Module ( module. unwrap_or ( self . graph_root ) )
3372
3396
}
3373
3397
3374
- fn lint_if_path_starts_with_module ( & self ,
3375
- id : Option < NodeId > ,
3376
- path : & [ Ident ] ,
3377
- path_span : Span ,
3378
- second_binding : Option < & NameBinding > ) {
3379
- let id = match id {
3380
- Some ( id) => id,
3381
- None => return ,
3398
+ fn lint_if_path_starts_with_module (
3399
+ & self ,
3400
+ crate_lint : CrateLint ,
3401
+ path : & [ Ident ] ,
3402
+ path_span : Span ,
3403
+ second_binding : Option < & NameBinding > ,
3404
+ ) {
3405
+ let ( diag_id, diag_span) = match crate_lint {
3406
+ CrateLint :: No => return ,
3407
+ CrateLint :: SimplePath ( id) => ( id, path_span) ,
3408
+ CrateLint :: UsePath { root_id, root_span } => ( root_id, root_span) ,
3382
3409
} ;
3383
3410
3384
3411
let first_name = match path. get ( 0 ) {
@@ -3414,7 +3441,7 @@ impl<'a> Resolver<'a> {
3414
3441
}
3415
3442
}
3416
3443
3417
- self . lint_path_starts_with_module ( id , path_span ) ;
3444
+ self . lint_path_starts_with_module ( diag_id , diag_span ) ;
3418
3445
}
3419
3446
3420
3447
fn lint_path_starts_with_module ( & self , id : NodeId , span : Span ) {
@@ -3650,7 +3677,7 @@ impl<'a> Resolver<'a> {
3650
3677
// Search in module.
3651
3678
let mod_path = & path[ ..path. len ( ) - 1 ] ;
3652
3679
if let PathResult :: Module ( module) = self . resolve_path ( mod_path, Some ( TypeNS ) ,
3653
- false , span, None ) {
3680
+ false , span, CrateLint :: No ) {
3654
3681
add_module_candidates ( module, & mut names) ;
3655
3682
}
3656
3683
}
@@ -4427,4 +4454,19 @@ pub enum MakeGlobMap {
4427
4454
No ,
4428
4455
}
4429
4456
4457
+ enum CrateLint {
4458
+ /// Do not issue the lint
4459
+ No ,
4460
+
4461
+ /// This lint applies to some random path like `impl ::foo::Bar`
4462
+ /// or whatever. In this case, we can take the span of that path.
4463
+ SimplePath ( NodeId ) ,
4464
+
4465
+ /// This lint comes from a `use` statement. In this case, what we
4466
+ /// care about really is the *root* `use` statement; e.g., if we
4467
+ /// have nested things like `use a::{b, c}`, we care about the
4468
+ /// `use a` part.
4469
+ UsePath { root_id : NodeId , root_span : Span } ,
4470
+ }
4471
+
4430
4472
__build_diagnostic_array ! { librustc_resolve, DIAGNOSTICS }
0 commit comments