88// option. This file may not be copied, modified, or distributed
99// except according to those terms.
1010
11- //! Give useful errors and suggestions to users when a method can't be
11+ //! Give useful errors and suggestions to users when an item can't be
1212//! found or is otherwise invalid.
1313
1414use CrateCtxt ;
@@ -27,12 +27,13 @@ use syntax::print::pprust;
2727use std:: cell;
2828use std:: cmp:: Ordering ;
2929
30- use super :: { MethodError , CandidateSource , impl_method, trait_method} ;
30+ use super :: { MethodError , CandidateSource , impl_item, trait_item} ;
31+ use super :: probe:: Mode ;
3132
3233pub fn report_error < ' a , ' tcx > ( fcx : & FnCtxt < ' a , ' tcx > ,
3334 span : Span ,
3435 rcvr_ty : Ty < ' tcx > ,
35- method_name : ast:: Name ,
36+ item_name : ast:: Name ,
3637 rcvr_expr : Option < & ast:: Expr > ,
3738 error : MethodError )
3839{
@@ -42,28 +43,30 @@ pub fn report_error<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
4243 }
4344
4445 match error {
45- MethodError :: NoMatch ( static_sources, out_of_scope_traits) => {
46+ MethodError :: NoMatch ( static_sources, out_of_scope_traits, mode ) => {
4647 let cx = fcx. tcx ( ) ;
47- let method_ustring = method_name . user_string ( cx) ;
48+ let item_ustring = item_name . user_string ( cx) ;
4849
4950 fcx. type_error_message (
5051 span,
5152 |actual| {
52- format ! ( "type `{}` does not implement any \
53- method in scope named `{}`",
54- actual,
55- method_ustring)
53+ format ! ( "no {} named `{}` found for type `{}` \
54+ in the current scope",
55+ if mode == Mode :: MethodCall { "method" }
56+ else { "associated item" } ,
57+ item_ustring,
58+ actual)
5659 } ,
5760 rcvr_ty,
5861 None ) ;
5962
60- // If the method has the name of a field, give a help note
63+ // If the item has the name of a field, give a help note
6164 if let ( & ty:: ty_struct( did, _) , Some ( _) ) = ( & rcvr_ty. sty , rcvr_expr) {
6265 let fields = ty:: lookup_struct_fields ( cx, did) ;
63- if fields. iter ( ) . any ( |f| f. name == method_name ) {
66+ if fields. iter ( ) . any ( |f| f. name == item_name ) {
6467 cx. sess . span_note ( span,
6568 & format ! ( "use `(s.{0})(...)` if you meant to call the \
66- function stored in the `{0}` field", method_ustring ) ) ;
69+ function stored in the `{0}` field", item_ustring ) ) ;
6770 }
6871 }
6972
@@ -72,25 +75,25 @@ pub fn report_error<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
7275 span,
7376 "found defined static methods, maybe a `self` is missing?" ) ;
7477
75- report_candidates ( fcx, span, method_name , static_sources) ;
78+ report_candidates ( fcx, span, item_name , static_sources) ;
7679 }
7780
78- suggest_traits_to_import ( fcx, span, rcvr_ty, method_name ,
81+ suggest_traits_to_import ( fcx, span, rcvr_ty, item_name ,
7982 rcvr_expr, out_of_scope_traits)
8083 }
8184
8285 MethodError :: Ambiguity ( sources) => {
8386 span_err ! ( fcx. sess( ) , span, E0034 ,
84- "multiple applicable methods in scope" ) ;
87+ "multiple applicable items in scope" ) ;
8588
86- report_candidates ( fcx, span, method_name , sources) ;
89+ report_candidates ( fcx, span, item_name , sources) ;
8790 }
8891
8992 MethodError :: ClosureAmbiguity ( trait_def_id) => {
9093 let msg = format ! ( "the `{}` method from the `{}` trait cannot be explicitly \
9194 invoked on this closure as we have not yet inferred what \
9295 kind of closure it is",
93- method_name . user_string( fcx. tcx( ) ) ,
96+ item_name . user_string( fcx. tcx( ) ) ,
9497 ty:: item_path_str( fcx. tcx( ) , trait_def_id) ) ;
9598 let msg = if let Some ( callee) = rcvr_expr {
9699 format ! ( "{}; use overloaded call notation instead (e.g., `{}()`)" ,
@@ -104,19 +107,19 @@ pub fn report_error<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
104107
105108 fn report_candidates ( fcx : & FnCtxt ,
106109 span : Span ,
107- method_name : ast:: Name ,
110+ item_name : ast:: Name ,
108111 mut sources : Vec < CandidateSource > ) {
109112 sources. sort ( ) ;
110113 sources. dedup ( ) ;
111114
112115 for ( idx, source) in sources. iter ( ) . enumerate ( ) {
113116 match * source {
114117 CandidateSource :: ImplSource ( impl_did) => {
115- // Provide the best span we can. Use the method , if local to crate, else
116- // the impl, if local to crate (method may be defaulted), else the call site.
117- let method = impl_method ( fcx. tcx ( ) , impl_did, method_name ) . unwrap ( ) ;
118+ // Provide the best span we can. Use the item , if local to crate, else
119+ // the impl, if local to crate (item may be defaulted), else the call site.
120+ let item = impl_item ( fcx. tcx ( ) , impl_did, item_name ) . unwrap ( ) ;
118121 let impl_span = fcx. tcx ( ) . map . def_id_span ( impl_did, span) ;
119- let method_span = fcx. tcx ( ) . map . def_id_span ( method . def_id , impl_span) ;
122+ let item_span = fcx. tcx ( ) . map . def_id_span ( item . def_id ( ) , impl_span) ;
120123
121124 let impl_ty = check:: impl_self_ty ( fcx, span, impl_did) . ty ;
122125
@@ -127,16 +130,16 @@ pub fn report_error<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
127130 trait_ref. def_id) ) ,
128131 } ;
129132
130- span_note ! ( fcx. sess( ) , method_span ,
133+ span_note ! ( fcx. sess( ) , item_span ,
131134 "candidate #{} is defined in an impl{} for the type `{}`" ,
132135 idx + 1 ,
133136 insertion,
134137 impl_ty. user_string( fcx. tcx( ) ) ) ;
135138 }
136139 CandidateSource :: TraitSource ( trait_did) => {
137- let ( _, method ) = trait_method ( fcx. tcx ( ) , trait_did, method_name ) . unwrap ( ) ;
138- let method_span = fcx. tcx ( ) . map . def_id_span ( method . def_id , span) ;
139- span_note ! ( fcx. sess( ) , method_span ,
140+ let ( _, item ) = trait_item ( fcx. tcx ( ) , trait_did, item_name ) . unwrap ( ) ;
141+ let item_span = fcx. tcx ( ) . map . def_id_span ( item . def_id ( ) , span) ;
142+ span_note ! ( fcx. sess( ) , item_span ,
140143 "candidate #{} is defined in the trait `{}`" ,
141144 idx + 1 ,
142145 ty:: item_path_str( fcx. tcx( ) , trait_did) ) ;
@@ -152,19 +155,19 @@ pub type AllTraitsVec = Vec<TraitInfo>;
152155fn suggest_traits_to_import < ' a , ' tcx > ( fcx : & FnCtxt < ' a , ' tcx > ,
153156 span : Span ,
154157 rcvr_ty : Ty < ' tcx > ,
155- method_name : ast:: Name ,
158+ item_name : ast:: Name ,
156159 rcvr_expr : Option < & ast:: Expr > ,
157160 valid_out_of_scope_traits : Vec < ast:: DefId > )
158161{
159162 let tcx = fcx. tcx ( ) ;
160- let method_ustring = method_name . user_string ( tcx) ;
163+ let item_ustring = item_name . user_string ( tcx) ;
161164
162165 if !valid_out_of_scope_traits. is_empty ( ) {
163166 let mut candidates = valid_out_of_scope_traits;
164167 candidates. sort ( ) ;
165168 candidates. dedup ( ) ;
166169 let msg = format ! (
167- "methods from traits can only be called if the trait is in scope; \
170+ "items from traits can only be used if the trait is in scope; \
168171 the following {traits_are} implemented but not in scope, \
169172 perhaps add a `use` for {one_of_them}:",
170173 traits_are = if candidates. len( ) == 1 { "trait is" } else { "traits are" } ,
@@ -185,7 +188,7 @@ fn suggest_traits_to_import<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
185188 let type_is_local = type_derefs_to_local ( fcx, span, rcvr_ty, rcvr_expr) ;
186189
187190 // there's no implemented traits, so lets suggest some traits to
188- // implement, by finding ones that have the method name, and are
191+ // implement, by finding ones that have the item name, and are
189192 // legal to implement.
190193 let mut candidates = all_traits ( fcx. ccx )
191194 . filter ( |info| {
@@ -196,7 +199,7 @@ fn suggest_traits_to_import<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
196199 // implementing a trait would be legal but is rejected
197200 // here).
198201 ( type_is_local || ast_util:: is_local ( info. def_id ) )
199- && trait_method ( tcx, info. def_id , method_name ) . is_some ( )
202+ && trait_item ( tcx, info. def_id , item_name ) . is_some ( )
200203 } )
201204 . collect :: < Vec < _ > > ( ) ;
202205
@@ -209,12 +212,12 @@ fn suggest_traits_to_import<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
209212 // of a type parameter: suggest adding a trait bound rather
210213 // than implementing.
211214 let msg = format ! (
212- "methods from traits can only be called if the trait is implemented and in scope; \
213- the following {traits_define} a method `{name}`, \
215+ "items from traits can only be used if the trait is implemented and in scope; \
216+ the following {traits_define} an item `{name}`, \
214217 perhaps you need to implement {one_of_them}:",
215218 traits_define = if candidates. len( ) == 1 { "trait defines" } else { "traits define" } ,
216219 one_of_them = if candidates. len( ) == 1 { "it" } else { "one of them" } ,
217- name = method_ustring ) ;
220+ name = item_ustring ) ;
218221
219222 fcx. sess ( ) . fileline_help ( span, & msg[ ..] ) ;
220223
0 commit comments