code: def add_file(self, filename):
          
  
          assert not self.final, 'Trying to mutate a final graph.'
          self.add_source_file(filename)
          resolved, unresolved = self.get_file_deps(filename)
          self.graph.add_node(filename)
          for f in resolved:
              self.graph.add_node(f)
              self.graph.add_edge(filename, f)
          for imp in unresolved:
              self.broken_deps[filename].add(imp)
docs: Add a file and all its immediate dependencies to the graph.