| # Configuration file for YouCompleteMe vim plugin to allow the plugin | 
 | # to determine the compile flags.  This file is based on: | 
 | # https://github.com/Valloric/YouCompleteMe/blob/master/cpp/ycm/.ycm_extra_conf.py | 
 | # | 
 | # This is free and unencumbered software released into the public domain. | 
 | # | 
 | # Anyone is free to copy, modify, publish, use, compile, sell, or | 
 | # distribute this software, either in source code form or as a compiled | 
 | # binary, for any purpose, commercial or non-commercial, and by any | 
 | # means. | 
 | # | 
 | # In jurisdictions that recognize copyright laws, the author or authors | 
 | # of this software dedicate any and all copyright interest in the | 
 | # software to the public domain. We make this dedication for the benefit | 
 | # of the public at large and to the detriment of our heirs and | 
 | # successors. We intend this dedication to be an overt act of | 
 | # relinquishment in perpetuity of all present and future rights to this | 
 | # software under copyright law. | 
 | # | 
 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 
 | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 
 | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | 
 | # IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR | 
 | # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | 
 | # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | 
 | # OTHER DEALINGS IN THE SOFTWARE. | 
 | # | 
 | # For more information, please refer to <http://unlicense.org/> | 
 |  | 
 | import os | 
 | import ycm_core | 
 | from clang_helpers import PrepareClangFlags | 
 |  | 
 | compilation_database_folder = os.path.dirname(os.path.realpath(__file__)) | 
 |  | 
 | if compilation_database_folder: | 
 |   database = ycm_core.CompilationDatabase( compilation_database_folder ) | 
 | else: | 
 |   database = None | 
 |  | 
 | def MakeRelativePathsInFlagsAbsolute( flags, working_directory ): | 
 |   if not working_directory: | 
 |     return flags | 
 |   new_flags = [] | 
 |   make_next_absolute = False | 
 |   path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ] | 
 |   for flag in flags: | 
 |     new_flag = flag | 
 |  | 
 |     if make_next_absolute: | 
 |       make_next_absolute = False | 
 |       if not flag.startswith( '/' ): | 
 |         new_flag = os.path.join( working_directory, flag ) | 
 |  | 
 |     for path_flag in path_flags: | 
 |       if flag == path_flag: | 
 |         make_next_absolute = True | 
 |         break | 
 |  | 
 |       if flag.startswith( path_flag ): | 
 |         path = flag[ len( path_flag ): ] | 
 |         new_flag = path_flag + os.path.join( working_directory, path ) | 
 |         break | 
 |  | 
 |     if new_flag: | 
 |       new_flags.append( new_flag ) | 
 |   return new_flags | 
 |  | 
 |  | 
 | def FlagsForFile( filename ): | 
 |   if database: | 
 |     # Bear in mind that compilation_info.compiler_flags_ does NOT return a | 
 |     # python list, but a "list-like" StringVec object | 
 |     compilation_info = database.GetCompilationInfoForFile( filename ) | 
 |     final_flags = PrepareClangFlags( | 
 |         MakeRelativePathsInFlagsAbsolute( | 
 |             compilation_info.compiler_flags_, | 
 |             compilation_info.compiler_working_dir_ ), | 
 |         filename ) | 
 |     do_cache = True | 
 |   else: | 
 |     final_flags = [ ] | 
 |     do_cache = False | 
 |  | 
 |   return { | 
 |     'flags': final_flags, | 
 |     'do_cache': do_cache | 
 |   } |