@@ -53,15 +53,19 @@ pub struct Analyzer<'tcx, 'ctx> {
5353}
5454
5555impl < ' tcx , ' ctx > Analyzer < ' tcx , ' ctx > {
56- fn extract_require_annot < T > ( & self , resolver : T ) -> Option < AnnotFormula < T :: Output > >
56+ fn extract_require_annot < T > (
57+ & self ,
58+ def_id : DefId ,
59+ resolver : T ,
60+ ) -> Option < AnnotFormula < T :: Output > >
5761 where
5862 T : annot:: Resolver ,
5963 {
6064 let mut require_annot = None ;
61- for attrs in self . tcx . get_attrs_by_path (
62- self . local_def_id . to_def_id ( ) ,
63- & analyze:: annot:: requires_path ( ) ,
64- ) {
65+ for attrs in self
66+ . tcx
67+ . get_attrs_by_path ( def_id , & analyze:: annot:: requires_path ( ) )
68+ {
6569 if require_annot. is_some ( ) {
6670 unimplemented ! ( ) ;
6771 }
@@ -72,15 +76,15 @@ impl<'tcx, 'ctx> Analyzer<'tcx, 'ctx> {
7276 require_annot
7377 }
7478
75- fn extract_ensure_annot < T > ( & self , resolver : T ) -> Option < AnnotFormula < T :: Output > >
79+ fn extract_ensure_annot < T > ( & self , def_id : DefId , resolver : T ) -> Option < AnnotFormula < T :: Output > >
7680 where
7781 T : annot:: Resolver ,
7882 {
7983 let mut ensure_annot = None ;
80- for attrs in self . tcx . get_attrs_by_path (
81- self . local_def_id . to_def_id ( ) ,
82- & analyze:: annot:: ensures_path ( ) ,
83- ) {
84+ for attrs in self
85+ . tcx
86+ . get_attrs_by_path ( def_id , & analyze:: annot:: ensures_path ( ) )
87+ {
8488 if ensure_annot. is_some ( ) {
8589 unimplemented ! ( ) ;
8690 }
@@ -252,6 +256,17 @@ impl<'tcx, 'ctx> Analyzer<'tcx, 'ctx> {
252256 || ( all_params_annotated && has_ret)
253257 }
254258
259+ pub fn get_trait_item ( & mut self ) -> Option < LocalDefId > {
260+ let impl_item_assoc = self
261+ . tcx
262+ . opt_associated_item ( self . local_def_id . to_def_id ( ) ) ?;
263+ let trait_item_id = impl_item_assoc
264+ . trait_item_def_id
265+ . and_then ( |id| id. as_local ( ) ) ?;
266+
267+ Some ( trait_item_id)
268+ }
269+
255270 pub fn expected_ty ( & mut self ) -> rty:: RefinedType {
256271 let sig = self
257272 . ctx
@@ -268,14 +283,33 @@ impl<'tcx, 'ctx> Analyzer<'tcx, 'ctx> {
268283 param_resolver. push_param ( input_ident. name , input_ty. to_sort ( ) ) ;
269284 }
270285
271- let mut require_annot = self . extract_require_annot ( & param_resolver) ;
272- let mut ensure_annot = {
273- let output_ty = self . type_builder . build ( sig. output ( ) ) ;
274- let resolver = annot:: StackedResolver :: default ( )
275- . resolver ( analyze:: annot:: ResultResolver :: new ( output_ty. to_sort ( ) ) )
276- . resolver ( ( & param_resolver) . map ( rty:: RefinedTypeVar :: Free ) ) ;
277- self . extract_ensure_annot ( resolver)
278- } ;
286+ let mut require_annot =
287+ self . extract_require_annot ( self . local_def_id . to_def_id ( ) , & param_resolver) ;
288+
289+ let output_ty = self . type_builder . build ( sig. output ( ) ) ;
290+ let result_param_resolver = annot:: StackedResolver :: default ( )
291+ . resolver ( analyze:: annot:: ResultResolver :: new ( output_ty. to_sort ( ) ) )
292+ . resolver ( ( & param_resolver) . map ( rty:: RefinedTypeVar :: Free ) ) ;
293+ let mut ensure_annot =
294+ self . extract_ensure_annot ( self . local_def_id . to_def_id ( ) , & result_param_resolver) ;
295+
296+ if let Some ( trait_item_id) = self . get_trait_item ( ) {
297+ tracing:: info!(
298+ "trait item fonud: {}" ,
299+ self . tcx. item_name( trait_item_id. into( ) ) . to_string( )
300+ ) ;
301+ let trait_require_annot =
302+ self . extract_require_annot ( trait_item_id. into ( ) , & param_resolver) ;
303+ let trait_ensure_annot =
304+ self . extract_ensure_annot ( trait_item_id. into ( ) , & result_param_resolver) ;
305+
306+ assert ! ( require_annot. is_none( ) || trait_require_annot. is_none( ) ) ;
307+ require_annot = require_annot. or ( trait_require_annot) ;
308+
309+ assert ! ( ensure_annot. is_none( ) || trait_ensure_annot. is_none( ) ) ;
310+ ensure_annot = ensure_annot. or ( trait_ensure_annot) ;
311+ }
312+
279313 let param_annots = self . extract_param_annots ( & param_resolver) ;
280314 let ret_annot = self . extract_ret_annot ( & param_resolver) ;
281315
0 commit comments