Mercurial > vim-crosoft
annotate scripts/ycm_extra_conf.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 | 5d2c0db51914 |
children | 096e80c13781 |
rev | line source |
---|---|
0 | 1 import argparse |
2 import logging | |
3 import os.path | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
4 import shutil |
0 | 5 import sys |
6 | |
7 | |
8 if True: # 'vim' in sys.modules: | |
9 sys.path.append(os.path.dirname(__file__)) | |
10 | |
11 | |
12 from logutil import setup_logging | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
13 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:
0
diff
changeset
|
14 from vsutil import SolutionCache, ITEM_TYPE_CPP_SRC, ITEM_TYPE_CPP_HDR |
0 | 15 |
16 | |
17 logger = logging.getLogger(__name__) | |
18 | |
19 | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
20 def _split_paths_property(val): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
21 if val: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
22 return val.strip(';').split(';') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
23 return [] |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
24 |
0 | 25 |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
26 def _split_paths_property_and_make_absolute(basedir, val): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
27 return [os.path.abspath(os.path.join(basedir, p)) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
28 for p in _split_paths_property(val)] |
0 | 29 |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
30 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
31 def _get_item_specific_flags(projdir, clcompileitems, filename): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
32 logger.debug("Looking through %d items to find: %s" % (len(clcompileitems), filename)) |
0 | 33 filename_lower = filename.lower() |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
34 for item in clcompileitems: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
35 absiteminclude = os.path.normpath(os.path.join(projdir, item.include)) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
36 if absiteminclude.lower() != filename_lower: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
37 continue |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
38 logger.debug("Found file-specific flags for: %s" % filename) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
39 incpaths = _split_paths_property_and_make_absolute( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
40 projdir, item.metadata.get('AdditionalIncludeDirectories')) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
41 incfiles = _split_paths_property_and_make_absolute( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
42 projdir, item.metadata.get('ForcedIncludeFiles')) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
43 return (incpaths, incfiles) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
44 return ([], []) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
45 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
46 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
47 def _find_any_possible_item_specific_flags( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
48 solution, slncache, projdir, clcompileitems, filename, incpaths, incfiles, *, |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
49 search_neighbours=True): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
50 # First, find any actual flags for this item. |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
51 item_incpaths, item_incfiles = _get_item_specific_flags(projdir, clcompileitems, filename) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
52 if item_incpaths or item_incfiles: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
53 incpaths += item_incpaths |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
54 incfiles += item_incfiles |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
55 return True |
0 | 56 |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
57 logger.debug("Requested item didn't have any flags, looking for companion item") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
58 from find_companion import _find_companion_item |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
59 companion_item = _find_companion_item(solution, filename, slncache=slncache) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
60 if companion_item: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
61 logger.debug("Found companion item: %s" % companion_item) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
62 item_incpaths, item_incfiles = _get_item_specific_flags(projdir, clcompileitems, companion_item) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
63 incpaths += item_incpaths |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
64 incfiles += item_incfiles |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
65 return True |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
66 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
67 #logger.debug("No companion item found, see if we can find flags for a neighbour") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
68 #os.path.dirname(filename) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
69 return False |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
70 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
71 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
72 def _expand_extra_flags_with_solution_extra_flags(solution, extraflags): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
73 argfilename = os.path.join( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
74 os.path.dirname(solution), |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
75 '.vimcrosoft', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
76 (os.path.basename(solution) + '.flags')) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
77 try: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
78 with open(argfilename, 'r', encoding='utf8') as fp: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
79 lines = fp.readlines() |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
80 logger.debug("Read extra flags from: %s (%d lines)" % (argfilename, len(lines))) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
81 except OSError: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
82 return extraflags |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
83 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
84 extraflags = extraflags or [] |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
85 for line in lines: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
86 if not line.startswith('#'): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
87 extraflags.append(line.strip()) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
88 return extraflags |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
89 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
90 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
91 def _build_cflags(filename, solution, buildenv=None, slncache=None, extraflags=None, |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
92 force_fwd_slashes=True, short_flags=True): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
93 # Find the current file in the solution. |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
94 cache, proj = find_item_project(filename, solution, slncache) |
0 | 95 logger.debug("Found project %s: %s" % (proj.name, proj.abspath)) |
96 | |
97 # Get the provided config/platform combo, which represent a solution | |
98 # configuration, and find the corresponding project configuration. | |
99 # For instance, a solution configuration of "Debug|Win64" could map | |
100 # to a "MyDebug|AnyCPU" configuration on a specific project. | |
101 sln_config_platform = '%s|%s' % (buildenv['Configuration'], | |
102 buildenv['Platform']) | |
103 proj_config_platform = cache.slnobj.find_project_configuration( | |
104 proj.guid, sln_config_platform) | |
105 if not proj_config_platform: | |
106 raise Exception("Can't find project configuration and platform for " | |
107 "solution configuration and platform: %s" % | |
108 sln_config_platform) | |
109 | |
110 # Make a build environment for the project, and figure out what | |
111 # kind of project it is. | |
112 proj_config, proj_platform = proj_config_platform.split('|') | |
113 | |
114 proj_buildenv = buildenv.copy() | |
115 proj_buildenv['Configuration'] = proj_config | |
116 proj_buildenv['Platform'] = proj_platform | |
117 | |
118 cfggroup = proj.propertygroup('Configuration', proj_buildenv) | |
119 cfgtype = cfggroup.get('ConfigurationType') | |
120 if not cfgtype: | |
121 raise Exception("Can't find configuration type. Did you specify a " | |
122 "configuration name and platform? Got: %s" % | |
123 proj_buildenv) | |
124 logger.debug("Found configuration type: %s" % cfgtype) | |
125 | |
126 # Let's prepare a list of standard stuff for C++. | |
127 preproc = [] | |
128 incpaths = [] | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
129 incfiles = [] |
0 | 130 projdir = os.path.dirname(proj.abspath) |
131 | |
132 if cfgtype == 'Makefile': | |
133 # It's a 'Makefile' project, which means we know as little about | |
134 # compiler flags as whatever information was given to VS. As | |
135 # such, if the solution setup doesn't give enough info, VS | |
136 # intellisense won't work, and neither will YouCompleteMe. | |
137 defaultpropgroup = proj.defaultpropertygroup(proj_buildenv) | |
138 | |
139 nmake_preproc = defaultpropgroup.get('NMakePreprocessorDefinitions') | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
140 preproc += _split_paths_property(nmake_preproc) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
141 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
142 vs_incpaths = defaultpropgroup.get('IncludePath') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
143 if vs_incpaths: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
144 incpaths += _split_paths_property_and_make_absolute( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
145 projdir, vs_incpaths) |
0 | 146 |
147 nmake_incpaths = defaultpropgroup.get('NMakeIncludeSearchPath') | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
148 if nmake_incpaths: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
149 incpaths += _split_paths_property_and_make_absolute( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
150 projdir, nmake_incpaths) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
151 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
152 nmake_forcedincs = defaultpropgroup.get('NMakeForcedIncludes') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
153 if nmake_forcedincs: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
154 incfiles += _split_paths_property_and_make_absolute( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
155 projdir, nmake_forcedincs) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
156 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
157 # Find stuff specific to the file we are working on. |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
158 defaultitemgroup = proj.defaultitemgroup(proj_buildenv) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
159 clcompileitems = list(defaultitemgroup.get_items_of_types([ITEM_TYPE_CPP_SRC, ITEM_TYPE_CPP_HDR])) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
160 _find_any_possible_item_specific_flags( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
161 solution, slncache, projdir, clcompileitems, filename, incpaths, incfiles) |
0 | 162 |
163 else: | |
164 # We should definitely support standard VC++ projects here but | |
165 # I don't need it yet :) | |
166 raise Exception("Don't know how to handle configuration type: %s" % | |
167 cfgtype) | |
168 | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
169 # We need to duplicate all the forced-included files because they could |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
170 # have a VS-generated PCH file next to them. Clang then tries to pick it |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
171 # up and complains that it doesn't use a valid format... :( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
172 incfiles = _cache_pch_files(incfiles) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
173 |
0 | 174 # Build the clang/YCM flags with what we found. |
175 flags = ['-x', 'c++'] # TODO: check language type from project file. | |
176 | |
177 for symbol in preproc: | |
178 flags.append('-D%s' % symbol) | |
179 for path in incpaths: | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
180 flagname = '-I' |
0 | 181 if path.startswith("C:\\Program Files"): |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
182 flagname = '-isystem' |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
183 flagval = path.replace('\\', '/') if force_fwd_slashes else path |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
184 if short_flags: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
185 flags.append('%s%s' % (flagname, flagval)) |
0 | 186 else: |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
187 flags.append(flagname) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
188 flags.append(flagval) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
189 # For some reason it seems VS applies those in last-to-first order. |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
190 incfiles = list(reversed(incfiles)) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
191 for path in incfiles: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
192 if force_fwd_slashes: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
193 flags.append('--include=%s' % path.replace('\\', '/')) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
194 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
195 flags.append('--include=%s' % path) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
196 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
197 if extraflags: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
198 flags += extraflags |
0 | 199 |
200 return {'flags': flags} | |
201 | |
202 | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
203 _clang_shadow_pch_suffix = '-for-clang' |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
204 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
205 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
206 def _cache_pch_files(paths): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
207 outpaths = [] |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
208 for path in paths: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
209 name, ext = os.path.splitext(path) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
210 outpath = "%s%s%s" % (name, _clang_shadow_pch_suffix, ext) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
211 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
212 do_cache = False |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
213 orig_mtime = os.path.getmtime(path) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
214 try: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
215 out_mtime = os.path.getmtime(outpath) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
216 if orig_mtime >= out_mtime: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
217 do_cache = True |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
218 except OSError: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
219 do_cache = True |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
220 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
221 if do_cache: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
222 logger.debug("Creating shadow PCH file: %s" % path) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
223 shutil.copy2(path, outpath) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
224 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
225 outpaths.append(outpath) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
226 return outpaths |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
227 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
228 |
0 | 229 def _build_env_from_vim(client_data): |
230 buildenv = {} | |
231 buildenv['Configuration'] = client_data.get('g:vimcrosoft_current_config', '') | |
232 buildenv['Platform'] = client_data.get('g:vimcrosoft_current_platform', '') | |
233 return buildenv | |
234 | |
235 | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
236 _dump_debug_file = True |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
237 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
238 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
239 def _do_dump_debug_file(args, flags, debug_filename): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
240 import pprint |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
241 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
242 with open(debug_filename, 'w') as fp: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
243 fp.write(" args: \n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
244 fp.write("=========\n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
245 pp = pprint.PrettyPrinter(indent=2, stream=fp) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
246 pp.pprint(args) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
247 fp.write("\n\n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
248 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
249 fp.write(" flags: \n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
250 fp.write("==========\n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
251 flags = flags.get('flags') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
252 if flags: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
253 fp.write(flags[0]) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
254 for flag in flags[1:]: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
255 if flag[0] == '-': |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
256 fp.write("\n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
257 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
258 fp.write(" ") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
259 fp.write(flag) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
260 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
261 fp.write("<no flags found>\n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
262 fp.write("\n\n") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
263 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
264 |
0 | 265 def Settings(**kwargs): |
266 language = kwargs.get('language') | |
267 filename = kwargs.get('filename') | |
268 | |
269 client_data = kwargs.get('client_data', {}) | |
270 from_cli = kwargs.get('from_cli', False) | |
271 if from_cli: | |
272 solution = client_data.get('solution') | |
273 slncache = client_data.get('slncache') | |
274 buildenv = client_data.get('env', {}) | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
275 extraflags = client_data.get('extra_flags') |
0 | 276 else: |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
277 if not client_data: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
278 raise Exception("No client data provided by Vim host!") |
0 | 279 solution = client_data.get('g:vimcrosoft_current_sln') |
280 slncache = client_data.get('g:vimcrosoft_current_sln_cache') | |
281 buildenv = _build_env_from_vim(client_data) | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
282 extraflags = client_data.get('g:vimcrosoft_extra_clang_args') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
283 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
284 extraflags = _expand_extra_flags_with_solution_extra_flags(solution, extraflags) |
0 | 285 |
286 flags = None | |
287 | |
288 if language == 'cfamily': | |
289 try: | |
290 flags = _build_cflags(filename, solution, | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
291 buildenv=buildenv, slncache=slncache, |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
292 extraflags=extraflags) |
0 | 293 except Exception as exc: |
294 if from_cli: | |
295 raise | |
296 flags = {'error': str(exc)} | |
297 else: | |
298 flags = {'error': f"Unknown language: {language}"} | |
299 | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
300 if _dump_debug_file: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
301 debug_filename = os.path.join( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
302 os.path.dirname(solution), '.vimcrosoft', 'debug_flags.txt') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
303 _do_dump_debug_file(kwargs, flags, debug_filename) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
304 |
0 | 305 return flags |
306 | |
307 | |
308 languages = { | |
309 'cfamily': ['h', 'c', 'hpp', 'cpp', 'inl'] | |
310 } | |
311 | |
312 | |
313 def _get_language(filename): | |
314 _, ext = os.path.splitext(filename) | |
315 ext = ext.lstrip('.') | |
316 for lang, exts in languages.items(): | |
317 if ext in exts: | |
318 return lang | |
319 return None | |
320 | |
321 | |
322 def main(): | |
323 parser = argparse.ArgumentParser() | |
324 parser.add_argument('solution', | |
325 help="The solution file") | |
326 parser.add_argument('filename', | |
327 help="The filename for which to get flags") | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
328 parser.add_argument('--no-auto-env', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
329 action='store_true', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
330 help="Don't read configuration information from Vimcrosoft cache") |
0 | 331 parser.add_argument('-p', '--property', |
332 action="append", | |
333 help="Specifies a build property") | |
334 parser.add_argument('-c', '--cache', | |
335 help="The solution cache to use") | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
336 parser.add_argument('--cmdline', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
337 action='store_true', |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
338 help="Output flags in a command-line form") |
0 | 339 parser.add_argument('-v', '--verbose', |
340 action='store_true', | |
341 help="Show debugging information") | |
342 args = parser.parse_args() | |
343 setup_logging(args.verbose) | |
344 | |
345 lang = _get_language(args.filename) | |
346 logger.debug(f"Got language {lang} for {args.filename}") | |
347 | |
348 build_env = {} | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
349 slncache = args.cache |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
350 if not args.no_auto_env: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
351 load_vimcrosoft_auto_env(args.solution, build_env) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
352 if not slncache: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
353 slncache = find_vimcrosoft_slncache(args.solution) |
0 | 354 if args.property: |
355 for p in args.property: | |
356 pname, pval = p.split('=', 1) | |
357 build_env[pname] = pval | |
358 logger.debug(f"Got build environment: {build_env}") | |
359 client_data = {'solution': args.solution, | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
360 'slncache': slncache, |
0 | 361 'env': build_env} |
362 | |
363 params = {'from_cli': True, | |
364 'language': lang, | |
365 'filename': args.filename, | |
366 'client_data': client_data | |
367 } | |
368 flags = Settings(**params) | |
10
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
369 if args.cmdline: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
370 import shlex |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
371 if hasattr(shlex, 'join'): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
372 joinargs = shlex.join |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
373 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
374 joinargs = lambda a: ' '.join(a) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
375 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
376 with open('clang_ycm_args.rsp', 'w', encoding='utf8') as fp: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
377 fp.write("%s -fsyntax-only \"%s\"" % ( |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
378 joinargs(sanitizeargs(flags['flags'])), |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
379 args.filename.replace('\\', '/') |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
380 )) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
381 with open('clang_ycm_invoke.cmd', 'w', encoding='utf8') as fp: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
382 fp.write("\"c:\\Program Files\\LLVM\\bin\\clang++.exe\" @clang_ycm_args.rsp > clang_ycm_invoke.log 2>&1") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
383 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
384 logger.info("Command line written to: clang_ycm_invoke.cmd") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
385 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
386 logger.info("Flags:") |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
387 import pprint |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
388 pp = pprint.PrettyPrinter(indent=2) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
389 pp.pprint(flags) |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
390 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
391 |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
392 def sanitizeargs(args): |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
393 for arg in args: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
394 if ' ' in arg: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
395 yield '"%s"' % arg |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
396 else: |
f444739dd8af
Improvements to YCM dynamic flags.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
397 yield arg |
0 | 398 |
399 | |
400 if __name__ == '__main__': | |
401 main() |