diff --git a/CHANGELOG.md b/CHANGELOG.md index 90ae1f278..7d4653894 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.79.6 + +* Fix a bug where Sass would add an extra `*/` after loud comments with + whitespace after an explicit `*/` in the indented syntax. + +* **Potentially breaking bug fxi:** Adding text after an explicit `*/` in the + indented syntax is now an error, rather than silently generating invalid CSS. + ## 1.79.5 * Changes to how `selector.unify()` and `@extend` combine selectors: diff --git a/lib/src/parse/parser.dart b/lib/src/parse/parser.dart index 49dd72fe4..8efbbe772 100644 --- a/lib/src/parse/parser.dart +++ b/lib/src/parse/parser.dart @@ -719,14 +719,6 @@ class Parser { throwWithTrace(map.mapException(error), error, stackTrace); } - } on SourceSpanFormatException catch (error, stackTrace) { - var span = error.span as FileSpan; - if (startsWithIgnoreCase(error.message, "expected")) { - span = _adjustExceptionSpan(span); - } - - throwWithTrace( - SassFormatException(error.message, span), error, stackTrace); } on MultiSourceSpanFormatException catch (error, stackTrace) { var span = error.span as FileSpan; var secondarySpans = error.secondarySpans.cast(); @@ -743,6 +735,14 @@ class Parser { error.message, span, error.primaryLabel, secondarySpans), error, stackTrace); + } on SourceSpanFormatException catch (error, stackTrace) { + var span = error.span as FileSpan; + if (startsWithIgnoreCase(error.message, "expected")) { + span = _adjustExceptionSpan(span); + } + + throwWithTrace( + SassFormatException(error.message, span), error, stackTrace); } } diff --git a/lib/src/parse/sass.dart b/lib/src/parse/sass.dart index ba9e22411..8b072c914 100644 --- a/lib/src/parse/sass.dart +++ b/lib/src/parse/sass.dart @@ -6,6 +6,7 @@ import 'package:charcode/charcode.dart'; import 'package:string_scanner/string_scanner.dart'; import '../ast/sass.dart'; +import '../exception.dart'; import '../interpolation_buffer.dart'; import '../util/character.dart'; import '../value.dart'; @@ -216,6 +217,7 @@ class SassParser extends StylesheetParser { scanner.expect("/*"); var first = true; + var closed = false; var buffer = InterpolationBuffer()..write("/*"); var parentIndentation = currentIndentation; while (true) { @@ -253,6 +255,41 @@ class SassParser extends StylesheetParser { buffer.writeCharCode(scanner.readChar()); } + case $asterisk: + if (scanner.peekChar(1) == $slash) { + buffer.writeCharCode(scanner.readChar()); + buffer.writeCharCode(scanner.readChar()); + var span = scanner.spanFrom(start); + whitespace(); + + // For backwards compatibility, allow additional comments after + // the initial comment is closed. + while (scanner.peekChar().isNewline && _peekIndentation() > parentIndentation) { + while (_lookingAtDoubleNewline()) { + _expectNewline(); + } + _readIndentation(); + whitespace(); + } + + if (!scanner.peekChar().isNewline) { + var errorStart = scanner.state; + while (!scanner.isDone && !scanner.peekChar().isNewline) { + scanner.readChar(); + } + throw new MultiSpanSassFormatException( + "Unexpected text after end of comment", + scanner.spanFrom(errorStart), + "extra text", + {span: "comment"} + ); + } else { + return LoudComment(buffer.interpolation(span)); + } + } else { + buffer.writeCharCode(scanner.readChar()); + } + case _: buffer.writeCharCode(scanner.readChar()); } diff --git a/pubspec.yaml b/pubspec.yaml index fd1b48e60..eb3df9023 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: sass -version: 1.79.5 +version: 1.79.6-dev description: A Sass implementation in Dart. homepage: https://github.com/sass/dart-sass