class_docstr: This AST visitor is used to find dependencies of a JITFunction. This can
  be used to invalidate a JITFunction's hash when its source code -- or
  that of its dependencies -- changes.
class_docstr_tok: ["This","AST","visitor","is","used","to","find","dependencies","of","a","JITFunction",".","This","can","be","used","to","invalidate","a","JITFunction","'s","hash","when","its","source","code","--","or","that","of","its","dependencies","--","changes","."]
code: def visit_Attribute(self, node):
      lhs = self.visit(node.value)
      while isinstance(lhs, ast.Attribute):
          lhs = self.visit(lhs.value)
      if lhs is None or (getattr(lhs, "__name__", "") == TRITON_MODULE):
          return None
      return getattr(lhs, node.attr)
  
imports: from __future__ import annotations, division
  import ast
  import hashlib
  import inspect
  import os
  import textwrap
  from collections import defaultdict, namedtuple
  from functools import cached_property
  from typing import Callable, Generic, Iterable, List, Optional, TypeVar, Union, cast, overload
  from ..runtime.driver import driver
label_desc: Use image node_id 3 for calling the DependenciesFinder obj's underlying member method code with example usage: obj.visit_Attribute(node) and returns: getattr, None