mirror of
https://github.com/danog/dart-sass.git
synced 2025-01-22 05:41:14 +01:00
Improve handling of invalid semicolons in the indented syntax (#330)
This improves the error message and fixes a bug where semicolons were allowed after declarations.
This commit is contained in:
parent
7c26959156
commit
8007892075
@ -1,5 +1,9 @@
|
||||
## 1.4.0
|
||||
|
||||
* Improve the error message for invalid semicolons in the indented syntax.
|
||||
|
||||
* Properly disallow semicolons after declarations in the indented syntax.
|
||||
|
||||
### Command-Line Interface
|
||||
|
||||
* Add support for compiling multiple files at once by writing
|
||||
|
@ -54,17 +54,13 @@ class SassParser extends StylesheetParser {
|
||||
}
|
||||
|
||||
void expectStatementSeparator([String name]) {
|
||||
if (!atEndOfStatement()) scanner.expectChar($lf);
|
||||
if (!atEndOfStatement()) _expectNewline();
|
||||
if (_peekIndentation() <= currentIndentation) return;
|
||||
scanner.error(
|
||||
"Nothing may be indented ${name == null ? 'here' : 'beneath a $name'}.",
|
||||
position: _nextIndentationEnd.position);
|
||||
}
|
||||
|
||||
void expectSemicolon(String name) {
|
||||
if (!atEndOfStatement()) scanner.expectChar($lf);
|
||||
}
|
||||
|
||||
bool atEndOfStatement() {
|
||||
var next = scanner.peekChar();
|
||||
return next == null || isNewline(next);
|
||||
@ -295,6 +291,20 @@ class SassParser extends StylesheetParser {
|
||||
}
|
||||
}
|
||||
|
||||
/// Expect and consume a single newline character.
|
||||
void _expectNewline() {
|
||||
switch (scanner.peekChar()) {
|
||||
case $semicolon:
|
||||
scanner.error("semicolons aren't allowed in the indented syntax.");
|
||||
return;
|
||||
case $lf:
|
||||
scanner.readChar();
|
||||
return;
|
||||
default:
|
||||
scanner.error("expected newline.");
|
||||
}
|
||||
}
|
||||
|
||||
/// As long as the scanner's position is indented beneath the starting line,
|
||||
/// runs [body] to consume the next statement.
|
||||
void _whileIndentedLower(void body()) {
|
||||
|
@ -304,12 +304,12 @@ abstract class StylesheetParser extends Parser {
|
||||
// Properties that are ambiguous with selectors can't have additional
|
||||
// properties nested beneath them, so we force an error. This will be
|
||||
// caught below and cause the text to be reparsed as a selector.
|
||||
if (couldBeSelector) scanner.expectChar($semicolon);
|
||||
if (couldBeSelector) expectStatementSeparator();
|
||||
} else if (!atEndOfStatement()) {
|
||||
// Force an exception if there isn't a valid end-of-property character
|
||||
// but don't consume that character. This will also cause the text to be
|
||||
// reparsed.
|
||||
scanner.expectChar($semicolon);
|
||||
expectStatementSeparator();
|
||||
}
|
||||
} on FormatException catch (_) {
|
||||
if (!couldBeSelector) rethrow;
|
||||
|
Loading…
x
Reference in New Issue
Block a user