@@ -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