Skip to content

Commit 0a62c90

Browse files
committed
Coerce numbers in for ranges if possible
1 parent bdd8a5e commit 0a62c90

File tree

3 files changed

+16
-1
lines changed

3 files changed

+16
-1
lines changed

src/ast_values.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,14 @@ namespace Sass {
10961096
return this;
10971097
}
10981098

1099+
Number* Number::coerce(Logger& logger, Number& lhs)
1100+
{
1101+
if (this->Units::operator==(lhs)) return this;
1102+
double factor = getUnitConversionFactor(lhs);
1103+
if (factor == 0.0) throw Exception::UnitMismatch(logger, lhs, *this);
1104+
return SASS_MEMORY_NEW(Number, pstate(), value() * factor, lhs);
1105+
}
1106+
10991107
/////////////////////////////////////////////////////////////////////////
11001108
// Implement delayed value fetcher
11011109
/////////////////////////////////////////////////////////////////////////

src/ast_values.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,8 @@ namespace Sass {
399399
value_ *= this->Units::normalize();
400400
}
401401

402+
Number* coerce(Logger& logger, Number& rhs);
403+
402404
// Implement delayed value fetcher
403405
Value* withoutSlash() override final;
404406

src/eval.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1470,7 +1470,7 @@ namespace Sass {
14701470
}
14711471

14721472
/*
1473-
1473+
14741474
/// Whether this node has a visible sibling after it.
14751475
bool get hasFollowingSibling {
14761476
if (_parent == null) return false;
@@ -2004,6 +2004,11 @@ namespace Sass {
20042004
ValueObj high = f->upper_bound()->accept(this);
20052005
NumberObj sass_start = low->assertNumber(logger456, "");
20062006
NumberObj sass_end = high->assertNumber(logger456, "");
2007+
// Support compatible unit types (e.g. cm to mm)
2008+
sass_end = sass_end->coerce(logger456, sass_start);
2009+
// Can only use integer ranges
2010+
sass_start->assertInt(logger456);
2011+
sass_end->assertInt(logger456);
20072012
// check if units are valid for sequence
20082013
if (sass_start->unit() != sass_end->unit()) {
20092014
callStackFrame csf(logger456, f->pstate());

0 commit comments

Comments
 (0)