Skip to content

Commit 9b67a3e

Browse files
rchen152stroxler
authored andcommitted
Split an iterate_by_method helper out of iterate()
Summary: Splits out a helper that accepts a `call_method` parameter, so that we can use `call_metaclass_method` (next diff). Reviewed By: yangdanny97 Differential Revision: D67615539 fbshipit-source-id: bec95413145de86f697bcaa839cf4ccdbab7ac6f
1 parent 9861a78 commit 9b67a3e

File tree

1 file changed

+25
-11
lines changed

1 file changed

+25
-11
lines changed

pyre2/pyre2/bin/alt/answers.rs

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use std::sync::Arc;
1313
use dupe::Dupe;
1414
use ruff_python_ast::name::Name;
1515
use ruff_python_ast::Expr;
16+
use ruff_python_ast::Keyword;
1617
use ruff_python_ast::TypeParam;
1718
use ruff_python_ast::TypeParams;
1819
use ruff_text_size::Ranged;
@@ -656,21 +657,34 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
656657
}
657658
}
658659

660+
fn iterate_by_method(
661+
&self,
662+
call_method: &dyn Fn(&Name, TextRange, &[CallArg], &[Keyword]) -> Option<Type>,
663+
range: TextRange,
664+
) -> Option<Type> {
665+
if let Some(iterator_ty) = call_method(&dunder::ITER, range, &[], &[]) {
666+
Some(self.call_method_or_error(&iterator_ty, &dunder::NEXT, range, &[], &[]))
667+
} else {
668+
let int_ty = self.stdlib.int().to_type();
669+
let arg = CallArg::Type(&int_ty, range);
670+
call_method(&dunder::GETITEM, range, &[arg], &[])
671+
}
672+
}
673+
659674
fn iterate(&self, iterable: &Type, range: TextRange) -> Iterable {
660675
match iterable {
661676
Type::ClassType(cls) => {
662-
let ty = if let Some(iterator_ty) =
663-
self.call_method(iterable, &dunder::ITER, range, &[], &[])
664-
{
665-
self.call_method_or_error(&iterator_ty, &dunder::NEXT, range, &[], &[])
666-
} else {
667-
let int_ty = self.stdlib.int().to_type();
668-
let arg = CallArg::Type(&int_ty, range);
669-
self.call_method(iterable, &dunder::GETITEM, range, &[arg], &[])
670-
.unwrap_or_else(|| {
671-
self.error(range, format!("Class `{}` is not iterable", cls.name()))
672-
})
677+
let call_method = |method_name: &Name,
678+
range: TextRange,
679+
args: &[CallArg],
680+
keywords: &[Keyword]| {
681+
self.call_method(iterable, method_name, range, args, keywords)
673682
};
683+
let ty = self
684+
.iterate_by_method(&call_method, range)
685+
.unwrap_or_else(|| {
686+
self.error(range, format!("Class `{}` is not iterable", cls.name()))
687+
});
674688
Iterable::OfType(ty)
675689
}
676690
Type::Tuple(Tuple::Concrete(elts)) => Iterable::FixedLen(elts.clone()),

0 commit comments

Comments
 (0)