code: def visit_ModuleNode(self, node):
      if node.is_pxd:
          return node
      self.scope_type = "module"
      self.scope_node = node
  
      if not self.current_directives["autotestdict"]:
          return node
      self.all_docstrings = self.current_directives["autotestdict.all"]
      self.cdef_docstrings = (
          self.all_docstrings
          or self.current_directives["autotestdict.cdef"]
      )
  
      assert isinstance(node.body, StatListNode)
  
      # First see if __test__ is already created
      if "__test__" in node.scope.entries:
          # Do nothing
          return node
  
      pos = node.pos
  
      self.tests = []
      self.testspos = node.pos
  
      test_dict_entry = node.scope.declare_var(
          EncodedString("__test__"),
          py_object_type,
          pos,
          visibility="public",
      )
      create_test_dict_assignment = SingleAssignmentNode(
          pos,
          lhs=NameNode(
              pos, name=EncodedString("__test__"), entry=test_dict_entry
          ),
          rhs=DictNode(pos, key_value_pairs=self.tests),
      )
      self.visitchildren(node)
      node.body.stats.append(create_test_dict_assignment)
      return node
  
file_path: catboost/contrib/tools/cython/Cython/Compiler/AnalysedTreeTransforms.py
imports: from __future__ import absolute_import
  from .Visitor import ScopeTrackingTransform
  from .Nodes import StatListNode, SingleAssignmentNode, CFuncDefNode, DefNode
  from .ExprNodes import DictNode, DictItemNode, NameNode, UnicodeNode
  from .PyrexTypes import py_object_type
  from .StringEncoding import EncodedString
  from .None import Symtab
label_desc: Use image node_id 1 for calling the AutoTestDictTransform obj's underlying member method code with example usage: obj.visit_ModuleNode(node) and returns: node, node, node, node