def visit_Attribute(self, node: ast.Attribute) -> None: if not isinstance(node.value, ast.Call): names = [] for sub_node in ast.walk(node): if isinstance(sub_node, ast.Attribute): names.append(sub_node.attr) elif isinstance(sub_node, ast.Name): names.append(sub_node.id) names.reverse() Name.register(lineno=node.lineno, name=".".join(names), node=node)
def traverse(self) -> None: if self.skip_file(): return None try: if C.PY38_PLUS: tree = ast.parse(self.source, type_comments=True) else: tree = ast.parse(self.source) except SyntaxError as e: print( color.paint(str(e), color.RED) + " at " + color.paint(self.path.as_posix(), color.GREEN)) return None """ Set parent """ relate(tree) Scope.add_global_scope(tree) """ Name analyzer """ _NameAnalyzer().visit(tree) """ Receive items on the __all__ list """ importable_visitor = _ImportableAnalyzer() importable_visitor.visit(tree) for node in importable_visitor.importable_nodes: if isinstance(node, ast.Constant): Name.register( lineno=node.lineno, name=str(node.value), node=node, is_all=True, ) elif isinstance(node, ast.Str): Name.register(lineno=node.lineno, name=node.s, node=node, is_all=True) importable_visitor.clear() """ Import analyzer """ _ImportAnalyzer( source=self.source, include_star_import=self.include_star_import, ).traverse(tree) Scope.remove_current_scope()
def visit_Name(self, node: ast.Name) -> None: if not isinstance(node.parent, ast.Attribute): # type: ignore Name.register(lineno=node.lineno, name=node.id, node=node)