diff options
Diffstat (limited to 'contrib/YouCompleteMe/ycm_extra_conf.py')
-rw-r--r-- | contrib/YouCompleteMe/ycm_extra_conf.py | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/contrib/YouCompleteMe/ycm_extra_conf.py b/contrib/YouCompleteMe/ycm_extra_conf.py index 7c54677c8f..e436609ce2 100644 --- a/contrib/YouCompleteMe/ycm_extra_conf.py +++ b/contrib/YouCompleteMe/ycm_extra_conf.py @@ -9,47 +9,57 @@ def DirectoryOfThisScript(): def GetDatabase(): compilation_database_folder = os.path.join(DirectoryOfThisScript(), - '..', 'build') + 'build') if os.path.exists(compilation_database_folder): return ycm_core.CompilationDatabase(compilation_database_folder) return None -def IsHeaderFile(filename): - extension = os.path.splitext(filename)[1] - return extension == '.h' - - def GetCompilationInfoForFile(filename): database = GetDatabase() if not database: return None - if IsHeaderFile(filename): - basename = os.path.splitext(filename)[0] - c_file = basename + '.c' - # for pure headers (no c file), default to main.c - if not os.path.exists(c_file): - c_file = os.path.join(DirectoryOfThisScript(), 'nvim', 'main.c') - if os.path.exists(c_file): - compilation_info = database.GetCompilationInfoForFile(c_file) - if compilation_info.compiler_flags_: - return compilation_info - return None return database.GetCompilationInfoForFile(filename) +# It seems YCM does not resolve directories correctly. This function will +# adjust paths in the compiler flags to be absolute +def FixDirectories(args, compiler_working_dir): + def adjust_path(path): + return os.path.abspath(os.path.join(compiler_working_dir, path)) + + adjust_next_arg = False + new_args = [] + for arg in args: + if adjust_next_arg: + arg = adjust_path(arg) + adjust_next_arg = False + else: + for dir_flag in ['-I', '-isystem', '-o', '-c']: + if arg.startswith(dir_flag): + if arg != dir_flag: + # flag and path are concatenated in same arg + path = arg[len(dir_flag):] + new_path = adjust_path(path) + arg = '{0}{1}'.format(dir_flag, new_path) + else: + # path is specified in next argument + adjust_next_arg = True + new_args.append(arg) + return new_args + + def FlagsForFile(filename): compilation_info = GetCompilationInfoForFile(filename) if not compilation_info: return None # Add flags not needed for clang-the-binary, # but needed for libclang-the-library (YCM uses this last one). - flags = (list(compilation_info.compiler_flags_) - if compilation_info.compiler_flags_ - else []) + flags = FixDirectories((list(compilation_info.compiler_flags_) + if compilation_info.compiler_flags_ + else []), compilation_info.compiler_working_dir_) extra_flags = ['-Wno-newline-eof'] - final_flags = flags + extra_flags return { - 'flags': final_flags, + 'flags': flags + extra_flags, 'do_cache': True } |