Skip to content

Commit

Permalink
Sqrt calc function implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
pamelalozano16 committed May 19, 2023
1 parent eb18526 commit e3e91d7
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 1 deletion.
4 changes: 4 additions & 0 deletions lib/src/ast/sass/expression/calculation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ class CalculationExpression implements Expression {
}
}

/// Returns a `sqrt()` calculation expression.
CalculationExpression.sqrt(Expression argument, FileSpan span)
: this("sqrt", [argument], span);

/// Returns a `clamp()` calculation expression.
CalculationExpression.clamp(
Expression min, Expression value, Expression max, FileSpan span)
Expand Down
1 change: 1 addition & 0 deletions lib/src/parse/stylesheet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2894,6 +2894,7 @@ abstract class StylesheetParser extends Parser {
assert(scanner.peekChar() == $lparen);
switch (name) {
case "calc":
case "sqrt":
var arguments = _calculationArguments(1);
return CalculationExpression(name, arguments, scanner.spanFrom(start));

Expand Down
20 changes: 20 additions & 0 deletions lib/src/value/calculation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import '../utils.dart';
import '../value.dart';
import '../visitor/interface/value.dart';
import '../visitor/serialize.dart';
import 'dart:math' as math;

/// A SassScript calculation.
///
Expand Down Expand Up @@ -120,6 +121,25 @@ class SassCalculation extends Value {
return SassCalculation._("max", args);
}

/// Creates a `sqrt()` calculation with the given [argument].
///
/// Each argument must be either a [SassNumber], a [SassCalculation], an
/// unquoted [SassString], a [CalculationOperation], or a
/// [CalculationInterpolation]. It must be passed at least one argument.
///
/// This automatically simplifies the calculation, so it may return a
/// [SassNumber] rather than a [SassCalculation]. It throws an exception if it
/// can determine that the calculation will definitely produce invalid CSS.
static Value sqrt(Object argument) {
argument = _simplify(argument);
if (argument is! SassNumber) {
return SassCalculation.sqrt(argument);
}
argument.assertNoUnits();

return SassNumber(math.sqrt(argument.value));
}

/// Creates a `clamp()` calculation with the given [min], [value], and [max].
///
/// Each argument must be either a [SassNumber], a [SassCalculation], an
Expand Down
5 changes: 4 additions & 1 deletion lib/src/visitor/async_evaluate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2292,7 +2292,7 @@ class _EvaluateVisitor
var arguments = [
for (var argument in node.arguments)
await _visitCalculationValue(argument,
inMinMax: node.name == 'min' || node.name == 'max')
inMinMax: {'min', 'max', 'sqrt'}.contains(node.name))
];
if (_inSupportsDeclaration) {
return SassCalculation.unsimplified(node.name, arguments);
Expand All @@ -2303,6 +2303,9 @@ class _EvaluateVisitor
case "calc":
assert(arguments.length == 1);
return SassCalculation.calc(arguments[0]);
case "sqrt":
assert(arguments.length == 1);
return SassCalculation.sqrt(arguments[0]);
case "min":
return SassCalculation.min(arguments);
case "max":
Expand Down

0 comments on commit e3e91d7

Please sign in to comment.