def read_cpp_source_file(self, source_file):
xml_file = '<STR_LIT>'<EOL>try:<EOL><INDENT>ffname = self.__file_full_name(source_file)<EOL>self.logger.debug("<STR_LIT>", ffname)<EOL>decls = self.__dcache.cached_value(ffname, self.__config)<EOL>if not decls:<EOL><INDENT>self.logger.debug(<EOL>"<STR_LIT>")<EOL>xml_file = self.create_xml_file(ffname)<EOL>decls, files = self.__parse_xml_file(xml_file)<EOL>self.__dcache.update(<EOL>ffname, self.__config, decls, files)<EOL><DEDENT>else:<EOL><INDENT>self.logger.debug((<EOL>"<STR_LIT>" +<EOL>"<STR_LIT>"))<EOL><DEDENT><DEDENT>except Exception:<EOL><INDENT>if xml_file:<EOL><INDENT>utils.remove_file_no_raise(xml_file, self.__config)<EOL><DEDENT>raise<EOL><DEDENT>if xml_file:<EOL><INDENT>utils.remove_file_no_raise(xml_file, self.__config)<EOL><DEDENT>return decls<EOL>
Reads C++ source file and returns declarations tree

:param source_file: path to C++ source file
:type source_file: str