def traverse(self) -> None: if not self.skip_file(): 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 else: relate(tree) name_scanner = _NameScanner() name_scanner.traverse(tree) self.names.extend(name_scanner.names) import_scanner = _ImportScanner( source=self.source, names=self.names, include_star_import=self.include_star_import, ) import_scanner.traverse(tree) self.imports.extend(import_scanner.imports) self.import_names.extend([imp.name for imp in self.imports])
def traverse( self, source: Union[str, bytes], mode: str = "exec", parent: Optional[ast.AST] = None, ) -> None: try: if PY38_PLUS: tree = ast.parse(source, mode=mode, type_comments=True) else: tree = ast.parse(source, mode=mode) except SyntaxError as err: if self.show_error: print(color.paint(str(err), color.RED)) # pragma: no cover raise err relate(tree, parent=parent) self.visit(tree) """ Receive items on the __all__ list """ importable_visitor = ImportableVisitor() importable_visitor.traverse(self.source) for node in importable_visitor.importable_nodes: if isinstance(node, ast.Constant): self.names.append( Name(lineno=node.lineno, name=str(node.value))) elif isinstance(node, ast.Str): self.names.append(Name(lineno=node.lineno, name=node.s))
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 run_visit(self, source: str) -> None: self.source = source if self.skip_file(): return if PY38_PLUS: self.iter_type_comments() with contextlib.suppress(SyntaxError): tree = ast.parse(self.source) relate(tree) self.visit(tree) self.import_names = [imp["name"] for imp in self.imports] self.names = list(self.get_names()) self.unused_imports = list(self.get_unused_imports())
def join_visit(self, value: str, node: ast.AST, *, mode: str = "eval") -> None: """A function that parses the value, copies locations from the node and includes them in self.visit.""" if PY38_PLUS: tree = ast.parse(value, mode=mode, type_comments=True) else: tree = ast.parse(value, mode=mode) relate(tree, parent=node.parent) # type: ignore for new_node in ast.walk(tree): ast.copy_location(new_node, node) self.visit(tree)
def get_names(cls, package: str) -> FrozenSet[str]: if utils.is_std(package): return utils.get_dir(package) source = utils.get_source(package) if source: try: tree = ast.parse(source) except SyntaxError: return frozenset() else: visitor = cls() relate(tree) visitor.visit(tree) return visitor.get_all() or visitor.get_suggestion() return frozenset()
def traverse(self, tree) -> None: relate(tree) self.visit(tree)
def traverse(self, source: str) -> None: tree = ast.parse(source) relate(tree) self.visit(tree)