Fix selector-no-qualifying-type false negatives for :is/where()#8940
Conversation
🦋 Changeset detectedLatest commit: b1dfcf3 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
Nicely done! Thank you for tackling this tricky one. The approach and implementation LGTM:
|
…where--empathetic-stag-beetle-f777388630' of https://github.com/stylelint/stylelint into fix-selector-no-qualifying-type-false-negatives-for-is-where--empathetic-stag-beetle-f777388630
ybiquitous
left a comment
There was a problem hiding this comment.
@romainmenke Thanks for the pull request. Overall LGTM 👍🏼
I've left some minor suggestions for code improvements. I'd appreciate it if you could take a look.
[suggestion] What if we could add a few examples for the new problem types to the rule README?
- Using
&nesting selector - Using
:is()pseudo-class
Co-authored-by: Masafumi Koba <473530+ybiquitous@users.noreply.github.com>
Co-authored-by: Masafumi Koba <473530+ybiquitous@users.noreply.github.com>
Co-authored-by: Masafumi Koba <473530+ybiquitous@users.noreply.github.com>
Co-authored-by: Masafumi Koba <473530+ybiquitous@users.noreply.github.com>
|
Thank you for the review @ybiquitous, |
ybiquitous
left a comment
There was a problem hiding this comment.
Thank you for addressing my reviews. The changed code looks good enough to me 👍🏼
| datasource | package | from | to | | ---------- | --------- | ------- | ------ | | npm | stylelint | 16.26.1 | 17.0.0 | ## [v17.0.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#1700---2026-01-15) It contains 14 breaking changes, which we've detailed in the [migrating to `17.0.0` guide](docs/migration-guide/to-17.md). Additionally, it adds 3 options to the rules and fixes 9 bugs. We've also released compatible versions of our [shared config](https://www.npmjs.com/package/stylelint-config-standard), [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint), [Node.js Rule Tester](https://www.npmjs.com/package/stylelint-test-rule-node) and [Jest preset](https://www.npmjs.com/package/jest-preset-stylelint). - Removed: CommonJS Node.js API ([#8859](stylelint/stylelint#8859)) ([@jeddy3](https://github.com/jeddy3)). - Removed: `output` property in the Node.js API returned resolved object ([#8878](stylelint/stylelint#8878)) ([@jeddy3](https://github.com/jeddy3)). - Removed: support for Node.js less than 20.19.0 ([#8867](stylelint/stylelint#8867)) ([@jeddy3](https://github.com/jeddy3)). - Removed: GitHub formatter ([#8888](stylelint/stylelint#8888)) ([@jeddy3](https://github.com/jeddy3)). - Removed: `resolveNestedSelectors` option from `selector-class-pattern` ([#8931](stylelint/stylelint#8931)) ([@jeddy3](https://github.com/jeddy3)). - Removed: `checkContextFunctionalPseudoClasses` option from `selector-max-id` ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)). - Changed: default `fix` mode to `strict` ([#8889](stylelint/stylelint#8889)) ([@jeddy3](https://github.com/jeddy3)). - Changed: `report` to be consistent and predictable in how it handles the provided position arguments ([#8217](stylelint/stylelint#8217)) ([@romainmenke](https://github.com/romainmenke)). - Changed: `selector-max-*` syntax rules for standard CSS nesting and modern functional pseudo-classes ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)). - Changed: `*-specificity` semantic rules for standard CSS nesting ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)). - Changed: `no-duplicate-selectors` and `selector-no-qualifying-type` for standard CSS nesting ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)). - Changed: `*-list` rules to have consistent behaviour for vendor prefixes and case ([#8912](stylelint/stylelint#8912)) ([@jeddy3](https://github.com/jeddy3)). - Changed: `*-no-vendor-prefix` rules to have consistent behaviour for their `ignore*: []` secondary options ([#8924](stylelint/stylelint#8924)) ([@jeddy3](https://github.com/jeddy3)). - Changed: `declaration-property-max-values` rule to have consistent behaviour for vendor prefixes ([#8926](stylelint/stylelint#8926)) ([@jeddy3](https://github.com/jeddy3)). - Added: `except: ["after-block"]` to `custom-property-empty-line-before` ([#8921](stylelint/stylelint#8921)) ([@kovsu](https://github.com/kovsu)). - Added: `except: ["after-block"]` to `declaration-empty-line-before` ([#8910](stylelint/stylelint#8910)) ([@kovsu](https://github.com/kovsu)). - Added: `ignoreSelectors: []` to `no-duplicate-selectors` ([#8883](stylelint/stylelint#8883)) ([@kovsu](https://github.com/kovsu)). - Fixed: Windows drive letter casing inconsistencies when matching patterns against file paths ([#8941](stylelint/stylelint#8941)) ([@adalinesimonian](https://github.com/adalinesimonian)). - Fixed: CLI help to include TypeScript config files ([#8908](stylelint/stylelint#8908)) ([@kovsu](https://github.com/kovsu)). - Fixed: `at-rule-descriptor-no-unknown` false positives for declarations within feature-value-blocks ([#8868](stylelint/stylelint#8868)) ([@kovsu](https://github.com/kovsu)). - Fixed: `declaration-block-no-redundant-longhand-properties` false negatives for short and long combinations ([#8892](stylelint/stylelint#8892)) ([@nathannewyen](https://github.com/nathannewyen)). - Fixed: `media-feature-name-no-unknown` false positives for namespaced dollar variables and range context queries ([#8890](stylelint/stylelint#8890)) ([@kovsu](https://github.com/kovsu)). - Fixed: `nesting-selector-no-missing-scoping-root` false positives for CSS-in-JS ([#8905](stylelint/stylelint#8905)) ([@kovsu](https://github.com/kovsu)). - Fixed: `no-invalid-position-declaration` false negatives for embedded blocks ([#8907](stylelint/stylelint#8907)) ([@kovsu](https://github.com/kovsu)). - Fixed: `selector-no-qualifying-type` false negatives for `:is/where()` ([#8940](stylelint/stylelint#8940)) ([@romainmenke](https://github.com/romainmenke)). - Fixed: `selector-type-no-unknown` false positives for MathML 4 tags ([#8874](stylelint/stylelint#8874)) ([@jeddy3](https://github.com/jeddy3)).
| datasource | package | from | to | | ---------- | --------- | ------- | ------ | | npm | stylelint | 16.26.1 | 17.0.0 | ## [v17.0.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#1700---2026-01-15) It contains 14 breaking changes, which we've detailed in the [migrating to `17.0.0` guide](docs/migration-guide/to-17.md). Additionally, it adds 3 options to the rules and fixes 9 bugs. We've also released compatible versions of our [shared config](https://www.npmjs.com/package/stylelint-config-standard), [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint), [Node.js Rule Tester](https://www.npmjs.com/package/stylelint-test-rule-node) and [Jest preset](https://www.npmjs.com/package/jest-preset-stylelint). - Removed: CommonJS Node.js API ([#8859](stylelint/stylelint#8859)) ([@jeddy3](https://github.com/jeddy3)). - Removed: `output` property in the Node.js API returned resolved object ([#8878](stylelint/stylelint#8878)) ([@jeddy3](https://github.com/jeddy3)). - Removed: support for Node.js less than 20.19.0 ([#8867](stylelint/stylelint#8867)) ([@jeddy3](https://github.com/jeddy3)). - Removed: GitHub formatter ([#8888](stylelint/stylelint#8888)) ([@jeddy3](https://github.com/jeddy3)). - Removed: `resolveNestedSelectors` option from `selector-class-pattern` ([#8931](stylelint/stylelint#8931)) ([@jeddy3](https://github.com/jeddy3)). - Removed: `checkContextFunctionalPseudoClasses` option from `selector-max-id` ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)). - Changed: default `fix` mode to `strict` ([#8889](stylelint/stylelint#8889)) ([@jeddy3](https://github.com/jeddy3)). - Changed: `report` to be consistent and predictable in how it handles the provided position arguments ([#8217](stylelint/stylelint#8217)) ([@romainmenke](https://github.com/romainmenke)). - Changed: `selector-max-*` syntax rules for standard CSS nesting and modern functional pseudo-classes ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)). - Changed: `*-specificity` semantic rules for standard CSS nesting ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)). - Changed: `no-duplicate-selectors` and `selector-no-qualifying-type` for standard CSS nesting ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)). - Changed: `*-list` rules to have consistent behaviour for vendor prefixes and case ([#8912](stylelint/stylelint#8912)) ([@jeddy3](https://github.com/jeddy3)). - Changed: `*-no-vendor-prefix` rules to have consistent behaviour for their `ignore*: []` secondary options ([#8924](stylelint/stylelint#8924)) ([@jeddy3](https://github.com/jeddy3)). - Changed: `declaration-property-max-values` rule to have consistent behaviour for vendor prefixes ([#8926](stylelint/stylelint#8926)) ([@jeddy3](https://github.com/jeddy3)). - Added: `except: ["after-block"]` to `custom-property-empty-line-before` ([#8921](stylelint/stylelint#8921)) ([@kovsu](https://github.com/kovsu)). - Added: `except: ["after-block"]` to `declaration-empty-line-before` ([#8910](stylelint/stylelint#8910)) ([@kovsu](https://github.com/kovsu)). - Added: `ignoreSelectors: []` to `no-duplicate-selectors` ([#8883](stylelint/stylelint#8883)) ([@kovsu](https://github.com/kovsu)). - Fixed: Windows drive letter casing inconsistencies when matching patterns against file paths ([#8941](stylelint/stylelint#8941)) ([@adalinesimonian](https://github.com/adalinesimonian)). - Fixed: CLI help to include TypeScript config files ([#8908](stylelint/stylelint#8908)) ([@kovsu](https://github.com/kovsu)). - Fixed: `at-rule-descriptor-no-unknown` false positives for declarations within feature-value-blocks ([#8868](stylelint/stylelint#8868)) ([@kovsu](https://github.com/kovsu)). - Fixed: `declaration-block-no-redundant-longhand-properties` false negatives for short and long combinations ([#8892](stylelint/stylelint#8892)) ([@nathannewyen](https://github.com/nathannewyen)). - Fixed: `media-feature-name-no-unknown` false positives for namespaced dollar variables and range context queries ([#8890](stylelint/stylelint#8890)) ([@kovsu](https://github.com/kovsu)). - Fixed: `nesting-selector-no-missing-scoping-root` false positives for CSS-in-JS ([#8905](stylelint/stylelint#8905)) ([@kovsu](https://github.com/kovsu)). - Fixed: `no-invalid-position-declaration` false negatives for embedded blocks ([#8907](stylelint/stylelint#8907)) ([@kovsu](https://github.com/kovsu)). - Fixed: `selector-no-qualifying-type` false negatives for `:is/where()` ([#8940](stylelint/stylelint#8940)) ([@romainmenke](https://github.com/romainmenke)). - Fixed: `selector-type-no-unknown` false positives for MathML 4 tags ([#8874](stylelint/stylelint#8874)) ([@jeddy3](https://github.com/jeddy3)).
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [stylelint](https://stylelint.io) ([source](https://github.com/stylelint/stylelint)) | devDependencies | major | [`^16.23.1` -> `^17.0.0`](https://renovatebot.com/diffs/npm/stylelint/16.26.1/17.0.0) | --- ### Release Notes <details> <summary>stylelint/stylelint (stylelint)</summary> ### [`v17.0.0`](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#1700---2026-01-15) [Compare Source](stylelint/stylelint@16.26.1...17.0.0) It contains 14 breaking changes, which we've detailed in the [migrating to `17.0.0` guide](docs/migration-guide/to-17.md). Additionally, it adds 3 options to the rules and fixes 9 bugs. We've also released compatible versions of our [shared config](https://www.npmjs.com/package/stylelint-config-standard), [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint), [Node.js Rule Tester](https://www.npmjs.com/package/stylelint-test-rule-node) and [Jest preset](https://www.npmjs.com/package/jest-preset-stylelint). - Removed: CommonJS Node.js API ([#​8859](stylelint/stylelint#8859)) ([@​jeddy3](https://github.com/jeddy3)). - Removed: `output` property in the Node.js API returned resolved object ([#​8878](stylelint/stylelint#8878)) ([@​jeddy3](https://github.com/jeddy3)). - Removed: support for Node.js less than 20.19.0 ([#​8867](stylelint/stylelint#8867)) ([@​jeddy3](https://github.com/jeddy3)). - Removed: GitHub formatter ([#​8888](stylelint/stylelint#8888)) ([@​jeddy3](https://github.com/jeddy3)). - Removed: `resolveNestedSelectors` option from `selector-class-pattern` ([#​8931](stylelint/stylelint#8931)) ([@​jeddy3](https://github.com/jeddy3)). - Removed: `checkContextFunctionalPseudoClasses` option from `selector-max-id` ([#​8913](stylelint/stylelint#8913)) ([@​jeddy3](https://github.com/jeddy3)). - Changed: default `fix` mode to `strict` ([#​8889](stylelint/stylelint#8889)) ([@​jeddy3](https://github.com/jeddy3)). - Changed: `report` to be consistent and predictable in how it handles the provided position arguments ([#​8217](stylelint/stylelint#8217)) ([@​romainmenke](https://github.com/romainmenke)). - Changed: `selector-max-*` syntax rules for standard CSS nesting and modern functional pseudo-classes ([#​8913](stylelint/stylelint#8913)) ([@​jeddy3](https://github.com/jeddy3)). - Changed: `*-specificity` semantic rules for standard CSS nesting ([#​8913](stylelint/stylelint#8913)) ([@​jeddy3](https://github.com/jeddy3)). - Changed: `no-duplicate-selectors` and `selector-no-qualifying-type` for standard CSS nesting ([#​8913](stylelint/stylelint#8913)) ([@​jeddy3](https://github.com/jeddy3)). - Changed: `*-list` rules to have consistent behaviour for vendor prefixes and case ([#​8912](stylelint/stylelint#8912)) ([@​jeddy3](https://github.com/jeddy3)). - Changed: `*-no-vendor-prefix` rules to have consistent behaviour for their `ignore*: []` secondary options ([#​8924](stylelint/stylelint#8924)) ([@​jeddy3](https://github.com/jeddy3)). - Changed: `declaration-property-max-values` rule to have consistent behaviour for vendor prefixes ([#​8926](stylelint/stylelint#8926)) ([@​jeddy3](https://github.com/jeddy3)). - Added: `except: ["after-block"]` to `custom-property-empty-line-before` ([#​8921](stylelint/stylelint#8921)) ([@​kovsu](https://github.com/kovsu)). - Added: `except: ["after-block"]` to `declaration-empty-line-before` ([#​8910](stylelint/stylelint#8910)) ([@​kovsu](https://github.com/kovsu)). - Added: `ignoreSelectors: []` to `no-duplicate-selectors` ([#​8883](stylelint/stylelint#8883)) ([@​kovsu](https://github.com/kovsu)). - Fixed: Windows drive letter casing inconsistencies when matching patterns against file paths ([#​8941](stylelint/stylelint#8941)) ([@​adalinesimonian](https://github.com/adalinesimonian)). - Fixed: CLI help to include TypeScript config files ([#​8908](stylelint/stylelint#8908)) ([@​kovsu](https://github.com/kovsu)). - Fixed: `at-rule-descriptor-no-unknown` false positives for declarations within feature-value-blocks ([#​8868](stylelint/stylelint#8868)) ([@​kovsu](https://github.com/kovsu)). - Fixed: `declaration-block-no-redundant-longhand-properties` false negatives for short and long combinations ([#​8892](stylelint/stylelint#8892)) ([@​nathannewyen](https://github.com/nathannewyen)). - Fixed: `media-feature-name-no-unknown` false positives for namespaced dollar variables and range context queries ([#​8890](stylelint/stylelint#8890)) ([@​kovsu](https://github.com/kovsu)). - Fixed: `nesting-selector-no-missing-scoping-root` false positives for CSS-in-JS ([#​8905](stylelint/stylelint#8905)) ([@​kovsu](https://github.com/kovsu)). - Fixed: `no-invalid-position-declaration` false negatives for embedded blocks ([#​8907](stylelint/stylelint#8907)) ([@​kovsu](https://github.com/kovsu)). - Fixed: `selector-no-qualifying-type` false negatives for `:is/where()` ([#​8940](stylelint/stylelint#8940)) ([@​romainmenke](https://github.com/romainmenke)). - Fixed: `selector-type-no-unknown` false positives for MathML 4 tags ([#​8874](stylelint/stylelint#8874)) ([@​jeddy3](https://github.com/jeddy3)). </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS42MS4wIiwidXBkYXRlZEluVmVyIjoiNDEuNjEuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> Reviewed-on: https://git.robbevp.be/robbevp/website-robbevanpetegem/pulls/504 Co-authored-by: Renovate Bot <renovate@robbevp.be> Co-committed-by: Renovate Bot <renovate@robbevp.be>
Closes #8927
These cases added some complexity:
I didn't see a way to traverse all tag names in the original AST and do checks from there.
I ended up first building all compounds as a new AST:
:is(a, [attribute]):is(b, .class)->ab, a.class, ba, b[attribute](abare two nodes in the AST)This new AST can be traversed top down in a single pass.
Because of all the AST mutations I also changed the message.
The message now reports the tag name and the original compound, not the computed compound.
When nesting, this original compound will be from the resolved selector.
atag name[attribute]:is(div a)compoundbtag name:is(a, [attribute]):is(b, .class)compoundatag name:is(a, [attribute]):is(b, .class)compoundThe report range will be that of only the tag name.