Mercurial > vim-crosoft
annotate scripts/find_companion.py @ 11:096e80c13781
Use the correct documentation extension.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Fri, 22 Jan 2021 16:42:25 -0800 |
parents | f444739dd8af |
children |
rev | line source |
---|---|
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import argparse |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import logging |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 import os.path |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 import sys |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 if True: # 'vim' in sys.modules: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 sys.path.append(os.path.dirname(__file__)) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 from logutil import setup_logging |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 from vshelpers import load_vimcrosoft_auto_env, find_vimcrosoft_slncache, find_item_project |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 from vsutil import SolutionCache, ITEM_TYPE_CPP_SRC, ITEM_TYPE_CPP_HDR |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 logger = logging.getLogger(__name__) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 def _find_companion_item(solution, item_path, companion_name=None, companion_type=None, slncache=None): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 # Try to guess the default companion file if needed. |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 if companion_name == None or companion_type == None: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 primary_name, primary_ext = os.path.splitext(item_path) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 primary_name = os.path.basename(primary_name) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 if primary_ext == '.cpp': |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 companion_name = primary_name + '.h' |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 companion_type = ITEM_TYPE_CPP_HDR |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 elif primary_ext == '.h': |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 companion_name = primary_name + '.cpp' |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 companion_type = ITEM_TYPE_CPP_SRC |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 raise Exception("Can't guess the companion file for: %s" % item_path) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 # Find the primary file in the solution. |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 cache, proj = find_item_project(item_path, solution, slncache) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 logger.debug("Found project %s: %s" % (proj.name, proj.abspath)) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 # Look for the companion file in that project: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 candidates = [] |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 dfgroup = proj.defaultitemgroup() |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 for cur_item in dfgroup.get_items_of_type(companion_type): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 cur_item_name = os.path.basename(cur_item.include) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
42 if cur_item_name == companion_name: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
43 cur_item_path = proj.get_abs_item_include(cur_item) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 candidates.append((cur_item, _get_companion_score(cur_item_path, item_path))) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 candidates = sorted(candidates, key=lambda i: i[1], reverse=True) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 logger.debug("Found candidates: %s" % [(c[0].include, c[1]) for c in candidates]) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 if candidates: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 return proj.get_abs_item_include(candidates[0][0]) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 return None |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 def _get_companion_score(item_path, ref_path): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 for i, c in enumerate(zip(item_path, ref_path)): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 if c[0] != c[1]: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 return i |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 return min(len(item_path, ref_path)) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 def main(): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 parser = argparse.ArgumentParser() |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 parser.add_argument('solution', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 help="The solution file") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 parser.add_argument('filename', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 help="The filename for which to get the companion") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 parser.add_argument('--no-auto-env', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 action='store_true', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 help="Don't read configuration information from Vimcrosoft cache") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 parser.add_argument('-c', '--cache', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 help="The solution cache to use") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 parser.add_argument('-v', '--verbose', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 action='store_true', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 help="Show debugging information") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 args = parser.parse_args() |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 setup_logging(args.verbose) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 build_env = {} |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 slncache = args.cache |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 if not args.no_auto_env: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 load_vimcrosoft_auto_env(args.solution, build_env) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 if not slncache: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 slncache = find_vimcrosoft_slncache(args.solution) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
83 companion = _find_companion_item(args.solution, args.filename, |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
84 slncache=slncache) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
85 print(companion) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
86 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
87 if __name__ == '__main__': |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
88 main() |