Skip to content

Commit 5f7fcea

Browse files
committed
Implement new deprecation warnings
1 parent 70fa64f commit 5f7fcea

File tree

2 files changed

+57
-5
lines changed

2 files changed

+57
-5
lines changed

src/ast_values.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1089,8 +1089,14 @@ namespace Sass {
10891089
{
10901090
if (!hasUnit("%")) {
10911091
sass::sstream msg;
1092+
StringVector dif(numerators);
1093+
StringVector mul(denominators);
1094+
// ToDo: don't report percentage twice!?
1095+
for (auto& unit : mul) unit = " * 1" + unit;
1096+
for (auto& unit : dif) unit = " / 1" + unit;
1097+
sass::string reunit(StringUtils::join(mul, "") + StringUtils::join(dif, ""));
10921098
msg << "$" << name << ": Passing a number without unit % (" << inspect() << ") is deprecated." << STRMLF;
1093-
msg << "To preserve current behavior: $" << name << " * 1%" << STRMLF;
1099+
msg << "To preserve current behavior: $" << name << reunit << " * 1%" << STRMLF;
10941100
logger.addDeprecation(msg.str(), pstate());
10951101
}
10961102
return this;

src/fn_colors.cpp

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,41 @@ namespace Sass {
8888
}
8989
// EO isMsFilterStart
9090

91+
/// Prints a deprecation warning if [hue] has a unit other than `deg`.
92+
void checkAngle(Logger& logger, const Number* angle, const sass::string& name)
93+
{
94+
95+
if (!angle->hasUnits() || angle->hasUnit("deg")) return;
96+
97+
sass::sstream message;
98+
message << "$" << name << ": Passing a unit other than deg (";
99+
message << angle->inspect() << ") is deprecated." << STRMLF;
100+
101+
if (angle->numerators.size() == 1 && angle->denominators.size() == 0 &&
102+
get_unit_class(string_to_unit(angle->numerators[0])) == UnitClass::ANGLE)
103+
{
104+
double coerced = angle->getUnitConversionFactor(Strings::deg) * angle->value();
105+
Number correct(angle->pstate(), coerced, "deg");
106+
Number wrong(angle->pstate(), angle->value(), "deg");
107+
message << "You're passing " << angle->inspect() << ", which is currently (incorrectly) converted to " << wrong.inspect() << "." << STRMLF;
108+
message << "Soon, it will instead be correctly converted to " << correct.inspect() << "." << STRMLF << STRMLF;
109+
message << "To preserve current behavior: $" << name << " * 1deg/1" << angle->numerators[0] << STRMLF;
110+
message << "To migrate to new behavior: 0deg + $" << name << STRMLF;
111+
}
112+
else {
113+
StringVector dif(angle->numerators);
114+
StringVector mul(angle->denominators);
115+
// ToDo: don't report percentage twice!?
116+
for (auto& unit : mul) unit = " * 1" + unit;
117+
for (auto& unit : dif) unit = " / 1" + unit;
118+
message << STRMLF << "To preserve current behavior: $" << name
119+
<< StringUtils::join(mul, "") << StringUtils::join(dif, "") << STRMLF;
120+
}
121+
122+
message << STRMLF << "See https://sass-lang.com/d/color-units" << STRMLF;
123+
logger.addDeprecation(message.str(), angle->pstate());
124+
}
125+
91126
// Helper function for debugging
92127
// ToDo return EnvKey?
93128
const sass::string& getColorArgName(
@@ -875,6 +910,7 @@ namespace Sass {
875910
{
876911
const Color* color = arguments[0]->assertColor(compiler, Strings::color);
877912
const Number* degrees = arguments[1]->assertNumber(compiler, Strings::degrees);
913+
checkAngle(compiler, degrees, Strings::degrees);
878914
ColorHslaObj copy(color->copyAsHSLA()); // Must make a copy!
879915
copy->h(absmod(copy->h() + degrees->value(), 360.0));
880916
return copy.detach();
@@ -1162,6 +1198,10 @@ namespace Sass {
11621198
Number* nr_wn = getKwdArg(keywords, key_whiteness, compiler);
11631199
Number* nr_bn = getKwdArg(keywords, key_blackness, compiler);
11641200

1201+
if (nr_h) checkAngle(compiler, nr_h, Strings::hue);
1202+
if (nr_s) nr_s->checkPercent(compiler, Strings::saturation);
1203+
if (nr_l) nr_l->checkPercent(compiler, Strings::lightness);
1204+
11651205
double r = nr_r ? nr_r->assertRange(-255.0, 255.0, compiler, Strings::red) : 0.0;
11661206
double g = nr_g ? nr_g->assertRange(-255.0, 255.0, compiler, Strings::green) : 0.0;
11671207
double b = nr_b ? nr_b->assertRange(-255.0, 255.0, compiler, Strings::blue) : 0.0;
@@ -1249,6 +1289,8 @@ namespace Sass {
12491289
Number* nr_wn = getKwdArg(keywords, key_whiteness, compiler);
12501290
Number* nr_bn = getKwdArg(keywords, key_blackness, compiler);
12511291

1292+
if (nr_h) checkAngle(compiler, nr_h, Strings::hue);
1293+
12521294
double r = nr_r ? nr_r->assertRange(0.0, 255.0, compiler, Strings::red) : 0.0;
12531295
double g = nr_g ? nr_g->assertRange(0.0, 255.0, compiler, Strings::green) : 0.0;
12541296
double b = nr_b ? nr_b->assertRange(0.0, 255.0, compiler, Strings::blue) : 0.0;
@@ -1681,10 +1723,14 @@ namespace Sass {
16811723
return SASS_MEMORY_NEW(String, pstate, fncall.str());
16821724
}
16831725

1684-
const Number* h = _h->assertNumber(logger, Strings::hue);
1685-
const Number* s = _s->assertNumber(logger, Strings::saturation)->checkPercent(logger, Strings::saturation);
1686-
const Number* l = _l->assertNumber(logger, Strings::lightness)->checkPercent(logger, Strings::lightness);
1687-
const Number* a = _a ? _a->assertNumber(logger, Strings::alpha) : nullptr;
1726+
Number* h = _h->assertNumber(logger, Strings::hue);
1727+
Number* s = _s->assertNumber(logger, Strings::saturation);
1728+
Number* l = _l->assertNumber(logger, Strings::lightness);
1729+
Number* a = _a ? _a->assertNumber(logger, Strings::alpha) : nullptr;
1730+
1731+
checkAngle(logger, h, Strings::hue);
1732+
s->checkPercent(logger, Strings::saturation);
1733+
l->checkPercent(logger, Strings::lightness);
16881734

16891735
return SASS_MEMORY_NEW(ColorHsla, pstate,
16901736
h->value(),

0 commit comments

Comments
 (0)