33import ast
44import hashlib
55import os
6- from collections import deque , defaultdict
6+ from collections import defaultdict , deque
77from itertools import chain
88from typing import TYPE_CHECKING
99
@@ -747,13 +747,13 @@ def collect_type_names_from_annotation(node: ast.expr | None) -> set[str]:
747747def extract_init_stub_from_class (class_name : str , module_source : str , module_tree : ast .Module ) -> str | None :
748748 class_node = None
749749 # Use a deque-based BFS to find the first matching ClassDef (preserves ast.walk order)
750- q = deque ([module_tree ])
750+ q : deque [ ast . AST ] = deque ([module_tree ])
751751 while q :
752- node = q .popleft ()
753- if isinstance (node , ast .ClassDef ) and node .name == class_name :
754- class_node = node
752+ candidate = q .popleft ()
753+ if isinstance (candidate , ast .ClassDef ) and candidate .name == class_name :
754+ class_node = candidate
755755 break
756- q .extend (ast .iter_child_nodes (node ))
756+ q .extend (ast .iter_child_nodes (candidate ))
757757
758758 if class_node is None :
759759 return None
@@ -780,16 +780,15 @@ def extract_init_stub_from_class(class_name: str, module_source: str, module_tre
780780 return None
781781
782782 snippets : list [str ] = []
783- for node in relevant_nodes :
784- start = node .lineno
785- if node .decorator_list :
783+ for fn_node in relevant_nodes :
784+ start = fn_node .lineno
785+ if fn_node .decorator_list :
786786 # Compute minimum decorator lineno with an explicit loop (avoids generator/min overhead)
787787 m = start
788- for d in node .decorator_list :
789- if d .lineno < m :
790- m = d .lineno
788+ for d in fn_node .decorator_list :
789+ m = min (m , d .lineno )
791790 start = m
792- snippets .append ("\n " .join (lines [start - 1 : node .end_lineno ]))
791+ snippets .append ("\n " .join (lines [start - 1 : fn_node .end_lineno ]))
793792
794793 return f"class { class_name } :\n " + "\n " .join (snippets )
795794
0 commit comments