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 cca9464 commit a0eace6
Show file tree
Hide file tree
Showing 7 changed files with 38 additions and 7 deletions.
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
7 changes: 2 additions & 5 deletions lib/src/functions/math.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import '../deprecation.dart';
import '../evaluation_context.dart';
import '../exception.dart';
import '../module/built_in.dart';
import '../util/number.dart';
import '../value.dart';

/// The global definitions of Sass math functions.
Expand Down Expand Up @@ -144,11 +145,7 @@ final _pow = _function("pow", r"$base, $exponent", (arguments) {

final _sqrt = _function("sqrt", r"$number", (arguments) {
var number = arguments[0].assertNumber("number");
if (number.hasUnits) {
throw SassScriptException("\$number: Expected $number to have no units.");
} else {
return SassNumber(math.sqrt(number.value));
}
return sqrt(number);
});

///
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
6 changes: 6 additions & 0 deletions lib/src/util/number.dart
Original file line number Diff line number Diff line change
Expand Up @@ -118,3 +118,9 @@ double moduloLikeSass(double num1, double num2) {
var result = num1 % num2;
return result == 0 ? 0 : result + num2;
}

/// Return square root of [number]
SassNumber sqrt(SassNumber number) {
number.assertNoUnits();
return SassNumber(math.sqrt(number.value));
}
21 changes: 19 additions & 2 deletions lib/src/value/calculation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:meta/meta.dart';

import '../exception.dart';
import '../util/nullable.dart';
import '../util/number.dart';
import '../util/number.dart' as number;
import '../utils.dart';
import '../value.dart';
import '../visitor/interface/value.dart';
Expand Down Expand Up @@ -120,6 +120,23 @@ 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]);
}
return number.sqrt(argument);
}

/// Creates a `clamp()` calculation with the given [min], [value], and [max].
///
/// Each argument must be either a [SassNumber], a [SassCalculation], an
Expand Down Expand Up @@ -202,7 +219,7 @@ class SassCalculation extends Value {

_verifyCompatibleNumbers([left, right]);

if (right is SassNumber && fuzzyLessThan(right.value, 0)) {
if (right is SassNumber && number.fuzzyLessThan(right.value, 0)) {
right = right.times(SassNumber(-1));
operator = operator == CalculationOperator.plus
? CalculationOperator.minus
Expand Down
3 changes: 3 additions & 0 deletions lib/src/visitor/async_evaluate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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
3 changes: 3 additions & 0 deletions lib/src/visitor/evaluate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2292,6 +2292,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 a0eace6

Please sign in to comment.