Skip to content

Can c_cpp_properties.json support wildcard paths? #723

Closed

Description

@bbalp

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. :)

Activity

  1. sean-mcmanus commented on Jan 10, 2018

    @sean-mcmanus
    Contributor

    This should be implementable in our open source typescript if anyone wants to contribute :)

  2. bobbrow commented on Jun 26, 2018

    @bobbrow
    Contributor

    With 0.17.5 you should be able to use /my/path/** and it will add all of the relevant paths. Let us know if that works for you.

  3. added
    fixedCheck the Milestone for the release in which the fix is or will be available.
    on Jun 26, 2018
  4. aaronlelevier commented on Feb 22, 2019

    @aaronlelevier

    Hi, is a middle wildcard not supported though? For example:

    /Users/aaron/Documents/github/opencv/modules/*/include/**
    

    It's not finding the path, and I'm trying to avoid adding each opencv/modules/<some-module>/include/** to the includePath

    Thanks

  5. BillDenton commented on Feb 28, 2019

    @BillDenton

    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.

  6. bobbrow commented on Feb 28, 2019

    @bobbrow
    Contributor

    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

  7. 21 remaining items

  8. added this to the On Deck milestone on Nov 16, 2021
  9. momadacoding commented on Jun 15, 2022

    @momadacoding

    any progress?

  10. sean-mcmanus commented on Jun 15, 2022

    @sean-mcmanus
    Contributor

    @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.

  11. gchen88 commented on Sep 14, 2022

    @gchen88

    ran across this Issue. also interested. any good news yet?

  12. sean-mcmanus commented on Sep 15, 2022

    @sean-mcmanus
    Contributor

    @lifo888 No news. I don't have an ETA.

  13. yne commented on Jan 2, 2023

    @yne
    Contributor

    Here is a standalone working example of a glob walker

    show
    import 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 resolveAndSplit() in ~/.vscode/extensions/ms-vscode.cpptools-*/dist/main.js :

        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

    Bob Brown (@bobbrow) I'm currently following the CONTRIBUTING.md in order to send you a PR. Is that okay for you ?

  14. sean-mcmanus commented on Jan 3, 2023

    @sean-mcmanus
    Contributor

    Rémy F. (@yne) Sure, can you submit a PR?

  15. yne commented on Jan 17, 2023

    @yne
    Contributor

    Sean McManus (@sean-mcmanus): I've PR'd a working exemple with * path support.

  16. BillDenton commented on Jun 29, 2023

    @BillDenton

    Sean McManus (@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?
    Thanks.

  17. sean-mcmanus commented on Jun 29, 2023

    @sean-mcmanus
    Contributor

    BillDenton It'll be in 1.17.0. Syntax is currently * for wildcards in the middle of a path.

  18. added
    fixedCheck the Milestone for the release in which the fix is or will be available.
    on Jul 18, 2023
  19. locked and limited conversation to collaborators on Aug 12, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Feature RequestLanguage ServicefixedCheck the Milestone for the release in which the fix is or will be available.help wantedCan be fixed in the public (open source) repo.

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions