Skip to content

Commit acc62a1

Browse files
committed
add: reference trait-side definitions for require/ensure annotations of
functions in impl blocks
1 parent 0c08a03 commit acc62a1

1 file changed

Lines changed: 52 additions & 18 deletions

File tree

src/analyze/local_def.rs

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,19 @@ pub struct Analyzer<'tcx, 'ctx> {
5353
}
5454

5555
impl<'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

Comments
 (0)