From c4e8e5cfc8821cf2c819faf1d91f96aabc4d00c9 Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Thu, 9 May 2024 17:20:05 -0700 Subject: [PATCH] [Color 4] Be stricter about slash-separated strings --- lib/src/functions/color.dart | 41 ++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/lib/src/functions/color.dart b/lib/src/functions/color.dart index 206bfb67e..2ab90895a 100644 --- a/lib/src/functions/color.dart +++ b/lib/src/functions/color.dart @@ -1269,15 +1269,18 @@ Value _parseChannels(String functionName, Value input, channels = componentList; } - for (var channel in channels) { + for (var i = 0; i < channels.length; i++) { + var channel = channels[i]; if (!channel.isSpecialNumber && channel is! SassNumber && !_isNone(channel)) { - var channelName = - space?.channels[channels.indexOf(channel)].name ?? 'channel'; + var channelName = space?.channels + .elementAtOrNull(i) + ?.name + .andThen((name) => '$name channel') ?? + 'channel ${i + 1}'; throw SassScriptException( - 'Expected $channelName channel to be a number, was $channel.', - name); + 'Expected $channelName to be a number, was $channel.', name); } } @@ -1352,16 +1355,15 @@ Value _parseChannels(String functionName, Value input, [...var initial, SassString(hasQuotes: false, :var text)] => switch ( text.split('/')) { [_] => (input, null), - [var channel3 && 'none', var alpha] || - [var channel3, var alpha && 'none'] => - switch ((_parseNumberOrNone(channel3), _parseNumberOrNone(alpha))) { - (var channel3Value?, var alphaValue?) => ( - SassList([...initial, channel3Value], ListSeparator.space), - alphaValue - ), - _ => null - }, - _ => null + [var channel3, var alpha] => ( + SassList([...initial, _parseNumberOrString(channel3)], + ListSeparator.space), + _parseNumberOrString(alpha) + ), + var components => throw SassScriptException( + "Only 2 slash-separated elements allowed, but ${components.length} " + "${pluralize('was', components.length, plural: 'were')} passed.", + name) }, [...var initial, SassNumber(asSlash: (var before, var after))] => ( SassList([...initial, before], ListSeparator.space), @@ -1370,15 +1372,12 @@ Value _parseChannels(String functionName, Value input, _ => (input, null) }; -/// Parses [text] as either a Sass number or the unquoted Sass string "none". -/// -/// If neither matches, returns null. -Value? _parseNumberOrNone(String text) { - if (text == 'none') return SassString('none', quotes: false); +/// Parses [text] as either a Sass number or an unquoted Sass string. +Value _parseNumberOrString(String text) { try { return ScssParser(text).parseNumber(); } on SassFormatException { - return null; + return SassString(text, quotes: false); } }