From 90ee4ef58014c5a4c9956ff5ecb9eda589174112 Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Sun, 24 Apr 2022 04:06:09 +0200 Subject: [PATCH 1/2] Fix the string representations of the Sass AST Those are used when providing recommendations in warnings or errors, so it is better if they produce valid code. --- lib/src/ast/sass/argument_declaration.dart | 4 ++-- lib/src/ast/sass/argument_invocation.dart | 2 +- lib/src/ast/sass/expression/list.dart | 4 ++-- lib/src/ast/sass/import/static.dart | 2 -- lib/src/ast/sass/statement/declaration.dart | 17 +++++++++++++++++ lib/src/ast/sass/statement/extend_rule.dart | 2 +- lib/src/ast/sass/statement/if_rule.dart | 2 +- .../sass/statement/variable_declaration.dart | 4 ++-- 8 files changed, 26 insertions(+), 11 deletions(-) diff --git a/lib/src/ast/sass/argument_declaration.dart b/lib/src/ast/sass/argument_declaration.dart index 9d26652d6..5e1ac5932 100644 --- a/lib/src/ast/sass/argument_declaration.dart +++ b/lib/src/ast/sass/argument_declaration.dart @@ -161,7 +161,7 @@ class ArgumentDeclaration implements SassNode { } String toString() => [ - for (var arg in arguments) arg.toString(), - if (restArgument != null) '$restArgument...' + for (var arg in arguments) '\$$arg', + if (restArgument != null) '\$$restArgument...' ].join(', '); } diff --git a/lib/src/ast/sass/argument_invocation.dart b/lib/src/ast/sass/argument_invocation.dart index b8edac92d..25af571cd 100644 --- a/lib/src/ast/sass/argument_invocation.dart +++ b/lib/src/ast/sass/argument_invocation.dart @@ -48,7 +48,7 @@ class ArgumentInvocation implements SassNode { String toString() { var components = [ ...positional, - for (var name in named.keys) "$name: ${named[name]}", + for (var name in named.keys) "\$$name: ${named[name]}", if (rest != null) "$rest...", if (keywordRest != null) "$keywordRest..." ]; diff --git a/lib/src/ast/sass/expression/list.dart b/lib/src/ast/sass/expression/list.dart index 4b2e41477..53a10f3fc 100644 --- a/lib/src/ast/sass/expression/list.dart +++ b/lib/src/ast/sass/expression/list.dart @@ -53,8 +53,8 @@ class ListExpression implements Expression { if (expression.contents.length < 2) return false; if (expression.hasBrackets) return false; return separator == ListSeparator.comma - ? separator == ListSeparator.comma - : separator != ListSeparator.undecided; + ? expression.separator == ListSeparator.comma + : expression.separator != ListSeparator.undecided; } if (separator != ListSeparator.space) return false; diff --git a/lib/src/ast/sass/import/static.dart b/lib/src/ast/sass/import/static.dart index 655220800..6388a5cbd 100644 --- a/lib/src/ast/sass/import/static.dart +++ b/lib/src/ast/sass/import/static.dart @@ -3,7 +3,6 @@ // https://opensource.org/licenses/MIT. import 'package:meta/meta.dart'; -import 'package:charcode/charcode.dart'; import 'package:source_span/source_span.dart'; import '../import.dart'; @@ -36,7 +35,6 @@ class StaticImport implements Import { var buffer = StringBuffer(url); if (supports != null) buffer.write(" supports($supports)"); if (media != null) buffer.write(" $media"); - buffer.writeCharCode($semicolon); return buffer.toString(); } } diff --git a/lib/src/ast/sass/statement/declaration.dart b/lib/src/ast/sass/statement/declaration.dart index 6122fba18..1f55e22a2 100644 --- a/lib/src/ast/sass/statement/declaration.dart +++ b/lib/src/ast/sass/statement/declaration.dart @@ -2,6 +2,7 @@ // MIT-style license that can be found in the LICENSE file or at // https://opensource.org/licenses/MIT. +import 'package:charcode/charcode.dart'; import 'package:meta/meta.dart'; import 'package:source_span/source_span.dart'; @@ -62,4 +63,20 @@ class Declaration extends ParentStatement { } T accept(StatementVisitor visitor) => visitor.visitDeclaration(this); + + String toString() { + var buffer = StringBuffer(); + buffer.write(name); + buffer.writeCharCode($colon); + + if (value != null) { + if (!isCustomProperty) { + buffer.writeCharCode($space); + } + buffer.write("$value"); + } + + var children = this.children; + return children == null ? "$buffer;" : "$buffer {${children.join(" ")}}"; + } } diff --git a/lib/src/ast/sass/statement/extend_rule.dart b/lib/src/ast/sass/statement/extend_rule.dart index e82866e7f..7ba9f0c8c 100644 --- a/lib/src/ast/sass/statement/extend_rule.dart +++ b/lib/src/ast/sass/statement/extend_rule.dart @@ -32,5 +32,5 @@ class ExtendRule implements Statement { T accept(StatementVisitor visitor) => visitor.visitExtendRule(this); - String toString() => "@extend $selector"; + String toString() => "@extend $selector${isOptional ? ' !optional' : ''};"; } diff --git a/lib/src/ast/sass/statement/if_rule.dart b/lib/src/ast/sass/statement/if_rule.dart index 5ec8ec918..056cbd9f8 100644 --- a/lib/src/ast/sass/statement/if_rule.dart +++ b/lib/src/ast/sass/statement/if_rule.dart @@ -44,7 +44,7 @@ class IfRule implements Statement { String toString() { var result = clauses .mapIndexed((index, clause) => - "@${index == 0 ? 'if' : 'else if'} {${clause.children.join(' ')}}") + "@${index == 0 ? 'if' : 'else if'} ${clause.expression} {${clause.children.join(' ')}}") .join(' '); var lastClause = this.lastClause; diff --git a/lib/src/ast/sass/statement/variable_declaration.dart b/lib/src/ast/sass/statement/variable_declaration.dart index 16e2c8e21..a82401b0a 100644 --- a/lib/src/ast/sass/statement/variable_declaration.dart +++ b/lib/src/ast/sass/statement/variable_declaration.dart @@ -90,9 +90,9 @@ class VariableDeclaration implements Statement, SassDeclaration { visitor.visitVariableDeclaration(this); String toString() { - var buffer = StringBuffer("\$"); + var buffer = StringBuffer(); if (namespace != null) buffer.write("$namespace."); - buffer.write("$name: $expression;"); + buffer.write("\$$name: $expression;"); return buffer.toString(); } } From fb9b279f79dacf4e800fc5e7a0b1476bd5c984bb Mon Sep 17 00:00:00 2001 From: Jennifer Thakar Date: Mon, 25 Apr 2022 16:46:09 -0700 Subject: [PATCH 2/2] Add changelog --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53e6dfaeb..454cda4e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.50.2 + +* Improve the string output of some AST nodes in error messages. + ## 1.50.1 ### Embedded Sass diff --git a/pubspec.yaml b/pubspec.yaml index 4d5a38985..bdc03da67 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: sass -version: 1.50.1 +version: 1.50.2-dev description: A Sass implementation in Dart. homepage: https://github.com/sass/dart-sass