@@ -67,7 +67,7 @@ use syntax::ast::{Arm, BindingMode, Block, Crate, Expr, ExprKind};
67
67
use syntax:: ast:: { FnDecl , ForeignItem , ForeignItemKind , Generics } ;
68
68
use syntax:: ast:: { Item , ItemKind , ImplItem , ImplItemKind } ;
69
69
use syntax:: ast:: { Local , Pat , PatKind , Path } ;
70
- use syntax:: ast:: { PathSegment , PathParameters , TraitItemKind , TraitRef , Ty , TyKind } ;
70
+ use syntax:: ast:: { PathSegment , PathParameters , SelfKind , TraitItemKind , TraitRef , Ty , TyKind } ;
71
71
72
72
use std:: collections:: { HashMap , HashSet } ;
73
73
use std:: cell:: { Cell , RefCell } ;
@@ -148,7 +148,13 @@ enum ResolutionError<'a> {
148
148
/// error E0424: `self` is not available in a static method
149
149
SelfNotAvailableInStaticMethod ,
150
150
/// error E0425: unresolved name
151
- UnresolvedName ( & ' a str , & ' a str , UnresolvedNameContext < ' a > ) ,
151
+ UnresolvedName {
152
+ path : & ' a str ,
153
+ message : & ' a str ,
154
+ context : UnresolvedNameContext < ' a > ,
155
+ is_static_method : bool ,
156
+ is_field : bool
157
+ } ,
152
158
/// error E0426: use of undeclared label
153
159
UndeclaredLabel ( & ' a str ) ,
154
160
/// error E0427: cannot use `ref` binding mode with ...
@@ -406,16 +412,21 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>,
406
412
"`self` is not available in a static method. Maybe a `self` \
407
413
argument is missing?")
408
414
}
409
- ResolutionError :: UnresolvedName ( path, msg, context) => {
415
+ ResolutionError :: UnresolvedName { path, message : msg, context, is_static_method,
416
+ is_field } => {
410
417
let mut err = struct_span_err ! ( resolver. session,
411
418
span,
412
419
E0425 ,
413
420
"unresolved name `{}`{}" ,
414
421
path,
415
422
msg) ;
416
-
417
423
match context {
418
- UnresolvedNameContext :: Other => { } // no help available
424
+ UnresolvedNameContext :: Other => {
425
+ if msg. is_empty ( ) && is_static_method && is_field {
426
+ err. help ( "this is an associated function, you don't have access to \
427
+ this type's fields or methods") ;
428
+ }
429
+ }
419
430
UnresolvedNameContext :: PathIsMod ( parent) => {
420
431
err. help ( & match parent. map ( |parent| & parent. node ) {
421
432
Some ( & ExprKind :: Field ( _, ident) ) => {
@@ -596,7 +607,7 @@ impl<'a, 'v> Visitor<'v> for Resolver<'a> {
596
607
}
597
608
FnKind :: Method ( _, sig, _) => {
598
609
self . visit_generics ( & sig. generics ) ;
599
- MethodRibKind
610
+ MethodRibKind ( sig . explicit_self . node == SelfKind :: Static )
600
611
}
601
612
FnKind :: Closure => ClosureRibKind ( node_id) ,
602
613
} ;
@@ -666,7 +677,9 @@ enum RibKind<'a> {
666
677
// methods. Allow references to ty params that impl or trait
667
678
// binds. Disallow any other upvars (including other ty params that are
668
679
// upvars).
669
- MethodRibKind ,
680
+ //
681
+ // The boolean value represents the fact that this method is static or not.
682
+ MethodRibKind ( bool ) ,
670
683
671
684
// We passed through an item scope. Disallow upvars.
672
685
ItemRibKind ,
@@ -1095,7 +1108,13 @@ impl<'a> hir::lowering::Resolver for Resolver<'a> {
1095
1108
Err ( false ) => {
1096
1109
let path_name = & format ! ( "{}" , path) ;
1097
1110
let error =
1098
- ResolutionError :: UnresolvedName ( path_name, "" , UnresolvedNameContext :: Other ) ;
1111
+ ResolutionError :: UnresolvedName {
1112
+ path : path_name,
1113
+ message : "" ,
1114
+ context : UnresolvedNameContext :: Other ,
1115
+ is_static_method : false ,
1116
+ is_field : false
1117
+ } ;
1099
1118
resolve_error ( self , path. span , error) ;
1100
1119
Def :: Err
1101
1120
}
@@ -1657,7 +1676,9 @@ impl<'a> Resolver<'a> {
1657
1676
let type_parameters =
1658
1677
HasTypeParameters ( & sig. generics ,
1659
1678
FnSpace ,
1660
- MethodRibKind ) ;
1679
+ MethodRibKind (
1680
+ sig. explicit_self . node ==
1681
+ SelfKind :: Static ) ) ;
1661
1682
this. with_type_parameter_rib ( type_parameters, |this| {
1662
1683
visit:: walk_trait_item ( this, trait_item)
1663
1684
} ) ;
@@ -1776,7 +1797,10 @@ impl<'a> Resolver<'a> {
1776
1797
self . value_ribs . pop ( ) ;
1777
1798
}
1778
1799
1779
- fn resolve_function ( & mut self , rib_kind : RibKind < ' a > , declaration : & FnDecl , block : & Block ) {
1800
+ fn resolve_function ( & mut self ,
1801
+ rib_kind : RibKind < ' a > ,
1802
+ declaration : & FnDecl ,
1803
+ block : & Block ) {
1780
1804
// Create a value rib for the function.
1781
1805
self . value_ribs . push ( Rib :: new ( rib_kind) ) ;
1782
1806
@@ -1983,7 +2007,9 @@ impl<'a> Resolver<'a> {
1983
2007
let type_parameters =
1984
2008
HasTypeParameters ( & sig. generics ,
1985
2009
FnSpace ,
1986
- MethodRibKind ) ;
2010
+ MethodRibKind (
2011
+ sig. explicit_self . node ==
2012
+ SelfKind :: Static ) ) ;
1987
2013
this. with_type_parameter_rib ( type_parameters, |this| {
1988
2014
visit:: walk_impl_item ( this, impl_item) ;
1989
2015
} ) ;
@@ -2677,7 +2703,7 @@ impl<'a> Resolver<'a> {
2677
2703
def = Def :: Upvar ( node_def_id, node_id, depth, function_id) ;
2678
2704
seen. insert ( node_id, depth) ;
2679
2705
}
2680
- ItemRibKind | MethodRibKind => {
2706
+ ItemRibKind | MethodRibKind ( _ ) => {
2681
2707
// This was an attempt to access an upvar inside a
2682
2708
// named function item. This is not allowed, so we
2683
2709
// report an error.
@@ -2699,7 +2725,7 @@ impl<'a> Resolver<'a> {
2699
2725
Def :: TyParam ( ..) | Def :: SelfTy ( ..) => {
2700
2726
for rib in ribs {
2701
2727
match rib. kind {
2702
- NormalRibKind | MethodRibKind | ClosureRibKind ( ..) |
2728
+ NormalRibKind | MethodRibKind ( _ ) | ClosureRibKind ( ..) |
2703
2729
ModuleRibKind ( ..) => {
2704
2730
// Nothing to do. Continue.
2705
2731
}
@@ -2992,9 +3018,13 @@ impl<'a> Resolver<'a> {
2992
3018
// `resolve_path` already reported the error
2993
3019
} else {
2994
3020
let mut method_scope = false ;
3021
+ let mut is_static = false ;
2995
3022
self . value_ribs . iter ( ) . rev ( ) . all ( |rib| {
2996
3023
method_scope = match rib. kind {
2997
- MethodRibKind => true ,
3024
+ MethodRibKind ( is_static_) => {
3025
+ is_static = is_static_;
3026
+ true
3027
+ }
2998
3028
ItemRibKind | ConstantItemRibKind => false ,
2999
3029
_ => return true , // Keep advancing
3000
3030
} ;
@@ -3008,22 +3038,29 @@ impl<'a> Resolver<'a> {
3008
3038
ResolutionError :: SelfNotAvailableInStaticMethod ) ;
3009
3039
} else {
3010
3040
let last_name = path. segments . last ( ) . unwrap ( ) . identifier . name ;
3011
- let mut msg = match self . find_fallback_in_self_type ( last_name) {
3041
+ let ( mut msg, is_field) =
3042
+ match self . find_fallback_in_self_type ( last_name) {
3012
3043
NoSuggestion => {
3013
3044
// limit search to 5 to reduce the number
3014
3045
// of stupid suggestions
3015
- match self . find_best_match ( & path_name) {
3046
+ ( match self . find_best_match ( & path_name) {
3016
3047
SuggestionType :: Macro ( s) => {
3017
3048
format ! ( "the macro `{}`" , s)
3018
3049
}
3019
3050
SuggestionType :: Function ( s) => format ! ( "`{}`" , s) ,
3020
3051
SuggestionType :: NotFound => "" . to_string ( ) ,
3021
- }
3052
+ } , false )
3053
+ }
3054
+ Field => {
3055
+ ( if is_static && method_scope {
3056
+ "" . to_string ( )
3057
+ } else {
3058
+ format ! ( "`self.{}`" , path_name)
3059
+ } , true )
3022
3060
}
3023
- Field => format ! ( "`self.{}`" , path_name) ,
3024
- TraitItem => format ! ( "to call `self.{}`" , path_name) ,
3061
+ TraitItem => ( format ! ( "to call `self.{}`" , path_name) , false ) ,
3025
3062
TraitMethod ( path_str) =>
3026
- format ! ( "to call `{}::{}`" , path_str, path_name) ,
3063
+ ( format ! ( "to call `{}::{}`" , path_str, path_name) , false ) ,
3027
3064
} ;
3028
3065
3029
3066
let mut context = UnresolvedNameContext :: Other ;
@@ -3048,8 +3085,13 @@ impl<'a> Resolver<'a> {
3048
3085
3049
3086
resolve_error ( self ,
3050
3087
expr. span ,
3051
- ResolutionError :: UnresolvedName (
3052
- & path_name, & msg, context) ) ;
3088
+ ResolutionError :: UnresolvedName {
3089
+ path : & path_name,
3090
+ message : & msg,
3091
+ context : context,
3092
+ is_static_method : method_scope && is_static,
3093
+ is_field : is_field,
3094
+ } ) ;
3053
3095
}
3054
3096
}
3055
3097
}
0 commit comments