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()'] extra_flags = [ '-Wall', '-Wextra', # '-Wshadow', # '-Werror', # '-Wc++98-compat', # '-Wno-long-long', # '-Wno-variadic-macros', # '-fexceptions', # '-DNDEBUG', ] 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': flags + extra_flags, 'do_cache': True }