@@ -16,12 +16,10 @@ use middle::def;
16
16
use middle:: privacy:: { AllPublic , DependsOn , LastPrivate , LastMod } ;
17
17
use middle:: subst;
18
18
use middle:: traits;
19
- use middle:: ty:: * ;
20
- use middle:: ty;
19
+ use middle:: ty:: { self , AsPredicate , ToPolyTraitRef } ;
21
20
use middle:: infer;
22
21
use util:: ppaux:: Repr ;
23
22
24
- use std:: rc:: Rc ;
25
23
use syntax:: ast:: DefId ;
26
24
use syntax:: ast;
27
25
use syntax:: codemap:: Span ;
@@ -39,7 +37,7 @@ pub enum MethodError {
39
37
// Did not find an applicable method, but we did find various
40
38
// static methods that may apply, as well as a list of
41
39
// not-in-scope traits which may work.
42
- NoMatch ( Vec < CandidateSource > , Vec < ast:: DefId > ) ,
40
+ NoMatch ( Vec < CandidateSource > , Vec < ast:: DefId > , probe :: Mode ) ,
43
41
44
42
// Multiple methods might apply.
45
43
Ambiguity ( Vec < CandidateSource > ) ,
@@ -62,7 +60,7 @@ type ItemIndex = usize; // just for doc purposes
62
60
pub fn exists < ' a , ' tcx > ( fcx : & FnCtxt < ' a , ' tcx > ,
63
61
span : Span ,
64
62
method_name : ast:: Name ,
65
- self_ty : Ty < ' tcx > ,
63
+ self_ty : ty :: Ty < ' tcx > ,
66
64
call_expr_id : ast:: NodeId )
67
65
-> bool
68
66
{
@@ -92,11 +90,11 @@ pub fn exists<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
92
90
pub fn lookup < ' a , ' tcx > ( fcx : & FnCtxt < ' a , ' tcx > ,
93
91
span : Span ,
94
92
method_name : ast:: Name ,
95
- self_ty : Ty < ' tcx > ,
96
- supplied_method_types : Vec < Ty < ' tcx > > ,
93
+ self_ty : ty :: Ty < ' tcx > ,
94
+ supplied_method_types : Vec < ty :: Ty < ' tcx > > ,
97
95
call_expr : & ' tcx ast:: Expr ,
98
96
self_expr : & ' tcx ast:: Expr )
99
- -> Result < MethodCallee < ' tcx > , MethodError >
97
+ -> Result < ty :: MethodCallee < ' tcx > , MethodError >
100
98
{
101
99
debug ! ( "lookup(method_name={}, self_ty={}, call_expr={}, self_expr={})" ,
102
100
method_name. repr( fcx. tcx( ) ) ,
@@ -115,9 +113,9 @@ pub fn lookup_in_trait<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
115
113
self_expr : Option < & ast:: Expr > ,
116
114
m_name : ast:: Name ,
117
115
trait_def_id : DefId ,
118
- self_ty : Ty < ' tcx > ,
119
- opt_input_types : Option < Vec < Ty < ' tcx > > > )
120
- -> Option < MethodCallee < ' tcx > >
116
+ self_ty : ty :: Ty < ' tcx > ,
117
+ opt_input_types : Option < Vec < ty :: Ty < ' tcx > > > )
118
+ -> Option < ty :: MethodCallee < ' tcx > >
121
119
{
122
120
lookup_in_trait_adjusted ( fcx, span, self_expr, m_name, trait_def_id,
123
121
0 , false , self_ty, opt_input_types)
@@ -139,9 +137,9 @@ pub fn lookup_in_trait_adjusted<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
139
137
trait_def_id : DefId ,
140
138
autoderefs : usize ,
141
139
unsize : bool ,
142
- self_ty : Ty < ' tcx > ,
143
- opt_input_types : Option < Vec < Ty < ' tcx > > > )
144
- -> Option < MethodCallee < ' tcx > >
140
+ self_ty : ty :: Ty < ' tcx > ,
141
+ opt_input_types : Option < Vec < ty :: Ty < ' tcx > > > )
142
+ -> Option < ty :: MethodCallee < ' tcx > >
145
143
{
146
144
debug ! ( "lookup_in_trait_adjusted(self_ty={}, self_expr={}, m_name={}, trait_def_id={})" ,
147
145
self_ty. repr( fcx. tcx( ) ) ,
@@ -186,7 +184,9 @@ pub fn lookup_in_trait_adjusted<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
186
184
// Trait must have a method named `m_name` and it should not have
187
185
// type parameters or early-bound regions.
188
186
let tcx = fcx. tcx ( ) ;
189
- let ( method_num, method_ty) = trait_method ( tcx, trait_def_id, m_name) . unwrap ( ) ;
187
+ let ( method_num, method_ty) = trait_item ( tcx, trait_def_id, m_name)
188
+ . and_then ( |( idx, item) | item. as_opt_method ( ) . map ( |m| ( idx, m) ) )
189
+ . unwrap ( ) ;
190
190
assert_eq ! ( method_ty. generics. types. len( subst:: FnSpace ) , 0 ) ;
191
191
assert_eq ! ( method_ty. generics. regions. len( subst:: FnSpace ) , 0 ) ;
192
192
@@ -288,10 +288,10 @@ pub fn lookup_in_trait_adjusted<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
288
288
}
289
289
}
290
290
291
- let callee = MethodCallee {
292
- origin : MethodTypeParam ( MethodParam { trait_ref : trait_ref. clone ( ) ,
293
- method_num : method_num,
294
- impl_def_id : None } ) ,
291
+ let callee = ty :: MethodCallee {
292
+ origin : ty :: MethodTypeParam ( ty :: MethodParam { trait_ref : trait_ref. clone ( ) ,
293
+ method_num : method_num,
294
+ impl_def_id : None } ) ,
295
295
ty : fty,
296
296
substs : trait_ref. substs . clone ( )
297
297
} ;
@@ -304,7 +304,7 @@ pub fn lookup_in_trait_adjusted<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
304
304
pub fn resolve_ufcs < ' a , ' tcx > ( fcx : & FnCtxt < ' a , ' tcx > ,
305
305
span : Span ,
306
306
method_name : ast:: Name ,
307
- self_ty : Ty < ' tcx > ,
307
+ self_ty : ty :: Ty < ' tcx > ,
308
308
expr_id : ast:: NodeId )
309
309
-> Result < ( def:: Def , LastPrivate ) , MethodError >
310
310
{
@@ -322,41 +322,40 @@ pub fn resolve_ufcs<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
322
322
_ => def:: FromTrait ( pick. item . container ( ) . id ( ) )
323
323
} ;
324
324
let def_result = match pick. item {
325
- ImplOrTraitItem :: MethodTraitItem ( ..) => def:: DefMethod ( def_id, provenance) ,
326
- ImplOrTraitItem :: ConstTraitItem ( ..) => def:: DefAssociatedConst ( def_id, provenance) ,
327
- ImplOrTraitItem :: TypeTraitItem ( ..) => {
325
+ ty :: ImplOrTraitItem :: MethodTraitItem ( ..) => def:: DefMethod ( def_id, provenance) ,
326
+ ty :: ImplOrTraitItem :: ConstTraitItem ( ..) => def:: DefAssociatedConst ( def_id, provenance) ,
327
+ ty :: ImplOrTraitItem :: TypeTraitItem ( ..) => {
328
328
fcx. tcx ( ) . sess . span_bug ( span, "resolve_ufcs: probe picked associated type" ) ;
329
329
}
330
330
} ;
331
331
Ok ( ( def_result, lp) )
332
332
}
333
333
334
334
335
- /// Find method with name `method_name ` defined in `trait_def_id` and return it, along with its
336
- /// index (or `None`, if no such method ).
337
- fn trait_method < ' tcx > ( tcx : & ty:: ctxt < ' tcx > ,
338
- trait_def_id : ast:: DefId ,
339
- method_name : ast:: Name )
340
- -> Option < ( usize , Rc < ty:: Method < ' tcx > > ) >
335
+ /// Find item with name `item_name ` defined in `trait_def_id` and return it, along with its
336
+ /// index (or `None`, if no such item ).
337
+ fn trait_item < ' tcx > ( tcx : & ty:: ctxt < ' tcx > ,
338
+ trait_def_id : ast:: DefId ,
339
+ item_name : ast:: Name )
340
+ -> Option < ( usize , ty:: ImplOrTraitItem < ' tcx > ) >
341
341
{
342
342
let trait_items = ty:: trait_items ( tcx, trait_def_id) ;
343
343
trait_items
344
344
. iter ( )
345
345
. enumerate ( )
346
- . find ( |& ( _, ref item) | item. name ( ) == method_name )
347
- . and_then ( |( idx , item) | item . as_opt_method ( ) . map ( |m| ( idx , m ) ) )
346
+ . find ( |& ( _, ref item) | item. name ( ) == item_name )
347
+ . map ( |( num , item) | ( num , ( * item ) . clone ( ) ) )
348
348
}
349
349
350
- fn impl_method < ' tcx > ( tcx : & ty:: ctxt < ' tcx > ,
351
- impl_def_id : ast:: DefId ,
352
- method_name : ast:: Name )
353
- -> Option < Rc < ty:: Method < ' tcx > > >
350
+ fn impl_item < ' tcx > ( tcx : & ty:: ctxt < ' tcx > ,
351
+ impl_def_id : ast:: DefId ,
352
+ item_name : ast:: Name )
353
+ -> Option < ty:: ImplOrTraitItem < ' tcx > >
354
354
{
355
355
let impl_items = tcx. impl_items . borrow ( ) ;
356
356
let impl_items = impl_items. get ( & impl_def_id) . unwrap ( ) ;
357
357
impl_items
358
358
. iter ( )
359
359
. map ( |& did| ty:: impl_or_trait_item ( tcx, did. def_id ( ) ) )
360
- . find ( |m| m. name ( ) == method_name)
361
- . and_then ( |item| item. as_opt_method ( ) )
360
+ . find ( |m| m. name ( ) == item_name)
362
361
}
0 commit comments