diff options
Diffstat (limited to '.ycm_extra_conf.py')
-rw-r--r-- | .ycm_extra_conf.py | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/.ycm_extra_conf.py b/.ycm_extra_conf.py new file mode 100644 index 0000000..0d255af --- /dev/null +++ b/.ycm_extra_conf.py @@ -0,0 +1,118 @@ +# This file is NOT licensed under the GPLv3, which is the license for the rest +# of YouCompleteMe. +# For more information, please refer to <http://unlicense.org/> + +import os +import sys +import ycm_core + +def log(msg): + filename = "/Users/viroemer/extra.txt" + with open(filename, 'a') as f: + f.write('%s\n' % msg) + + +source_root = os.path.dirname( os.path.abspath( __file__ ) ) +build_root = os.path.join( source_root, 'build' ) + +# These are the compilation flags that will be used in case there's no +# compilation database set (by default, one is not set). +# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR. +#flags = [ +# '-x', 'c++', +# '--std=c++14', +# +# '-Weverything', +# '-Wall', +# '-Wextra', +# '-Werror', +# '-pedantic', +# '-isystem', '/usr/include', +# '-isystem', '/usr/local/include', +# '-isystem', '/usr/local/opt/openssl/include', +# '-UNDEBUG' +#] + +if os.path.exists(os.path.join(build_root, 'compile_commands.json')): + print("Hello world") + database = ycm_core.CompilationDatabase(build_root) +else: + database = None + +SOURCE_EXTENSIONS = [ '.cpp', '.cc', '.h', '.hpp' ] + +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 + + +def IsHeaderFile( filename ): + extension = os.path.splitext( filename )[ 1 ] + return extension in [ '.h' ] + + +def GetCompilationInfoForFile( filename ): + # The compilation_commands.json file generated by CMake does not have entries + # for header files. So we do our best by asking the db for flags for a + # corresponding source file, if any. If one exists, the flags for that file + # should be good enough. + if IsHeaderFile( filename ): + basename = os.path.splitext( filename )[ 0 ] + for extension in SOURCE_EXTENSIONS: + replacement_file = basename + extension + if os.path.exists( replacement_file ): + + compilation_info = database.GetCompilationInfoForFile( replacement_file ) + if compilation_info.compiler_flags_: + return compilation_info + return None + return database.GetCompilationInfoForFile( filename ) + +def FlagsForFile( filename, **kwargs ): + if database: + # Bear in mind that compilation_info.compiler_flags_ does NOT return a + # python list, but a "list-like" StringVec object + compilation_info = GetCompilationInfoForFile( filename ) + if not compilation_info: + return None + + final_flags = MakeRelativePathsInFlagsAbsolute( + compilation_info.compiler_flags_, + compilation_info.compiler_working_dir_ ) + + else: + relative_to = DirectoryOfThisScript() + final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to ) + + return { + 'flags': final_flags, + 'do_cache': True + } |