@@ -88,6 +88,41 @@ namespace Sass {
88
88
}
89
89
// EO isMsFilterStart
90
90
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
+
91
126
// Helper function for debugging
92
127
// ToDo return EnvKey?
93
128
const sass::string& getColorArgName (
@@ -875,6 +910,7 @@ namespace Sass {
875
910
{
876
911
const Color* color = arguments[0 ]->assertColor (compiler, Strings::color);
877
912
const Number* degrees = arguments[1 ]->assertNumber (compiler, Strings::degrees);
913
+ checkAngle (compiler, degrees, Strings::degrees);
878
914
ColorHslaObj copy (color->copyAsHSLA ()); // Must make a copy!
879
915
copy->h (absmod (copy->h () + degrees->value (), 360.0 ));
880
916
return copy.detach ();
@@ -1162,6 +1198,10 @@ namespace Sass {
1162
1198
Number* nr_wn = getKwdArg (keywords, key_whiteness, compiler);
1163
1199
Number* nr_bn = getKwdArg (keywords, key_blackness, compiler);
1164
1200
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
+
1165
1205
double r = nr_r ? nr_r->assertRange (-255.0 , 255.0 , compiler, Strings::red) : 0.0 ;
1166
1206
double g = nr_g ? nr_g->assertRange (-255.0 , 255.0 , compiler, Strings::green) : 0.0 ;
1167
1207
double b = nr_b ? nr_b->assertRange (-255.0 , 255.0 , compiler, Strings::blue) : 0.0 ;
@@ -1249,6 +1289,8 @@ namespace Sass {
1249
1289
Number* nr_wn = getKwdArg (keywords, key_whiteness, compiler);
1250
1290
Number* nr_bn = getKwdArg (keywords, key_blackness, compiler);
1251
1291
1292
+ if (nr_h) checkAngle (compiler, nr_h, Strings::hue);
1293
+
1252
1294
double r = nr_r ? nr_r->assertRange (0.0 , 255.0 , compiler, Strings::red) : 0.0 ;
1253
1295
double g = nr_g ? nr_g->assertRange (0.0 , 255.0 , compiler, Strings::green) : 0.0 ;
1254
1296
double b = nr_b ? nr_b->assertRange (0.0 , 255.0 , compiler, Strings::blue) : 0.0 ;
@@ -1681,10 +1723,14 @@ namespace Sass {
1681
1723
return SASS_MEMORY_NEW (String, pstate, fncall.str ());
1682
1724
}
1683
1725
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);
1688
1734
1689
1735
return SASS_MEMORY_NEW (ColorHsla, pstate,
1690
1736
h->value (),
0 commit comments