From 88e3d59037a7f93cabd24ca1b843373d4f1de591 Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Sun, 24 Apr 2022 04:06:09 +0200 Subject: [PATCH] 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 | 1 - 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(+), 10 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..50119f77d 100644 --- a/lib/src/ast/sass/import/static.dart +++ b/lib/src/ast/sass/import/static.dart @@ -36,7 +36,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(); } }