Skip to content

Commit 6e2d637

Browse files
authored
Allow adjacent forward slashes in plain CSS expressions (#2190)
See sass/sass#3797
1 parent fa4d909 commit 6e2d637

File tree

4 files changed

+21
-4
lines changed

4 files changed

+21
-4
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
## 1.72.0
22

3+
* Support adjacent `/`s without whitespace in between when parsing plain CSS
4+
expressions.
5+
36
* Allow the Node.js `pkg:` importer to load Sass stylesheets for `package.json`
47
`exports` field entries without extensions.
58

lib/src/parse/css.dart

+3-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ class CssParser extends ScssParser {
3232

3333
CssParser(super.contents, {super.url, super.logger});
3434

35-
void silentComment() {
35+
bool silentComment() {
36+
if (inExpression) return false;
37+
3638
var start = scanner.state;
3739
super.silentComment();
3840
error("Silent comments aren't allowed in plain CSS.",

lib/src/parse/parser.dart

+5-3
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,7 @@ class Parser {
114114

115115
switch (scanner.peekChar(1)) {
116116
case $slash:
117-
silentComment();
118-
return true;
117+
return silentComment();
119118
case $asterisk:
120119
loudComment();
121120
return true;
@@ -135,12 +134,15 @@ class Parser {
135134
}
136135

137136
/// Consumes and ignores a silent (Sass-style) comment.
137+
///
138+
/// Returns whether the comment was consumed.
138139
@protected
139-
void silentComment() {
140+
bool silentComment() {
140141
scanner.expect("//");
141142
while (!scanner.isDone && !scanner.peekChar().isNewline) {
142143
scanner.readChar();
143144
}
145+
return true;
144146
}
145147

146148
/// Consumes and ignores a loud (CSS-style) comment.

lib/src/parse/stylesheet.dart

+10
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ abstract class StylesheetParser extends Parser {
5656
/// Whether the parser is currently within a parenthesized expression.
5757
var _inParentheses = false;
5858

59+
/// Whether the parser is currently within an expression.
60+
@protected
61+
bool get inExpression => _inExpression;
62+
var _inExpression = false;
63+
5964
/// A map from all variable names that are assigned with `!global` in the
6065
/// current stylesheet to the nodes where they're defined.
6166
///
@@ -1686,7 +1691,9 @@ abstract class StylesheetParser extends Parser {
16861691
}
16871692

16881693
var start = scanner.state;
1694+
var wasInExpression = _inExpression;
16891695
var wasInParentheses = _inParentheses;
1696+
_inExpression = true;
16901697

16911698
// We use the convention below of referring to nullable variables that are
16921699
// shared across anonymous functions in this method with a trailing
@@ -2039,11 +2046,13 @@ abstract class StylesheetParser extends Parser {
20392046
_inParentheses = wasInParentheses;
20402047
var singleExpression = singleExpression_;
20412048
if (singleExpression != null) commaExpressions.add(singleExpression);
2049+
_inExpression = wasInExpression;
20422050
return ListExpression(commaExpressions, ListSeparator.comma,
20432051
scanner.spanFrom(beforeBracket ?? start),
20442052
brackets: bracketList);
20452053
} else if (bracketList && spaceExpressions != null) {
20462054
resolveOperations();
2055+
_inExpression = wasInExpression;
20472056
return ListExpression(spaceExpressions..add(singleExpression_!),
20482057
ListSeparator.space, scanner.spanFrom(beforeBracket!),
20492058
brackets: true);
@@ -2054,6 +2063,7 @@ abstract class StylesheetParser extends Parser {
20542063
ListSeparator.undecided, scanner.spanFrom(beforeBracket!),
20552064
brackets: true);
20562065
}
2066+
_inExpression = wasInExpression;
20572067
return singleExpression_!;
20582068
}
20592069
}

0 commit comments

Comments
 (0)