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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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()