Skip to content

Commit 6fd0f6d

Browse files
authored
Improve the error message for extending compound selectors. (#294)
Closes #286
1 parent 2e42c74 commit 6fd0f6d

File tree

5 files changed

+49
-11
lines changed

5 files changed

+49
-11
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
* Properly parse `#{$var} -#{$var}` as two separate values in a list rather than
77
one value being subtracted from another.
88

9+
* Improve the error message for extending compound selectors.
10+
911
## 1.1.1
1012

1113
* Add a commit that was accidentally left out of 1.1.0.

lib/src/parse/selector.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class SelectorParser extends Parser {
4545
SimpleSelector parseSimpleSelector() {
4646
return wrapSpanFormatException(() {
4747
var simple = _simpleSelector();
48-
if (!scanner.isDone) scanner.error("expected selector.");
48+
if (!scanner.isDone) scanner.error("unexpected token.");
4949
return simple;
5050
});
5151
}

lib/src/visitor/async_evaluate.dart

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -537,10 +537,28 @@ class _EvaluateVisitor
537537
var targetText =
538538
await _interpolationToValue(node.selector, warnForColor: true);
539539

540-
var target = _adjustParseError(
541-
targetText.span,
542-
() => new SimpleSelector.parse(targetText.value.trim(),
543-
logger: _logger, allowParent: false));
540+
var target = _adjustParseError(targetText.span, () {
541+
try {
542+
return new SimpleSelector.parse(targetText.value.trim(),
543+
logger: _logger, allowParent: false);
544+
} on SassFormatException catch (error) {
545+
CompoundSelector compound;
546+
try {
547+
compound = new CompoundSelector.parse(targetText.value.trim(),
548+
logger: _logger, allowParent: false);
549+
} on SassFormatException {
550+
throw error;
551+
}
552+
553+
// If the selector was a compound selector but not a simple
554+
// selector, emit a more explicit error.
555+
throw new SassFormatException(
556+
"compound selectors may longer be extended.\n"
557+
"Consider `@extend ${compound.components.join(', ')}` instead.\n"
558+
"See http://bit.ly/ExtendCompound for details.\n",
559+
error.span);
560+
}
561+
});
544562
_extender.addExtension(_styleRule.selector, target, node, _mediaQueries);
545563
return null;
546564
}

lib/src/visitor/evaluate.dart

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// DO NOT EDIT. This file was generated from async_evaluate.dart.
66
// See tool/synchronize.dart for details.
77
//
8-
// Checksum: 9b5790272f09f8932a01ef9bfa0fd4ebc6b75eaa
8+
// Checksum: 3360e4065a1e1ceeabcaad34f5c09066e7d0c1d2
99

1010
import 'dart:math' as math;
1111

@@ -534,10 +534,28 @@ class _EvaluateVisitor
534534

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

537-
var target = _adjustParseError(
538-
targetText.span,
539-
() => new SimpleSelector.parse(targetText.value.trim(),
540-
logger: _logger, allowParent: false));
537+
var target = _adjustParseError(targetText.span, () {
538+
try {
539+
return new SimpleSelector.parse(targetText.value.trim(),
540+
logger: _logger, allowParent: false);
541+
} on SassFormatException catch (error) {
542+
CompoundSelector compound;
543+
try {
544+
compound = new CompoundSelector.parse(targetText.value.trim(),
545+
logger: _logger, allowParent: false);
546+
} on SassFormatException {
547+
throw error;
548+
}
549+
550+
// If the selector was a compound selector but not a simple
551+
// selector, emit a more explicit error.
552+
throw new SassFormatException(
553+
"compound selectors may longer be extended.\n"
554+
"Consider `@extend ${compound.components.join(', ')}` instead.\n"
555+
"See http://bit.ly/ExtendCompound for details.\n",
556+
error.span);
557+
}
558+
});
541559
_extender.addExtension(_styleRule.selector, target, node, _mediaQueries);
542560
return null;
543561
}

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: sass
2-
version: 1.2.0-dev
2+
version: 1.2.0
33
description: A Sass implementation in Dart.
44
author: Dart Team <[email protected]>
55
homepage: https://github.com/sass/dart-sass

0 commit comments

Comments
 (0)