@@ -66,6 +66,7 @@ use crate::types::annotation::Qualifier;
6666use crate :: types:: callable:: Param ;
6767use crate :: types:: callable:: Required ;
6868use crate :: types:: class:: Class ;
69+ use crate :: types:: class:: ClassType ;
6970use crate :: types:: class_metadata:: ClassMetadata ;
7071use crate :: types:: literal:: Lit ;
7172use crate :: types:: module:: Module ;
@@ -671,6 +672,19 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
671672 }
672673 }
673674
675+ fn iterate_by_metaclass ( & self , cls : & ClassType , range : TextRange ) -> Iterable {
676+ let call_method =
677+ |method_name : & Name , range : TextRange , args : & [ CallArg ] , keywords : & [ Keyword ] | {
678+ self . call_metaclass_method ( cls, method_name, range, args, keywords)
679+ } ;
680+ let ty = self
681+ . iterate_by_method ( & call_method, range)
682+ . unwrap_or_else ( || {
683+ self . error ( range, format ! ( "Class object `{}` is not iterable" , cls) )
684+ } ) ;
685+ Iterable :: OfType ( ty)
686+ }
687+
674688 fn iterate ( & self , iterable : & Type , range : TextRange ) -> Iterable {
675689 match iterable {
676690 Type :: ClassType ( cls) => {
@@ -695,6 +709,10 @@ impl<'a, Ans: LookupAnswer> AnswersSolver<'a, Ans> {
695709 Type :: Var ( v) if let Some ( _guard) = self . recurser . recurse ( * v) => {
696710 self . iterate ( & self . solver ( ) . force_var ( * v) , range)
697711 }
712+ Type :: ClassDef ( cls) => {
713+ self . iterate_by_metaclass ( & self . promote_to_class_type ( cls, range) , range)
714+ }
715+ Type :: Type ( box Type :: ClassType ( cls) ) => self . iterate_by_metaclass ( cls, range) ,
698716 _ => Iterable :: OfType (
699717 self . error_todo ( "Answers::solve_binding - Binding::IterableValue" , range) ,
700718 ) ,
0 commit comments