Skip to content

Commit 77eb142

Browse files
committed
Merge pull request #1989 from mgreter/feature/pseudo-selector-compare
Implement compare methods for `Pseudo_Selector`
2 parents c624d6e + 2a94073 commit 77eb142

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

src/ast.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ namespace Sass {
209209

210210
bool Simple_Selector::operator== (const Simple_Selector& rhs) const
211211
{
212+
if (const Pseudo_Selector* lp = dynamic_cast<const Pseudo_Selector*>(this)) return *lp == rhs;
212213
if (const Wrapped_Selector* lw = dynamic_cast<const Wrapped_Selector*>(this)) return *lw == rhs;
213214
if (const Attribute_Selector* la = dynamic_cast<const Attribute_Selector*>(this)) return *la == rhs;
214215
if (is_ns_eq(ns(), rhs.ns()))
@@ -218,6 +219,7 @@ namespace Sass {
218219

219220
bool Simple_Selector::operator< (const Simple_Selector& rhs) const
220221
{
222+
if (const Pseudo_Selector* lp = dynamic_cast<const Pseudo_Selector*>(this)) return *lp == rhs;
221223
if (const Wrapped_Selector* lw = dynamic_cast<const Wrapped_Selector*>(this)) return *lw < rhs;
222224
if (const Attribute_Selector* la = dynamic_cast<const Attribute_Selector*>(this)) return *la < rhs;
223225
if (is_ns_eq(ns(), rhs.ns()))
@@ -481,6 +483,49 @@ namespace Sass {
481483
return ns() == rhs.ns();
482484
}
483485

486+
bool Pseudo_Selector::operator== (const Pseudo_Selector& rhs) const
487+
{
488+
if (is_ns_eq(ns(), rhs.ns()) && name() == rhs.name())
489+
{
490+
Expression* lhs_ex = expression();
491+
Expression* rhs_ex = rhs.expression();
492+
if (rhs_ex && lhs_ex) return *lhs_ex == *rhs_ex;
493+
else return lhs_ex == rhs_ex;
494+
}
495+
else return false;
496+
}
497+
498+
bool Pseudo_Selector::operator== (const Simple_Selector& rhs) const
499+
{
500+
if (const Pseudo_Selector* w = dynamic_cast<const Pseudo_Selector*>(&rhs))
501+
{
502+
return *this == *w;
503+
}
504+
if (is_ns_eq(ns(), rhs.ns()))
505+
{ return name() == rhs.name(); }
506+
return ns() == rhs.ns();
507+
}
508+
509+
bool Pseudo_Selector::operator< (const Pseudo_Selector& rhs) const
510+
{
511+
if (is_ns_eq(ns(), rhs.ns()) && name() == rhs.name())
512+
{ return *(expression()) < *(rhs.expression()); }
513+
if (is_ns_eq(ns(), rhs.ns()))
514+
{ return name() < rhs.name(); }
515+
return ns() < rhs.ns();
516+
}
517+
518+
bool Pseudo_Selector::operator< (const Simple_Selector& rhs) const
519+
{
520+
if (const Pseudo_Selector* w = dynamic_cast<const Pseudo_Selector*>(&rhs))
521+
{
522+
return *this < *w;
523+
}
524+
if (is_ns_eq(ns(), rhs.ns()))
525+
{ return name() < rhs.name(); }
526+
return ns() < rhs.ns();
527+
}
528+
484529
bool Wrapped_Selector::operator== (const Wrapped_Selector& rhs) const
485530
{
486531
if (is_ns_eq(ns(), rhs.ns()) && name() == rhs.name())

src/ast.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2146,6 +2146,10 @@ namespace Sass {
21462146
return Constants::Specificity_Type;
21472147
return Constants::Specificity_Pseudo;
21482148
}
2149+
bool operator==(const Simple_Selector& rhs) const;
2150+
bool operator==(const Pseudo_Selector& rhs) const;
2151+
bool operator<(const Simple_Selector& rhs) const;
2152+
bool operator<(const Pseudo_Selector& rhs) const;
21492153
virtual Compound_Selector* unify_with(Compound_Selector*, Context&);
21502154
ATTACH_OPERATIONS()
21512155
};

0 commit comments

Comments
 (0)