From 997e068499d709929eb62a7a610615122c218d2c Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Fri, 17 Aug 2018 13:32:10 -0700 Subject: [PATCH] Add support for extending selector lists (#455) Closes #452 --- CHANGELOG.md | 6 ++++- lib/src/visitor/async_evaluate.dart | 36 ++++++++++++++++------------- lib/src/visitor/evaluate.dart | 36 ++++++++++++++++------------- pubspec.yaml | 2 +- 4 files changed, 46 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e5733fd0..040050567 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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. diff --git a/lib/src/visitor/async_evaluate.dart b/lib/src/visitor/async_evaluate.dart index b77f91f2f..82ef41bbe 100644 --- a/lib/src/visitor/async_evaluate.dart +++ b/lib/src/visitor/async_evaluate.dart @@ -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; } diff --git a/lib/src/visitor/evaluate.dart b/lib/src/visitor/evaluate.dart index e29c98a14..0ab08900c 100644 --- a/lib/src/visitor/evaluate.dart +++ b/lib/src/visitor/evaluate.dart @@ -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; @@ -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; } diff --git a/pubspec.yaml b/pubspec.yaml index 92adb98cc..67335509d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: sass -version: 1.12.1-dev +version: 1.13.0 description: A Sass implementation in Dart. author: Dart Team homepage: https://github.com/sass/dart-sass