From 8b652b5ebfdd3735f276ac54caff74df6f162eb6 Mon Sep 17 00:00:00 2001 From: Samir Benmendil Date: Mon, 24 Oct 2016 09:14:28 +0100 Subject: [PATCH] vim: global ycm_extra_conf This will search for a compile_commands.json file in any subdirectory and use that to get flags. Revert to some simple default flags. --- vim/ycm_extra_conf.py | 114 +++++++++++++++++++++++++----------------- 1 file changed, 67 insertions(+), 47 deletions(-) diff --git a/vim/ycm_extra_conf.py b/vim/ycm_extra_conf.py index f0e3679..b262265 100644 --- a/vim/ycm_extra_conf.py +++ b/vim/ycm_extra_conf.py @@ -1,13 +1,48 @@ -import os +from glob import glob +from os import path + +import ycm_core + + +def findCompilationDatabaseFolder(dir='.'): + dirs = [path.dirname(f) for f in glob(dir + '/**/compile_commands.json', + recursive=True)] + return dirs + + +def generateQtFlags(): + flags = [] + for p in glob('/usr/include/qt/*/'): + flags += ['-isystem', p] + return flags + + +def isHeader(filename): + ext = path.splitext(filename)[1] + return ext in ['.hpp', '.h'] + + +def GetCompilationInfoForFile(database, filename): + if isHeader(filename): + basename = path.splitext(filename)[0] + for ext in ['.cpp', '.c']: + cpp_file = basename + ext + if path.exists(cpp_file): + compilation_info = database.GetCompilationInfoForFile( + cpp_file) + if compilation_info.compiler_flags_: + return compilation_info + return None + return database.GetCompilationInfoForFile(filename) def FlagsForFile(filename, **kwargs): client_data = kwargs['client_data'] cwd = client_data['getcwd()'] - flags = [ + extra_flags = [ '-Wall', - # '-Wextra', + '-Wextra', # '-Wshadow', # '-Werror', # '-Wc++98-compat', @@ -15,52 +50,37 @@ def FlagsForFile(filename, **kwargs): # '-Wno-variadic-macros', # '-fexceptions', # '-DNDEBUG', - '-std=c++14', - '-stdlib=libstdc++', - '-x', 'c++', - '-isystem', '/usr/include', - '-isystem', '/usr/local/include', - '-isystem', '/usr/include/qt', - '-I', '.', - '-I', './include', ] - relative_to = cwd - final_flags = MakeRelativePathsInFlagsAbsolute(flags, relative_to) + + folders = findCompilationDatabaseFolder(cwd) + if not folders: + folder = None + else: + folder = folders[0] + if len(folders) > 1: + print("Multiple compilation databases found!") + print(folders) + print("Selecting first: %s" % (folder)) + + if folder: + database = ycm_core.CompilationDatabase(folder) + compilation_info = GetCompilationInfoForFile(database, filename) + if not compilation_info: + return None + flags = list(compilation_info.compiler_flags_) + else: + flags = [ + '-std=c++14', + '-stdlib=libstdc++', + '-x', 'c++', + '-isystem', '/usr/include', + '-isystem', '/usr/local/include', + '-I', cwd, + '-I', cwd + '/include', + ] + flags = generateQtFlags() return { - 'flags': final_flags, + 'flags': flags + extra_flags, 'do_cache': True } - - -def DirectoryOfThisScript(): - return os.path.dirname(os.path.abspath(__file__)) - - -def MakeRelativePathsInFlagsAbsolute(flags, working_directory): - if not working_directory: - return list(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 -- 2.48.1