cursorless
cursorless copied to clipboard
Filter instances to only include matches that have same scope type as input
We already do this when we detect that the input for "instance" is a token or word, but we should do it for other scopes. We should also construct a target of the right scope type. For example:
const aaa = bbb(ccc, ddd);
const eee = ccc + ddd(ccc, fff);
In this case, "chuck two instances arg cap" should give:
const aaa = bbb(ddd);
const eee = ccc + ddd(fff);
Note how:
- It skips the
cccin= ccc +because that is not an argument - It cleans up commas on both
cccargs, because it constructs args rather than untyped targets
I do wonder if this behaviour would be surprising? Would you see that ccc in const ccc as an instance of the same thing?
Related:
- [ ] We should probably tackle https://github.com/cursorless-dev/cursorless/issues/1949 while we're here
Approach
- [ ] Add a
scopeTypefield toTarget - [ ] Try to expand to that
scopeTypewhen we find a match, just as we do for token and word targets ininstancetoday - [ ] If we can expand to that scope type and it's equal to the range, return the target we expanded to, as that has the rich info
Another potential problem here: this behaviour will likely be quite surprising with "name". If I say "clear every instance name" as a poor-man's rename, it wouldn't work, because the other instances won't be names 🤔
I am starting to get the feeling that "name", "first token", etc should downgrade to "token" for inference / instance, as they are most often the problem children for this kinda thing. They're often just used as a convenient way to target a token, rather than a semantically rich scope. Idk
Cc/ @josharian
I think the best way to answer that question is to play around with it a bit.
Which question?
Whether some scopes should be downgraded to token.
Right yeah I think that makes sense. On the first question of whether requiring "name" to be "name" for instance, I'm quite confident that would bite me
Update from meet-up:
- Let's go for the approach described in this issue
- The "every name" thing can be solved by saying "every token name", whereas the reverse can't be recovered