@@ -521,10 +521,10 @@ namespace Sass {
521521 // of style declarations.
522522 // ///////////////////////////////////////////////////////////////////////////
523523 class Ruleset : public Has_Block {
524- ADD_PROPERTY (Selector_Obj , selector)
524+ ADD_PROPERTY (Selector_List_Obj , selector)
525525 ADD_PROPERTY (bool , is_root);
526526 public:
527- Ruleset (ParserState pstate, Selector_Obj s = 0 , Block_Obj b = 0 )
527+ Ruleset (ParserState pstate, Selector_List_Obj s = 0 , Block_Obj b = 0 )
528528 : Has_Block(pstate, b), selector_(s), is_root_(false )
529529 { statement_type (RULESET); }
530530 Ruleset (const Ruleset* ptr)
@@ -598,10 +598,10 @@ namespace Sass {
598598 // /////////////////////////////////////////////////////////////////////
599599 class Directive : public Has_Block {
600600 ADD_CONSTREF (std::string, keyword)
601- ADD_PROPERTY (Selector_Obj , selector)
601+ ADD_PROPERTY (Selector_List_Obj , selector)
602602 ADD_PROPERTY (Expression_Obj, value)
603603 public:
604- Directive (ParserState pstate, std::string kwd, Selector_Obj sel = 0 , Block_Obj b = 0 , Expression_Obj val = 0 )
604+ Directive (ParserState pstate, std::string kwd, Selector_List_Obj sel = 0 , Block_Obj b = 0 , Expression_Obj val = 0 )
605605 : Has_Block(pstate, b), keyword_(kwd), selector_(sel), value_(val) // set value manually if needed
606606 { statement_type (DIRECTIVE); }
607607 Directive (const Directive* ptr)
@@ -633,7 +633,7 @@ namespace Sass {
633633 class Keyframe_Rule : public Has_Block {
634634 // according to css spec, this should be <keyframes-name>
635635 // <keyframes-name> = <custom-ident> | <string>
636- ADD_PROPERTY (Selector_Obj , name)
636+ ADD_PROPERTY (Selector_List_Obj , name)
637637 public:
638638 Keyframe_Rule (ParserState pstate, Block_Obj b)
639639 : Has_Block(pstate, b), name_()
@@ -911,9 +911,9 @@ namespace Sass {
911911 // The Sass `@extend` directive.
912912 // //////////////////////////////
913913 class Extension : public Statement {
914- ADD_PROPERTY (Selector_Obj , selector)
914+ ADD_PROPERTY (Selector_List_Obj , selector)
915915 public:
916- Extension (ParserState pstate, Selector_Obj s)
916+ Extension (ParserState pstate, Selector_List_Obj s)
917917 : Statement(pstate), selector_(s)
918918 { statement_type (EXTEND); }
919919 Extension (const Extension* ptr)
@@ -2313,19 +2313,26 @@ namespace Sass {
23132313 // Interpolated selectors -- the interpolated String will be expanded and
23142314 // re-parsed into a normal selector class.
23152315 // ///////////////////////////////////////////////////////////////////////
2316- class Selector_Schema : public Selector {
2316+ class Selector_Schema : public AST_Node {
23172317 ADD_PROPERTY (String_Obj, contents)
23182318 ADD_PROPERTY (bool , connect_parent);
2319+ // must not be a reference counted object
2320+ // otherwise we create circular references
2321+ ADD_PROPERTY (Media_Block_Ptr, media_block)
2322+ // store computed hash
2323+ size_t hash_;
23192324 public:
23202325 Selector_Schema (ParserState pstate, String_Obj c)
2321- : Selector (pstate),
2326+ : AST_Node (pstate),
23222327 contents_ (c),
2323- connect_parent_(true )
2328+ connect_parent_(true ),
2329+ media_block_(NULL )
23242330 { }
23252331 Selector_Schema (const Selector_Schema* ptr)
2326- : Selector (ptr),
2332+ : AST_Node (ptr),
23272333 contents_(ptr->contents_),
2328- connect_parent_(ptr->connect_parent_)
2334+ connect_parent_(ptr->connect_parent_),
2335+ media_block_(ptr->media_block_)
23292336 { }
23302337 virtual bool has_parent_ref ();
23312338 virtual bool has_real_parent_ref ();
@@ -2657,9 +2664,9 @@ namespace Sass {
26572664 // Wrapped selector -- pseudo selector that takes a list of selectors as argument(s) e.g., :not(:first-of-type), :-moz-any(ol p.blah, ul, menu, dir)
26582665 // ///////////////////////////////////////////////
26592666 class Wrapped_Selector : public Simple_Selector {
2660- ADD_PROPERTY (Selector_Obj , selector)
2667+ ADD_PROPERTY (Selector_List_Obj , selector)
26612668 public:
2662- Wrapped_Selector (ParserState pstate, std::string n, Selector_Obj sel)
2669+ Wrapped_Selector (ParserState pstate, std::string n, Selector_List_Obj sel)
26632670 : Simple_Selector(pstate, n), selector_(sel)
26642671 { simple_type (WRAPPED_SEL); }
26652672 Wrapped_Selector (const Wrapped_Selector* ptr)
@@ -2668,28 +2675,10 @@ namespace Sass {
26682675 virtual bool is_superselector_of (Wrapped_Selector_Obj sub);
26692676 // Selectors inside the negation pseudo-class are counted like any
26702677 // other, but the negation itself does not count as a pseudo-class.
2671- virtual size_t hash ()
2672- {
2673- if (hash_ == 0 ) {
2674- hash_combine (hash_, Simple_Selector::hash ());
2675- if (selector_) hash_combine (hash_, selector_->hash ());
2676- }
2677- return hash_;
2678- }
2679- virtual bool has_parent_ref () {
2680- // if (has_reference()) return true;
2681- if (!selector ()) return false ;
2682- return selector ()->has_parent_ref ();
2683- }
2684- virtual bool has_real_parent_ref () {
2685- // if (has_reference()) return true;
2686- if (!selector ()) return false ;
2687- return selector ()->has_real_parent_ref ();
2688- }
2689- virtual unsigned long specificity () const
2690- {
2691- return selector_ ? selector_->specificity () : 0 ;
2692- }
2678+ virtual size_t hash ();
2679+ virtual bool has_parent_ref ();
2680+ virtual bool has_real_parent_ref ();
2681+ virtual unsigned long specificity () const ;
26932682 virtual bool operator ==(const Simple_Selector& rhs) const ;
26942683 virtual bool operator ==(const Wrapped_Selector& rhs) const ;
26952684 virtual bool operator <(const Simple_Selector& rhs) const ;
@@ -2971,16 +2960,21 @@ namespace Sass {
29712960 // Comma-separated selector groups.
29722961 // /////////////////////////////////
29732962 class Selector_List : public Selector , public Vectorized <Complex_Selector_Obj> {
2963+ ADD_PROPERTY (Selector_Schema_Obj, schema)
29742964 ADD_CONSTREF (std::vector<std::string>, wspace)
29752965 protected:
29762966 void adjust_after_pushing (Complex_Selector_Obj c);
29772967 public:
29782968 Selector_List (ParserState pstate, size_t s = 0 )
2979- : Selector(pstate), Vectorized<Complex_Selector_Obj>(s), wspace_(0 )
2969+ : Selector(pstate),
2970+ Vectorized<Complex_Selector_Obj>(s),
2971+ schema_ (NULL ),
2972+ wspace_(0 )
29802973 { }
29812974 Selector_List (const Selector_List* ptr)
29822975 : Selector(ptr),
29832976 Vectorized<Complex_Selector_Obj>(*ptr),
2977+ schema_(ptr->schema_),
29842978 wspace_(ptr->wspace_)
29852979 { }
29862980 std::string type () { return " list" ; }
@@ -2995,6 +2989,7 @@ namespace Sass {
29952989 virtual bool is_superselector_of (Selector_List_Obj sub, std::string wrapping = " " );
29962990 Selector_List_Ptr unify_with (Selector_List_Ptr, Context&);
29972991 void populate_extends (Selector_List_Obj, Context&, Subset_Map&);
2992+ Selector_List_Obj eval (Eval& eval);
29982993 virtual size_t hash ()
29992994 {
30002995 if (Selector::hash_ == 0 ) {
0 commit comments