Skip to content

Commit 713b7cc

Browse files
authored
Properly register pseudos' child selectors in ExtensionStore (#1374)
Closes #1297
1 parent 3918aef commit 713b7cc

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
URLs (those that begin with `/`) in `@import` rules would be passed to
1414
both Dart and JS importers as `file:` URLs.
1515

16+
* Fix an edge case where `@extend` wouldn't affect a selector within a
17+
pseudo-selector such as `:is()` that itself extended other selectors.
18+
1619
## 1.35.1
1720

1821
* Fix a bug where the quiet dependency flag didn't silence warnings in some

lib/src/extend/extension_store.dart

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -258,16 +258,12 @@ class ExtensionStore {
258258

259259
sources[complex] = extension;
260260

261-
for (var component in complex.components) {
262-
if (component is CompoundSelector) {
263-
for (var simple in component.components) {
264-
_extensionsByExtender.putIfAbsent(simple, () => []).add(extension);
265-
// Only source specificity for the original selector is relevant.
266-
// Selectors generated by `@extend` don't get new specificity.
267-
_sourceSpecificity.putIfAbsent(
268-
simple, () => complex.maxSpecificity);
269-
}
270-
}
261+
for (var simple in _simpleSelectors(complex)) {
262+
_extensionsByExtender.putIfAbsent(simple, () => []).add(extension);
263+
// Only source specificity for the original selector is relevant.
264+
// Selectors generated by `@extend` don't get new specificity.
265+
_sourceSpecificity.putIfAbsent(
266+
simple, () => complex.maxSpecificity);
271267
}
272268

273269
if (selectors != null || existingExtensions != null) {
@@ -292,6 +288,24 @@ class ExtensionStore {
292288
}
293289
}
294290

291+
/// Returns an iterable of all simple selectors in [complex]
292+
Iterable<SimpleSelector> _simpleSelectors(ComplexSelector complex) sync* {
293+
for (var component in complex.components) {
294+
if (component is CompoundSelector) {
295+
for (var simple in component.components) {
296+
yield simple;
297+
298+
if (simple is! PseudoSelector) continue;
299+
var selector = simple.selector;
300+
if (selector == null) continue;
301+
for (var complex in selector.components) {
302+
yield* _simpleSelectors(complex);
303+
}
304+
}
305+
}
306+
}
307+
}
308+
295309
/// Extend [extensions] using [newExtensions].
296310
///
297311
/// Note that this does duplicate some work done by

0 commit comments

Comments
 (0)