nodes: 0, module; 1, function_definition; 2, function_name:assist; 3, parameters; 4, block; 5, identifier:self; 6, identifier:project_path; 7, identifier:source; 8, identifier:position; 9, identifier:filename; 10, expression_statement; 11, return_statement; 12, comment:"""Return completion match and list of completion proposals
  
          :param project_path: absolute project path
          :param source: unicode or byte string code source
          :param position: character or byte cursor position
          :param filename: absolute path of file with source code
          :returns: tuple (completion match, sorted list of proposals)
          """; 13, call; 14, attribute; 15, argument_list; 16, identifier:self; 17, identifier:_call; 18, string; 19, identifier:project_path; 20, identifier:source; 21, identifier:position; 22, identifier:filename; 23, string_content:assist
code: def assist(self, project_path, source, position, filename):
          """Return completion match and list of completion proposals
  
          :param project_path: absolute project path
          :param source: unicode or byte string code source
          :param position: character or byte cursor position
          :param filename: absolute path of file with source code
          :returns: tuple (completion match, sorted list of proposals)
          """
          return self._call('assist', project_path, source, position, filename)