Skip to content

Commit

Permalink
Add support for extending selector lists (#455)
Browse files Browse the repository at this point in the history
Closes #452
  • Loading branch information
nex3 authored Aug 17, 2018
1 parent 677d781 commit 997e068
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 34 deletions.
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
## 1.12.1
## 1.13.0

* Allow `@extend` to be used with multiple comma-separated simple selectors.
This is already supported by other implementations, but fell through the
cracks for Dart Sass until now.

* Don't crash when a media rule contains another media rule followed by a style
rule.
Expand Down
36 changes: 20 additions & 16 deletions lib/src/visitor/async_evaluate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -580,29 +580,33 @@ class _EvaluateVisitor
var targetText =
await _interpolationToValue(node.selector, warnForColor: true);

var target = _adjustParseError(targetText.span, () {
try {
return new SimpleSelector.parse(targetText.value.trim(),
logger: _logger, allowParent: false);
} on SassFormatException catch (error) {
CompoundSelector compound;
try {
compound = new CompoundSelector.parse(targetText.value.trim(),
logger: _logger, allowParent: false);
} on SassFormatException {
throw error;
}

var list = _adjustParseError(
targetText.span,
() => new SelectorList.parse(targetText.value.trim(),
logger: _logger, allowParent: false));

for (var complex in list.components) {
if (complex.components.length != 1 ||
complex.components.first is! CompoundSelector) {
// If the selector was a compound selector but not a simple
// selector, emit a more explicit error.
throw new SassFormatException(
"complex selectors may not be extended.", targetText.span);
}

var compound = complex.components.first as CompoundSelector;
if (compound.components.length != 1) {
throw new SassFormatException(
"compound selectors may longer be extended.\n"
"Consider `@extend ${compound.components.join(', ')}` instead.\n"
"See http://bit.ly/ExtendCompound for details.\n",
error.span);
targetText.span);
}
});
_extender.addExtension(_styleRule.selector, target, node, _mediaQueries);

_extender.addExtension(
_styleRule.selector, compound.components.first, node, _mediaQueries);
}

return null;
}

Expand Down
36 changes: 20 additions & 16 deletions lib/src/visitor/evaluate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
// DO NOT EDIT. This file was generated from async_evaluate.dart.
// See tool/synchronize.dart for details.
//
// Checksum: 2bf89d853d3acfa3d7215dc7a6d43aefe0397519
// Checksum: 11e77e1df658d69b4ecab6447225f79c358db535

import 'async_evaluate.dart' show EvaluateResult;
export 'async_evaluate.dart' show EvaluateResult;
Expand Down Expand Up @@ -581,29 +581,33 @@ class _EvaluateVisitor

var targetText = _interpolationToValue(node.selector, warnForColor: true);

var target = _adjustParseError(targetText.span, () {
try {
return new SimpleSelector.parse(targetText.value.trim(),
logger: _logger, allowParent: false);
} on SassFormatException catch (error) {
CompoundSelector compound;
try {
compound = new CompoundSelector.parse(targetText.value.trim(),
logger: _logger, allowParent: false);
} on SassFormatException {
throw error;
}
var list = _adjustParseError(
targetText.span,
() => new SelectorList.parse(targetText.value.trim(),
logger: _logger, allowParent: false));

for (var complex in list.components) {
if (complex.components.length != 1 ||
complex.components.first is! CompoundSelector) {
// If the selector was a compound selector but not a simple
// selector, emit a more explicit error.
throw new SassFormatException(
"complex selectors may not be extended.", targetText.span);
}

var compound = complex.components.first as CompoundSelector;
if (compound.components.length != 1) {
throw new SassFormatException(
"compound selectors may longer be extended.\n"
"Consider `@extend ${compound.components.join(', ')}` instead.\n"
"See http://bit.ly/ExtendCompound for details.\n",
error.span);
targetText.span);
}
});
_extender.addExtension(_styleRule.selector, target, node, _mediaQueries);

_extender.addExtension(
_styleRule.selector, compound.components.first, node, _mediaQueries);
}

return null;
}

Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: sass
version: 1.12.1-dev
version: 1.13.0
description: A Sass implementation in Dart.
author: Dart Team <[email protected]>
homepage: https://github.com/sass/dart-sass
Expand Down

0 comments on commit 997e068

Please sign in to comment.