4848
4949#include " sass.h"
5050#include " sass_values.h"
51+ #include " sass_context.h"
5152#include " sass_functions.h"
5253
5354namespace Sass {
@@ -122,7 +123,7 @@ namespace Sass {
122123 virtual operator bool () { return true ; }
123124 virtual ~Expression () { }
124125 virtual string type () { return " " ; /* TODO: raise an error? */ }
125- virtual bool is_invisible () { return false ; }
126+ virtual bool is_invisible () const { return false ; }
126127 static string type_name () { return " " ; }
127128 virtual bool is_false () { return false ; }
128129 virtual bool operator ==( Expression& rhs) const { return false ; }
@@ -177,7 +178,7 @@ namespace Sass {
177178 size_t length () const { return elements_.size (); }
178179 bool empty () const { return elements_.empty (); }
179180 T last () { return elements_.back (); }
180- T first () { return elements_.front (); }
181+ T first () { return elements_.front (); }
181182 T& operator [](size_t i) { return elements_[i]; }
182183 const T& operator [](size_t i) const { return elements_[i]; }
183184 Vectorized& operator <<(T element)
@@ -259,6 +260,12 @@ namespace Sass {
259260 }
260261 const unordered_map<Expression*, Expression*>& pairs () const { return elements_; }
261262 const vector<Expression*>& keys () const { return list_; }
263+
264+ unordered_map<Expression*, Expression*>::iterator end () { return elements_.end (); }
265+ unordered_map<Expression*, Expression*>::iterator begin () { return elements_.begin (); }
266+ unordered_map<Expression*, Expression*>::const_iterator end () const { return elements_.end (); }
267+ unordered_map<Expression*, Expression*>::const_iterator begin () const { return elements_.begin (); }
268+
262269 };
263270 inline Hashed::~Hashed () { }
264271
@@ -292,7 +299,7 @@ namespace Sass {
292299 virtual ~Statement () = 0 ;
293300 // needed for rearranging nested rulesets during CSS emission
294301 virtual bool is_hoistable () { return false ; }
295- virtual bool is_invisible () { return false ; }
302+ virtual bool is_invisible () const { return false ; }
296303 virtual bool bubbles () { return false ; }
297304 virtual Block* block () { return 0 ; }
298305 };
@@ -347,7 +354,7 @@ namespace Sass {
347354 Ruleset (ParserState pstate, Selector* s = 0 , Block* b = 0 )
348355 : Has_Block(pstate, b), selector_(s), at_root_(false )
349356 { statement_type (RULESET); }
350- bool is_invisible ();
357+ bool is_invisible () const ;
351358 // nested rulesets need to be hoisted out of their enclosing blocks
352359 bool is_hoistable () { return true ; }
353360 ATTACH_OPERATIONS ()
@@ -393,7 +400,7 @@ namespace Sass {
393400 { statement_type (MEDIA); }
394401 bool bubbles () { return true ; }
395402 bool is_hoistable () { return true ; }
396- bool is_invisible () {
403+ bool is_invisible () const {
397404 bool is_invisible = true ;
398405 for (size_t i = 0 , L = block ()->length (); i < L && is_invisible; i++)
399406 is_invisible &= (*block ())[i]->is_invisible ();
@@ -571,13 +578,12 @@ namespace Sass {
571578 // //////////////////////////////////
572579 // The Sass `@if` control directive.
573580 // //////////////////////////////////
574- class If : public Statement {
581+ class If : public Has_Block {
575582 ADD_PROPERTY (Expression*, predicate)
576- ADD_PROPERTY (Block*, consequent)
577583 ADD_PROPERTY (Block*, alternative)
578584 public:
579585 If (ParserState pstate, Expression* pred, Block* con, Block* alt = 0 )
580- : Statement (pstate), predicate_(pred ), consequent_(con ), alternative_(alt)
586+ : Has_Block (pstate, con ), predicate_(pred ), alternative_(alt)
581587 { }
582588 ATTACH_OPERATIONS ()
583589 };
@@ -752,21 +758,19 @@ namespace Sass {
752758 // /////////////////////////////////////////////////////////////////////
753759 class List : public Expression , public Vectorized <Expression*> {
754760 void adjust_after_pushing (Expression* e) { is_expanded (false ); }
755- public:
756- enum Separator { SPACE, COMMA };
757761 private:
758- ADD_PROPERTY (Separator , separator)
762+ ADD_PROPERTY (enum Sass_Separator , separator)
759763 ADD_PROPERTY (bool , is_arglist)
760764 public:
761765 List (ParserState pstate,
762- size_t size = 0 , Separator sep = SPACE , bool argl = false )
766+ size_t size = 0 , enum Sass_Separator sep = SASS_SPACE , bool argl = false )
763767 : Expression(pstate),
764768 Vectorized<Expression*>(size),
765769 separator_ (sep), is_arglist_(argl)
766770 { concrete_type (LIST); }
767771 string type () { return is_arglist_ ? " arglist" : " list" ; }
768772 static string type_name () { return " list" ; }
769- bool is_invisible () { return ! length (); }
773+ bool is_invisible () const { return empty (); }
770774 Expression* value_at_index (size_t i);
771775
772776 virtual size_t size () const ;
@@ -777,7 +781,7 @@ namespace Sass {
777781 {
778782 if (hash_ > 0 ) return hash_;
779783
780- hash_ = std::hash<string>()(separator () == COMMA ? " comma" : " space" );
784+ hash_ = std::hash<string>()(separator () == SASS_COMMA ? " comma" : " space" );
781785 for (size_t i = 0 , L = length (); i < L; ++i)
782786 hash_combine (hash_, (elements ()[i])->hash ());
783787
@@ -807,7 +811,7 @@ namespace Sass {
807811 { concrete_type (MAP); }
808812 string type () { return " map" ; }
809813 static string type_name () { return " map" ; }
810- bool is_invisible () { return ! length (); }
814+ bool is_invisible () const { return empty (); }
811815
812816 virtual bool operator ==(Expression& rhs) const
813817 {
@@ -847,21 +851,14 @@ namespace Sass {
847851 // subclassing.
848852 // ////////////////////////////////////////////////////////////////////////
849853 class Binary_Expression : public Expression {
850- public:
851- enum Type {
852- AND, OR, // logical connectives
853- EQ, NEQ, GT, GTE, LT, LTE, // arithmetic relations
854- ADD, SUB, MUL, DIV, MOD, // arithmetic functions
855- NUM_OPS // so we know how big to make the op table
856- };
857854 private:
858- ADD_PROPERTY (Type , type)
855+ ADD_PROPERTY (enum Sass_OP , type)
859856 ADD_PROPERTY (Expression*, left)
860857 ADD_PROPERTY (Expression*, right)
861858 size_t hash_;
862859 public:
863860 Binary_Expression (ParserState pstate,
864- Type t, Expression* lhs, Expression* rhs)
861+ enum Sass_OP t, Expression* lhs, Expression* rhs)
865862 : Expression(pstate), type_(t), left_(lhs), right_(rhs), hash_(0 )
866863 { }
867864 const string type_name () {
@@ -1553,7 +1550,7 @@ namespace Sass {
15531550 Null (ParserState pstate) : Expression(pstate) { concrete_type (NULL_VAL); }
15541551 string type () { return " null" ; }
15551552 static string type_name () { return " null" ; }
1556- bool is_invisible () { return true ; }
1553+ bool is_invisible () const { return true ; }
15571554 operator bool () { return false ; }
15581555 bool is_false () { return true ; }
15591556
@@ -2133,7 +2130,7 @@ namespace Sass {
21332130 ATTACH_OPERATIONS ()
21342131 };
21352132
2136- inline bool Ruleset::is_invisible () {
2133+ inline bool Ruleset::is_invisible () const {
21372134 bool is_invisible = true ;
21382135 Selector_List* sl = static_cast <Selector_List*>(selector ());
21392136 for (size_t i = 0 , L = sl->length (); i < L && is_invisible; ++i)
0 commit comments