Mercurial > vim-crosoft
diff scripts/vshelpers.py @ 10:f444739dd8af
Improvements to YCM dynamic flags.
- Fallback to a "companion" item (e.g. header/source) or a nearby item
when no flags are found for an item.
- Finding a "companion" is also exposed as a standalone script.
- Ability to pass extra clang flags, including some from a special
file found in the .vimcrosoft directory.
- Add support for PCH and other forced-include files.
- Add options for short/long args, or forcing forward slashes.
- Debugging/troubleshooting options, including dumping a batch file and
response file to run clang directly, and the ability to auto-load a
solution's last known environment when running in command line.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Thu, 24 Sep 2020 23:02:16 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/vshelpers.py Thu Sep 24 23:02:16 2020 -0700 @@ -0,0 +1,81 @@ +import os.path +import logging +from vsutil import SolutionCache + + +logger = logging.getLogger(__name__) + +config_format = 2 # Keep in sync with vimcrosoft.vim + + +def load_vimcrosoft_auto_env(sln_file, build_env): + cache_file = os.path.join(os.path.dirname(sln_file), '.vimcrosoft', 'config.txt') + if not os.path.isfile(cache_file): + logger.warn("No Vimcrosoft cache file found, you will probably have to specify " + "all configuration values in the command line!") + return + + with open(cache_file, 'r', encoding='utf8') as fp: + lines = fp.readlines() + + tokens = [ + '_VimcrosoftConfigFormat', + '_VimcrosoftCurrentSolution', + 'Configuration', + 'Platform', + '_VimcrosoftActiveProject'] + for i, line in enumerate(lines): + token = tokens[i] + build_env[token] = line.strip() + + try: + found_conffmt = int(build_env['_VimcrosoftConfigFormat'].split('=')[-1]) + except: + raise Exception("Invalid Vimcrosoft cache file found.") + if found_conffmt != config_format: + raise Exception("Incompatible Vimcrosoft cache file found. " + "Expected format %d but got %d" % (config_format, found_conffmt)) + + logger.info("Loaded cached configuration|platform: %s|%s" % + (build_env['Configuration'], build_env['Platform'])) + + +def find_vimcrosoft_slncache(sln_file): + return os.path.join(os.path.dirname(sln_file), '.vimcrosoft', 'slncache.bin') + + +def get_solution_cache(solution, slncache=None): + if not solution: + raise Exception( + "No solution path was provided!") + + cache, loaded = SolutionCache.load_or_rebuild(solution, slncache) + if not loaded: + cache.build_cache() + if slncache: + logger.debug(f"Saving solution cache: {slncache}") + cache.save(slncache) + + return cache + + +def find_item_project(item_path, solution, slncache=None): + # Load the solution + cache = get_solution_cache(solution, slncache) + + # Find the primary file in the solution. + item_path_lower = item_path.lower() + projpath = None + for pp, pi in cache.index.items(): + if item_path_lower in pi: + projpath = pp + break + else: + raise Exception("File doesn't belong to the solution: %s" % item_path) + + # Find the project that our file belongs to. + proj = cache.slnobj.find_project_by_path(projpath) + if not proj: + raise Exception("Can't find project in solution: %s" % projpath) + + return cache, proj