From 2cee2cf48053648b86acbcaddd3ddc2e73b73f13 Mon Sep 17 00:00:00 2001 From: Marko Budiselic <marko.budiselic@memgraph.io> Date: Mon, 20 Feb 2017 14:17:09 +0100 Subject: [PATCH] youcompleteme config has been added to the repo Summary: youcompleteme config has been added to the repo Test Plan: manual Reviewers: mislav.bradac Reviewed By: mislav.bradac Subscribers: pullbot, buda Differential Revision: https://phabricator.memgraph.io/D53 --- .gitignore | 1 - .ycm_extra_conf.py | 156 ++++++++++++++++++++++++++++++++++ tests/manual/antlr_parser.cpp | 2 +- 3 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 .ycm_extra_conf.py diff --git a/.gitignore b/.gitignore index 33d2014da..c5d77708b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ .DS_Store -.ycm_extra_conf.py .ycm_extra_conf.pyc *.swp *.swo diff --git a/.ycm_extra_conf.py b/.ycm_extra_conf.py new file mode 100644 index 000000000..12822c7b9 --- /dev/null +++ b/.ycm_extra_conf.py @@ -0,0 +1,156 @@ +import os +import os.path +import fnmatch +import logging +import ycm_core + +BASE_FLAGS = [ + '-Wall', + '-Wextra', + '-Werror', + '-Wno-long-long', + '-Wno-variadic-macros', + '-fexceptions', + '-ferror-limit=10000', + '-DNDEBUG', + '-std=c++1y', + '-xc++', + '-I/usr/lib/', + '-I/usr/include/', + '-I./src', + '-I./include', + '-I./libs/fmt', + '-I./libs/yaml-cpp', + '-I./build/googletest-src/googletest/include', + '-I./build/googlebenchmark-src/include', + '-I./libs/antlr4/runtime/Cpp/runtime/src' +] + +SOURCE_EXTENSIONS = [ + '.cpp', + '.cxx', + '.cc', + '.c', + '.m', + '.mm' +] + +HEADER_EXTENSIONS = [ + '.h', + '.hxx', + '.hpp', + '.hh' +] + +def IsHeaderFile(filename): + extension = os.path.splitext(filename)[1] + return extension in HEADER_EXTENSIONS + +def GetCompilationInfoForFile(database, filename): + 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 FindNearest(path, target): + candidate = os.path.join(path, target) + if(os.path.isfile(candidate) or os.path.isdir(candidate)): + logging.info("Found nearest " + target + " at " + candidate) + return candidate; + else: + parent = os.path.dirname(os.path.abspath(path)); + if(parent == path): + raise RuntimeError("Could not find " + target); + return FindNearest(parent, target) + +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 FlagsForClangComplete(root): + try: + clang_complete_path = FindNearest(root, '.clang_complete') + clang_complete_flags = open(clang_complete_path, 'r').read().splitlines() + return clang_complete_flags + except: + return None + +def FlagsForInclude(root): + try: + include_path = FindNearest(root, 'include') + flags = [] + for dirroot, dirnames, filenames in os.walk(include_path): + for dir_path in dirnames: + real_path = os.path.join(dirroot, dir_path) + flags = flags + ["-I" + real_path] + return flags + except: + return None + +def FlagsForCompilationDatabase(root, filename): + try: + compilation_db_path = FindNearest(root, 'compile_commands.json') + compilation_db_dir = os.path.dirname(compilation_db_path) + logging.info("Set compilation database directory to " + compilation_db_dir) + compilation_db = ycm_core.CompilationDatabase(compilation_db_dir) + if not compilation_db: + logging.info("Compilation database file found but unable to load") + return None + compilation_info = GetCompilationInfoForFile(compilation_db, filename) + if not compilation_info: + logging.info("No compilation info for " + filename + " in compilation database") + return None + return MakeRelativePathsInFlagsAbsolute( + compilation_info.compiler_flags_, + compilation_info.compiler_working_dir_) + except: + return None + +def FlagsForFile(filename): + root = os.path.realpath(filename); + compilation_db_flags = FlagsForCompilationDatabase(root, filename) + if compilation_db_flags: + final_flags = compilation_db_flags + else: + final_flags = BASE_FLAGS + clang_flags = FlagsForClangComplete(root) + if clang_flags: + final_flags = final_flags + clang_flags + include_flags = FlagsForInclude(root) + if include_flags: + final_flags = final_flags + include_flags + return { + 'flags': final_flags, + 'do_cache': True + } diff --git a/tests/manual/antlr_parser.cpp b/tests/manual/antlr_parser.cpp index 5d3516252..a7568fb7c 100644 --- a/tests/manual/antlr_parser.cpp +++ b/tests/manual/antlr_parser.cpp @@ -4,7 +4,7 @@ #include "query/frontend/opencypher/generated/CypherLexer.h" #include "query/frontend/opencypher/generated/CypherParser.h" -using namespace antlrcpptest; +using namespace antlropencypher; using namespace antlr4; int main(int, const char **a) {