-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Can c_cpp_properties.json support wildcard paths? #723
Comments
This should be implementable in our open source typescript if anyone wants to contribute :) |
With 0.17.5 you should be able to use |
Hi, is a middle wildcard not supported though? For example:
It's not finding the path, and I'm trying to avoid adding each Thanks |
As far as I can see the middle wildcard doesn't work. Our include files are all "include" & "interface" directories in many places. So this only leaves using everything via "${workspaceFolder}/", or adding each one in turn when required (which may be better where there are duplicated names). I suspect using "${workspaceFolder}/" isn't great for performance. |
A middle wildcard is not currently supported. I started a branch that would support this a while ago, but I forget what state it was in and now the branch is out of date. If anyone wants to get it back in sync with master and finish it, we can consider taking it. I'll reopen this issue since the original request was not actually addressed. This is the branch: https://github.com/Microsoft/vscode-cpptools/tree/bobbrow/expand-wildcards |
In my opinion, in addition to supporting the normal "*" it would be also good have "**" as the From the bash manpage:
Then, we could use, for example,
|
Hey @bobbrow,
Looking into how the wildcard support is added to vscode-cpptools, I've come across a couple PRs (#1896, #2136); Their changes do not make much sense into how the recursive It looks like it's all passed off to pre-compiled |
@NZSmartie cpptools is closed source. It seems like |
* Merge OpenDebugAD7 into MIEngine MIEngine will now create OpenDebugAD7.exe and DebugEngineHost for VSCode C++ extension. * Removing Lab.*, Debug/Release builds for new projs * Fixing active configurations
@sean-mcmanus @bobbrow Any update on this? All my include headers are in "include" or "interface" directories. Hence I would like to use all sub-directories that end in "include" or "interface", and nothing else. |
@BillDenton No update (the issue hasn't been assigned to a milestone yet). I believe the fix could be implemented in our open source typescript. |
Seems that way. Off hand I'm not sure of any VSCode-provided APIs, but a package to resolve/expand globstars could be used to format a value to pass to cpptools right from the extension. |
any progress? |
@haolly Not yet -- it's been pushed back repeatedly. It's currently "On Deck" which means we don't have a definite target Milestone yet. The best case might be September, but it certainly could be delayed further. |
ran across this Issue. also interested. any good news yet? |
@lifo888 No news. I don't have an ETA. |
Here is a standalone working example of a glob walker showimport fs from 'fs';
import path from 'path';
import process from 'process'
class Demo {
globMatch(pattern, str) {// use picomatch ?
let i = 0;
let j = 0;
while (i < pattern.length && j < str.length) {
if (pattern.charAt(i) == '*') {
if (i + 1 == pattern.length)
return true;
for (let k = j; k < str.length; k++)
if (this.globMatch(pattern.substring(i + 1), str.substring(k)))
return true;
return false;
} else {
if (pattern.charAt(i) != str.charAt(j))
return false;
i++;
j++;
}
}
return (i == pattern.length && j == str.length);
}
tryReadDir = (dir) => { try { const res = fs.readdirSync(dir); return res; } catch (e) { return []; } };
globWalkDir(components, i = 0) {
if (i >= components.length || components[i] == '**') {
return path.sep + components.join(path.sep); // end of expression
}
const cwd = path.sep + components.slice(0, i).join(path.sep);
return this.tryReadDir(cwd)
.filter(name => this.globMatch(components[i], name))
.filter(match => fs.lstatSync(path.join(cwd, match)).isDirectory())
.map(match => this.globWalkDir([...components.slice(0, i), match, ...components.slice(i + 1)], i + 1));
//console.log({components,i, cwd, ls, res})
}
}
if (!process.argv[2] || !path.isAbsolute(process.argv[2])) {
throw 'USAGE: glob.mjs ABS_GLOB_EXP';
}
const compo = process.argv[2].split(path.sep).slice(1);
console.log(new Demo().globWalkDir(compo).flat(compo.length)); It allow partial matching, for example : > globWalkDir(['usr','l*','**']); // "/usr/l*/**" pattern
[ '/usr/lib/**', '/usr/lib32/**', '/usr/local/**' ] and can be used as drop-in replacement of globMatch(pattern, str) { // TODO: use picomatch ?
let i = 0;
let j = 0;
while (i < pattern.length && j < str.length) {
if (pattern.charAt(i) == '*') {
if (i + 1 == pattern.length)
return true;
for (let k = j; k < str.length; k++)
if (this.globMatch(pattern.substring(i + 1), str.substring(k)))
return true;
return false;
} else {
if (pattern.charAt(i) != str.charAt(j))
return false;
i++;
j++;
}
}
return (i == pattern.length && j == str.length);
}
tryReadDir(...args) { try { return fs.readdirSync(...args); } catch (e) { return []; } }
globWalkDir(components, i = 0) {
if (i >= components.length || components[i] == '**') {
return path.sep + components.join(path.sep); // end of expression
}
const cwd = path.sep + components.slice(0, i).join(path.sep);
return this.tryReadDir(cwd)
.filter(name => this.globMatch(components[i], name))
.filter(match => fs.lstatSync(path.join(cwd, match)).isDirectory())
.map(match => this.globWalkDir([...components.slice(0, i), match, ...components.slice(i + 1)], i + 1));
}
resolveAndSplit(paths, defaultValue, env) { //// <<<<<
return paths ? this.resolveDefaults(paths, defaultValue).map(entry =>
util.resolveVariables(entry, env).split(util.envDelimiter).filter(e => e)
.map(e => e.replace("${workspaceFolder}", this.rootUri.fsPath).split(path.sep).slice(1))
.map(e => this.globWalkDir(e).flat(e.length))
.flat()
).flat() : [];
} Tell me if you have any use-case that doesn't work @bobbrow I'm currently following the CONTRIBUTING.md in order to send you a PR. Is that okay for you ? |
@yne Sure, can you submit a PR? |
@sean-mcmanus: I've PR'd a working exemple with |
@sean-mcmanus Slightly confused about the status of this issue and the related issue #10388. What is the status with the latest VS Code 1.79.2 and C/C++ extension v1.16.3? What is the syntax? |
@BillDenton It'll be in 1.17.0. Syntax is currently |
The scripts I am using to build my projects are generating the dependencies in a folder. It could be very useful in this situation to be able to give a path like this
/my/path/*/include
to simplify/my/path/dep1/include
/my/path/dep2/include
/my/path/dep3/include
I would be pleased to have your opinion. :)
The text was updated successfully, but these errors were encountered: