48
48
49
49
#include " sass.h"
50
50
#include " sass_values.h"
51
+ #include " sass_context.h"
51
52
#include " sass_functions.h"
52
53
53
54
namespace Sass {
@@ -122,7 +123,7 @@ namespace Sass {
122
123
virtual operator bool () { return true ; }
123
124
virtual ~Expression () { }
124
125
virtual string type () { return " " ; /* TODO: raise an error? */ }
125
- virtual bool is_invisible () { return false ; }
126
+ virtual bool is_invisible () const { return false ; }
126
127
static string type_name () { return " " ; }
127
128
virtual bool is_false () { return false ; }
128
129
virtual bool operator ==( Expression& rhs) const { return false ; }
@@ -177,7 +178,7 @@ namespace Sass {
177
178
size_t length () const { return elements_.size (); }
178
179
bool empty () const { return elements_.empty (); }
179
180
T last () { return elements_.back (); }
180
- T first () { return elements_.front (); }
181
+ T first () { return elements_.front (); }
181
182
T& operator [](size_t i) { return elements_[i]; }
182
183
const T& operator [](size_t i) const { return elements_[i]; }
183
184
Vectorized& operator <<(T element)
@@ -259,6 +260,12 @@ namespace Sass {
259
260
}
260
261
const unordered_map<Expression*, Expression*>& pairs () const { return elements_; }
261
262
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
+
262
269
};
263
270
inline Hashed::~Hashed () { }
264
271
@@ -292,7 +299,7 @@ namespace Sass {
292
299
virtual ~Statement () = 0 ;
293
300
// needed for rearranging nested rulesets during CSS emission
294
301
virtual bool is_hoistable () { return false ; }
295
- virtual bool is_invisible () { return false ; }
302
+ virtual bool is_invisible () const { return false ; }
296
303
virtual bool bubbles () { return false ; }
297
304
virtual Block* block () { return 0 ; }
298
305
};
@@ -347,7 +354,7 @@ namespace Sass {
347
354
Ruleset (ParserState pstate, Selector* s = 0 , Block* b = 0 )
348
355
: Has_Block(pstate, b), selector_(s), at_root_(false )
349
356
{ statement_type (RULESET); }
350
- bool is_invisible ();
357
+ bool is_invisible () const ;
351
358
// nested rulesets need to be hoisted out of their enclosing blocks
352
359
bool is_hoistable () { return true ; }
353
360
ATTACH_OPERATIONS ()
@@ -393,7 +400,7 @@ namespace Sass {
393
400
{ statement_type (MEDIA); }
394
401
bool bubbles () { return true ; }
395
402
bool is_hoistable () { return true ; }
396
- bool is_invisible () {
403
+ bool is_invisible () const {
397
404
bool is_invisible = true ;
398
405
for (size_t i = 0 , L = block ()->length (); i < L && is_invisible; i++)
399
406
is_invisible &= (*block ())[i]->is_invisible ();
@@ -571,13 +578,12 @@ namespace Sass {
571
578
// //////////////////////////////////
572
579
// The Sass `@if` control directive.
573
580
// //////////////////////////////////
574
- class If : public Statement {
581
+ class If : public Has_Block {
575
582
ADD_PROPERTY (Expression*, predicate)
576
- ADD_PROPERTY (Block*, consequent)
577
583
ADD_PROPERTY (Block*, alternative)
578
584
public:
579
585
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)
581
587
{ }
582
588
ATTACH_OPERATIONS ()
583
589
};
@@ -752,21 +758,19 @@ namespace Sass {
752
758
// /////////////////////////////////////////////////////////////////////
753
759
class List : public Expression , public Vectorized <Expression*> {
754
760
void adjust_after_pushing (Expression* e) { is_expanded (false ); }
755
- public:
756
- enum Separator { SPACE, COMMA };
757
761
private:
758
- ADD_PROPERTY (Separator , separator)
762
+ ADD_PROPERTY (enum Sass_Separator , separator)
759
763
ADD_PROPERTY (bool , is_arglist)
760
764
public:
761
765
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 )
763
767
: Expression(pstate),
764
768
Vectorized<Expression*>(size),
765
769
separator_ (sep), is_arglist_(argl)
766
770
{ concrete_type (LIST); }
767
771
string type () { return is_arglist_ ? " arglist" : " list" ; }
768
772
static string type_name () { return " list" ; }
769
- bool is_invisible () { return ! length (); }
773
+ bool is_invisible () const { return empty (); }
770
774
Expression* value_at_index (size_t i);
771
775
772
776
virtual size_t size () const ;
@@ -777,7 +781,7 @@ namespace Sass {
777
781
{
778
782
if (hash_ > 0 ) return hash_;
779
783
780
- hash_ = std::hash<string>()(separator () == COMMA ? " comma" : " space" );
784
+ hash_ = std::hash<string>()(separator () == SASS_COMMA ? " comma" : " space" );
781
785
for (size_t i = 0 , L = length (); i < L; ++i)
782
786
hash_combine (hash_, (elements ()[i])->hash ());
783
787
@@ -807,7 +811,7 @@ namespace Sass {
807
811
{ concrete_type (MAP); }
808
812
string type () { return " map" ; }
809
813
static string type_name () { return " map" ; }
810
- bool is_invisible () { return ! length (); }
814
+ bool is_invisible () const { return empty (); }
811
815
812
816
virtual bool operator ==(Expression& rhs) const
813
817
{
@@ -847,21 +851,14 @@ namespace Sass {
847
851
// subclassing.
848
852
// ////////////////////////////////////////////////////////////////////////
849
853
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
- };
857
854
private:
858
- ADD_PROPERTY (Type , type)
855
+ ADD_PROPERTY (enum Sass_OP , type)
859
856
ADD_PROPERTY (Expression*, left)
860
857
ADD_PROPERTY (Expression*, right)
861
858
size_t hash_;
862
859
public:
863
860
Binary_Expression (ParserState pstate,
864
- Type t, Expression* lhs, Expression* rhs)
861
+ enum Sass_OP t, Expression* lhs, Expression* rhs)
865
862
: Expression(pstate), type_(t), left_(lhs), right_(rhs), hash_(0 )
866
863
{ }
867
864
const string type_name () {
@@ -1553,7 +1550,7 @@ namespace Sass {
1553
1550
Null (ParserState pstate) : Expression(pstate) { concrete_type (NULL_VAL); }
1554
1551
string type () { return " null" ; }
1555
1552
static string type_name () { return " null" ; }
1556
- bool is_invisible () { return true ; }
1553
+ bool is_invisible () const { return true ; }
1557
1554
operator bool () { return false ; }
1558
1555
bool is_false () { return true ; }
1559
1556
@@ -2133,7 +2130,7 @@ namespace Sass {
2133
2130
ATTACH_OPERATIONS ()
2134
2131
};
2135
2132
2136
- inline bool Ruleset::is_invisible () {
2133
+ inline bool Ruleset::is_invisible () const {
2137
2134
bool is_invisible = true ;
2138
2135
Selector_List* sl = static_cast <Selector_List*>(selector ());
2139
2136
for (size_t i = 0 , L = sl->length (); i < L && is_invisible; ++i)
0 commit comments