|  | # 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 | 
|  | } |