sassc 1.11.1 → 1.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/README.md +3 -2
- data/ext/libsass/Makefile.conf +2 -1
- data/ext/libsass/appveyor.yml +10 -5
- data/ext/libsass/docs/dev-ast-memory.md +223 -0
- data/ext/libsass/include/sass/base.h +2 -0
- data/ext/libsass/script/bootstrap +7 -4
- data/ext/libsass/script/ci-build-libsass +3 -3
- data/ext/libsass/script/ci-install-compiler +2 -0
- data/ext/libsass/script/ci-report-coverage +2 -1
- data/ext/libsass/script/test-leaks.pl +103 -0
- data/ext/libsass/src/ast.cpp +621 -495
- data/ext/libsass/src/ast.hpp +801 -367
- data/ext/libsass/src/ast_def_macros.hpp +5 -5
- data/ext/libsass/src/ast_fwd_decl.hpp +312 -14
- data/ext/libsass/src/bind.cpp +54 -51
- data/ext/libsass/src/bind.hpp +3 -7
- data/ext/libsass/src/check_nesting.cpp +117 -120
- data/ext/libsass/src/check_nesting.hpp +38 -34
- data/ext/libsass/src/color_maps.cpp +3 -3
- data/ext/libsass/src/color_maps.hpp +3 -3
- data/ext/libsass/src/context.cpp +33 -34
- data/ext/libsass/src/context.hpp +12 -14
- data/ext/libsass/src/cssize.cpp +200 -228
- data/ext/libsass/src/cssize.hpp +49 -49
- data/ext/libsass/src/debugger.hpp +260 -241
- data/ext/libsass/src/emitter.cpp +6 -6
- data/ext/libsass/src/emitter.hpp +7 -7
- data/ext/libsass/src/environment.cpp +2 -2
- data/ext/libsass/src/environment.hpp +0 -2
- data/ext/libsass/src/error_handling.cpp +5 -5
- data/ext/libsass/src/error_handling.hpp +12 -12
- data/ext/libsass/src/eval.cpp +412 -401
- data/ext/libsass/src/eval.hpp +61 -62
- data/ext/libsass/src/expand.cpp +223 -204
- data/ext/libsass/src/expand.hpp +42 -42
- data/ext/libsass/src/extend.cpp +198 -201
- data/ext/libsass/src/extend.hpp +12 -14
- data/ext/libsass/src/file.hpp +4 -5
- data/ext/libsass/src/functions.cpp +413 -418
- data/ext/libsass/src/functions.hpp +7 -10
- data/ext/libsass/src/inspect.cpp +115 -109
- data/ext/libsass/src/inspect.hpp +69 -69
- data/ext/libsass/src/listize.cpp +31 -33
- data/ext/libsass/src/listize.hpp +8 -10
- data/ext/libsass/src/memory/SharedPtr.cpp +116 -0
- data/ext/libsass/src/memory/SharedPtr.hpp +202 -0
- data/ext/libsass/src/node.cpp +45 -43
- data/ext/libsass/src/node.hpp +15 -15
- data/ext/libsass/src/operation.hpp +136 -136
- data/ext/libsass/src/output.cpp +48 -49
- data/ext/libsass/src/output.hpp +14 -14
- data/ext/libsass/src/parser.cpp +530 -554
- data/ext/libsass/src/parser.hpp +91 -96
- data/ext/libsass/src/prelexer.cpp +13 -10
- data/ext/libsass/src/remove_placeholders.cpp +25 -21
- data/ext/libsass/src/remove_placeholders.hpp +7 -7
- data/ext/libsass/src/sass2scss.cpp +2 -1
- data/ext/libsass/src/sass_context.cpp +125 -107
- data/ext/libsass/src/sass_context.hpp +1 -1
- data/ext/libsass/src/sass_util.hpp +5 -5
- data/ext/libsass/src/sass_values.cpp +27 -27
- data/ext/libsass/src/source_map.cpp +2 -2
- data/ext/libsass/src/source_map.hpp +2 -2
- data/ext/libsass/src/subset_map.cpp +57 -0
- data/ext/libsass/src/subset_map.hpp +8 -76
- data/ext/libsass/src/to_c.cpp +13 -13
- data/ext/libsass/src/to_c.hpp +14 -14
- data/ext/libsass/src/to_value.cpp +20 -20
- data/ext/libsass/src/to_value.hpp +20 -21
- data/ext/libsass/src/util.cpp +55 -88
- data/ext/libsass/src/util.hpp +9 -13
- data/ext/libsass/src/values.cpp +27 -26
- data/ext/libsass/src/values.hpp +2 -2
- data/ext/libsass/test/test_subset_map.cpp +69 -69
- data/ext/libsass/win/libsass.targets +3 -2
- data/ext/libsass/win/libsass.vcxproj.filters +9 -6
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +0 -1
- data/test/native_test.rb +1 -1
- metadata +7 -5
- data/ext/libsass/src/ast_factory.hpp +0 -92
- data/ext/libsass/src/memory_manager.cpp +0 -77
- data/ext/libsass/src/memory_manager.hpp +0 -48
    
        data/ext/libsass/src/ast.hpp
    CHANGED
    
    | @@ -9,8 +9,30 @@ | |
| 9 9 | 
             
            #include <iostream>
         | 
| 10 10 | 
             
            #include <typeinfo>
         | 
| 11 11 | 
             
            #include <algorithm>
         | 
| 12 | 
            -
            #include <unordered_map>
         | 
| 13 12 | 
             
            #include "sass/base.h"
         | 
| 13 | 
            +
            #include "ast_fwd_decl.hpp"
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            #ifdef DEBUG_SHARED_PTR
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            #define ATTACH_VIRTUAL_AST_OPERATIONS(klass) \
         | 
| 18 | 
            +
              virtual klass##_Ptr copy(std::string, size_t) const = 0; \
         | 
| 19 | 
            +
              virtual klass##_Ptr clone(std::string, size_t) const = 0; \
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            #define ATTACH_AST_OPERATIONS(klass) \
         | 
| 22 | 
            +
              virtual klass##_Ptr copy(std::string, size_t) const; \
         | 
| 23 | 
            +
              virtual klass##_Ptr clone(std::string, size_t) const; \
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            #else
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            #define ATTACH_VIRTUAL_AST_OPERATIONS(klass) \
         | 
| 28 | 
            +
              virtual klass##_Ptr copy() const = 0; \
         | 
| 29 | 
            +
              virtual klass##_Ptr clone() const = 0; \
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            #define ATTACH_AST_OPERATIONS(klass) \
         | 
| 32 | 
            +
              virtual klass##_Ptr copy() const; \
         | 
| 33 | 
            +
              virtual klass##_Ptr clone() const; \
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            #endif
         | 
| 14 36 |  | 
| 15 37 | 
             
            #ifdef __clang__
         | 
| 16 38 |  | 
| @@ -20,12 +42,7 @@ | |
| 20 42 | 
             
             *
         | 
| 21 43 | 
             
             * Type type() which hides string type() from Expression
         | 
| 22 44 | 
             
             *
         | 
| 23 | 
            -
             * and
         | 
| 24 | 
            -
             *
         | 
| 25 | 
            -
             * Block* block() which hides virtual Block* block() from Statement
         | 
| 26 | 
            -
             *
         | 
| 27 45 | 
             
             */
         | 
| 28 | 
            -
             | 
| 29 46 | 
             
            #pragma clang diagnostic push
         | 
| 30 47 | 
             
            #pragma clang diagnostic ignored "-Woverloaded-virtual"
         | 
| 31 48 |  | 
| @@ -86,19 +103,26 @@ namespace Sass { | |
| 86 103 | 
             
              //////////////////////////////////////////////////////////
         | 
| 87 104 | 
             
              // Abstract base class for all abstract syntax tree nodes.
         | 
| 88 105 | 
             
              //////////////////////////////////////////////////////////
         | 
| 89 | 
            -
              class AST_Node : public  | 
| 106 | 
            +
              class AST_Node : public SharedObj {
         | 
| 90 107 | 
             
                ADD_PROPERTY(ParserState, pstate)
         | 
| 91 108 | 
             
              public:
         | 
| 92 109 | 
             
                AST_Node(ParserState pstate)
         | 
| 93 110 | 
             
                : pstate_(pstate)
         | 
| 94 111 | 
             
                { }
         | 
| 112 | 
            +
                AST_Node(const AST_Node* ptr)
         | 
| 113 | 
            +
                : pstate_(ptr->pstate_)
         | 
| 114 | 
            +
                { }
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                // AST_Node(AST_Node& ptr) = delete;
         | 
| 117 | 
            +
             | 
| 95 118 | 
             
                virtual ~AST_Node() = 0;
         | 
| 96 119 | 
             
                virtual size_t hash() { return 0; }
         | 
| 120 | 
            +
                ATTACH_VIRTUAL_AST_OPERATIONS(AST_Node);
         | 
| 97 121 | 
             
                virtual std::string inspect() const { return to_string({ INSPECT, 5 }); }
         | 
| 98 122 | 
             
                virtual std::string to_sass() const { return to_string({ TO_SASS, 5 }); }
         | 
| 99 123 | 
             
                virtual std::string to_string(Sass_Inspect_Options opt) const;
         | 
| 100 124 | 
             
                virtual std::string to_string() const;
         | 
| 101 | 
            -
                 | 
| 125 | 
            +
                virtual void cloneChildren() {};
         | 
| 102 126 | 
             
              public:
         | 
| 103 127 | 
             
                void update_pstate(const ParserState& pstate);
         | 
| 104 128 | 
             
                void set_pstate_offset(const Offset& offset);
         | 
| @@ -129,8 +153,15 @@ namespace Sass { | |
| 129 153 | 
             
                  NULL_VAL,
         | 
| 130 154 | 
             
                  C_WARNING,
         | 
| 131 155 | 
             
                  C_ERROR,
         | 
| 156 | 
            +
                  FUNCTION,
         | 
| 132 157 | 
             
                  NUM_TYPES
         | 
| 133 158 | 
             
                };
         | 
| 159 | 
            +
                enum Simple_Type {
         | 
| 160 | 
            +
                  SIMPLE,
         | 
| 161 | 
            +
                  ATTR_SEL,
         | 
| 162 | 
            +
                  PSEUDO_SEL,
         | 
| 163 | 
            +
                  WRAPPED_SEL,
         | 
| 164 | 
            +
                };
         | 
| 134 165 | 
             
              private:
         | 
| 135 166 | 
             
                // expressions in some contexts shouldn't be evaluated
         | 
| 136 167 | 
             
                ADD_PROPERTY(bool, is_delayed)
         | 
| @@ -146,12 +177,20 @@ namespace Sass { | |
| 146 177 | 
             
                  is_interpolant_(i),
         | 
| 147 178 | 
             
                  concrete_type_(ct)
         | 
| 148 179 | 
             
                { }
         | 
| 180 | 
            +
                Expression(const Expression* ptr)
         | 
| 181 | 
            +
                : AST_Node(ptr),
         | 
| 182 | 
            +
                  is_delayed_(ptr->is_delayed_),
         | 
| 183 | 
            +
                  is_expanded_(ptr->is_expanded_),
         | 
| 184 | 
            +
                  is_interpolant_(ptr->is_interpolant_),
         | 
| 185 | 
            +
                  concrete_type_(ptr->concrete_type_)
         | 
| 186 | 
            +
                { }
         | 
| 149 187 | 
             
                virtual operator bool() { return true; }
         | 
| 150 188 | 
             
                virtual ~Expression() { }
         | 
| 151 189 | 
             
                virtual std::string type() { return ""; /* TODO: raise an error? */ }
         | 
| 152 190 | 
             
                virtual bool is_invisible() const { return false; }
         | 
| 153 191 | 
             
                static std::string type_name() { return ""; }
         | 
| 154 192 | 
             
                virtual bool is_false() { return false; }
         | 
| 193 | 
            +
                // virtual bool is_true() { return !is_false(); }
         | 
| 155 194 | 
             
                virtual bool operator== (const Expression& rhs) const { return false; }
         | 
| 156 195 | 
             
                virtual bool eq(const Expression& rhs) const { return *this == rhs; };
         | 
| 157 196 | 
             
                virtual void set_delayed(bool delayed) { is_delayed(delayed); }
         | 
| @@ -160,6 +199,7 @@ namespace Sass { | |
| 160 199 | 
             
                virtual bool is_right_interpolant() const { return is_interpolant(); }
         | 
| 161 200 | 
             
                virtual std::string inspect() const { return to_string({ INSPECT, 5 }); }
         | 
| 162 201 | 
             
                virtual std::string to_sass() const { return to_string({ TO_SASS, 5 }); }
         | 
| 202 | 
            +
                ATTACH_VIRTUAL_AST_OPERATIONS(Expression);
         | 
| 163 203 | 
             
                virtual size_t hash() { return 0; }
         | 
| 164 204 | 
             
              };
         | 
| 165 205 |  | 
| @@ -172,6 +212,10 @@ namespace Sass { | |
| 172 212 | 
             
                           bool d = false, bool e = false, bool i = false, Concrete_Type ct = NONE)
         | 
| 173 213 | 
             
                : Expression(pstate, d, e, i, ct)
         | 
| 174 214 | 
             
                { }
         | 
| 215 | 
            +
                PreValue(const PreValue* ptr)
         | 
| 216 | 
            +
                : Expression(ptr)
         | 
| 217 | 
            +
                { }
         | 
| 218 | 
            +
                ATTACH_VIRTUAL_AST_OPERATIONS(PreValue);
         | 
| 175 219 | 
             
                virtual ~PreValue() { }
         | 
| 176 220 | 
             
              };
         | 
| 177 221 |  | 
| @@ -184,6 +228,10 @@ namespace Sass { | |
| 184 228 | 
             
                      bool d = false, bool e = false, bool i = false, Concrete_Type ct = NONE)
         | 
| 185 229 | 
             
                : Expression(pstate, d, e, i, ct)
         | 
| 186 230 | 
             
                { }
         | 
| 231 | 
            +
                Value(const Value* ptr)
         | 
| 232 | 
            +
                : Expression(ptr)
         | 
| 233 | 
            +
                { }
         | 
| 234 | 
            +
                ATTACH_VIRTUAL_AST_OPERATIONS(Value);
         | 
| 187 235 | 
             
                virtual bool operator== (const Expression& rhs) const = 0;
         | 
| 188 236 | 
             
              };
         | 
| 189 237 | 
             
            }
         | 
| @@ -194,17 +242,17 @@ namespace Sass { | |
| 194 242 |  | 
| 195 243 | 
             
            namespace std {
         | 
| 196 244 | 
             
              template<>
         | 
| 197 | 
            -
              struct hash<Sass:: | 
| 245 | 
            +
              struct hash<Sass::Expression_Obj>
         | 
| 198 246 | 
             
              {
         | 
| 199 | 
            -
                size_t operator()(Sass:: | 
| 247 | 
            +
                size_t operator()(Sass::Expression_Obj s) const
         | 
| 200 248 | 
             
                {
         | 
| 201 249 | 
             
                  return s->hash();
         | 
| 202 250 | 
             
                }
         | 
| 203 251 | 
             
              };
         | 
| 204 252 | 
             
              template<>
         | 
| 205 | 
            -
              struct equal_to<Sass:: | 
| 253 | 
            +
              struct equal_to<Sass::Expression_Obj>
         | 
| 206 254 | 
             
              {
         | 
| 207 | 
            -
                bool operator()( Sass:: | 
| 255 | 
            +
                bool operator()( Sass::Expression_Obj lhs,  Sass::Expression_Obj rhs) const
         | 
| 208 256 | 
             
                {
         | 
| 209 257 | 
             
                  return lhs->hash() == rhs->hash();
         | 
| 210 258 | 
             
                }
         | 
| @@ -231,23 +279,24 @@ namespace Sass { | |
| 231 279 | 
             
                virtual ~Vectorized() = 0;
         | 
| 232 280 | 
             
                size_t length() const   { return elements_.size(); }
         | 
| 233 281 | 
             
                bool empty() const      { return elements_.empty(); }
         | 
| 282 | 
            +
                void clear()            { return elements_.clear(); }
         | 
| 234 283 | 
             
                T last() const          { return elements_.back(); }
         | 
| 235 284 | 
             
                T first() const         { return elements_.front(); }
         | 
| 236 285 | 
             
                T& operator[](size_t i) { return elements_[i]; }
         | 
| 237 286 | 
             
                virtual const T& at(size_t i) const { return elements_.at(i); }
         | 
| 287 | 
            +
                virtual T& at(size_t i) { return elements_.at(i); }
         | 
| 238 288 | 
             
                const T& operator[](size_t i) const { return elements_[i]; }
         | 
| 239 | 
            -
                virtual  | 
| 289 | 
            +
                virtual void append(T element)
         | 
| 240 290 | 
             
                {
         | 
| 241 | 
            -
                  if ( | 
| 242 | 
            -
             | 
| 243 | 
            -
             | 
| 244 | 
            -
             | 
| 245 | 
            -
                   | 
| 291 | 
            +
                  if (element) {
         | 
| 292 | 
            +
                    reset_hash();
         | 
| 293 | 
            +
                    elements_.push_back(element);
         | 
| 294 | 
            +
                    adjust_after_pushing(element);
         | 
| 295 | 
            +
                  }
         | 
| 246 296 | 
             
                }
         | 
| 247 | 
            -
                 | 
| 297 | 
            +
                virtual void concat(Vectorized* v)
         | 
| 248 298 | 
             
                {
         | 
| 249 | 
            -
                  for (size_t i = 0, L = v->length(); i < L; ++i)  | 
| 250 | 
            -
                  return *this;
         | 
| 299 | 
            +
                  for (size_t i = 0, L = v->length(); i < L; ++i) this->append((*v)[i]);
         | 
| 251 300 | 
             
                }
         | 
| 252 301 | 
             
                Vectorized& unshift(T element)
         | 
| 253 302 | 
             
                {
         | 
| @@ -284,43 +333,27 @@ namespace Sass { | |
| 284 333 | 
             
              // extra <std::vector> internally to maintain insertion order for interation.
         | 
| 285 334 | 
             
              /////////////////////////////////////////////////////////////////////////////
         | 
| 286 335 | 
             
              class Hashed {
         | 
| 287 | 
            -
              struct HashExpression {
         | 
| 288 | 
            -
                size_t operator() (Expression* ex) const {
         | 
| 289 | 
            -
                  return ex ? ex->hash() : 0;
         | 
| 290 | 
            -
                }
         | 
| 291 | 
            -
              };
         | 
| 292 | 
            -
              struct CompareExpression {
         | 
| 293 | 
            -
                bool operator()(const Expression* lhs, const Expression* rhs) const {
         | 
| 294 | 
            -
                  return lhs && rhs && lhs->eq(*rhs);
         | 
| 295 | 
            -
                }
         | 
| 296 | 
            -
              };
         | 
| 297 | 
            -
              typedef std::unordered_map<
         | 
| 298 | 
            -
                Expression*, // key
         | 
| 299 | 
            -
                Expression*, // value
         | 
| 300 | 
            -
                HashExpression, // hasher
         | 
| 301 | 
            -
                CompareExpression // compare
         | 
| 302 | 
            -
              > ExpressionMap;
         | 
| 303 336 | 
             
              private:
         | 
| 304 337 | 
             
                ExpressionMap elements_;
         | 
| 305 | 
            -
                std::vector< | 
| 338 | 
            +
                std::vector<Expression_Obj> list_;
         | 
| 306 339 | 
             
              protected:
         | 
| 307 340 | 
             
                size_t hash_;
         | 
| 308 | 
            -
                 | 
| 341 | 
            +
                Expression_Obj duplicate_key_;
         | 
| 309 342 | 
             
                void reset_hash() { hash_ = 0; }
         | 
| 310 343 | 
             
                void reset_duplicate_key() { duplicate_key_ = 0; }
         | 
| 311 | 
            -
                virtual void adjust_after_pushing(std::pair< | 
| 344 | 
            +
                virtual void adjust_after_pushing(std::pair<Expression_Obj, Expression_Obj> p) { }
         | 
| 312 345 | 
             
              public:
         | 
| 313 | 
            -
                Hashed(size_t s = 0) : elements_(ExpressionMap(s)), list_(std::vector< | 
| 346 | 
            +
                Hashed(size_t s = 0) : elements_(ExpressionMap(s)), list_(std::vector<Expression_Obj>())
         | 
| 314 347 | 
             
                { elements_.reserve(s); list_.reserve(s); reset_duplicate_key(); }
         | 
| 315 348 | 
             
                virtual ~Hashed();
         | 
| 316 349 | 
             
                size_t length() const                  { return list_.size(); }
         | 
| 317 350 | 
             
                bool empty() const                     { return list_.empty(); }
         | 
| 318 | 
            -
                bool has( | 
| 319 | 
            -
                 | 
| 351 | 
            +
                bool has(Expression_Obj k) const          { return elements_.count(k) == 1; }
         | 
| 352 | 
            +
                Expression_Obj at(Expression_Obj k) const;
         | 
| 320 353 | 
             
                bool has_duplicate_key() const         { return duplicate_key_ != 0; }
         | 
| 321 | 
            -
                 | 
| 354 | 
            +
                Expression_Obj get_duplicate_key() const  { return duplicate_key_; }
         | 
| 322 355 | 
             
                const ExpressionMap elements() { return elements_; }
         | 
| 323 | 
            -
                Hashed& operator<<(std::pair< | 
| 356 | 
            +
                Hashed& operator<<(std::pair<Expression_Obj, Expression_Obj> p)
         | 
| 324 357 | 
             
                {
         | 
| 325 358 | 
             
                  reset_hash();
         | 
| 326 359 |  | 
| @@ -348,12 +381,12 @@ namespace Sass { | |
| 348 381 | 
             
                  return *this;
         | 
| 349 382 | 
             
                }
         | 
| 350 383 | 
             
                const ExpressionMap& pairs() const { return elements_; }
         | 
| 351 | 
            -
                const std::vector< | 
| 384 | 
            +
                const std::vector<Expression_Obj>& keys() const { return list_; }
         | 
| 352 385 |  | 
| 353 | 
            -
                std::unordered_map< | 
| 354 | 
            -
                std::unordered_map< | 
| 355 | 
            -
                std::unordered_map< | 
| 356 | 
            -
                std::unordered_map< | 
| 386 | 
            +
            //    std::unordered_map<Expression_Obj, Expression_Obj>::iterator end() { return elements_.end(); }
         | 
| 387 | 
            +
            //    std::unordered_map<Expression_Obj, Expression_Obj>::iterator begin() { return elements_.begin(); }
         | 
| 388 | 
            +
            //    std::unordered_map<Expression_Obj, Expression_Obj>::const_iterator end() const { return elements_.end(); }
         | 
| 389 | 
            +
            //    std::unordered_map<Expression_Obj, Expression_Obj>::const_iterator begin() const { return elements_.begin(); }
         | 
| 357 390 |  | 
| 358 391 | 
             
              };
         | 
| 359 392 | 
             
              inline Hashed::~Hashed() { }
         | 
| @@ -392,19 +425,23 @@ namespace Sass { | |
| 392 425 | 
             
                  IF
         | 
| 393 426 | 
             
                };
         | 
| 394 427 | 
             
              private:
         | 
| 395 | 
            -
                ADD_PROPERTY(Block*, block)
         | 
| 396 428 | 
             
                ADD_PROPERTY(Statement_Type, statement_type)
         | 
| 397 429 | 
             
                ADD_PROPERTY(size_t, tabs)
         | 
| 398 430 | 
             
                ADD_PROPERTY(bool, group_end)
         | 
| 399 431 | 
             
              public:
         | 
| 400 432 | 
             
                Statement(ParserState pstate, Statement_Type st = NONE, size_t t = 0)
         | 
| 401 | 
            -
                : AST_Node(pstate),  | 
| 433 | 
            +
                : AST_Node(pstate), statement_type_(st), tabs_(t), group_end_(false)
         | 
| 434 | 
            +
                 { }
         | 
| 435 | 
            +
                Statement(const Statement* ptr)
         | 
| 436 | 
            +
                : AST_Node(ptr),
         | 
| 437 | 
            +
                  statement_type_(ptr->statement_type_),
         | 
| 438 | 
            +
                  tabs_(ptr->tabs_),
         | 
| 439 | 
            +
                  group_end_(ptr->group_end_)
         | 
| 402 440 | 
             
                 { }
         | 
| 403 441 | 
             
                virtual ~Statement() = 0;
         | 
| 404 442 | 
             
                // needed for rearranging nested rulesets during CSS emission
         | 
| 405 443 | 
             
                virtual bool   is_invisible() const { return false; }
         | 
| 406 444 | 
             
                virtual bool   bubbles() { return false; }
         | 
| 407 | 
            -
                virtual Block* block()  { return 0; }
         | 
| 408 445 | 
             
                virtual bool has_content()
         | 
| 409 446 | 
             
                {
         | 
| 410 447 | 
             
                  return statement_type_ == CONTENT;
         | 
| @@ -415,21 +452,27 @@ namespace Sass { | |
| 415 452 | 
             
              ////////////////////////
         | 
| 416 453 | 
             
              // Blocks of statements.
         | 
| 417 454 | 
             
              ////////////////////////
         | 
| 418 | 
            -
              class Block : public Statement, public Vectorized< | 
| 455 | 
            +
              class Block : public Statement, public Vectorized<Statement_Obj> {
         | 
| 419 456 | 
             
                ADD_PROPERTY(bool, is_root)
         | 
| 420 457 | 
             
                ADD_PROPERTY(bool, is_at_root);
         | 
| 421 458 | 
             
                // needed for properly formatted CSS emission
         | 
| 422 459 | 
             
              protected:
         | 
| 423 | 
            -
                void adjust_after_pushing( | 
| 460 | 
            +
                void adjust_after_pushing(Statement_Obj s)
         | 
| 424 461 | 
             
                {
         | 
| 425 462 | 
             
                }
         | 
| 426 463 | 
             
              public:
         | 
| 427 464 | 
             
                Block(ParserState pstate, size_t s = 0, bool r = false)
         | 
| 428 465 | 
             
                : Statement(pstate),
         | 
| 429 | 
            -
                  Vectorized< | 
| 466 | 
            +
                  Vectorized<Statement_Obj>(s),
         | 
| 430 467 | 
             
                  is_root_(r),
         | 
| 431 468 | 
             
                  is_at_root_(false)
         | 
| 432 469 | 
             
                { }
         | 
| 470 | 
            +
                Block(const Block* ptr)
         | 
| 471 | 
            +
                : Statement(ptr),
         | 
| 472 | 
            +
                  Vectorized<Statement_Obj>(*ptr),
         | 
| 473 | 
            +
                  is_root_(ptr->is_root_),
         | 
| 474 | 
            +
                  is_at_root_(ptr->is_at_root_)
         | 
| 475 | 
            +
                { }
         | 
| 433 476 | 
             
                virtual bool has_content()
         | 
| 434 477 | 
             
                {
         | 
| 435 478 | 
             
                  for (size_t i = 0, L = elements().size(); i < L; ++i) {
         | 
| @@ -437,7 +480,7 @@ namespace Sass { | |
| 437 480 | 
             
                  }
         | 
| 438 481 | 
             
                  return Statement::has_content();
         | 
| 439 482 | 
             
                }
         | 
| 440 | 
            -
                Block | 
| 483 | 
            +
                ATTACH_AST_OPERATIONS(Block)
         | 
| 441 484 | 
             
                ATTACH_OPERATIONS()
         | 
| 442 485 | 
             
              };
         | 
| 443 486 |  | 
| @@ -445,11 +488,14 @@ namespace Sass { | |
| 445 488 | 
             
              // Abstract base class for statements that contain blocks of statements.
         | 
| 446 489 | 
             
              ////////////////////////////////////////////////////////////////////////
         | 
| 447 490 | 
             
              class Has_Block : public Statement {
         | 
| 448 | 
            -
                ADD_PROPERTY( | 
| 491 | 
            +
                ADD_PROPERTY(Block_Obj, block)
         | 
| 449 492 | 
             
              public:
         | 
| 450 | 
            -
                Has_Block(ParserState pstate,  | 
| 493 | 
            +
                Has_Block(ParserState pstate, Block_Obj b)
         | 
| 451 494 | 
             
                : Statement(pstate), block_(b)
         | 
| 452 495 | 
             
                { }
         | 
| 496 | 
            +
                Has_Block(const Has_Block* ptr)
         | 
| 497 | 
            +
                : Statement(ptr), block_(ptr->block_)
         | 
| 498 | 
            +
                { }
         | 
| 453 499 | 
             
                virtual bool has_content()
         | 
| 454 500 | 
             
                {
         | 
| 455 501 | 
             
                  return (block_ && block_->has_content()) || Statement::has_content();
         | 
| @@ -463,14 +509,21 @@ namespace Sass { | |
| 463 509 | 
             
              // of style declarations.
         | 
| 464 510 | 
             
              /////////////////////////////////////////////////////////////////////////////
         | 
| 465 511 | 
             
              class Ruleset : public Has_Block {
         | 
| 466 | 
            -
                ADD_PROPERTY( | 
| 512 | 
            +
                ADD_PROPERTY(Selector_Obj, selector)
         | 
| 467 513 | 
             
                ADD_PROPERTY(bool, at_root);
         | 
| 468 514 | 
             
                ADD_PROPERTY(bool, is_root);
         | 
| 469 515 | 
             
              public:
         | 
| 470 | 
            -
                Ruleset(ParserState pstate,  | 
| 516 | 
            +
                Ruleset(ParserState pstate, Selector_Obj s = 0, Block_Obj b = 0)
         | 
| 471 517 | 
             
                : Has_Block(pstate, b), selector_(s), at_root_(false), is_root_(false)
         | 
| 472 518 | 
             
                { statement_type(RULESET); }
         | 
| 519 | 
            +
                Ruleset(const Ruleset* ptr)
         | 
| 520 | 
            +
                : Has_Block(ptr),
         | 
| 521 | 
            +
                  selector_(ptr->selector_),
         | 
| 522 | 
            +
                  at_root_(ptr->at_root_),
         | 
| 523 | 
            +
                  is_root_(ptr->is_root_)
         | 
| 524 | 
            +
                { statement_type(RULESET); }
         | 
| 473 525 | 
             
                bool is_invisible() const;
         | 
| 526 | 
            +
                ATTACH_AST_OPERATIONS(Ruleset)
         | 
| 474 527 | 
             
                ATTACH_OPERATIONS()
         | 
| 475 528 | 
             
              };
         | 
| 476 529 |  | 
| @@ -478,13 +531,19 @@ namespace Sass { | |
| 478 531 | 
             
              // Bubble.
         | 
| 479 532 | 
             
              /////////////////
         | 
| 480 533 | 
             
              class Bubble : public Statement {
         | 
| 481 | 
            -
                ADD_PROPERTY( | 
| 534 | 
            +
                ADD_PROPERTY(Statement_Obj, node)
         | 
| 482 535 | 
             
                ADD_PROPERTY(bool, group_end)
         | 
| 483 536 | 
             
              public:
         | 
| 484 | 
            -
                Bubble(ParserState pstate,  | 
| 537 | 
            +
                Bubble(ParserState pstate, Statement_Obj n, Statement_Obj g = 0, size_t t = 0)
         | 
| 485 538 | 
             
                : Statement(pstate, Statement::BUBBLE, t), node_(n), group_end_(g == 0)
         | 
| 486 539 | 
             
                { }
         | 
| 540 | 
            +
                Bubble(const Bubble* ptr)
         | 
| 541 | 
            +
                : Statement(ptr),
         | 
| 542 | 
            +
                  node_(ptr->node_),
         | 
| 543 | 
            +
                  group_end_(ptr->group_end_)
         | 
| 544 | 
            +
                { }
         | 
| 487 545 | 
             
                bool bubbles() { return true; }
         | 
| 546 | 
            +
                ATTACH_AST_OPERATIONS(Bubble)
         | 
| 488 547 | 
             
                ATTACH_OPERATIONS()
         | 
| 489 548 | 
             
              };
         | 
| 490 549 |  | 
| @@ -494,9 +553,14 @@ namespace Sass { | |
| 494 553 | 
             
              class Trace : public Has_Block {
         | 
| 495 554 | 
             
                ADD_PROPERTY(std::string, name)
         | 
| 496 555 | 
             
              public:
         | 
| 497 | 
            -
                Trace(ParserState pstate, std::string n,  | 
| 556 | 
            +
                Trace(ParserState pstate, std::string n, Block_Obj b = 0)
         | 
| 498 557 | 
             
                : Has_Block(pstate, b), name_(n)
         | 
| 499 558 | 
             
                { }
         | 
| 559 | 
            +
                Trace(const Trace* ptr)
         | 
| 560 | 
            +
                : Has_Block(ptr),
         | 
| 561 | 
            +
                  name_(ptr->name_)
         | 
| 562 | 
            +
                { }
         | 
| 563 | 
            +
                ATTACH_AST_OPERATIONS(Trace)
         | 
| 500 564 | 
             
                ATTACH_OPERATIONS()
         | 
| 501 565 | 
             
              };
         | 
| 502 566 |  | 
| @@ -504,16 +568,20 @@ namespace Sass { | |
| 504 568 | 
             
              // Media queries.
         | 
| 505 569 | 
             
              /////////////////
         | 
| 506 570 | 
             
              class Media_Block : public Has_Block {
         | 
| 507 | 
            -
                ADD_PROPERTY( | 
| 571 | 
            +
                ADD_PROPERTY(List_Obj, media_queries)
         | 
| 508 572 | 
             
              public:
         | 
| 509 | 
            -
                Media_Block(ParserState pstate,  | 
| 573 | 
            +
                Media_Block(ParserState pstate, List_Obj mqs, Block_Obj b)
         | 
| 510 574 | 
             
                : Has_Block(pstate, b), media_queries_(mqs)
         | 
| 511 575 | 
             
                { statement_type(MEDIA); }
         | 
| 512 | 
            -
                Media_Block(ParserState pstate,  | 
| 576 | 
            +
                Media_Block(ParserState pstate, List_Obj mqs, Block_Obj b, Selector_Obj s)
         | 
| 513 577 | 
             
                : Has_Block(pstate, b), media_queries_(mqs)
         | 
| 514 578 | 
             
                { statement_type(MEDIA); }
         | 
| 579 | 
            +
                Media_Block(const Media_Block* ptr)
         | 
| 580 | 
            +
                : Has_Block(ptr), media_queries_(ptr->media_queries_)
         | 
| 581 | 
            +
                { statement_type(MEDIA); }
         | 
| 515 582 | 
             
                bool bubbles() { return true; }
         | 
| 516 583 | 
             
                bool is_invisible() const;
         | 
| 584 | 
            +
                ATTACH_AST_OPERATIONS(Media_Block)
         | 
| 517 585 | 
             
                ATTACH_OPERATIONS()
         | 
| 518 586 | 
             
              };
         | 
| 519 587 |  | 
| @@ -523,12 +591,18 @@ namespace Sass { | |
| 523 591 | 
             
              ///////////////////////////////////////////////////////////////////////
         | 
| 524 592 | 
             
              class Directive : public Has_Block {
         | 
| 525 593 | 
             
                ADD_PROPERTY(std::string, keyword)
         | 
| 526 | 
            -
                ADD_PROPERTY( | 
| 527 | 
            -
                ADD_PROPERTY( | 
| 594 | 
            +
                ADD_PROPERTY(Selector_Obj, selector)
         | 
| 595 | 
            +
                ADD_PROPERTY(Expression_Obj, value)
         | 
| 528 596 | 
             
              public:
         | 
| 529 | 
            -
                Directive(ParserState pstate, std::string kwd,  | 
| 597 | 
            +
                Directive(ParserState pstate, std::string kwd, Selector_Obj sel = 0, Block_Obj b = 0, Expression_Obj val = 0)
         | 
| 530 598 | 
             
                : Has_Block(pstate, b), keyword_(kwd), selector_(sel), value_(val) // set value manually if needed
         | 
| 531 599 | 
             
                { statement_type(DIRECTIVE); }
         | 
| 600 | 
            +
                Directive(const Directive* ptr)
         | 
| 601 | 
            +
                : Has_Block(ptr),
         | 
| 602 | 
            +
                  keyword_(ptr->keyword_),
         | 
| 603 | 
            +
                  selector_(ptr->selector_),
         | 
| 604 | 
            +
                  value_(ptr->value_) // set value manually if needed
         | 
| 605 | 
            +
                { statement_type(DIRECTIVE); }
         | 
| 532 606 | 
             
                bool bubbles() { return is_keyframes() || is_media(); }
         | 
| 533 607 | 
             
                bool is_media() {
         | 
| 534 608 | 
             
                  return keyword_.compare("@-webkit-media") == 0 ||
         | 
| @@ -542,6 +616,7 @@ namespace Sass { | |
| 542 616 | 
             
                         keyword_.compare("@-o-keyframes") == 0 ||
         | 
| 543 617 | 
             
                         keyword_.compare("@keyframes") == 0;
         | 
| 544 618 | 
             
                }
         | 
| 619 | 
            +
                ATTACH_AST_OPERATIONS(Directive)
         | 
| 545 620 | 
             
                ATTACH_OPERATIONS()
         | 
| 546 621 | 
             
              };
         | 
| 547 622 |  | 
| @@ -549,11 +624,17 @@ namespace Sass { | |
| 549 624 | 
             
              // Keyframe-rules -- the child blocks of "@keyframes" nodes.
         | 
| 550 625 | 
             
              ///////////////////////////////////////////////////////////////////////
         | 
| 551 626 | 
             
              class Keyframe_Rule : public Has_Block {
         | 
| 552 | 
            -
                 | 
| 627 | 
            +
                // according to css spec, this should be <keyframes-name>
         | 
| 628 | 
            +
                // <keyframes-name> = <custom-ident> | <string>
         | 
| 629 | 
            +
                ADD_PROPERTY(Selector_Obj, name)
         | 
| 553 630 | 
             
              public:
         | 
| 554 | 
            -
                Keyframe_Rule(ParserState pstate,  | 
| 555 | 
            -
                : Has_Block(pstate, b),  | 
| 631 | 
            +
                Keyframe_Rule(ParserState pstate, Block_Obj b)
         | 
| 632 | 
            +
                : Has_Block(pstate, b), name_()
         | 
| 633 | 
            +
                { statement_type(KEYFRAMERULE); }
         | 
| 634 | 
            +
                Keyframe_Rule(const Keyframe_Rule* ptr)
         | 
| 635 | 
            +
                : Has_Block(ptr), name_(ptr->name_)
         | 
| 556 636 | 
             
                { statement_type(KEYFRAMERULE); }
         | 
| 637 | 
            +
                ATTACH_AST_OPERATIONS(Keyframe_Rule)
         | 
| 557 638 | 
             
                ATTACH_OPERATIONS()
         | 
| 558 639 | 
             
              };
         | 
| 559 640 |  | 
| @@ -561,15 +642,23 @@ namespace Sass { | |
| 561 642 | 
             
              // Declarations -- style rules consisting of a property name and values.
         | 
| 562 643 | 
             
              ////////////////////////////////////////////////////////////////////////
         | 
| 563 644 | 
             
              class Declaration : public Has_Block {
         | 
| 564 | 
            -
                ADD_PROPERTY( | 
| 565 | 
            -
                ADD_PROPERTY( | 
| 645 | 
            +
                ADD_PROPERTY(String_Obj, property)
         | 
| 646 | 
            +
                ADD_PROPERTY(Expression_Obj, value)
         | 
| 566 647 | 
             
                ADD_PROPERTY(bool, is_important)
         | 
| 567 648 | 
             
                ADD_PROPERTY(bool, is_indented)
         | 
| 568 649 | 
             
              public:
         | 
| 569 650 | 
             
                Declaration(ParserState pstate,
         | 
| 570 | 
            -
                             | 
| 651 | 
            +
                            String_Obj prop, Expression_Obj val, bool i = false, Block_Obj b = 0)
         | 
| 571 652 | 
             
                : Has_Block(pstate, b), property_(prop), value_(val), is_important_(i), is_indented_(false)
         | 
| 572 653 | 
             
                { statement_type(DECLARATION); }
         | 
| 654 | 
            +
                Declaration(const Declaration* ptr)
         | 
| 655 | 
            +
                : Has_Block(ptr),
         | 
| 656 | 
            +
                  property_(ptr->property_),
         | 
| 657 | 
            +
                  value_(ptr->value_),
         | 
| 658 | 
            +
                  is_important_(ptr->is_important_),
         | 
| 659 | 
            +
                  is_indented_(ptr->is_indented_)
         | 
| 660 | 
            +
                { statement_type(DECLARATION); }
         | 
| 661 | 
            +
                ATTACH_AST_OPERATIONS(Declaration)
         | 
| 573 662 | 
             
                ATTACH_OPERATIONS()
         | 
| 574 663 | 
             
              };
         | 
| 575 664 |  | 
| @@ -578,16 +667,24 @@ namespace Sass { | |
| 578 667 | 
             
              /////////////////////////////////////
         | 
| 579 668 | 
             
              class Assignment : public Statement {
         | 
| 580 669 | 
             
                ADD_PROPERTY(std::string, variable)
         | 
| 581 | 
            -
                ADD_PROPERTY( | 
| 670 | 
            +
                ADD_PROPERTY(Expression_Obj, value)
         | 
| 582 671 | 
             
                ADD_PROPERTY(bool, is_default)
         | 
| 583 672 | 
             
                ADD_PROPERTY(bool, is_global)
         | 
| 584 673 | 
             
              public:
         | 
| 585 674 | 
             
                Assignment(ParserState pstate,
         | 
| 586 | 
            -
                           std::string var,  | 
| 675 | 
            +
                           std::string var, Expression_Obj val,
         | 
| 587 676 | 
             
                           bool is_default = false,
         | 
| 588 677 | 
             
                           bool is_global = false)
         | 
| 589 678 | 
             
                : Statement(pstate), variable_(var), value_(val), is_default_(is_default), is_global_(is_global)
         | 
| 590 679 | 
             
                { statement_type(ASSIGNMENT); }
         | 
| 680 | 
            +
                Assignment(const Assignment* ptr)
         | 
| 681 | 
            +
                : Statement(ptr),
         | 
| 682 | 
            +
                  variable_(ptr->variable_),
         | 
| 683 | 
            +
                  value_(ptr->value_),
         | 
| 684 | 
            +
                  is_default_(ptr->is_default_),
         | 
| 685 | 
            +
                  is_global_(ptr->is_global_)
         | 
| 686 | 
            +
                { statement_type(ASSIGNMENT); }
         | 
| 687 | 
            +
                ATTACH_AST_OPERATIONS(Assignment)
         | 
| 591 688 | 
             
                ATTACH_OPERATIONS()
         | 
| 592 689 | 
             
              };
         | 
| 593 690 |  | 
| @@ -596,18 +693,25 @@ namespace Sass { | |
| 596 693 | 
             
              // necessary to store a list of each in an Import node.
         | 
| 597 694 | 
             
              ////////////////////////////////////////////////////////////////////////////
         | 
| 598 695 | 
             
              class Import : public Statement {
         | 
| 599 | 
            -
                std::vector< | 
| 696 | 
            +
                std::vector<Expression_Obj> urls_;
         | 
| 600 697 | 
             
                std::vector<Include>     incs_;
         | 
| 601 | 
            -
                ADD_PROPERTY( | 
| 698 | 
            +
                ADD_PROPERTY(List_Obj,      import_queries);
         | 
| 602 699 | 
             
              public:
         | 
| 603 700 | 
             
                Import(ParserState pstate)
         | 
| 604 701 | 
             
                : Statement(pstate),
         | 
| 605 | 
            -
                  urls_(std::vector< | 
| 702 | 
            +
                  urls_(std::vector<Expression_Obj>()),
         | 
| 606 703 | 
             
                  incs_(std::vector<Include>()),
         | 
| 607 | 
            -
                   | 
| 704 | 
            +
                  import_queries_()
         | 
| 608 705 | 
             
                { statement_type(IMPORT); }
         | 
| 609 | 
            -
                 | 
| 706 | 
            +
                Import(const Import* ptr)
         | 
| 707 | 
            +
                : Statement(ptr),
         | 
| 708 | 
            +
                  urls_(ptr->urls_),
         | 
| 709 | 
            +
                  incs_(ptr->incs_),
         | 
| 710 | 
            +
                  import_queries_(ptr->import_queries_)
         | 
| 711 | 
            +
                { statement_type(IMPORT); }
         | 
| 712 | 
            +
                std::vector<Expression_Obj>& urls() { return urls_; }
         | 
| 610 713 | 
             
                std::vector<Include>& incs() { return incs_; }
         | 
| 714 | 
            +
                ATTACH_AST_OPERATIONS(Import)
         | 
| 611 715 | 
             
                ATTACH_OPERATIONS()
         | 
| 612 716 | 
             
              };
         | 
| 613 717 |  | 
| @@ -623,6 +727,10 @@ namespace Sass { | |
| 623 727 | 
             
                Import_Stub(ParserState pstate, Include res)
         | 
| 624 728 | 
             
                : Statement(pstate), resource_(res)
         | 
| 625 729 | 
             
                { statement_type(IMPORT_STUB); }
         | 
| 730 | 
            +
                Import_Stub(const Import_Stub* ptr)
         | 
| 731 | 
            +
                : Statement(ptr), resource_(ptr->resource_)
         | 
| 732 | 
            +
                { statement_type(IMPORT_STUB); }
         | 
| 733 | 
            +
                ATTACH_AST_OPERATIONS(Import_Stub)
         | 
| 626 734 | 
             
                ATTACH_OPERATIONS()
         | 
| 627 735 | 
             
              };
         | 
| 628 736 |  | 
| @@ -630,11 +738,15 @@ namespace Sass { | |
| 630 738 | 
             
              // The Sass `@warn` directive.
         | 
| 631 739 | 
             
              //////////////////////////////
         | 
| 632 740 | 
             
              class Warning : public Statement {
         | 
| 633 | 
            -
                ADD_PROPERTY( | 
| 741 | 
            +
                ADD_PROPERTY(Expression_Obj, message)
         | 
| 634 742 | 
             
              public:
         | 
| 635 | 
            -
                Warning(ParserState pstate,  | 
| 743 | 
            +
                Warning(ParserState pstate, Expression_Obj msg)
         | 
| 636 744 | 
             
                : Statement(pstate), message_(msg)
         | 
| 637 745 | 
             
                { statement_type(WARNING); }
         | 
| 746 | 
            +
                Warning(const Warning* ptr)
         | 
| 747 | 
            +
                : Statement(ptr), message_(ptr->message_)
         | 
| 748 | 
            +
                { statement_type(WARNING); }
         | 
| 749 | 
            +
                ATTACH_AST_OPERATIONS(Warning)
         | 
| 638 750 | 
             
                ATTACH_OPERATIONS()
         | 
| 639 751 | 
             
              };
         | 
| 640 752 |  | 
| @@ -642,11 +754,15 @@ namespace Sass { | |
| 642 754 | 
             
              // The Sass `@error` directive.
         | 
| 643 755 | 
             
              ///////////////////////////////
         | 
| 644 756 | 
             
              class Error : public Statement {
         | 
| 645 | 
            -
                ADD_PROPERTY( | 
| 757 | 
            +
                ADD_PROPERTY(Expression_Obj, message)
         | 
| 646 758 | 
             
              public:
         | 
| 647 | 
            -
                Error(ParserState pstate,  | 
| 759 | 
            +
                Error(ParserState pstate, Expression_Obj msg)
         | 
| 648 760 | 
             
                : Statement(pstate), message_(msg)
         | 
| 649 761 | 
             
                { statement_type(ERROR); }
         | 
| 762 | 
            +
                Error(const Error* ptr)
         | 
| 763 | 
            +
                : Statement(ptr), message_(ptr->message_)
         | 
| 764 | 
            +
                { statement_type(ERROR); }
         | 
| 765 | 
            +
                ATTACH_AST_OPERATIONS(Error)
         | 
| 650 766 | 
             
                ATTACH_OPERATIONS()
         | 
| 651 767 | 
             
              };
         | 
| 652 768 |  | 
| @@ -654,11 +770,15 @@ namespace Sass { | |
| 654 770 | 
             
              // The Sass `@debug` directive.
         | 
| 655 771 | 
             
              ///////////////////////////////
         | 
| 656 772 | 
             
              class Debug : public Statement {
         | 
| 657 | 
            -
                ADD_PROPERTY( | 
| 773 | 
            +
                ADD_PROPERTY(Expression_Obj, value)
         | 
| 658 774 | 
             
              public:
         | 
| 659 | 
            -
                Debug(ParserState pstate,  | 
| 775 | 
            +
                Debug(ParserState pstate, Expression_Obj val)
         | 
| 660 776 | 
             
                : Statement(pstate), value_(val)
         | 
| 661 777 | 
             
                { statement_type(DEBUGSTMT); }
         | 
| 778 | 
            +
                Debug(const Debug* ptr)
         | 
| 779 | 
            +
                : Statement(ptr), value_(ptr->value_)
         | 
| 780 | 
            +
                { statement_type(DEBUGSTMT); }
         | 
| 781 | 
            +
                ATTACH_AST_OPERATIONS(Debug)
         | 
| 662 782 | 
             
                ATTACH_OPERATIONS()
         | 
| 663 783 | 
             
              };
         | 
| 664 784 |  | 
| @@ -666,14 +786,20 @@ namespace Sass { | |
| 666 786 | 
             
              // CSS comments. These may be interpolated.
         | 
| 667 787 | 
             
              ///////////////////////////////////////////
         | 
| 668 788 | 
             
              class Comment : public Statement {
         | 
| 669 | 
            -
                ADD_PROPERTY( | 
| 789 | 
            +
                ADD_PROPERTY(String_Obj, text)
         | 
| 670 790 | 
             
                ADD_PROPERTY(bool, is_important)
         | 
| 671 791 | 
             
              public:
         | 
| 672 | 
            -
                Comment(ParserState pstate,  | 
| 792 | 
            +
                Comment(ParserState pstate, String_Obj txt, bool is_important)
         | 
| 673 793 | 
             
                : Statement(pstate), text_(txt), is_important_(is_important)
         | 
| 674 794 | 
             
                { statement_type(COMMENT); }
         | 
| 795 | 
            +
                Comment(const Comment* ptr)
         | 
| 796 | 
            +
                : Statement(ptr),
         | 
| 797 | 
            +
                  text_(ptr->text_),
         | 
| 798 | 
            +
                  is_important_(ptr->is_important_)
         | 
| 799 | 
            +
                { statement_type(COMMENT); }
         | 
| 675 800 | 
             
                virtual bool is_invisible() const
         | 
| 676 801 | 
             
                { return /* is_important() == */ false; }
         | 
| 802 | 
            +
                ATTACH_AST_OPERATIONS(Comment)
         | 
| 677 803 | 
             
                ATTACH_OPERATIONS()
         | 
| 678 804 | 
             
              };
         | 
| 679 805 |  | 
| @@ -681,16 +807,22 @@ namespace Sass { | |
| 681 807 | 
             
              // The Sass `@if` control directive.
         | 
| 682 808 | 
             
              ////////////////////////////////////
         | 
| 683 809 | 
             
              class If : public Has_Block {
         | 
| 684 | 
            -
                ADD_PROPERTY( | 
| 685 | 
            -
                ADD_PROPERTY( | 
| 810 | 
            +
                ADD_PROPERTY(Expression_Obj, predicate)
         | 
| 811 | 
            +
                ADD_PROPERTY(Block_Obj, alternative)
         | 
| 686 812 | 
             
              public:
         | 
| 687 | 
            -
                If(ParserState pstate,  | 
| 688 | 
            -
                : Has_Block(pstate, con), predicate_(pred), alternative_(alt)
         | 
| 813 | 
            +
                If(ParserState pstate, Expression_Obj pred, Block_Obj con, Block_Obj alt = 0)
         | 
| 814 | 
            +
                : Has_Block(pstate, &con), predicate_(pred), alternative_(alt)
         | 
| 815 | 
            +
                { statement_type(IF); }
         | 
| 816 | 
            +
                If(const If* ptr)
         | 
| 817 | 
            +
                : Has_Block(ptr),
         | 
| 818 | 
            +
                  predicate_(ptr->predicate_),
         | 
| 819 | 
            +
                  alternative_(ptr->alternative_)
         | 
| 689 820 | 
             
                { statement_type(IF); }
         | 
| 690 821 | 
             
                virtual bool has_content()
         | 
| 691 822 | 
             
                {
         | 
| 692 823 | 
             
                  return Has_Block::has_content() || (alternative_ && alternative_->has_content());
         | 
| 693 824 | 
             
                }
         | 
| 825 | 
            +
                ATTACH_AST_OPERATIONS(If)
         | 
| 694 826 | 
             
                ATTACH_OPERATIONS()
         | 
| 695 827 | 
             
              };
         | 
| 696 828 |  | 
| @@ -699,15 +831,23 @@ namespace Sass { | |
| 699 831 | 
             
              /////////////////////////////////////
         | 
| 700 832 | 
             
              class For : public Has_Block {
         | 
| 701 833 | 
             
                ADD_PROPERTY(std::string, variable)
         | 
| 702 | 
            -
                ADD_PROPERTY( | 
| 703 | 
            -
                ADD_PROPERTY( | 
| 834 | 
            +
                ADD_PROPERTY(Expression_Obj, lower_bound)
         | 
| 835 | 
            +
                ADD_PROPERTY(Expression_Obj, upper_bound)
         | 
| 704 836 | 
             
                ADD_PROPERTY(bool, is_inclusive)
         | 
| 705 837 | 
             
              public:
         | 
| 706 838 | 
             
                For(ParserState pstate,
         | 
| 707 | 
            -
                    std::string var,  | 
| 839 | 
            +
                    std::string var, Expression_Obj lo, Expression_Obj hi, Block_Obj b, bool inc)
         | 
| 708 840 | 
             
                : Has_Block(pstate, b),
         | 
| 709 841 | 
             
                  variable_(var), lower_bound_(lo), upper_bound_(hi), is_inclusive_(inc)
         | 
| 710 842 | 
             
                { statement_type(FOR); }
         | 
| 843 | 
            +
                For(const For* ptr)
         | 
| 844 | 
            +
                : Has_Block(ptr),
         | 
| 845 | 
            +
                  variable_(ptr->variable_),
         | 
| 846 | 
            +
                  lower_bound_(ptr->lower_bound_),
         | 
| 847 | 
            +
                  upper_bound_(ptr->upper_bound_),
         | 
| 848 | 
            +
                  is_inclusive_(ptr->is_inclusive_)
         | 
| 849 | 
            +
                { statement_type(FOR); }
         | 
| 850 | 
            +
                ATTACH_AST_OPERATIONS(For)
         | 
| 711 851 | 
             
                ATTACH_OPERATIONS()
         | 
| 712 852 | 
             
              };
         | 
| 713 853 |  | 
| @@ -716,11 +856,15 @@ namespace Sass { | |
| 716 856 | 
             
              //////////////////////////////////////
         | 
| 717 857 | 
             
              class Each : public Has_Block {
         | 
| 718 858 | 
             
                ADD_PROPERTY(std::vector<std::string>, variables)
         | 
| 719 | 
            -
                ADD_PROPERTY( | 
| 859 | 
            +
                ADD_PROPERTY(Expression_Obj, list)
         | 
| 720 860 | 
             
              public:
         | 
| 721 | 
            -
                Each(ParserState pstate, std::vector<std::string> vars,  | 
| 861 | 
            +
                Each(ParserState pstate, std::vector<std::string> vars, Expression_Obj lst, Block_Obj b)
         | 
| 722 862 | 
             
                : Has_Block(pstate, b), variables_(vars), list_(lst)
         | 
| 723 863 | 
             
                { statement_type(EACH); }
         | 
| 864 | 
            +
                Each(const Each* ptr)
         | 
| 865 | 
            +
                : Has_Block(ptr), variables_(ptr->variables_), list_(ptr->list_)
         | 
| 866 | 
            +
                { statement_type(EACH); }
         | 
| 867 | 
            +
                ATTACH_AST_OPERATIONS(Each)
         | 
| 724 868 | 
             
                ATTACH_OPERATIONS()
         | 
| 725 869 | 
             
              };
         | 
| 726 870 |  | 
| @@ -728,11 +872,15 @@ namespace Sass { | |
| 728 872 | 
             
              // The Sass `@while` control directive.
         | 
| 729 873 | 
             
              ///////////////////////////////////////
         | 
| 730 874 | 
             
              class While : public Has_Block {
         | 
| 731 | 
            -
                ADD_PROPERTY( | 
| 875 | 
            +
                ADD_PROPERTY(Expression_Obj, predicate)
         | 
| 732 876 | 
             
              public:
         | 
| 733 | 
            -
                While(ParserState pstate,  | 
| 877 | 
            +
                While(ParserState pstate, Expression_Obj pred, Block_Obj b)
         | 
| 734 878 | 
             
                : Has_Block(pstate, b), predicate_(pred)
         | 
| 735 879 | 
             
                { statement_type(WHILE); }
         | 
| 880 | 
            +
                While(const While* ptr)
         | 
| 881 | 
            +
                : Has_Block(ptr), predicate_(ptr->predicate_)
         | 
| 882 | 
            +
                { statement_type(WHILE); }
         | 
| 883 | 
            +
                ATTACH_AST_OPERATIONS(While)
         | 
| 736 884 | 
             
                ATTACH_OPERATIONS()
         | 
| 737 885 | 
             
              };
         | 
| 738 886 |  | 
| @@ -740,11 +888,15 @@ namespace Sass { | |
| 740 888 | 
             
              // The @return directive for use inside SassScript functions.
         | 
| 741 889 | 
             
              /////////////////////////////////////////////////////////////
         | 
| 742 890 | 
             
              class Return : public Statement {
         | 
| 743 | 
            -
                ADD_PROPERTY( | 
| 891 | 
            +
                ADD_PROPERTY(Expression_Obj, value)
         | 
| 744 892 | 
             
              public:
         | 
| 745 | 
            -
                Return(ParserState pstate,  | 
| 893 | 
            +
                Return(ParserState pstate, Expression_Obj val)
         | 
| 746 894 | 
             
                : Statement(pstate), value_(val)
         | 
| 747 895 | 
             
                { statement_type(RETURN); }
         | 
| 896 | 
            +
                Return(const Return* ptr)
         | 
| 897 | 
            +
                : Statement(ptr), value_(ptr->value_)
         | 
| 898 | 
            +
                { statement_type(RETURN); }
         | 
| 899 | 
            +
                ATTACH_AST_OPERATIONS(Return)
         | 
| 748 900 | 
             
                ATTACH_OPERATIONS()
         | 
| 749 901 | 
             
              };
         | 
| 750 902 |  | 
| @@ -752,11 +904,15 @@ namespace Sass { | |
| 752 904 | 
             
              // The Sass `@extend` directive.
         | 
| 753 905 | 
             
              ////////////////////////////////
         | 
| 754 906 | 
             
              class Extension : public Statement {
         | 
| 755 | 
            -
                ADD_PROPERTY( | 
| 907 | 
            +
                ADD_PROPERTY(Selector_Obj, selector)
         | 
| 756 908 | 
             
              public:
         | 
| 757 | 
            -
                Extension(ParserState pstate,  | 
| 909 | 
            +
                Extension(ParserState pstate, Selector_Obj s)
         | 
| 758 910 | 
             
                : Statement(pstate), selector_(s)
         | 
| 759 911 | 
             
                { statement_type(EXTEND); }
         | 
| 912 | 
            +
                Extension(const Extension* ptr)
         | 
| 913 | 
            +
                : Statement(ptr), selector_(ptr->selector_)
         | 
| 914 | 
            +
                { statement_type(EXTEND); }
         | 
| 915 | 
            +
                ATTACH_AST_OPERATIONS(Extension)
         | 
| 760 916 | 
             
                ATTACH_OPERATIONS()
         | 
| 761 917 | 
             
              };
         | 
| 762 918 |  | 
| @@ -765,15 +921,14 @@ namespace Sass { | |
| 765 921 | 
             
              // by a type tag.
         | 
| 766 922 | 
             
              /////////////////////////////////////////////////////////////////////////////
         | 
| 767 923 | 
             
              struct Backtrace;
         | 
| 768 | 
            -
              typedef Environment< | 
| 769 | 
            -
              typedef const char* Signature;
         | 
| 770 | 
            -
              typedef Expression* (*Native_Function)(Env&, Env&, Context&, Signature, ParserState, Backtrace*, std::vector<CommaSequence_Selector*>);
         | 
| 924 | 
            +
              typedef Environment<AST_Node_Obj> Env;
         | 
| 771 925 | 
             
              typedef const char* Signature;
         | 
| 926 | 
            +
              typedef Expression_Ptr (*Native_Function)(Env&, Env&, Context&, Signature, ParserState, Backtrace*, std::vector<Selector_List_Obj>);
         | 
| 772 927 | 
             
              class Definition : public Has_Block {
         | 
| 773 928 | 
             
              public:
         | 
| 774 929 | 
             
                enum Type { MIXIN, FUNCTION };
         | 
| 775 930 | 
             
                ADD_PROPERTY(std::string, name)
         | 
| 776 | 
            -
                ADD_PROPERTY( | 
| 931 | 
            +
                ADD_PROPERTY(Parameters_Obj, parameters)
         | 
| 777 932 | 
             
                ADD_PROPERTY(Env*, environment)
         | 
| 778 933 | 
             
                ADD_PROPERTY(Type, type)
         | 
| 779 934 | 
             
                ADD_PROPERTY(Native_Function, native_function)
         | 
| @@ -782,10 +937,23 @@ namespace Sass { | |
| 782 937 | 
             
                ADD_PROPERTY(bool, is_overload_stub)
         | 
| 783 938 | 
             
                ADD_PROPERTY(Signature, signature)
         | 
| 784 939 | 
             
              public:
         | 
| 940 | 
            +
                Definition(const Definition* ptr)
         | 
| 941 | 
            +
                : Has_Block(ptr),
         | 
| 942 | 
            +
                  name_(ptr->name_),
         | 
| 943 | 
            +
                  parameters_(ptr->parameters_),
         | 
| 944 | 
            +
                  environment_(ptr->environment_),
         | 
| 945 | 
            +
                  type_(ptr->type_),
         | 
| 946 | 
            +
                  native_function_(ptr->native_function_),
         | 
| 947 | 
            +
                  c_function_(ptr->c_function_),
         | 
| 948 | 
            +
                  cookie_(ptr->cookie_),
         | 
| 949 | 
            +
                  is_overload_stub_(ptr->is_overload_stub_),
         | 
| 950 | 
            +
                  signature_(ptr->signature_)
         | 
| 951 | 
            +
                { }
         | 
| 952 | 
            +
             | 
| 785 953 | 
             
                Definition(ParserState pstate,
         | 
| 786 954 | 
             
                           std::string n,
         | 
| 787 | 
            -
                            | 
| 788 | 
            -
                            | 
| 955 | 
            +
                           Parameters_Obj params,
         | 
| 956 | 
            +
                           Block_Obj b,
         | 
| 789 957 | 
             
                           Type t)
         | 
| 790 958 | 
             
                : Has_Block(pstate, b),
         | 
| 791 959 | 
             
                  name_(n),
         | 
| @@ -801,7 +969,7 @@ namespace Sass { | |
| 801 969 | 
             
                Definition(ParserState pstate,
         | 
| 802 970 | 
             
                           Signature sig,
         | 
| 803 971 | 
             
                           std::string n,
         | 
| 804 | 
            -
                            | 
| 972 | 
            +
                           Parameters_Obj params,
         | 
| 805 973 | 
             
                           Native_Function func_ptr,
         | 
| 806 974 | 
             
                           bool overload_stub = false)
         | 
| 807 975 | 
             
                : Has_Block(pstate, 0),
         | 
| @@ -818,7 +986,7 @@ namespace Sass { | |
| 818 986 | 
             
                Definition(ParserState pstate,
         | 
| 819 987 | 
             
                           Signature sig,
         | 
| 820 988 | 
             
                           std::string n,
         | 
| 821 | 
            -
                            | 
| 989 | 
            +
                           Parameters_Obj params,
         | 
| 822 990 | 
             
                           Sass_Function_Entry c_func,
         | 
| 823 991 | 
             
                           bool whatever,
         | 
| 824 992 | 
             
                           bool whatever2)
         | 
| @@ -833,6 +1001,7 @@ namespace Sass { | |
| 833 1001 | 
             
                  is_overload_stub_(false),
         | 
| 834 1002 | 
             
                  signature_(sig)
         | 
| 835 1003 | 
             
                { }
         | 
| 1004 | 
            +
                ATTACH_AST_OPERATIONS(Definition)
         | 
| 836 1005 | 
             
                ATTACH_OPERATIONS()
         | 
| 837 1006 | 
             
              };
         | 
| 838 1007 |  | 
| @@ -841,11 +1010,17 @@ namespace Sass { | |
| 841 1010 | 
             
              //////////////////////////////////////
         | 
| 842 1011 | 
             
              class Mixin_Call : public Has_Block {
         | 
| 843 1012 | 
             
                ADD_PROPERTY(std::string, name)
         | 
| 844 | 
            -
                ADD_PROPERTY( | 
| 1013 | 
            +
                ADD_PROPERTY(Arguments_Obj, arguments)
         | 
| 845 1014 | 
             
              public:
         | 
| 846 | 
            -
                Mixin_Call(ParserState pstate, std::string n,  | 
| 1015 | 
            +
                Mixin_Call(ParserState pstate, std::string n, Arguments_Obj args, Block_Obj b = 0)
         | 
| 847 1016 | 
             
                : Has_Block(pstate, b), name_(n), arguments_(args)
         | 
| 848 1017 | 
             
                { }
         | 
| 1018 | 
            +
                Mixin_Call(const Mixin_Call* ptr)
         | 
| 1019 | 
            +
                : Has_Block(ptr),
         | 
| 1020 | 
            +
                  name_(ptr->name_),
         | 
| 1021 | 
            +
                  arguments_(ptr->arguments_)
         | 
| 1022 | 
            +
                { }
         | 
| 1023 | 
            +
                ATTACH_AST_OPERATIONS(Mixin_Call)
         | 
| 849 1024 | 
             
                ATTACH_OPERATIONS()
         | 
| 850 1025 | 
             
              };
         | 
| 851 1026 |  | 
| @@ -853,10 +1028,13 @@ namespace Sass { | |
| 853 1028 | 
             
              // The @content directive for mixin content blocks.
         | 
| 854 1029 | 
             
              ///////////////////////////////////////////////////
         | 
| 855 1030 | 
             
              class Content : public Statement {
         | 
| 856 | 
            -
                ADD_PROPERTY( | 
| 1031 | 
            +
                ADD_PROPERTY(Media_Block_Obj, media_block)
         | 
| 857 1032 | 
             
              public:
         | 
| 858 1033 | 
             
                Content(ParserState pstate) : Statement(pstate)
         | 
| 859 1034 | 
             
                { statement_type(CONTENT); }
         | 
| 1035 | 
            +
                Content(const Content* ptr) : Statement(ptr)
         | 
| 1036 | 
            +
                { statement_type(CONTENT); }
         | 
| 1037 | 
            +
                ATTACH_AST_OPERATIONS(Content)
         | 
| 860 1038 | 
             
                ATTACH_OPERATIONS()
         | 
| 861 1039 | 
             
              };
         | 
| 862 1040 |  | 
| @@ -864,8 +1042,8 @@ namespace Sass { | |
| 864 1042 | 
             
              // Lists of values, both comma- and space-separated (distinguished by a
         | 
| 865 1043 | 
             
              // type-tag.) Also used to represent variable-length argument lists.
         | 
| 866 1044 | 
             
              ///////////////////////////////////////////////////////////////////////
         | 
| 867 | 
            -
              class List : public Value, public Vectorized< | 
| 868 | 
            -
                void adjust_after_pushing( | 
| 1045 | 
            +
              class List : public Value, public Vectorized<Expression_Obj> {
         | 
| 1046 | 
            +
                void adjust_after_pushing(Expression_Obj e) { is_expanded(false); }
         | 
| 869 1047 | 
             
              private:
         | 
| 870 1048 | 
             
                ADD_PROPERTY(enum Sass_Separator, separator)
         | 
| 871 1049 | 
             
                ADD_PROPERTY(bool, is_arglist)
         | 
| @@ -874,11 +1052,18 @@ namespace Sass { | |
| 874 1052 | 
             
                List(ParserState pstate,
         | 
| 875 1053 | 
             
                     size_t size = 0, enum Sass_Separator sep = SASS_SPACE, bool argl = false)
         | 
| 876 1054 | 
             
                : Value(pstate),
         | 
| 877 | 
            -
                  Vectorized< | 
| 1055 | 
            +
                  Vectorized<Expression_Obj>(size),
         | 
| 878 1056 | 
             
                  separator_(sep),
         | 
| 879 1057 | 
             
                  is_arglist_(argl),
         | 
| 880 1058 | 
             
                  from_selector_(false)
         | 
| 881 1059 | 
             
                { concrete_type(LIST); }
         | 
| 1060 | 
            +
                List(const List* ptr)
         | 
| 1061 | 
            +
                : Value(ptr),
         | 
| 1062 | 
            +
                  Vectorized<Expression_Obj>(*ptr),
         | 
| 1063 | 
            +
                  separator_(ptr->separator_),
         | 
| 1064 | 
            +
                  is_arglist_(ptr->is_arglist_),
         | 
| 1065 | 
            +
                  from_selector_(ptr->from_selector_)
         | 
| 1066 | 
            +
                { concrete_type(LIST); }
         | 
| 882 1067 | 
             
                std::string type() { return is_arglist_ ? "arglist" : "list"; }
         | 
| 883 1068 | 
             
                static std::string type_name() { return "list"; }
         | 
| 884 1069 | 
             
                const char* sep_string(bool compressed = false) const {
         | 
| @@ -886,7 +1071,7 @@ namespace Sass { | |
| 886 1071 | 
             
                    " " : (compressed ? "," : ", ");
         | 
| 887 1072 | 
             
                }
         | 
| 888 1073 | 
             
                bool is_invisible() const { return empty(); }
         | 
| 889 | 
            -
                 | 
| 1074 | 
            +
                Expression_Obj value_at_index(size_t i);
         | 
| 890 1075 |  | 
| 891 1076 | 
             
                virtual size_t size() const;
         | 
| 892 1077 |  | 
| @@ -908,6 +1093,7 @@ namespace Sass { | |
| 908 1093 |  | 
| 909 1094 | 
             
                virtual bool operator== (const Expression& rhs) const;
         | 
| 910 1095 |  | 
| 1096 | 
            +
                ATTACH_AST_OPERATIONS(List)
         | 
| 911 1097 | 
             
                ATTACH_OPERATIONS()
         | 
| 912 1098 | 
             
              };
         | 
| 913 1099 |  | 
| @@ -915,17 +1101,21 @@ namespace Sass { | |
| 915 1101 | 
             
              // Key value paris.
         | 
| 916 1102 | 
             
              ///////////////////////////////////////////////////////////////////////
         | 
| 917 1103 | 
             
              class Map : public Value, public Hashed {
         | 
| 918 | 
            -
                void adjust_after_pushing(std::pair< | 
| 1104 | 
            +
                void adjust_after_pushing(std::pair<Expression_Obj, Expression_Obj> p) { is_expanded(false); }
         | 
| 919 1105 | 
             
              public:
         | 
| 920 1106 | 
             
                Map(ParserState pstate,
         | 
| 921 1107 | 
             
                     size_t size = 0)
         | 
| 922 1108 | 
             
                : Value(pstate),
         | 
| 923 1109 | 
             
                  Hashed(size)
         | 
| 924 1110 | 
             
                { concrete_type(MAP); }
         | 
| 1111 | 
            +
                Map(const Map* ptr)
         | 
| 1112 | 
            +
                : Value(ptr),
         | 
| 1113 | 
            +
                  Hashed(*ptr)
         | 
| 1114 | 
            +
                { concrete_type(MAP); }
         | 
| 925 1115 | 
             
                std::string type() { return "map"; }
         | 
| 926 1116 | 
             
                static std::string type_name() { return "map"; }
         | 
| 927 1117 | 
             
                bool is_invisible() const { return empty(); }
         | 
| 928 | 
            -
                 | 
| 1118 | 
            +
                List_Obj to_list(Context& ctx, ParserState& pstate);
         | 
| 929 1119 |  | 
| 930 1120 | 
             
                virtual size_t hash()
         | 
| 931 1121 | 
             
                {
         | 
| @@ -941,6 +1131,7 @@ namespace Sass { | |
| 941 1131 |  | 
| 942 1132 | 
             
                virtual bool operator== (const Expression& rhs) const;
         | 
| 943 1133 |  | 
| 1134 | 
            +
                ATTACH_AST_OPERATIONS(Map)
         | 
| 944 1135 | 
             
                ATTACH_OPERATIONS()
         | 
| 945 1136 | 
             
              };
         | 
| 946 1137 |  | 
| @@ -973,14 +1164,21 @@ namespace Sass { | |
| 973 1164 | 
             
              class Binary_Expression : public PreValue {
         | 
| 974 1165 | 
             
              private:
         | 
| 975 1166 | 
             
                ADD_HASHED(Operand, op)
         | 
| 976 | 
            -
                ADD_HASHED( | 
| 977 | 
            -
                ADD_HASHED( | 
| 1167 | 
            +
                ADD_HASHED(Expression_Obj, left)
         | 
| 1168 | 
            +
                ADD_HASHED(Expression_Obj, right)
         | 
| 978 1169 | 
             
                size_t hash_;
         | 
| 979 1170 | 
             
              public:
         | 
| 980 1171 | 
             
                Binary_Expression(ParserState pstate,
         | 
| 981 | 
            -
                                  Operand op,  | 
| 1172 | 
            +
                                  Operand op, Expression_Obj lhs, Expression_Obj rhs)
         | 
| 982 1173 | 
             
                : PreValue(pstate), op_(op), left_(lhs), right_(rhs), hash_(0)
         | 
| 983 1174 | 
             
                { }
         | 
| 1175 | 
            +
                Binary_Expression(const Binary_Expression* ptr)
         | 
| 1176 | 
            +
                : PreValue(ptr),
         | 
| 1177 | 
            +
                  op_(ptr->op_),
         | 
| 1178 | 
            +
                  left_(ptr->left_),
         | 
| 1179 | 
            +
                  right_(ptr->right_),
         | 
| 1180 | 
            +
                  hash_(ptr->hash_)
         | 
| 1181 | 
            +
                { }
         | 
| 984 1182 | 
             
                const std::string type_name() {
         | 
| 985 1183 | 
             
                  switch (type()) {
         | 
| 986 1184 | 
             
                    case AND: return "and"; break;
         | 
| @@ -1038,7 +1236,7 @@ namespace Sass { | |
| 1038 1236 | 
             
                {
         | 
| 1039 1237 | 
             
                  try
         | 
| 1040 1238 | 
             
                  {
         | 
| 1041 | 
            -
                     | 
| 1239 | 
            +
                    Binary_Expression_Ptr_Const m = dynamic_cast<Binary_Expression_Ptr_Const>(&rhs);
         | 
| 1042 1240 | 
             
                    if (m == 0) return false;
         | 
| 1043 1241 | 
             
                    return type() == m->type() &&
         | 
| 1044 1242 | 
             
                           left() == m->left() &&
         | 
| @@ -1060,6 +1258,7 @@ namespace Sass { | |
| 1060 1258 | 
             
                  return hash_;
         | 
| 1061 1259 | 
             
                }
         | 
| 1062 1260 | 
             
                enum Sass_OP type() const { return op_.operand; }
         | 
| 1261 | 
            +
                ATTACH_AST_OPERATIONS(Binary_Expression)
         | 
| 1063 1262 | 
             
                ATTACH_OPERATIONS()
         | 
| 1064 1263 | 
             
              };
         | 
| 1065 1264 |  | 
| @@ -1071,12 +1270,18 @@ namespace Sass { | |
| 1071 1270 | 
             
                enum Type { PLUS, MINUS, NOT };
         | 
| 1072 1271 | 
             
              private:
         | 
| 1073 1272 | 
             
                ADD_HASHED(Type, type)
         | 
| 1074 | 
            -
                ADD_HASHED( | 
| 1273 | 
            +
                ADD_HASHED(Expression_Obj, operand)
         | 
| 1075 1274 | 
             
                size_t hash_;
         | 
| 1076 1275 | 
             
              public:
         | 
| 1077 | 
            -
                Unary_Expression(ParserState pstate, Type t,  | 
| 1276 | 
            +
                Unary_Expression(ParserState pstate, Type t, Expression_Obj o)
         | 
| 1078 1277 | 
             
                : Expression(pstate), type_(t), operand_(o), hash_(0)
         | 
| 1079 1278 | 
             
                { }
         | 
| 1279 | 
            +
                Unary_Expression(const Unary_Expression* ptr)
         | 
| 1280 | 
            +
                : Expression(ptr),
         | 
| 1281 | 
            +
                  type_(ptr->type_),
         | 
| 1282 | 
            +
                  operand_(ptr->operand_),
         | 
| 1283 | 
            +
                  hash_(ptr->hash_)
         | 
| 1284 | 
            +
                { }
         | 
| 1080 1285 | 
             
                const std::string type_name() {
         | 
| 1081 1286 | 
             
                  switch (type_) {
         | 
| 1082 1287 | 
             
                    case PLUS: return "plus"; break;
         | 
| @@ -1089,7 +1294,7 @@ namespace Sass { | |
| 1089 1294 | 
             
                {
         | 
| 1090 1295 | 
             
                  try
         | 
| 1091 1296 | 
             
                  {
         | 
| 1092 | 
            -
                     | 
| 1297 | 
            +
                    Unary_Expression_Ptr_Const m = dynamic_cast<Unary_Expression_Ptr_Const>(&rhs);
         | 
| 1093 1298 | 
             
                    if (m == 0) return false;
         | 
| 1094 1299 | 
             
                    return type() == m->type() &&
         | 
| 1095 1300 | 
             
                           operand() == m->operand();
         | 
| @@ -1108,6 +1313,7 @@ namespace Sass { | |
| 1108 1313 | 
             
                  };
         | 
| 1109 1314 | 
             
                  return hash_;
         | 
| 1110 1315 | 
             
                }
         | 
| 1316 | 
            +
                ATTACH_AST_OPERATIONS(Unary_Expression)
         | 
| 1111 1317 | 
             
                ATTACH_OPERATIONS()
         | 
| 1112 1318 | 
             
              };
         | 
| 1113 1319 |  | 
| @@ -1115,17 +1321,29 @@ namespace Sass { | |
| 1115 1321 | 
             
              // Individual argument objects for mixin and function calls.
         | 
| 1116 1322 | 
             
              ////////////////////////////////////////////////////////////
         | 
| 1117 1323 | 
             
              class Argument : public Expression {
         | 
| 1118 | 
            -
                ADD_HASHED( | 
| 1324 | 
            +
                ADD_HASHED(Expression_Obj, value)
         | 
| 1119 1325 | 
             
                ADD_HASHED(std::string, name)
         | 
| 1120 1326 | 
             
                ADD_PROPERTY(bool, is_rest_argument)
         | 
| 1121 1327 | 
             
                ADD_PROPERTY(bool, is_keyword_argument)
         | 
| 1122 1328 | 
             
                size_t hash_;
         | 
| 1123 1329 | 
             
              public:
         | 
| 1124 | 
            -
                Argument(ParserState pstate,  | 
| 1330 | 
            +
                Argument(ParserState pstate, Expression_Obj val, std::string n = "", bool rest = false, bool keyword = false)
         | 
| 1125 1331 | 
             
                : Expression(pstate), value_(val), name_(n), is_rest_argument_(rest), is_keyword_argument_(keyword), hash_(0)
         | 
| 1126 1332 | 
             
                {
         | 
| 1127 1333 | 
             
                  if (!name_.empty() && is_rest_argument_) {
         | 
| 1128 | 
            -
                    error("variable-length argument may not be passed by name",  | 
| 1334 | 
            +
                    error("variable-length argument may not be passed by name", pstate_);
         | 
| 1335 | 
            +
                  }
         | 
| 1336 | 
            +
                }
         | 
| 1337 | 
            +
                Argument(const Argument* ptr)
         | 
| 1338 | 
            +
                : Expression(ptr),
         | 
| 1339 | 
            +
                  value_(ptr->value_),
         | 
| 1340 | 
            +
                  name_(ptr->name_),
         | 
| 1341 | 
            +
                  is_rest_argument_(ptr->is_rest_argument_),
         | 
| 1342 | 
            +
                  is_keyword_argument_(ptr->is_keyword_argument_),
         | 
| 1343 | 
            +
                  hash_(ptr->hash_)
         | 
| 1344 | 
            +
                {
         | 
| 1345 | 
            +
                  if (!name_.empty() && is_rest_argument_) {
         | 
| 1346 | 
            +
                    error("variable-length argument may not be passed by name", pstate_);
         | 
| 1129 1347 | 
             
                  }
         | 
| 1130 1348 | 
             
                }
         | 
| 1131 1349 |  | 
| @@ -1134,7 +1352,7 @@ namespace Sass { | |
| 1134 1352 | 
             
                {
         | 
| 1135 1353 | 
             
                  try
         | 
| 1136 1354 | 
             
                  {
         | 
| 1137 | 
            -
                     | 
| 1355 | 
            +
                    Argument_Ptr_Const m = dynamic_cast<Argument_Ptr_Const>(&rhs);
         | 
| 1138 1356 | 
             
                    if (!(m && name() == m->name())) return false;
         | 
| 1139 1357 | 
             
                    return *value() == *m->value();
         | 
| 1140 1358 | 
             
                  }
         | 
| @@ -1154,6 +1372,7 @@ namespace Sass { | |
| 1154 1372 | 
             
                  return hash_;
         | 
| 1155 1373 | 
             
                }
         | 
| 1156 1374 |  | 
| 1375 | 
            +
                ATTACH_AST_OPERATIONS(Argument)
         | 
| 1157 1376 | 
             
                ATTACH_OPERATIONS()
         | 
| 1158 1377 | 
             
              };
         | 
| 1159 1378 |  | 
| @@ -1162,26 +1381,34 @@ namespace Sass { | |
| 1162 1381 | 
             
              // error checking (e.g., ensuring that all ordinal arguments precede all
         | 
| 1163 1382 | 
             
              // named arguments).
         | 
| 1164 1383 | 
             
              ////////////////////////////////////////////////////////////////////////
         | 
| 1165 | 
            -
              class Arguments : public Expression, public Vectorized< | 
| 1384 | 
            +
              class Arguments : public Expression, public Vectorized<Argument_Obj> {
         | 
| 1166 1385 | 
             
                ADD_PROPERTY(bool, has_named_arguments)
         | 
| 1167 1386 | 
             
                ADD_PROPERTY(bool, has_rest_argument)
         | 
| 1168 1387 | 
             
                ADD_PROPERTY(bool, has_keyword_argument)
         | 
| 1169 1388 | 
             
              protected:
         | 
| 1170 | 
            -
                void adjust_after_pushing( | 
| 1389 | 
            +
                void adjust_after_pushing(Argument_Obj a);
         | 
| 1171 1390 | 
             
              public:
         | 
| 1172 1391 | 
             
                Arguments(ParserState pstate)
         | 
| 1173 1392 | 
             
                : Expression(pstate),
         | 
| 1174 | 
            -
                  Vectorized< | 
| 1393 | 
            +
                  Vectorized<Argument_Obj>(),
         | 
| 1175 1394 | 
             
                  has_named_arguments_(false),
         | 
| 1176 1395 | 
             
                  has_rest_argument_(false),
         | 
| 1177 1396 | 
             
                  has_keyword_argument_(false)
         | 
| 1178 1397 | 
             
                { }
         | 
| 1398 | 
            +
                Arguments(const Arguments* ptr)
         | 
| 1399 | 
            +
                : Expression(ptr),
         | 
| 1400 | 
            +
                  Vectorized<Argument_Obj>(*ptr),
         | 
| 1401 | 
            +
                  has_named_arguments_(ptr->has_named_arguments_),
         | 
| 1402 | 
            +
                  has_rest_argument_(ptr->has_rest_argument_),
         | 
| 1403 | 
            +
                  has_keyword_argument_(ptr->has_keyword_argument_)
         | 
| 1404 | 
            +
                { }
         | 
| 1179 1405 |  | 
| 1180 1406 | 
             
                virtual void set_delayed(bool delayed);
         | 
| 1181 1407 |  | 
| 1182 | 
            -
                 | 
| 1183 | 
            -
                 | 
| 1408 | 
            +
                Argument_Obj get_rest_argument();
         | 
| 1409 | 
            +
                Argument_Obj get_keyword_argument();
         | 
| 1184 1410 |  | 
| 1411 | 
            +
                ATTACH_AST_OPERATIONS(Arguments)
         | 
| 1185 1412 | 
             
                ATTACH_OPERATIONS()
         | 
| 1186 1413 | 
             
              };
         | 
| 1187 1414 |  | 
| @@ -1190,22 +1417,31 @@ namespace Sass { | |
| 1190 1417 | 
             
              //////////////////
         | 
| 1191 1418 | 
             
              class Function_Call : public PreValue {
         | 
| 1192 1419 | 
             
                ADD_HASHED(std::string, name)
         | 
| 1193 | 
            -
                ADD_HASHED( | 
| 1420 | 
            +
                ADD_HASHED(Arguments_Obj, arguments)
         | 
| 1421 | 
            +
                ADD_PROPERTY(bool, via_call)
         | 
| 1194 1422 | 
             
                ADD_PROPERTY(void*, cookie)
         | 
| 1195 1423 | 
             
                size_t hash_;
         | 
| 1196 1424 | 
             
              public:
         | 
| 1197 | 
            -
                Function_Call(ParserState pstate, std::string n,  | 
| 1198 | 
            -
                : PreValue(pstate), name_(n), arguments_(args), cookie_(cookie), hash_(0)
         | 
| 1199 | 
            -
                { concrete_type( | 
| 1200 | 
            -
                Function_Call(ParserState pstate, std::string n,  | 
| 1201 | 
            -
                : PreValue(pstate), name_(n), arguments_(args), cookie_(0), hash_(0)
         | 
| 1202 | 
            -
                { concrete_type( | 
| 1425 | 
            +
                Function_Call(ParserState pstate, std::string n, Arguments_Obj args, void* cookie)
         | 
| 1426 | 
            +
                : PreValue(pstate), name_(n), arguments_(args), via_call_(false), cookie_(cookie), hash_(0)
         | 
| 1427 | 
            +
                { concrete_type(FUNCTION); }
         | 
| 1428 | 
            +
                Function_Call(ParserState pstate, std::string n, Arguments_Obj args)
         | 
| 1429 | 
            +
                : PreValue(pstate), name_(n), arguments_(args), via_call_(false), cookie_(0), hash_(0)
         | 
| 1430 | 
            +
                { concrete_type(FUNCTION); }
         | 
| 1431 | 
            +
                Function_Call(const Function_Call* ptr)
         | 
| 1432 | 
            +
                : PreValue(ptr),
         | 
| 1433 | 
            +
                  name_(ptr->name_),
         | 
| 1434 | 
            +
                  arguments_(ptr->arguments_),
         | 
| 1435 | 
            +
                  via_call_(ptr->via_call_),
         | 
| 1436 | 
            +
                  cookie_(ptr->cookie_),
         | 
| 1437 | 
            +
                  hash_(ptr->hash_)
         | 
| 1438 | 
            +
                { concrete_type(FUNCTION); }
         | 
| 1203 1439 |  | 
| 1204 1440 | 
             
                virtual bool operator==(const Expression& rhs) const
         | 
| 1205 1441 | 
             
                {
         | 
| 1206 1442 | 
             
                  try
         | 
| 1207 1443 | 
             
                  {
         | 
| 1208 | 
            -
                     | 
| 1444 | 
            +
                    Function_Call_Ptr_Const m = dynamic_cast<Function_Call_Ptr_Const>(&rhs);
         | 
| 1209 1445 | 
             
                    if (!(m && name() == m->name())) return false;
         | 
| 1210 1446 | 
             
                    if (!(m && arguments()->length() == m->arguments()->length())) return false;
         | 
| 1211 1447 | 
             
                    for (size_t i =0, L = arguments()->length(); i < L; ++i)
         | 
| @@ -1228,7 +1464,7 @@ namespace Sass { | |
| 1228 1464 | 
             
                  }
         | 
| 1229 1465 | 
             
                  return hash_;
         | 
| 1230 1466 | 
             
                }
         | 
| 1231 | 
            -
             | 
| 1467 | 
            +
                ATTACH_AST_OPERATIONS(Function_Call)
         | 
| 1232 1468 | 
             
                ATTACH_OPERATIONS()
         | 
| 1233 1469 | 
             
              };
         | 
| 1234 1470 |  | 
| @@ -1236,12 +1472,18 @@ namespace Sass { | |
| 1236 1472 | 
             
              // Function call schemas.
         | 
| 1237 1473 | 
             
              /////////////////////////
         | 
| 1238 1474 | 
             
              class Function_Call_Schema : public Expression {
         | 
| 1239 | 
            -
                ADD_PROPERTY( | 
| 1240 | 
            -
                ADD_PROPERTY( | 
| 1475 | 
            +
                ADD_PROPERTY(String_Obj, name)
         | 
| 1476 | 
            +
                ADD_PROPERTY(Arguments_Obj, arguments)
         | 
| 1241 1477 | 
             
              public:
         | 
| 1242 | 
            -
                Function_Call_Schema(ParserState pstate,  | 
| 1478 | 
            +
                Function_Call_Schema(ParserState pstate, String_Obj n, Arguments_Obj args)
         | 
| 1243 1479 | 
             
                : Expression(pstate), name_(n), arguments_(args)
         | 
| 1244 1480 | 
             
                { concrete_type(STRING); }
         | 
| 1481 | 
            +
                Function_Call_Schema(const Function_Call_Schema* ptr)
         | 
| 1482 | 
            +
                : Expression(ptr),
         | 
| 1483 | 
            +
                  name_(ptr->name_),
         | 
| 1484 | 
            +
                  arguments_(ptr->arguments_)
         | 
| 1485 | 
            +
                { concrete_type(STRING); }
         | 
| 1486 | 
            +
                ATTACH_AST_OPERATIONS(Function_Call_Schema)
         | 
| 1245 1487 | 
             
                ATTACH_OPERATIONS()
         | 
| 1246 1488 | 
             
              };
         | 
| 1247 1489 |  | 
| @@ -1254,12 +1496,15 @@ namespace Sass { | |
| 1254 1496 | 
             
                Variable(ParserState pstate, std::string n)
         | 
| 1255 1497 | 
             
                : PreValue(pstate), name_(n)
         | 
| 1256 1498 | 
             
                { }
         | 
| 1499 | 
            +
                Variable(const Variable* ptr)
         | 
| 1500 | 
            +
                : PreValue(ptr), name_(ptr->name_)
         | 
| 1501 | 
            +
                { }
         | 
| 1257 1502 |  | 
| 1258 1503 | 
             
                virtual bool operator==(const Expression& rhs) const
         | 
| 1259 1504 | 
             
                {
         | 
| 1260 1505 | 
             
                  try
         | 
| 1261 1506 | 
             
                  {
         | 
| 1262 | 
            -
                     | 
| 1507 | 
            +
                    Variable_Ptr_Const e = dynamic_cast<Variable_Ptr_Const>(&rhs);
         | 
| 1263 1508 | 
             
                    return e && name() == e->name();
         | 
| 1264 1509 | 
             
                  }
         | 
| 1265 1510 | 
             
                  catch (std::bad_cast&)
         | 
| @@ -1274,6 +1519,7 @@ namespace Sass { | |
| 1274 1519 | 
             
                  return std::hash<std::string>()(name());
         | 
| 1275 1520 | 
             
                }
         | 
| 1276 1521 |  | 
| 1522 | 
            +
                ATTACH_AST_OPERATIONS(Variable)
         | 
| 1277 1523 | 
             
                ATTACH_OPERATIONS()
         | 
| 1278 1524 | 
             
              };
         | 
| 1279 1525 |  | 
| @@ -1293,12 +1539,18 @@ namespace Sass { | |
| 1293 1539 | 
             
                : Expression(pstate, DELAYED), type_(t), value_(val),
         | 
| 1294 1540 | 
             
                  hash_(0)
         | 
| 1295 1541 | 
             
                { }
         | 
| 1542 | 
            +
                Textual(const Textual* ptr)
         | 
| 1543 | 
            +
                : Expression(ptr),
         | 
| 1544 | 
            +
                  type_(ptr->type_),
         | 
| 1545 | 
            +
                  value_(ptr->value_),
         | 
| 1546 | 
            +
                  hash_(ptr->hash_)
         | 
| 1547 | 
            +
                { }
         | 
| 1296 1548 |  | 
| 1297 1549 | 
             
                virtual bool operator==(const Expression& rhs) const
         | 
| 1298 1550 | 
             
                {
         | 
| 1299 1551 | 
             
                  try
         | 
| 1300 1552 | 
             
                  {
         | 
| 1301 | 
            -
                     | 
| 1553 | 
            +
                    Textual_Ptr_Const e = dynamic_cast<Textual_Ptr_Const>(&rhs);
         | 
| 1302 1554 | 
             
                    return e && value() == e->value() && type() == e->type();
         | 
| 1303 1555 | 
             
                  }
         | 
| 1304 1556 | 
             
                  catch (std::bad_cast&)
         | 
| @@ -1317,6 +1569,7 @@ namespace Sass { | |
| 1317 1569 | 
             
                  return hash_;
         | 
| 1318 1570 | 
             
                }
         | 
| 1319 1571 |  | 
| 1572 | 
            +
                ATTACH_AST_OPERATIONS(Textual)
         | 
| 1320 1573 | 
             
                ATTACH_OPERATIONS()
         | 
| 1321 1574 | 
             
              };
         | 
| 1322 1575 |  | 
| @@ -1331,6 +1584,15 @@ namespace Sass { | |
| 1331 1584 | 
             
                size_t hash_;
         | 
| 1332 1585 | 
             
              public:
         | 
| 1333 1586 | 
             
                Number(ParserState pstate, double val, std::string u = "", bool zero = true);
         | 
| 1587 | 
            +
             | 
| 1588 | 
            +
                Number(const Number* ptr)
         | 
| 1589 | 
            +
                : Value(ptr),
         | 
| 1590 | 
            +
                  value_(ptr->value_), zero_(ptr->zero_),
         | 
| 1591 | 
            +
                  numerator_units_(ptr->numerator_units_),
         | 
| 1592 | 
            +
                  denominator_units_(ptr->denominator_units_),
         | 
| 1593 | 
            +
                  hash_(ptr->hash_)
         | 
| 1594 | 
            +
                { concrete_type(NUMBER); }
         | 
| 1595 | 
            +
             | 
| 1334 1596 | 
             
                bool zero() { return zero_; }
         | 
| 1335 1597 | 
             
                bool is_valid_css_unit() const;
         | 
| 1336 1598 | 
             
                std::vector<std::string>& numerator_units()   { return numerator_units_; }
         | 
| @@ -1363,7 +1625,7 @@ namespace Sass { | |
| 1363 1625 | 
             
                virtual bool operator< (const Number& rhs) const;
         | 
| 1364 1626 | 
             
                virtual bool operator== (const Expression& rhs) const;
         | 
| 1365 1627 | 
             
                virtual bool eq(const Expression& rhs) const;
         | 
| 1366 | 
            -
             | 
| 1628 | 
            +
                ATTACH_AST_OPERATIONS(Number)
         | 
| 1367 1629 | 
             
                ATTACH_OPERATIONS()
         | 
| 1368 1630 | 
             
              };
         | 
| 1369 1631 |  | 
| @@ -1382,6 +1644,15 @@ namespace Sass { | |
| 1382 1644 | 
             
                : Value(pstate), r_(r), g_(g), b_(b), a_(a), disp_(disp),
         | 
| 1383 1645 | 
             
                  hash_(0)
         | 
| 1384 1646 | 
             
                { concrete_type(COLOR); }
         | 
| 1647 | 
            +
                Color(const Color* ptr)
         | 
| 1648 | 
            +
                : Value(ptr),
         | 
| 1649 | 
            +
                  r_(ptr->r_),
         | 
| 1650 | 
            +
                  g_(ptr->g_),
         | 
| 1651 | 
            +
                  b_(ptr->b_),
         | 
| 1652 | 
            +
                  a_(ptr->a_),
         | 
| 1653 | 
            +
                  disp_(ptr->disp_),
         | 
| 1654 | 
            +
                  hash_(ptr->hash_)
         | 
| 1655 | 
            +
                { concrete_type(COLOR); }
         | 
| 1385 1656 | 
             
                std::string type() { return "color"; }
         | 
| 1386 1657 | 
             
                static std::string type_name() { return "color"; }
         | 
| 1387 1658 |  | 
| @@ -1398,6 +1669,7 @@ namespace Sass { | |
| 1398 1669 |  | 
| 1399 1670 | 
             
                virtual bool operator== (const Expression& rhs) const;
         | 
| 1400 1671 |  | 
| 1672 | 
            +
                ATTACH_AST_OPERATIONS(Color)
         | 
| 1401 1673 | 
             
                ATTACH_OPERATIONS()
         | 
| 1402 1674 | 
             
              };
         | 
| 1403 1675 |  | 
| @@ -1410,7 +1682,11 @@ namespace Sass { | |
| 1410 1682 | 
             
                Custom_Error(ParserState pstate, std::string msg)
         | 
| 1411 1683 | 
             
                : Value(pstate), message_(msg)
         | 
| 1412 1684 | 
             
                { concrete_type(C_ERROR); }
         | 
| 1685 | 
            +
                Custom_Error(const Custom_Error* ptr)
         | 
| 1686 | 
            +
                : Value(ptr), message_(ptr->message_)
         | 
| 1687 | 
            +
                { concrete_type(C_ERROR); }
         | 
| 1413 1688 | 
             
                virtual bool operator== (const Expression& rhs) const;
         | 
| 1689 | 
            +
                ATTACH_AST_OPERATIONS(Custom_Error)
         | 
| 1414 1690 | 
             
                ATTACH_OPERATIONS()
         | 
| 1415 1691 | 
             
              };
         | 
| 1416 1692 |  | 
| @@ -1423,7 +1699,11 @@ namespace Sass { | |
| 1423 1699 | 
             
                Custom_Warning(ParserState pstate, std::string msg)
         | 
| 1424 1700 | 
             
                : Value(pstate), message_(msg)
         | 
| 1425 1701 | 
             
                { concrete_type(C_WARNING); }
         | 
| 1702 | 
            +
                Custom_Warning(const Custom_Warning* ptr)
         | 
| 1703 | 
            +
                : Value(ptr), message_(ptr->message_)
         | 
| 1704 | 
            +
                { concrete_type(C_WARNING); }
         | 
| 1426 1705 | 
             
                virtual bool operator== (const Expression& rhs) const;
         | 
| 1706 | 
            +
                ATTACH_AST_OPERATIONS(Custom_Warning)
         | 
| 1427 1707 | 
             
                ATTACH_OPERATIONS()
         | 
| 1428 1708 | 
             
              };
         | 
| 1429 1709 |  | 
| @@ -1438,6 +1718,11 @@ namespace Sass { | |
| 1438 1718 | 
             
                : Value(pstate), value_(val),
         | 
| 1439 1719 | 
             
                  hash_(0)
         | 
| 1440 1720 | 
             
                { concrete_type(BOOLEAN); }
         | 
| 1721 | 
            +
                Boolean(const Boolean* ptr)
         | 
| 1722 | 
            +
                : Value(ptr),
         | 
| 1723 | 
            +
                  value_(ptr->value_),
         | 
| 1724 | 
            +
                  hash_(ptr->hash_)
         | 
| 1725 | 
            +
                { concrete_type(BOOLEAN); }
         | 
| 1441 1726 | 
             
                virtual operator bool() { return value_; }
         | 
| 1442 1727 | 
             
                std::string type() { return "bool"; }
         | 
| 1443 1728 | 
             
                static std::string type_name() { return "bool"; }
         | 
| @@ -1453,6 +1738,7 @@ namespace Sass { | |
| 1453 1738 |  | 
| 1454 1739 | 
             
                virtual bool operator== (const Expression& rhs) const;
         | 
| 1455 1740 |  | 
| 1741 | 
            +
                ATTACH_AST_OPERATIONS(Boolean)
         | 
| 1456 1742 | 
             
                ATTACH_OPERATIONS()
         | 
| 1457 1743 | 
             
              };
         | 
| 1458 1744 |  | 
| @@ -1465,12 +1751,19 @@ namespace Sass { | |
| 1465 1751 | 
             
                String(ParserState pstate, bool delayed = false)
         | 
| 1466 1752 | 
             
                : Value(pstate, delayed)
         | 
| 1467 1753 | 
             
                { concrete_type(STRING); }
         | 
| 1754 | 
            +
                String(const String* ptr)
         | 
| 1755 | 
            +
                : Value(ptr)
         | 
| 1756 | 
            +
                { concrete_type(STRING); }
         | 
| 1468 1757 | 
             
                static std::string type_name() { return "string"; }
         | 
| 1469 1758 | 
             
                virtual ~String() = 0;
         | 
| 1470 1759 | 
             
                virtual void rtrim() = 0;
         | 
| 1471 1760 | 
             
                virtual void ltrim() = 0;
         | 
| 1472 1761 | 
             
                virtual void trim() = 0;
         | 
| 1473 1762 | 
             
                virtual bool operator==(const Expression& rhs) const = 0;
         | 
| 1763 | 
            +
                virtual bool operator<(const Expression& rhs) const {
         | 
| 1764 | 
            +
                  return this->to_string() < rhs.to_string();
         | 
| 1765 | 
            +
                };
         | 
| 1766 | 
            +
                ATTACH_VIRTUAL_AST_OPERATIONS(String);
         | 
| 1474 1767 | 
             
                ATTACH_OPERATIONS()
         | 
| 1475 1768 | 
             
              };
         | 
| 1476 1769 | 
             
              inline String::~String() { };
         | 
| @@ -1479,13 +1772,19 @@ namespace Sass { | |
| 1479 1772 | 
             
              // Interpolated strings. Meant to be reduced to flat strings during the
         | 
| 1480 1773 | 
             
              // evaluation phase.
         | 
| 1481 1774 | 
             
              ///////////////////////////////////////////////////////////////////////
         | 
| 1482 | 
            -
              class String_Schema : public String, public Vectorized< | 
| 1775 | 
            +
              class String_Schema : public String, public Vectorized<Expression_Obj> {
         | 
| 1483 1776 | 
             
                // ADD_PROPERTY(bool, has_interpolants)
         | 
| 1484 1777 | 
             
                size_t hash_;
         | 
| 1485 1778 | 
             
              public:
         | 
| 1486 1779 | 
             
                String_Schema(ParserState pstate, size_t size = 0, bool has_interpolants = false)
         | 
| 1487 | 
            -
                : String(pstate), Vectorized< | 
| 1780 | 
            +
                : String(pstate), Vectorized<Expression_Obj>(size), hash_(0)
         | 
| 1781 | 
            +
                { concrete_type(STRING); }
         | 
| 1782 | 
            +
                String_Schema(const String_Schema* ptr)
         | 
| 1783 | 
            +
                : String(ptr),
         | 
| 1784 | 
            +
                  Vectorized<Expression_Obj>(*ptr),
         | 
| 1785 | 
            +
                  hash_(ptr->hash_)
         | 
| 1488 1786 | 
             
                { concrete_type(STRING); }
         | 
| 1787 | 
            +
             | 
| 1489 1788 | 
             
                std::string type() { return "string"; }
         | 
| 1490 1789 | 
             
                static std::string type_name() { return "string"; }
         | 
| 1491 1790 |  | 
| @@ -1516,7 +1815,7 @@ namespace Sass { | |
| 1516 1815 | 
             
                }
         | 
| 1517 1816 |  | 
| 1518 1817 | 
             
                virtual bool operator==(const Expression& rhs) const;
         | 
| 1519 | 
            -
             | 
| 1818 | 
            +
                ATTACH_AST_OPERATIONS(String_Schema)
         | 
| 1520 1819 | 
             
                ATTACH_OPERATIONS()
         | 
| 1521 1820 | 
             
              };
         | 
| 1522 1821 |  | 
| @@ -1530,6 +1829,13 @@ namespace Sass { | |
| 1530 1829 | 
             
              protected:
         | 
| 1531 1830 | 
             
                size_t hash_;
         | 
| 1532 1831 | 
             
              public:
         | 
| 1832 | 
            +
                String_Constant(const String_Constant* ptr)
         | 
| 1833 | 
            +
                : String(ptr),
         | 
| 1834 | 
            +
                  quote_mark_(ptr->quote_mark_),
         | 
| 1835 | 
            +
                  can_compress_whitespace_(ptr->can_compress_whitespace_),
         | 
| 1836 | 
            +
                  value_(ptr->value_),
         | 
| 1837 | 
            +
                  hash_(ptr->hash_)
         | 
| 1838 | 
            +
                { }
         | 
| 1533 1839 | 
             
                String_Constant(ParserState pstate, std::string val)
         | 
| 1534 1840 | 
             
                : String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(val)), hash_(0)
         | 
| 1535 1841 | 
             
                { }
         | 
| @@ -1564,6 +1870,7 @@ namespace Sass { | |
| 1564 1870 | 
             
                static char double_quote() { return '"'; }
         | 
| 1565 1871 | 
             
                static char single_quote() { return '\''; }
         | 
| 1566 1872 |  | 
| 1873 | 
            +
                ATTACH_AST_OPERATIONS(String_Constant)
         | 
| 1567 1874 | 
             
                ATTACH_OPERATIONS()
         | 
| 1568 1875 | 
             
              };
         | 
| 1569 1876 |  | 
| @@ -1573,8 +1880,8 @@ namespace Sass { | |
| 1573 1880 | 
             
              class String_Quoted : public String_Constant {
         | 
| 1574 1881 | 
             
              public:
         | 
| 1575 1882 | 
             
                String_Quoted(ParserState pstate, std::string val, char q = 0,
         | 
| 1576 | 
            -
             | 
| 1577 | 
            -
             | 
| 1883 | 
            +
                  bool keep_utf8_escapes = false, bool skip_unquoting = false,
         | 
| 1884 | 
            +
                  bool strict_unquoting = true)
         | 
| 1578 1885 | 
             
                : String_Constant(pstate, val)
         | 
| 1579 1886 | 
             
                {
         | 
| 1580 1887 | 
             
                  if (skip_unquoting == false) {
         | 
| @@ -1582,8 +1889,12 @@ namespace Sass { | |
| 1582 1889 | 
             
                  }
         | 
| 1583 1890 | 
             
                  if (q && quote_mark_) quote_mark_ = q;
         | 
| 1584 1891 | 
             
                }
         | 
| 1892 | 
            +
                String_Quoted(const String_Quoted* ptr)
         | 
| 1893 | 
            +
                : String_Constant(ptr)
         | 
| 1894 | 
            +
                { }
         | 
| 1585 1895 | 
             
                virtual bool operator==(const Expression& rhs) const;
         | 
| 1586 1896 | 
             
                virtual std::string inspect() const; // quotes are forced on inspection
         | 
| 1897 | 
            +
                ATTACH_AST_OPERATIONS(String_Quoted)
         | 
| 1587 1898 | 
             
                ATTACH_OPERATIONS()
         | 
| 1588 1899 | 
             
              };
         | 
| 1589 1900 |  | 
| @@ -1591,16 +1902,24 @@ namespace Sass { | |
| 1591 1902 | 
             
              // Media queries.
         | 
| 1592 1903 | 
             
              /////////////////
         | 
| 1593 1904 | 
             
              class Media_Query : public Expression,
         | 
| 1594 | 
            -
                                  public Vectorized< | 
| 1595 | 
            -
                ADD_PROPERTY( | 
| 1905 | 
            +
                                  public Vectorized<Media_Query_Expression_Obj> {
         | 
| 1906 | 
            +
                ADD_PROPERTY(String_Obj, media_type)
         | 
| 1596 1907 | 
             
                ADD_PROPERTY(bool, is_negated)
         | 
| 1597 1908 | 
             
                ADD_PROPERTY(bool, is_restricted)
         | 
| 1598 1909 | 
             
              public:
         | 
| 1599 1910 | 
             
                Media_Query(ParserState pstate,
         | 
| 1600 | 
            -
                             | 
| 1601 | 
            -
                : Expression(pstate), Vectorized< | 
| 1911 | 
            +
                            String_Obj t = 0, size_t s = 0, bool n = false, bool r = false)
         | 
| 1912 | 
            +
                : Expression(pstate), Vectorized<Media_Query_Expression_Obj>(s),
         | 
| 1602 1913 | 
             
                  media_type_(t), is_negated_(n), is_restricted_(r)
         | 
| 1603 1914 | 
             
                { }
         | 
| 1915 | 
            +
                Media_Query(const Media_Query* ptr)
         | 
| 1916 | 
            +
                : Expression(ptr),
         | 
| 1917 | 
            +
                  Vectorized<Media_Query_Expression_Obj>(*ptr),
         | 
| 1918 | 
            +
                  media_type_(ptr->media_type_),
         | 
| 1919 | 
            +
                  is_negated_(ptr->is_negated_),
         | 
| 1920 | 
            +
                  is_restricted_(ptr->is_restricted_)
         | 
| 1921 | 
            +
                { }
         | 
| 1922 | 
            +
                ATTACH_AST_OPERATIONS(Media_Query)
         | 
| 1604 1923 | 
             
                ATTACH_OPERATIONS()
         | 
| 1605 1924 | 
             
              };
         | 
| 1606 1925 |  | 
| @@ -1608,14 +1927,21 @@ namespace Sass { | |
| 1608 1927 | 
             
              // Media expressions (for use inside media queries).
         | 
| 1609 1928 | 
             
              ////////////////////////////////////////////////////
         | 
| 1610 1929 | 
             
              class Media_Query_Expression : public Expression {
         | 
| 1611 | 
            -
                ADD_PROPERTY( | 
| 1612 | 
            -
                ADD_PROPERTY( | 
| 1930 | 
            +
                ADD_PROPERTY(Expression_Obj, feature)
         | 
| 1931 | 
            +
                ADD_PROPERTY(Expression_Obj, value)
         | 
| 1613 1932 | 
             
                ADD_PROPERTY(bool, is_interpolated)
         | 
| 1614 1933 | 
             
              public:
         | 
| 1615 1934 | 
             
                Media_Query_Expression(ParserState pstate,
         | 
| 1616 | 
            -
                                        | 
| 1935 | 
            +
                                       Expression_Obj f, Expression_Obj v, bool i = false)
         | 
| 1617 1936 | 
             
                : Expression(pstate), feature_(f), value_(v), is_interpolated_(i)
         | 
| 1618 1937 | 
             
                { }
         | 
| 1938 | 
            +
                Media_Query_Expression(const Media_Query_Expression* ptr)
         | 
| 1939 | 
            +
                : Expression(ptr),
         | 
| 1940 | 
            +
                  feature_(ptr->feature_),
         | 
| 1941 | 
            +
                  value_(ptr->value_),
         | 
| 1942 | 
            +
                  is_interpolated_(ptr->is_interpolated_)
         | 
| 1943 | 
            +
                { }
         | 
| 1944 | 
            +
                ATTACH_AST_OPERATIONS(Media_Query_Expression)
         | 
| 1619 1945 | 
             
                ATTACH_OPERATIONS()
         | 
| 1620 1946 | 
             
              };
         | 
| 1621 1947 |  | 
| @@ -1623,12 +1949,16 @@ namespace Sass { | |
| 1623 1949 | 
             
              // `@supports` rule.
         | 
| 1624 1950 | 
             
              ////////////////////
         | 
| 1625 1951 | 
             
              class Supports_Block : public Has_Block {
         | 
| 1626 | 
            -
                ADD_PROPERTY( | 
| 1952 | 
            +
                ADD_PROPERTY(Supports_Condition_Obj, condition)
         | 
| 1627 1953 | 
             
              public:
         | 
| 1628 | 
            -
                Supports_Block(ParserState pstate,  | 
| 1954 | 
            +
                Supports_Block(ParserState pstate, Supports_Condition_Obj condition, Block_Obj block = 0)
         | 
| 1629 1955 | 
             
                : Has_Block(pstate, block), condition_(condition)
         | 
| 1630 1956 | 
             
                { statement_type(SUPPORTS); }
         | 
| 1957 | 
            +
                Supports_Block(const Supports_Block* ptr)
         | 
| 1958 | 
            +
                : Has_Block(ptr), condition_(ptr->condition_)
         | 
| 1959 | 
            +
                { statement_type(SUPPORTS); }
         | 
| 1631 1960 | 
             
                bool bubbles() { return true; }
         | 
| 1961 | 
            +
                ATTACH_AST_OPERATIONS(Supports_Block)
         | 
| 1632 1962 | 
             
                ATTACH_OPERATIONS()
         | 
| 1633 1963 | 
             
              };
         | 
| 1634 1964 |  | 
| @@ -1640,7 +1970,11 @@ namespace Sass { | |
| 1640 1970 | 
             
                Supports_Condition(ParserState pstate)
         | 
| 1641 1971 | 
             
                : Expression(pstate)
         | 
| 1642 1972 | 
             
                { }
         | 
| 1643 | 
            -
                 | 
| 1973 | 
            +
                Supports_Condition(const Supports_Condition* ptr)
         | 
| 1974 | 
            +
                : Expression(ptr)
         | 
| 1975 | 
            +
                { }
         | 
| 1976 | 
            +
                virtual bool needs_parens(Supports_Condition_Obj cond) const { return false; }
         | 
| 1977 | 
            +
                ATTACH_AST_OPERATIONS(Supports_Condition)
         | 
| 1644 1978 | 
             
                ATTACH_OPERATIONS()
         | 
| 1645 1979 | 
             
              };
         | 
| 1646 1980 |  | 
| @@ -1651,14 +1985,21 @@ namespace Sass { | |
| 1651 1985 | 
             
              public:
         | 
| 1652 1986 | 
             
                enum Operand { AND, OR };
         | 
| 1653 1987 | 
             
              private:
         | 
| 1654 | 
            -
                ADD_PROPERTY( | 
| 1655 | 
            -
                ADD_PROPERTY( | 
| 1988 | 
            +
                ADD_PROPERTY(Supports_Condition_Obj, left);
         | 
| 1989 | 
            +
                ADD_PROPERTY(Supports_Condition_Obj, right);
         | 
| 1656 1990 | 
             
                ADD_PROPERTY(Operand, operand);
         | 
| 1657 1991 | 
             
              public:
         | 
| 1658 | 
            -
                Supports_Operator(ParserState pstate,  | 
| 1992 | 
            +
                Supports_Operator(ParserState pstate, Supports_Condition_Obj l, Supports_Condition_Obj r, Operand o)
         | 
| 1659 1993 | 
             
                : Supports_Condition(pstate), left_(l), right_(r), operand_(o)
         | 
| 1660 1994 | 
             
                { }
         | 
| 1661 | 
            -
                 | 
| 1995 | 
            +
                Supports_Operator(const Supports_Operator* ptr)
         | 
| 1996 | 
            +
                : Supports_Condition(ptr),
         | 
| 1997 | 
            +
                  left_(ptr->left_),
         | 
| 1998 | 
            +
                  right_(ptr->right_),
         | 
| 1999 | 
            +
                  operand_(ptr->operand_)
         | 
| 2000 | 
            +
                { }
         | 
| 2001 | 
            +
                virtual bool needs_parens(Supports_Condition_Obj cond) const;
         | 
| 2002 | 
            +
                ATTACH_AST_OPERATIONS(Supports_Operator)
         | 
| 1662 2003 | 
             
                ATTACH_OPERATIONS()
         | 
| 1663 2004 | 
             
              };
         | 
| 1664 2005 |  | 
| @@ -1667,12 +2008,16 @@ namespace Sass { | |
| 1667 2008 | 
             
              //////////////////////////////////////////
         | 
| 1668 2009 | 
             
              class Supports_Negation : public Supports_Condition {
         | 
| 1669 2010 | 
             
              private:
         | 
| 1670 | 
            -
                ADD_PROPERTY( | 
| 2011 | 
            +
                ADD_PROPERTY(Supports_Condition_Obj, condition);
         | 
| 1671 2012 | 
             
              public:
         | 
| 1672 | 
            -
                Supports_Negation(ParserState pstate,  | 
| 2013 | 
            +
                Supports_Negation(ParserState pstate, Supports_Condition_Obj c)
         | 
| 1673 2014 | 
             
                : Supports_Condition(pstate), condition_(c)
         | 
| 1674 2015 | 
             
                { }
         | 
| 1675 | 
            -
                 | 
| 2016 | 
            +
                Supports_Negation(const Supports_Negation* ptr)
         | 
| 2017 | 
            +
                : Supports_Condition(ptr), condition_(ptr->condition_)
         | 
| 2018 | 
            +
                { }
         | 
| 2019 | 
            +
                virtual bool needs_parens(Supports_Condition_Obj cond) const;
         | 
| 2020 | 
            +
                ATTACH_AST_OPERATIONS(Supports_Negation)
         | 
| 1676 2021 | 
             
                ATTACH_OPERATIONS()
         | 
| 1677 2022 | 
             
              };
         | 
| 1678 2023 |  | 
| @@ -1681,13 +2026,19 @@ namespace Sass { | |
| 1681 2026 | 
             
              /////////////////////////////////////////////////////
         | 
| 1682 2027 | 
             
              class Supports_Declaration : public Supports_Condition {
         | 
| 1683 2028 | 
             
              private:
         | 
| 1684 | 
            -
                ADD_PROPERTY( | 
| 1685 | 
            -
                ADD_PROPERTY( | 
| 2029 | 
            +
                ADD_PROPERTY(Expression_Obj, feature);
         | 
| 2030 | 
            +
                ADD_PROPERTY(Expression_Obj, value);
         | 
| 1686 2031 | 
             
              public:
         | 
| 1687 | 
            -
                Supports_Declaration(ParserState pstate,  | 
| 2032 | 
            +
                Supports_Declaration(ParserState pstate, Expression_Obj f, Expression_Obj v)
         | 
| 1688 2033 | 
             
                : Supports_Condition(pstate), feature_(f), value_(v)
         | 
| 1689 2034 | 
             
                { }
         | 
| 1690 | 
            -
                 | 
| 2035 | 
            +
                Supports_Declaration(const Supports_Declaration* ptr)
         | 
| 2036 | 
            +
                : Supports_Condition(ptr),
         | 
| 2037 | 
            +
                  feature_(ptr->feature_),
         | 
| 2038 | 
            +
                  value_(ptr->value_)
         | 
| 2039 | 
            +
                { }
         | 
| 2040 | 
            +
                virtual bool needs_parens(Supports_Condition_Obj cond) const { return false; }
         | 
| 2041 | 
            +
                ATTACH_AST_OPERATIONS(Supports_Declaration)
         | 
| 1691 2042 | 
             
                ATTACH_OPERATIONS()
         | 
| 1692 2043 | 
             
              };
         | 
| 1693 2044 |  | 
| @@ -1696,12 +2047,17 @@ namespace Sass { | |
| 1696 2047 | 
             
              ///////////////////////////////////////////////
         | 
| 1697 2048 | 
             
              class Supports_Interpolation : public Supports_Condition {
         | 
| 1698 2049 | 
             
              private:
         | 
| 1699 | 
            -
                ADD_PROPERTY( | 
| 2050 | 
            +
                ADD_PROPERTY(Expression_Obj, value);
         | 
| 1700 2051 | 
             
              public:
         | 
| 1701 | 
            -
                Supports_Interpolation(ParserState pstate,  | 
| 2052 | 
            +
                Supports_Interpolation(ParserState pstate, Expression_Obj v)
         | 
| 1702 2053 | 
             
                : Supports_Condition(pstate), value_(v)
         | 
| 1703 2054 | 
             
                { }
         | 
| 1704 | 
            -
                 | 
| 2055 | 
            +
                Supports_Interpolation(const Supports_Interpolation* ptr)
         | 
| 2056 | 
            +
                : Supports_Condition(ptr),
         | 
| 2057 | 
            +
                  value_(ptr->value_)
         | 
| 2058 | 
            +
                { }
         | 
| 2059 | 
            +
                virtual bool needs_parens(Supports_Condition_Obj cond) const { return false; }
         | 
| 2060 | 
            +
                ATTACH_AST_OPERATIONS(Supports_Interpolation)
         | 
| 1705 2061 | 
             
                ATTACH_OPERATIONS()
         | 
| 1706 2062 | 
             
              };
         | 
| 1707 2063 |  | 
| @@ -1710,13 +2066,19 @@ namespace Sass { | |
| 1710 2066 | 
             
              /////////////////////////////////////////////////
         | 
| 1711 2067 | 
             
              class At_Root_Query : public Expression {
         | 
| 1712 2068 | 
             
              private:
         | 
| 1713 | 
            -
                ADD_PROPERTY( | 
| 1714 | 
            -
                ADD_PROPERTY( | 
| 2069 | 
            +
                ADD_PROPERTY(Expression_Obj, feature)
         | 
| 2070 | 
            +
                ADD_PROPERTY(Expression_Obj, value)
         | 
| 1715 2071 | 
             
              public:
         | 
| 1716 | 
            -
                At_Root_Query(ParserState pstate,  | 
| 2072 | 
            +
                At_Root_Query(ParserState pstate, Expression_Obj f = 0, Expression_Obj v = 0, bool i = false)
         | 
| 1717 2073 | 
             
                : Expression(pstate), feature_(f), value_(v)
         | 
| 1718 2074 | 
             
                { }
         | 
| 2075 | 
            +
                At_Root_Query(const At_Root_Query* ptr)
         | 
| 2076 | 
            +
                : Expression(ptr),
         | 
| 2077 | 
            +
                  feature_(ptr->feature_),
         | 
| 2078 | 
            +
                  value_(ptr->value_)
         | 
| 2079 | 
            +
                { }
         | 
| 1719 2080 | 
             
                bool exclude(std::string str);
         | 
| 2081 | 
            +
                ATTACH_AST_OPERATIONS(At_Root_Query)
         | 
| 1720 2082 | 
             
                ATTACH_OPERATIONS()
         | 
| 1721 2083 | 
             
              };
         | 
| 1722 2084 |  | 
| @@ -1724,13 +2086,16 @@ namespace Sass { | |
| 1724 2086 | 
             
              // At-root.
         | 
| 1725 2087 | 
             
              ///////////
         | 
| 1726 2088 | 
             
              class At_Root_Block : public Has_Block {
         | 
| 1727 | 
            -
                ADD_PROPERTY( | 
| 2089 | 
            +
                ADD_PROPERTY(At_Root_Query_Obj, expression)
         | 
| 1728 2090 | 
             
              public:
         | 
| 1729 | 
            -
                At_Root_Block(ParserState pstate,  | 
| 2091 | 
            +
                At_Root_Block(ParserState pstate, Block_Obj b = 0, At_Root_Query_Obj e = 0)
         | 
| 1730 2092 | 
             
                : Has_Block(pstate, b), expression_(e)
         | 
| 1731 2093 | 
             
                { statement_type(ATROOT); }
         | 
| 2094 | 
            +
                At_Root_Block(const At_Root_Block* ptr)
         | 
| 2095 | 
            +
                : Has_Block(ptr), expression_(ptr->expression_)
         | 
| 2096 | 
            +
                { statement_type(ATROOT); }
         | 
| 1732 2097 | 
             
                bool bubbles() { return true; }
         | 
| 1733 | 
            -
                bool exclude_node( | 
| 2098 | 
            +
                bool exclude_node(Statement_Obj s) {
         | 
| 1734 2099 | 
             
                  if (expression() == 0)
         | 
| 1735 2100 | 
             
                  {
         | 
| 1736 2101 | 
             
                    return s->statement_type() == Statement::RULESET;
         | 
| @@ -1738,7 +2103,7 @@ namespace Sass { | |
| 1738 2103 |  | 
| 1739 2104 | 
             
                  if (s->statement_type() == Statement::DIRECTIVE)
         | 
| 1740 2105 | 
             
                  {
         | 
| 1741 | 
            -
                    if ( | 
| 2106 | 
            +
                    if (Directive_Obj dir = SASS_MEMORY_CAST(Directive, s))
         | 
| 1742 2107 | 
             
                    {
         | 
| 1743 2108 | 
             
                      std::string keyword(dir->keyword());
         | 
| 1744 2109 | 
             
                      if (keyword.length() > 0) keyword.erase(0, 1);
         | 
| @@ -1757,12 +2122,13 @@ namespace Sass { | |
| 1757 2122 | 
             
                  {
         | 
| 1758 2123 | 
             
                    return expression()->exclude("supports");
         | 
| 1759 2124 | 
             
                  }
         | 
| 1760 | 
            -
                  if ( | 
| 2125 | 
            +
                  if (Directive_Obj dir = SASS_MEMORY_CAST(Directive, s))
         | 
| 1761 2126 | 
             
                  {
         | 
| 1762 2127 | 
             
                    if (dir->is_keyframes()) return expression()->exclude("keyframes");
         | 
| 1763 2128 | 
             
                  }
         | 
| 1764 2129 | 
             
                  return false;
         | 
| 1765 2130 | 
             
                }
         | 
| 2131 | 
            +
                ATTACH_AST_OPERATIONS(At_Root_Block)
         | 
| 1766 2132 | 
             
                ATTACH_OPERATIONS()
         | 
| 1767 2133 | 
             
              };
         | 
| 1768 2134 |  | 
| @@ -1772,6 +2138,7 @@ namespace Sass { | |
| 1772 2138 | 
             
              class Null : public Value {
         | 
| 1773 2139 | 
             
              public:
         | 
| 1774 2140 | 
             
                Null(ParserState pstate) : Value(pstate) { concrete_type(NULL_VAL); }
         | 
| 2141 | 
            +
                Null(const Null* ptr) : Value(ptr) { concrete_type(NULL_VAL); }
         | 
| 1775 2142 | 
             
                std::string type() { return "null"; }
         | 
| 1776 2143 | 
             
                static std::string type_name() { return "null"; }
         | 
| 1777 2144 | 
             
                bool is_invisible() const { return true; }
         | 
| @@ -1785,6 +2152,7 @@ namespace Sass { | |
| 1785 2152 |  | 
| 1786 2153 | 
             
                virtual bool operator== (const Expression& rhs) const;
         | 
| 1787 2154 |  | 
| 2155 | 
            +
                ATTACH_AST_OPERATIONS(Null)
         | 
| 1788 2156 | 
             
                ATTACH_OPERATIONS()
         | 
| 1789 2157 | 
             
              };
         | 
| 1790 2158 |  | 
| @@ -1792,10 +2160,10 @@ namespace Sass { | |
| 1792 2160 | 
             
              // Thunks for delayed evaluation.
         | 
| 1793 2161 | 
             
              /////////////////////////////////
         | 
| 1794 2162 | 
             
              class Thunk : public Expression {
         | 
| 1795 | 
            -
                ADD_PROPERTY( | 
| 2163 | 
            +
                ADD_PROPERTY(Expression_Obj, expression)
         | 
| 1796 2164 | 
             
                ADD_PROPERTY(Env*, environment)
         | 
| 1797 2165 | 
             
              public:
         | 
| 1798 | 
            -
                Thunk(ParserState pstate,  | 
| 2166 | 
            +
                Thunk(ParserState pstate, Expression_Obj exp, Env* env = 0)
         | 
| 1799 2167 | 
             
                : Expression(pstate), expression_(exp), environment_(env)
         | 
| 1800 2168 | 
             
                { }
         | 
| 1801 2169 | 
             
              };
         | 
| @@ -1805,17 +2173,28 @@ namespace Sass { | |
| 1805 2173 | 
             
              /////////////////////////////////////////////////////////
         | 
| 1806 2174 | 
             
              class Parameter : public AST_Node {
         | 
| 1807 2175 | 
             
                ADD_PROPERTY(std::string, name)
         | 
| 1808 | 
            -
                ADD_PROPERTY( | 
| 2176 | 
            +
                ADD_PROPERTY(Expression_Obj, default_value)
         | 
| 1809 2177 | 
             
                ADD_PROPERTY(bool, is_rest_parameter)
         | 
| 1810 2178 | 
             
              public:
         | 
| 1811 2179 | 
             
                Parameter(ParserState pstate,
         | 
| 1812 | 
            -
                          std::string n,  | 
| 2180 | 
            +
                          std::string n, Expression_Obj def = 0, bool rest = false)
         | 
| 1813 2181 | 
             
                : AST_Node(pstate), name_(n), default_value_(def), is_rest_parameter_(rest)
         | 
| 1814 2182 | 
             
                {
         | 
| 1815 2183 | 
             
                  if (default_value_ && is_rest_parameter_) {
         | 
| 1816 | 
            -
                    error("variable-length parameter may not have a default value",  | 
| 2184 | 
            +
                    error("variable-length parameter may not have a default value", pstate_);
         | 
| 1817 2185 | 
             
                  }
         | 
| 1818 2186 | 
             
                }
         | 
| 2187 | 
            +
                Parameter(const Parameter* ptr)
         | 
| 2188 | 
            +
                : AST_Node(ptr),
         | 
| 2189 | 
            +
                  name_(ptr->name_),
         | 
| 2190 | 
            +
                  default_value_(ptr->default_value_),
         | 
| 2191 | 
            +
                  is_rest_parameter_(ptr->is_rest_parameter_)
         | 
| 2192 | 
            +
                {
         | 
| 2193 | 
            +
                  if (default_value_ && is_rest_parameter_) {
         | 
| 2194 | 
            +
                    error("variable-length parameter may not have a default value", pstate_);
         | 
| 2195 | 
            +
                  }
         | 
| 2196 | 
            +
                }
         | 
| 2197 | 
            +
                ATTACH_AST_OPERATIONS(Parameter)
         | 
| 1819 2198 | 
             
                ATTACH_OPERATIONS()
         | 
| 1820 2199 | 
             
              };
         | 
| 1821 2200 |  | 
| @@ -1824,11 +2203,11 @@ namespace Sass { | |
| 1824 2203 | 
             
              // error checking (e.g., ensuring that all optional parameters follow all
         | 
| 1825 2204 | 
             
              // required parameters).
         | 
| 1826 2205 | 
             
              /////////////////////////////////////////////////////////////////////////
         | 
| 1827 | 
            -
              class Parameters : public AST_Node, public Vectorized< | 
| 2206 | 
            +
              class Parameters : public AST_Node, public Vectorized<Parameter_Obj> {
         | 
| 1828 2207 | 
             
                ADD_PROPERTY(bool, has_optional_parameters)
         | 
| 1829 2208 | 
             
                ADD_PROPERTY(bool, has_rest_parameter)
         | 
| 1830 2209 | 
             
              protected:
         | 
| 1831 | 
            -
                void adjust_after_pushing( | 
| 2210 | 
            +
                void adjust_after_pushing(Parameter_Obj p)
         | 
| 1832 2211 | 
             
                {
         | 
| 1833 2212 | 
             
                  if (p->default_value()) {
         | 
| 1834 2213 | 
             
                    if (has_rest_parameter_) {
         | 
| @@ -1854,10 +2233,17 @@ namespace Sass { | |
| 1854 2233 | 
             
              public:
         | 
| 1855 2234 | 
             
                Parameters(ParserState pstate)
         | 
| 1856 2235 | 
             
                : AST_Node(pstate),
         | 
| 1857 | 
            -
                  Vectorized< | 
| 2236 | 
            +
                  Vectorized<Parameter_Obj>(),
         | 
| 1858 2237 | 
             
                  has_optional_parameters_(false),
         | 
| 1859 2238 | 
             
                  has_rest_parameter_(false)
         | 
| 1860 2239 | 
             
                { }
         | 
| 2240 | 
            +
                Parameters(const Parameters* ptr)
         | 
| 2241 | 
            +
                : AST_Node(ptr),
         | 
| 2242 | 
            +
                  Vectorized<Parameter_Obj>(*ptr),
         | 
| 2243 | 
            +
                  has_optional_parameters_(ptr->has_optional_parameters_),
         | 
| 2244 | 
            +
                  has_rest_parameter_(ptr->has_rest_parameter_)
         | 
| 2245 | 
            +
                { }
         | 
| 2246 | 
            +
                ATTACH_AST_OPERATIONS(Parameters)
         | 
| 1861 2247 | 
             
                ATTACH_OPERATIONS()
         | 
| 1862 2248 | 
             
              };
         | 
| 1863 2249 |  | 
| @@ -1873,7 +2259,10 @@ namespace Sass { | |
| 1873 2259 | 
             
                // maybe we have optional flag
         | 
| 1874 2260 | 
             
                ADD_PROPERTY(bool, is_optional)
         | 
| 1875 2261 | 
             
                // parent block pointers
         | 
| 1876 | 
            -
             | 
| 2262 | 
            +
             | 
| 2263 | 
            +
                // must not be a reference counted object
         | 
| 2264 | 
            +
                // otherwise we create circular references
         | 
| 2265 | 
            +
                ADD_PROPERTY(Media_Block_Ptr, media_block)
         | 
| 1877 2266 | 
             
              protected:
         | 
| 1878 2267 | 
             
                size_t hash_;
         | 
| 1879 2268 | 
             
              public:
         | 
| @@ -1886,26 +2275,33 @@ namespace Sass { | |
| 1886 2275 | 
             
                  media_block_(0),
         | 
| 1887 2276 | 
             
                  hash_(0)
         | 
| 1888 2277 | 
             
                { concrete_type(SELECTOR); }
         | 
| 2278 | 
            +
                Selector(const Selector* ptr)
         | 
| 2279 | 
            +
                : Expression(ptr),
         | 
| 2280 | 
            +
                  // has_reference_(ptr->has_reference_),
         | 
| 2281 | 
            +
                  has_line_feed_(ptr->has_line_feed_),
         | 
| 2282 | 
            +
                  has_line_break_(ptr->has_line_break_),
         | 
| 2283 | 
            +
                  is_optional_(ptr->is_optional_),
         | 
| 2284 | 
            +
                  media_block_(ptr->media_block_),
         | 
| 2285 | 
            +
                  hash_(ptr->hash_)
         | 
| 2286 | 
            +
                { concrete_type(SELECTOR); }
         | 
| 1889 2287 | 
             
                virtual ~Selector() = 0;
         | 
| 1890 2288 | 
             
                virtual size_t hash() = 0;
         | 
| 1891 2289 | 
             
                virtual unsigned long specificity() {
         | 
| 1892 2290 | 
             
                  return 0;
         | 
| 1893 2291 | 
             
                }
         | 
| 1894 | 
            -
                virtual void set_media_block( | 
| 2292 | 
            +
                virtual void set_media_block(Media_Block_Ptr mb) {
         | 
| 1895 2293 | 
             
                  media_block(mb);
         | 
| 1896 2294 | 
             
                }
         | 
| 1897 | 
            -
                virtual bool has_wrapped_selector() {
         | 
| 1898 | 
            -
                  return false;
         | 
| 1899 | 
            -
                }
         | 
| 1900 | 
            -
                virtual bool has_placeholder() {
         | 
| 1901 | 
            -
                  return false;
         | 
| 1902 | 
            -
                }
         | 
| 1903 2295 | 
             
                virtual bool has_parent_ref() {
         | 
| 1904 2296 | 
             
                  return false;
         | 
| 1905 2297 | 
             
                }
         | 
| 1906 2298 | 
             
                virtual bool has_real_parent_ref() {
         | 
| 1907 2299 | 
             
                  return false;
         | 
| 1908 2300 | 
             
                }
         | 
| 2301 | 
            +
                // dispatch to correct handlers
         | 
| 2302 | 
            +
                virtual bool operator<(const Selector& rhs) const;
         | 
| 2303 | 
            +
                virtual bool operator==(const Selector& rhs) const;
         | 
| 2304 | 
            +
                ATTACH_VIRTUAL_AST_OPERATIONS(Selector);
         | 
| 1909 2305 | 
             
              };
         | 
| 1910 2306 | 
             
              inline Selector::~Selector() { }
         | 
| 1911 2307 |  | 
| @@ -1914,12 +2310,17 @@ namespace Sass { | |
| 1914 2310 | 
             
              // re-parsed into a normal selector class.
         | 
| 1915 2311 | 
             
              /////////////////////////////////////////////////////////////////////////
         | 
| 1916 2312 | 
             
              class Selector_Schema : public Selector {
         | 
| 1917 | 
            -
                ADD_PROPERTY( | 
| 2313 | 
            +
                ADD_PROPERTY(String_Obj, contents)
         | 
| 1918 2314 | 
             
                ADD_PROPERTY(bool, at_root);
         | 
| 1919 2315 | 
             
              public:
         | 
| 1920 | 
            -
                Selector_Schema(ParserState pstate,  | 
| 2316 | 
            +
                Selector_Schema(ParserState pstate, String_Obj c)
         | 
| 1921 2317 | 
             
                : Selector(pstate), contents_(c), at_root_(false)
         | 
| 1922 2318 | 
             
                { }
         | 
| 2319 | 
            +
                Selector_Schema(const Selector_Schema* ptr)
         | 
| 2320 | 
            +
                : Selector(ptr),
         | 
| 2321 | 
            +
                  contents_(ptr->contents_),
         | 
| 2322 | 
            +
                  at_root_(ptr->at_root_)
         | 
| 2323 | 
            +
                { }
         | 
| 1923 2324 | 
             
                virtual bool has_parent_ref();
         | 
| 1924 2325 | 
             
                virtual bool has_real_parent_ref();
         | 
| 1925 2326 | 
             
                virtual size_t hash() {
         | 
| @@ -1928,6 +2329,7 @@ namespace Sass { | |
| 1928 2329 | 
             
                  }
         | 
| 1929 2330 | 
             
                  return hash_;
         | 
| 1930 2331 | 
             
                }
         | 
| 2332 | 
            +
                ATTACH_AST_OPERATIONS(Selector_Schema)
         | 
| 1931 2333 | 
             
                ATTACH_OPERATIONS()
         | 
| 1932 2334 | 
             
              };
         | 
| 1933 2335 |  | 
| @@ -1935,13 +2337,15 @@ namespace Sass { | |
| 1935 2337 | 
             
              // Abstract base class for simple selectors.
         | 
| 1936 2338 | 
             
              ////////////////////////////////////////////
         | 
| 1937 2339 | 
             
              class Simple_Selector : public Selector {
         | 
| 1938 | 
            -
                ADD_PROPERTY(std::string, ns) | 
| 2340 | 
            +
                ADD_PROPERTY(std::string, ns)
         | 
| 1939 2341 | 
             
                ADD_PROPERTY(std::string, name)
         | 
| 2342 | 
            +
                ADD_PROPERTY(Simple_Type, simple_type)
         | 
| 1940 2343 | 
             
                ADD_PROPERTY(bool, has_ns)
         | 
| 1941 2344 | 
             
              public:
         | 
| 1942 2345 | 
             
                Simple_Selector(ParserState pstate, std::string n = "")
         | 
| 1943 2346 | 
             
                : Selector(pstate), ns_(""), name_(n), has_ns_(false)
         | 
| 1944 2347 | 
             
                {
         | 
| 2348 | 
            +
                  simple_type(SIMPLE);
         | 
| 1945 2349 | 
             
                  size_t pos = n.find('|');
         | 
| 1946 2350 | 
             
                  // found some namespace
         | 
| 1947 2351 | 
             
                  if (pos != std::string::npos) {
         | 
| @@ -1950,6 +2354,12 @@ namespace Sass { | |
| 1950 2354 | 
             
                    name_ = n.substr(pos + 1);
         | 
| 1951 2355 | 
             
                  }
         | 
| 1952 2356 | 
             
                }
         | 
| 2357 | 
            +
                Simple_Selector(const Simple_Selector* ptr)
         | 
| 2358 | 
            +
                : Selector(ptr),
         | 
| 2359 | 
            +
                  ns_(ptr->ns_),
         | 
| 2360 | 
            +
                  name_(ptr->name_),
         | 
| 2361 | 
            +
                  has_ns_(ptr->has_ns_)
         | 
| 2362 | 
            +
                { simple_type(SIMPLE); }
         | 
| 1953 2363 | 
             
                virtual bool unique() const
         | 
| 1954 2364 | 
             
                {
         | 
| 1955 2365 | 
             
                  return false;
         | 
| @@ -1997,20 +2407,27 @@ namespace Sass { | |
| 1997 2407 | 
             
                  return name_ == "*";
         | 
| 1998 2408 | 
             
                }
         | 
| 1999 2409 |  | 
| 2410 | 
            +
                virtual bool has_placeholder() {
         | 
| 2411 | 
            +
                  return false;
         | 
| 2412 | 
            +
                }
         | 
| 2413 | 
            +
             | 
| 2000 2414 | 
             
                virtual ~Simple_Selector() = 0;
         | 
| 2001 | 
            -
                virtual  | 
| 2415 | 
            +
                virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr, Context&);
         | 
| 2002 2416 | 
             
                virtual bool has_parent_ref() { return false; };
         | 
| 2003 2417 | 
             
                virtual bool has_real_parent_ref() { return false; };
         | 
| 2004 2418 | 
             
                virtual bool is_pseudo_element() { return false; }
         | 
| 2005 2419 | 
             
                virtual bool is_pseudo_class() { return false; }
         | 
| 2006 2420 |  | 
| 2007 | 
            -
                virtual bool is_superselector_of( | 
| 2421 | 
            +
                virtual bool is_superselector_of(Compound_Selector_Obj sub) { return false; }
         | 
| 2008 2422 |  | 
| 2009 | 
            -
                bool operator==(const  | 
| 2423 | 
            +
                virtual bool operator==(const Selector& rhs) const;
         | 
| 2424 | 
            +
                virtual bool operator==(const Simple_Selector& rhs) const;
         | 
| 2010 2425 | 
             
                inline bool operator!=(const Simple_Selector& rhs) const { return !(*this == rhs); }
         | 
| 2011 2426 |  | 
| 2427 | 
            +
                bool operator<(const Selector& rhs) const;
         | 
| 2012 2428 | 
             
                bool operator<(const Simple_Selector& rhs) const;
         | 
| 2013 2429 | 
             
                // default implementation should work for most of the simple selectors (otherwise overload)
         | 
| 2430 | 
            +
                ATTACH_VIRTUAL_AST_OPERATIONS(Simple_Selector);
         | 
| 2014 2431 | 
             
                ATTACH_OPERATIONS();
         | 
| 2015 2432 | 
             
              };
         | 
| 2016 2433 | 
             
              inline Simple_Selector::~Simple_Selector() { }
         | 
| @@ -2020,7 +2437,7 @@ namespace Sass { | |
| 2020 2437 | 
             
              // The Parent Selector Expression.
         | 
| 2021 2438 | 
             
              //////////////////////////////////
         | 
| 2022 2439 | 
             
              // parent selectors can occur in selectors but also
         | 
| 2023 | 
            -
              // inside strings in declarations ( | 
| 2440 | 
            +
              // inside strings in declarations (Compound_Selector).
         | 
| 2024 2441 | 
             
              // only one simple parent selector means the first case.
         | 
| 2025 2442 | 
             
              class Parent_Selector : public Simple_Selector {
         | 
| 2026 2443 | 
             
                ADD_PROPERTY(bool, real)
         | 
| @@ -2028,6 +2445,9 @@ namespace Sass { | |
| 2028 2445 | 
             
                Parent_Selector(ParserState pstate, bool r = true)
         | 
| 2029 2446 | 
             
                : Simple_Selector(pstate, "&"), real_(r)
         | 
| 2030 2447 | 
             
                { /* has_reference(true); */ }
         | 
| 2448 | 
            +
                Parent_Selector(const Parent_Selector* ptr)
         | 
| 2449 | 
            +
                : Simple_Selector(ptr), real_(ptr->real_)
         | 
| 2450 | 
            +
                { /* has_reference(true); */ }
         | 
| 2031 2451 | 
             
                bool is_real_parent_ref() { return real(); };
         | 
| 2032 2452 | 
             
                virtual bool has_parent_ref() { return true; };
         | 
| 2033 2453 | 
             
                virtual bool has_real_parent_ref() { return is_real_parent_ref(); };
         | 
| @@ -2037,6 +2457,7 @@ namespace Sass { | |
| 2037 2457 | 
             
                }
         | 
| 2038 2458 | 
             
                std::string type() { return "selector"; }
         | 
| 2039 2459 | 
             
                static std::string type_name() { return "selector"; }
         | 
| 2460 | 
            +
                ATTACH_AST_OPERATIONS(Parent_Selector)
         | 
| 2040 2461 | 
             
                ATTACH_OPERATIONS()
         | 
| 2041 2462 | 
             
              };
         | 
| 2042 2463 |  | 
| @@ -2048,6 +2469,9 @@ namespace Sass { | |
| 2048 2469 | 
             
                Placeholder_Selector(ParserState pstate, std::string n)
         | 
| 2049 2470 | 
             
                : Simple_Selector(pstate, n)
         | 
| 2050 2471 | 
             
                { }
         | 
| 2472 | 
            +
                Placeholder_Selector(const Placeholder_Selector* ptr)
         | 
| 2473 | 
            +
                : Simple_Selector(ptr)
         | 
| 2474 | 
            +
                { }
         | 
| 2051 2475 | 
             
                virtual unsigned long specificity()
         | 
| 2052 2476 | 
             
                {
         | 
| 2053 2477 | 
             
                  return Constants::Specificity_Base;
         | 
| @@ -2055,8 +2479,8 @@ namespace Sass { | |
| 2055 2479 | 
             
                virtual bool has_placeholder() {
         | 
| 2056 2480 | 
             
                  return true;
         | 
| 2057 2481 | 
             
                }
         | 
| 2058 | 
            -
                // virtual Placeholder_Selector* find_placeholder();
         | 
| 2059 2482 | 
             
                virtual ~Placeholder_Selector() {};
         | 
| 2483 | 
            +
                ATTACH_AST_OPERATIONS(Placeholder_Selector)
         | 
| 2060 2484 | 
             
                ATTACH_OPERATIONS()
         | 
| 2061 2485 | 
             
              };
         | 
| 2062 2486 |  | 
| @@ -2068,13 +2492,17 @@ namespace Sass { | |
| 2068 2492 | 
             
                Element_Selector(ParserState pstate, std::string n)
         | 
| 2069 2493 | 
             
                : Simple_Selector(pstate, n)
         | 
| 2070 2494 | 
             
                { }
         | 
| 2495 | 
            +
                Element_Selector(const Element_Selector* ptr)
         | 
| 2496 | 
            +
                : Simple_Selector(ptr)
         | 
| 2497 | 
            +
                { }
         | 
| 2071 2498 | 
             
                virtual unsigned long specificity()
         | 
| 2072 2499 | 
             
                {
         | 
| 2073 2500 | 
             
                  if (name() == "*") return 0;
         | 
| 2074 2501 | 
             
                  else               return Constants::Specificity_Element;
         | 
| 2075 2502 | 
             
                }
         | 
| 2076 | 
            -
                virtual  | 
| 2077 | 
            -
                virtual  | 
| 2503 | 
            +
                virtual Simple_Selector_Ptr unify_with(Simple_Selector_Ptr, Context&);
         | 
| 2504 | 
            +
                virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr, Context&);
         | 
| 2505 | 
            +
                ATTACH_AST_OPERATIONS(Element_Selector)
         | 
| 2078 2506 | 
             
                ATTACH_OPERATIONS()
         | 
| 2079 2507 | 
             
              };
         | 
| 2080 2508 |  | 
| @@ -2086,6 +2514,9 @@ namespace Sass { | |
| 2086 2514 | 
             
                Class_Selector(ParserState pstate, std::string n)
         | 
| 2087 2515 | 
             
                : Simple_Selector(pstate, n)
         | 
| 2088 2516 | 
             
                { }
         | 
| 2517 | 
            +
                Class_Selector(const Class_Selector* ptr)
         | 
| 2518 | 
            +
                : Simple_Selector(ptr)
         | 
| 2519 | 
            +
                { }
         | 
| 2089 2520 | 
             
                virtual bool unique() const
         | 
| 2090 2521 | 
             
                {
         | 
| 2091 2522 | 
             
                  return false;
         | 
| @@ -2094,7 +2525,8 @@ namespace Sass { | |
| 2094 2525 | 
             
                {
         | 
| 2095 2526 | 
             
                  return Constants::Specificity_Class;
         | 
| 2096 2527 | 
             
                }
         | 
| 2097 | 
            -
                virtual  | 
| 2528 | 
            +
                virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr, Context&);
         | 
| 2529 | 
            +
                ATTACH_AST_OPERATIONS(Class_Selector)
         | 
| 2098 2530 | 
             
                ATTACH_OPERATIONS()
         | 
| 2099 2531 | 
             
              };
         | 
| 2100 2532 |  | 
| @@ -2106,6 +2538,9 @@ namespace Sass { | |
| 2106 2538 | 
             
                Id_Selector(ParserState pstate, std::string n)
         | 
| 2107 2539 | 
             
                : Simple_Selector(pstate, n)
         | 
| 2108 2540 | 
             
                { }
         | 
| 2541 | 
            +
                Id_Selector(const Id_Selector* ptr)
         | 
| 2542 | 
            +
                : Simple_Selector(ptr)
         | 
| 2543 | 
            +
                { }
         | 
| 2109 2544 | 
             
                virtual bool unique() const
         | 
| 2110 2545 | 
             
                {
         | 
| 2111 2546 | 
             
                  return true;
         | 
| @@ -2114,7 +2549,8 @@ namespace Sass { | |
| 2114 2549 | 
             
                {
         | 
| 2115 2550 | 
             
                  return Constants::Specificity_ID;
         | 
| 2116 2551 | 
             
                }
         | 
| 2117 | 
            -
                virtual  | 
| 2552 | 
            +
                virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr, Context&);
         | 
| 2553 | 
            +
                ATTACH_AST_OPERATIONS(Id_Selector)
         | 
| 2118 2554 | 
             
                ATTACH_OPERATIONS()
         | 
| 2119 2555 | 
             
              };
         | 
| 2120 2556 |  | 
| @@ -2123,11 +2559,17 @@ namespace Sass { | |
| 2123 2559 | 
             
              ///////////////////////////////////////////////////
         | 
| 2124 2560 | 
             
              class Attribute_Selector : public Simple_Selector {
         | 
| 2125 2561 | 
             
                ADD_PROPERTY(std::string, matcher)
         | 
| 2126 | 
            -
                 | 
| 2562 | 
            +
                // this cannot be changed to obj atm!!!!!!????!!!!!!!
         | 
| 2563 | 
            +
                ADD_PROPERTY(String_Obj, value) // might be interpolated
         | 
| 2127 2564 | 
             
              public:
         | 
| 2128 | 
            -
                Attribute_Selector(ParserState pstate, std::string n, std::string m,  | 
| 2565 | 
            +
                Attribute_Selector(ParserState pstate, std::string n, std::string m, String_Obj v)
         | 
| 2129 2566 | 
             
                : Simple_Selector(pstate, n), matcher_(m), value_(v)
         | 
| 2130 | 
            -
                { }
         | 
| 2567 | 
            +
                { simple_type(ATTR_SEL); }
         | 
| 2568 | 
            +
                Attribute_Selector(const Attribute_Selector* ptr)
         | 
| 2569 | 
            +
                : Simple_Selector(ptr),
         | 
| 2570 | 
            +
                  matcher_(ptr->matcher_),
         | 
| 2571 | 
            +
                  value_(ptr->value_)
         | 
| 2572 | 
            +
                { simple_type(ATTR_SEL); }
         | 
| 2131 2573 | 
             
                virtual size_t hash()
         | 
| 2132 2574 | 
             
                {
         | 
| 2133 2575 | 
             
                  if (hash_ == 0) {
         | 
| @@ -2141,10 +2583,11 @@ namespace Sass { | |
| 2141 2583 | 
             
                {
         | 
| 2142 2584 | 
             
                  return Constants::Specificity_Attr;
         | 
| 2143 2585 | 
             
                }
         | 
| 2144 | 
            -
                bool operator==(const Simple_Selector& rhs) const;
         | 
| 2145 | 
            -
                bool operator==(const Attribute_Selector& rhs) const;
         | 
| 2146 | 
            -
                bool operator<(const Simple_Selector& rhs) const;
         | 
| 2147 | 
            -
                bool operator<(const Attribute_Selector& rhs) const;
         | 
| 2586 | 
            +
                virtual bool operator==(const Simple_Selector& rhs) const;
         | 
| 2587 | 
            +
                virtual bool operator==(const Attribute_Selector& rhs) const;
         | 
| 2588 | 
            +
                virtual bool operator<(const Simple_Selector& rhs) const;
         | 
| 2589 | 
            +
                virtual bool operator<(const Attribute_Selector& rhs) const;
         | 
| 2590 | 
            +
                ATTACH_AST_OPERATIONS(Attribute_Selector)
         | 
| 2148 2591 | 
             
                ATTACH_OPERATIONS()
         | 
| 2149 2592 | 
             
              };
         | 
| 2150 2593 |  | 
| @@ -2165,11 +2608,14 @@ namespace Sass { | |
| 2165 2608 |  | 
| 2166 2609 | 
             
              // Pseudo Selector cannot have any namespace?
         | 
| 2167 2610 | 
             
              class Pseudo_Selector : public Simple_Selector {
         | 
| 2168 | 
            -
                ADD_PROPERTY( | 
| 2611 | 
            +
                ADD_PROPERTY(String_Obj, expression)
         | 
| 2169 2612 | 
             
              public:
         | 
| 2170 | 
            -
                Pseudo_Selector(ParserState pstate, std::string n,  | 
| 2613 | 
            +
                Pseudo_Selector(ParserState pstate, std::string n, String_Obj expr = 0)
         | 
| 2171 2614 | 
             
                : Simple_Selector(pstate, n), expression_(expr)
         | 
| 2172 | 
            -
                { }
         | 
| 2615 | 
            +
                { simple_type(PSEUDO_SEL); }
         | 
| 2616 | 
            +
                Pseudo_Selector(const Pseudo_Selector* ptr)
         | 
| 2617 | 
            +
                : Simple_Selector(ptr), expression_(ptr->expression_)
         | 
| 2618 | 
            +
                { simple_type(PSEUDO_SEL); }
         | 
| 2173 2619 |  | 
| 2174 2620 | 
             
                // A pseudo-class always consists of a "colon" (:) followed by the name
         | 
| 2175 2621 | 
             
                // of the pseudo-class and optionally by a value between parentheses.
         | 
| @@ -2206,11 +2652,12 @@ namespace Sass { | |
| 2206 2652 | 
             
                    return Constants::Specificity_Element;
         | 
| 2207 2653 | 
             
                  return Constants::Specificity_Pseudo;
         | 
| 2208 2654 | 
             
                }
         | 
| 2209 | 
            -
                bool operator==(const Simple_Selector& rhs) const;
         | 
| 2210 | 
            -
                bool operator==(const Pseudo_Selector& rhs) const;
         | 
| 2211 | 
            -
                bool operator<(const Simple_Selector& rhs) const;
         | 
| 2212 | 
            -
                bool operator<(const Pseudo_Selector& rhs) const;
         | 
| 2213 | 
            -
                virtual  | 
| 2655 | 
            +
                virtual bool operator==(const Simple_Selector& rhs) const;
         | 
| 2656 | 
            +
                virtual bool operator==(const Pseudo_Selector& rhs) const;
         | 
| 2657 | 
            +
                virtual bool operator<(const Simple_Selector& rhs) const;
         | 
| 2658 | 
            +
                virtual bool operator<(const Pseudo_Selector& rhs) const;
         | 
| 2659 | 
            +
                virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr, Context&);
         | 
| 2660 | 
            +
                ATTACH_AST_OPERATIONS(Pseudo_Selector)
         | 
| 2214 2661 | 
             
                ATTACH_OPERATIONS()
         | 
| 2215 2662 | 
             
              };
         | 
| 2216 2663 |  | 
| @@ -2218,12 +2665,15 @@ namespace Sass { | |
| 2218 2665 | 
             
              // 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)
         | 
| 2219 2666 | 
             
              /////////////////////////////////////////////////
         | 
| 2220 2667 | 
             
              class Wrapped_Selector : public Simple_Selector {
         | 
| 2221 | 
            -
                ADD_PROPERTY( | 
| 2668 | 
            +
                ADD_PROPERTY(Selector_Obj, selector)
         | 
| 2222 2669 | 
             
              public:
         | 
| 2223 | 
            -
                Wrapped_Selector(ParserState pstate, std::string n,  | 
| 2670 | 
            +
                Wrapped_Selector(ParserState pstate, std::string n, Selector_Obj sel)
         | 
| 2224 2671 | 
             
                : Simple_Selector(pstate, n), selector_(sel)
         | 
| 2225 | 
            -
                { }
         | 
| 2226 | 
            -
                 | 
| 2672 | 
            +
                { simple_type(WRAPPED_SEL); }
         | 
| 2673 | 
            +
                Wrapped_Selector(const Wrapped_Selector* ptr)
         | 
| 2674 | 
            +
                : Simple_Selector(ptr), selector_(ptr->selector_)
         | 
| 2675 | 
            +
                { simple_type(WRAPPED_SEL); }
         | 
| 2676 | 
            +
                virtual bool is_superselector_of(Wrapped_Selector_Obj sub);
         | 
| 2227 2677 | 
             
                // Selectors inside the negation pseudo-class are counted like any
         | 
| 2228 2678 | 
             
                // other, but the negation itself does not count as a pseudo-class.
         | 
| 2229 2679 | 
             
                virtual size_t hash()
         | 
| @@ -2244,48 +2694,52 @@ namespace Sass { | |
| 2244 2694 | 
             
                  if (!selector()) return false;
         | 
| 2245 2695 | 
             
                  return selector()->has_real_parent_ref();
         | 
| 2246 2696 | 
             
                }
         | 
| 2247 | 
            -
                virtual bool has_wrapped_selector()
         | 
| 2248 | 
            -
                {
         | 
| 2249 | 
            -
                  return true;
         | 
| 2250 | 
            -
                }
         | 
| 2251 2697 | 
             
                virtual unsigned long specificity()
         | 
| 2252 2698 | 
             
                {
         | 
| 2253 2699 | 
             
                  return selector_ ? selector_->specificity() : 0;
         | 
| 2254 2700 | 
             
                }
         | 
| 2255 | 
            -
                bool operator==(const Simple_Selector& rhs) const;
         | 
| 2256 | 
            -
                bool operator==(const Wrapped_Selector& rhs) const;
         | 
| 2257 | 
            -
                bool operator<(const Simple_Selector& rhs) const;
         | 
| 2258 | 
            -
                bool operator<(const Wrapped_Selector& rhs) const;
         | 
| 2701 | 
            +
                virtual bool operator==(const Simple_Selector& rhs) const;
         | 
| 2702 | 
            +
                virtual bool operator==(const Wrapped_Selector& rhs) const;
         | 
| 2703 | 
            +
                virtual bool operator<(const Simple_Selector& rhs) const;
         | 
| 2704 | 
            +
                virtual bool operator<(const Wrapped_Selector& rhs) const;
         | 
| 2705 | 
            +
                virtual void cloneChildren();
         | 
| 2706 | 
            +
                ATTACH_AST_OPERATIONS(Wrapped_Selector)
         | 
| 2259 2707 | 
             
                ATTACH_OPERATIONS()
         | 
| 2260 2708 | 
             
              };
         | 
| 2261 2709 |  | 
| 2262 | 
            -
              struct  | 
| 2263 | 
            -
                bool operator() (const  | 
| 2710 | 
            +
              struct Complex_Selector_Pointer_Compare {
         | 
| 2711 | 
            +
                bool operator() (const Complex_Selector_Obj& pLeft, const Complex_Selector_Obj& pRight) const;
         | 
| 2264 2712 | 
             
              };
         | 
| 2265 2713 |  | 
| 2266 2714 | 
             
              ////////////////////////////////////////////////////////////////////////////
         | 
| 2267 2715 | 
             
              // Simple selector sequences. Maintains flags indicating whether it contains
         | 
| 2268 2716 | 
             
              // any parent references or placeholders, to simplify expansion.
         | 
| 2269 2717 | 
             
              ////////////////////////////////////////////////////////////////////////////
         | 
| 2270 | 
            -
              typedef std::set< | 
| 2271 | 
            -
              class  | 
| 2718 | 
            +
              typedef std::set<Complex_Selector_Obj, Complex_Selector_Pointer_Compare> SourcesSet;
         | 
| 2719 | 
            +
              class Compound_Selector : public Selector, public Vectorized<Simple_Selector_Obj> {
         | 
| 2272 2720 | 
             
              private:
         | 
| 2273 2721 | 
             
                SourcesSet sources_;
         | 
| 2274 2722 | 
             
                ADD_PROPERTY(bool, extended);
         | 
| 2275 2723 | 
             
                ADD_PROPERTY(bool, has_parent_reference);
         | 
| 2276 2724 | 
             
              protected:
         | 
| 2277 | 
            -
                void adjust_after_pushing( | 
| 2725 | 
            +
                void adjust_after_pushing(Simple_Selector_Obj s)
         | 
| 2278 2726 | 
             
                {
         | 
| 2279 2727 | 
             
                  // if (s->has_reference())   has_reference(true);
         | 
| 2280 2728 | 
             
                  // if (s->has_placeholder()) has_placeholder(true);
         | 
| 2281 2729 | 
             
                }
         | 
| 2282 2730 | 
             
              public:
         | 
| 2283 | 
            -
                 | 
| 2731 | 
            +
                Compound_Selector(ParserState pstate, size_t s = 0)
         | 
| 2284 2732 | 
             
                : Selector(pstate),
         | 
| 2285 | 
            -
                  Vectorized< | 
| 2733 | 
            +
                  Vectorized<Simple_Selector_Obj>(s),
         | 
| 2286 2734 | 
             
                  extended_(false),
         | 
| 2287 2735 | 
             
                  has_parent_reference_(false)
         | 
| 2288 2736 | 
             
                { }
         | 
| 2737 | 
            +
                Compound_Selector(const Compound_Selector* ptr)
         | 
| 2738 | 
            +
                : Selector(ptr),
         | 
| 2739 | 
            +
                  Vectorized<Simple_Selector_Obj>(*ptr),
         | 
| 2740 | 
            +
                  extended_(ptr->extended_),
         | 
| 2741 | 
            +
                  has_parent_reference_(ptr->has_parent_reference_)
         | 
| 2742 | 
            +
                { }
         | 
| 2289 2743 | 
             
                bool contains_placeholder() {
         | 
| 2290 2744 | 
             
                  for (size_t i = 0, L = length(); i < L; ++i) {
         | 
| 2291 2745 | 
             
                    if ((*this)[i]->has_placeholder()) return true;
         | 
| @@ -2293,33 +2747,33 @@ namespace Sass { | |
| 2293 2747 | 
             
                  return false;
         | 
| 2294 2748 | 
             
                };
         | 
| 2295 2749 |  | 
| 2296 | 
            -
                 | 
| 2750 | 
            +
                void append(Simple_Selector_Ptr element);
         | 
| 2297 2751 |  | 
| 2298 2752 | 
             
                bool is_universal() const
         | 
| 2299 2753 | 
             
                {
         | 
| 2300 2754 | 
             
                  return length() == 1 && (*this)[0]->is_universal();
         | 
| 2301 2755 | 
             
                }
         | 
| 2302 2756 |  | 
| 2303 | 
            -
                 | 
| 2304 | 
            -
                 | 
| 2305 | 
            -
                // virtual  | 
| 2757 | 
            +
                Complex_Selector_Obj to_complex();
         | 
| 2758 | 
            +
                Compound_Selector_Ptr unify_with(Compound_Selector_Ptr rhs, Context& ctx);
         | 
| 2759 | 
            +
                // virtual Placeholder_Selector_Ptr find_placeholder();
         | 
| 2306 2760 | 
             
                virtual bool has_parent_ref();
         | 
| 2307 2761 | 
             
                virtual bool has_real_parent_ref();
         | 
| 2308 | 
            -
                 | 
| 2762 | 
            +
                Simple_Selector_Ptr base()
         | 
| 2309 2763 | 
             
                {
         | 
| 2310 2764 | 
             
                  // Implement non-const in terms of const. Safe to const_cast since this method is non-const
         | 
| 2311 | 
            -
                  return const_cast< | 
| 2765 | 
            +
                  return const_cast<Simple_Selector_Ptr>(static_cast<Compound_Selector_Ptr_Const>(this)->base());
         | 
| 2312 2766 | 
             
                }
         | 
| 2313 | 
            -
                 | 
| 2767 | 
            +
                Simple_Selector_Ptr_Const base() const {
         | 
| 2314 2768 | 
             
                  if (length() == 0) return 0;
         | 
| 2315 2769 | 
             
                  // ToDo: why is this needed?
         | 
| 2316 | 
            -
                  if ( | 
| 2317 | 
            -
                    return (*this)[0];
         | 
| 2770 | 
            +
                  if (SASS_MEMORY_CAST(Element_Selector, (*this)[0]))
         | 
| 2771 | 
            +
                    return &(*this)[0];
         | 
| 2318 2772 | 
             
                  return 0;
         | 
| 2319 2773 | 
             
                }
         | 
| 2320 | 
            -
                virtual bool is_superselector_of( | 
| 2321 | 
            -
                virtual bool is_superselector_of( | 
| 2322 | 
            -
                virtual bool is_superselector_of( | 
| 2774 | 
            +
                virtual bool is_superselector_of(Compound_Selector_Obj sub, std::string wrapped = "");
         | 
| 2775 | 
            +
                virtual bool is_superselector_of(Complex_Selector_Obj sub, std::string wrapped = "");
         | 
| 2776 | 
            +
                virtual bool is_superselector_of(Selector_List_Obj sub, std::string wrapped = "");
         | 
| 2323 2777 | 
             
                virtual size_t hash()
         | 
| 2324 2778 | 
             
                {
         | 
| 2325 2779 | 
             
                  if (Selector::hash_ == 0) {
         | 
| @@ -2336,19 +2790,10 @@ namespace Sass { | |
| 2336 2790 | 
             
                  return sum;
         | 
| 2337 2791 | 
             
                }
         | 
| 2338 2792 |  | 
| 2339 | 
            -
                virtual bool has_wrapped_selector()
         | 
| 2340 | 
            -
                {
         | 
| 2341 | 
            -
                  if (length() == 0) return false;
         | 
| 2342 | 
            -
                  if (Simple_Selector* ss = elements().front()) {
         | 
| 2343 | 
            -
                    if (ss->has_wrapped_selector()) return true;
         | 
| 2344 | 
            -
                  }
         | 
| 2345 | 
            -
                  return false;
         | 
| 2346 | 
            -
                }
         | 
| 2347 | 
            -
             | 
| 2348 2793 | 
             
                virtual bool has_placeholder()
         | 
| 2349 2794 | 
             
                {
         | 
| 2350 2795 | 
             
                  if (length() == 0) return false;
         | 
| 2351 | 
            -
                  if ( | 
| 2796 | 
            +
                  if (Simple_Selector_Obj ss = elements().front()) {
         | 
| 2352 2797 | 
             
                    if (ss->has_placeholder()) return true;
         | 
| 2353 2798 | 
             
                  }
         | 
| 2354 2799 | 
             
                  return false;
         | 
| @@ -2357,22 +2802,21 @@ namespace Sass { | |
| 2357 2802 | 
             
                bool is_empty_reference()
         | 
| 2358 2803 | 
             
                {
         | 
| 2359 2804 | 
             
                  return length() == 1 &&
         | 
| 2360 | 
            -
                          | 
| 2805 | 
            +
                         SASS_MEMORY_CAST(Parent_Selector, (*this)[0]);
         | 
| 2361 2806 | 
             
                }
         | 
| 2362 | 
            -
                std::vector< | 
| 2807 | 
            +
                std::vector<Subset_Map_Key> to_str_vec(); // sometimes need to convert to a flat "by-value" data structure
         | 
| 2363 2808 |  | 
| 2364 | 
            -
                bool operator<(const  | 
| 2365 | 
            -
             | 
| 2366 | 
            -
                bool operator | 
| 2367 | 
            -
                inline bool operator!=(const SimpleSequence_Selector& rhs) const { return !(*this == rhs); }
         | 
| 2809 | 
            +
                virtual bool operator<(const Compound_Selector& rhs) const;
         | 
| 2810 | 
            +
                virtual bool operator==(const Compound_Selector& rhs) const;
         | 
| 2811 | 
            +
                inline bool operator!=(const Compound_Selector& rhs) const { return !(*this == rhs); }
         | 
| 2368 2812 |  | 
| 2369 2813 | 
             
                SourcesSet& sources() { return sources_; }
         | 
| 2370 2814 | 
             
                void clearSources() { sources_.clear(); }
         | 
| 2371 2815 | 
             
                void mergeSources(SourcesSet& sources, Context& ctx);
         | 
| 2372 2816 |  | 
| 2373 | 
            -
                 | 
| 2374 | 
            -
             | 
| 2375 | 
            -
                 | 
| 2817 | 
            +
                Compound_Selector_Ptr minus(Compound_Selector_Ptr rhs, Context& ctx);
         | 
| 2818 | 
            +
                virtual void cloneChildren();
         | 
| 2819 | 
            +
                ATTACH_AST_OPERATIONS(Compound_Selector)
         | 
| 2376 2820 | 
             
                ATTACH_OPERATIONS()
         | 
| 2377 2821 | 
             
              };
         | 
| 2378 2822 |  | 
| @@ -2381,37 +2825,40 @@ namespace Sass { | |
| 2381 2825 | 
             
              // CSS selector combinators (">", "+", "~", and whitespace). Essentially a
         | 
| 2382 2826 | 
             
              // linked list.
         | 
| 2383 2827 | 
             
              ////////////////////////////////////////////////////////////////////////////
         | 
| 2384 | 
            -
              class  | 
| 2828 | 
            +
              class Complex_Selector : public Selector {
         | 
| 2385 2829 | 
             
              public:
         | 
| 2386 2830 | 
             
                enum Combinator { ANCESTOR_OF, PARENT_OF, PRECEDES, ADJACENT_TO, REFERENCE };
         | 
| 2387 2831 | 
             
              private:
         | 
| 2388 2832 | 
             
                ADD_PROPERTY(Combinator, combinator)
         | 
| 2389 | 
            -
                ADD_PROPERTY( | 
| 2390 | 
            -
                ADD_PROPERTY( | 
| 2391 | 
            -
                ADD_PROPERTY( | 
| 2833 | 
            +
                ADD_PROPERTY(Compound_Selector_Obj, head)
         | 
| 2834 | 
            +
                ADD_PROPERTY(Complex_Selector_Obj, tail)
         | 
| 2835 | 
            +
                ADD_PROPERTY(String_Obj, reference);
         | 
| 2392 2836 | 
             
              public:
         | 
| 2393 2837 | 
             
                bool contains_placeholder() {
         | 
| 2394 2838 | 
             
                  if (head() && head()->contains_placeholder()) return true;
         | 
| 2395 2839 | 
             
                  if (tail() && tail()->contains_placeholder()) return true;
         | 
| 2396 2840 | 
             
                  return false;
         | 
| 2397 2841 | 
             
                };
         | 
| 2398 | 
            -
                 | 
| 2842 | 
            +
                Complex_Selector(ParserState pstate,
         | 
| 2399 2843 | 
             
                                 Combinator c = ANCESTOR_OF,
         | 
| 2400 | 
            -
                                  | 
| 2401 | 
            -
                                  | 
| 2402 | 
            -
                                  | 
| 2844 | 
            +
                                 Compound_Selector_Obj h = 0,
         | 
| 2845 | 
            +
                                 Complex_Selector_Obj t = 0,
         | 
| 2846 | 
            +
                                 String_Obj r = 0)
         | 
| 2403 2847 | 
             
                : Selector(pstate),
         | 
| 2404 2848 | 
             
                  combinator_(c),
         | 
| 2405 2849 | 
             
                  head_(h), tail_(t),
         | 
| 2406 2850 | 
             
                  reference_(r)
         | 
| 2407 | 
            -
                {
         | 
| 2408 | 
            -
             | 
| 2409 | 
            -
             | 
| 2410 | 
            -
             | 
| 2851 | 
            +
                {}
         | 
| 2852 | 
            +
                Complex_Selector(const Complex_Selector* ptr)
         | 
| 2853 | 
            +
                : Selector(ptr),
         | 
| 2854 | 
            +
                  combinator_(ptr->combinator_),
         | 
| 2855 | 
            +
                  head_(ptr->head_), tail_(ptr->tail_),
         | 
| 2856 | 
            +
                  reference_(ptr->reference_)
         | 
| 2857 | 
            +
                {};
         | 
| 2411 2858 | 
             
                virtual bool has_parent_ref();
         | 
| 2412 2859 | 
             
                virtual bool has_real_parent_ref();
         | 
| 2413 2860 |  | 
| 2414 | 
            -
                 | 
| 2861 | 
            +
                Complex_Selector_Obj skip_empty_reference()
         | 
| 2415 2862 | 
             
                {
         | 
| 2416 2863 | 
             
                  if ((!head_ || !head_->length() || head_->is_empty_reference()) &&
         | 
| 2417 2864 | 
             
                      combinator() == Combinator::ANCESTOR_OF)
         | 
| @@ -2431,36 +2878,29 @@ namespace Sass { | |
| 2431 2878 | 
             
                         combinator() == Combinator::ANCESTOR_OF;
         | 
| 2432 2879 | 
             
                }
         | 
| 2433 2880 |  | 
| 2434 | 
            -
                 | 
| 2881 | 
            +
                Complex_Selector_Obj context(Context&);
         | 
| 2435 2882 |  | 
| 2436 2883 |  | 
| 2884 | 
            +
                Selector_List_Ptr tails(Context& ctx, Selector_List_Ptr tails);
         | 
| 2885 | 
            +
             | 
| 2437 2886 | 
             
                // front returns the first real tail
         | 
| 2438 2887 | 
             
                // skips over parent and empty ones
         | 
| 2439 | 
            -
                 | 
| 2440 | 
            -
             | 
| 2888 | 
            +
                Complex_Selector_Obj first();
         | 
| 2441 2889 | 
             
                // last returns the last real tail
         | 
| 2442 | 
            -
                 | 
| 2443 | 
            -
             | 
| 2444 | 
            -
                CommaSequence_Selector* tails(Context& ctx, CommaSequence_Selector* tails);
         | 
| 2445 | 
            -
             | 
| 2446 | 
            -
                // unconstant accessors
         | 
| 2447 | 
            -
                Sequence_Selector* first();
         | 
| 2448 | 
            -
                Sequence_Selector* last();
         | 
| 2890 | 
            +
                Complex_Selector_Obj last();
         | 
| 2449 2891 |  | 
| 2450 2892 | 
             
                // some shortcuts that should be removed
         | 
| 2451 | 
            -
                 | 
| 2452 | 
            -
                Sequence_Selector* innermost() { return last(); };
         | 
| 2893 | 
            +
                Complex_Selector_Obj innermost() { return last(); };
         | 
| 2453 2894 |  | 
| 2454 2895 | 
             
                size_t length() const;
         | 
| 2455 | 
            -
                 | 
| 2456 | 
            -
                virtual bool is_superselector_of( | 
| 2457 | 
            -
                virtual bool is_superselector_of( | 
| 2458 | 
            -
                virtual bool is_superselector_of( | 
| 2459 | 
            -
                 | 
| 2460 | 
            -
                CommaSequence_Selector* unify_with(Sequence_Selector* rhs, Context& ctx);
         | 
| 2896 | 
            +
                Selector_List_Ptr resolve_parent_refs(Context& ctx, std::vector<Selector_List_Obj>& pstack, bool implicit_parent = true);
         | 
| 2897 | 
            +
                virtual bool is_superselector_of(Compound_Selector_Obj sub, std::string wrapping = "");
         | 
| 2898 | 
            +
                virtual bool is_superselector_of(Complex_Selector_Obj sub, std::string wrapping = "");
         | 
| 2899 | 
            +
                virtual bool is_superselector_of(Selector_List_Obj sub, std::string wrapping = "");
         | 
| 2900 | 
            +
                Selector_List_Ptr unify_with(Complex_Selector_Ptr rhs, Context& ctx);
         | 
| 2461 2901 | 
             
                Combinator clear_innermost();
         | 
| 2462 | 
            -
                void append(Context&,  | 
| 2463 | 
            -
                void set_innermost( | 
| 2902 | 
            +
                void append(Context&, Complex_Selector_Obj);
         | 
| 2903 | 
            +
                void set_innermost(Complex_Selector_Obj, Combinator);
         | 
| 2464 2904 | 
             
                virtual size_t hash()
         | 
| 2465 2905 | 
             
                {
         | 
| 2466 2906 | 
             
                  if (hash_ == 0) {
         | 
| @@ -2478,24 +2918,19 @@ namespace Sass { | |
| 2478 2918 | 
             
                  if (tail()) sum += tail()->specificity();
         | 
| 2479 2919 | 
             
                  return sum;
         | 
| 2480 2920 | 
             
                }
         | 
| 2481 | 
            -
                virtual void set_media_block( | 
| 2921 | 
            +
                virtual void set_media_block(Media_Block_Ptr mb) {
         | 
| 2482 2922 | 
             
                  media_block(mb);
         | 
| 2483 2923 | 
             
                  if (tail_) tail_->set_media_block(mb);
         | 
| 2484 2924 | 
             
                  if (head_) head_->set_media_block(mb);
         | 
| 2485 2925 | 
             
                }
         | 
| 2486 | 
            -
                virtual bool has_wrapped_selector() {
         | 
| 2487 | 
            -
                  if (head_ && head_->has_wrapped_selector()) return true;
         | 
| 2488 | 
            -
                  if (tail_ && tail_->has_wrapped_selector()) return true;
         | 
| 2489 | 
            -
                  return false;
         | 
| 2490 | 
            -
                }
         | 
| 2491 2926 | 
             
                virtual bool has_placeholder() {
         | 
| 2492 2927 | 
             
                  if (head_ && head_->has_placeholder()) return true;
         | 
| 2493 2928 | 
             
                  if (tail_ && tail_->has_placeholder()) return true;
         | 
| 2494 2929 | 
             
                  return false;
         | 
| 2495 2930 | 
             
                }
         | 
| 2496 | 
            -
                bool operator<(const  | 
| 2497 | 
            -
                bool operator==(const  | 
| 2498 | 
            -
                inline bool operator!=(const  | 
| 2931 | 
            +
                virtual bool operator<(const Complex_Selector& rhs) const;
         | 
| 2932 | 
            +
                virtual bool operator==(const Complex_Selector& rhs) const;
         | 
| 2933 | 
            +
                inline bool operator!=(const Complex_Selector& rhs) const { return !(*this == rhs); }
         | 
| 2499 2934 | 
             
                SourcesSet sources()
         | 
| 2500 2935 | 
             
                {
         | 
| 2501 2936 | 
             
                  //s = Set.new
         | 
| @@ -2504,8 +2939,8 @@ namespace Sass { | |
| 2504 2939 |  | 
| 2505 2940 | 
             
                  SourcesSet srcs;
         | 
| 2506 2941 |  | 
| 2507 | 
            -
                   | 
| 2508 | 
            -
                   | 
| 2942 | 
            +
                  Compound_Selector_Obj pHead = head();
         | 
| 2943 | 
            +
                  Complex_Selector_Obj  pTail = tail();
         | 
| 2509 2944 |  | 
| 2510 2945 | 
             
                  if (pHead) {
         | 
| 2511 2946 | 
             
                    SourcesSet& headSources = pHead->sources();
         | 
| @@ -2521,48 +2956,52 @@ namespace Sass { | |
| 2521 2956 | 
             
                }
         | 
| 2522 2957 | 
             
                void addSources(SourcesSet& sources, Context& ctx) {
         | 
| 2523 2958 | 
             
                  // members.map! {|m| m.is_a?(SimpleSequence) ? m.with_more_sources(sources) : m}
         | 
| 2524 | 
            -
                   | 
| 2959 | 
            +
                  Complex_Selector_Ptr pIter = this;
         | 
| 2525 2960 | 
             
                  while (pIter) {
         | 
| 2526 | 
            -
                     | 
| 2961 | 
            +
                    Compound_Selector_Ptr pHead = &pIter->head();
         | 
| 2527 2962 |  | 
| 2528 2963 | 
             
                    if (pHead) {
         | 
| 2529 2964 | 
             
                      pHead->mergeSources(sources, ctx);
         | 
| 2530 2965 | 
             
                    }
         | 
| 2531 2966 |  | 
| 2532 | 
            -
                    pIter = pIter->tail();
         | 
| 2967 | 
            +
                    pIter = &pIter->tail();
         | 
| 2533 2968 | 
             
                  }
         | 
| 2534 2969 | 
             
                }
         | 
| 2535 2970 | 
             
                void clearSources() {
         | 
| 2536 | 
            -
                   | 
| 2971 | 
            +
                  Complex_Selector_Ptr pIter = this;
         | 
| 2537 2972 | 
             
                  while (pIter) {
         | 
| 2538 | 
            -
                     | 
| 2973 | 
            +
                    Compound_Selector_Ptr pHead = &pIter->head();
         | 
| 2539 2974 |  | 
| 2540 2975 | 
             
                    if (pHead) {
         | 
| 2541 2976 | 
             
                      pHead->clearSources();
         | 
| 2542 2977 | 
             
                    }
         | 
| 2543 2978 |  | 
| 2544 | 
            -
                    pIter = pIter->tail();
         | 
| 2979 | 
            +
                    pIter = &pIter->tail();
         | 
| 2545 2980 | 
             
                  }
         | 
| 2546 2981 | 
             
                }
         | 
| 2547 | 
            -
             | 
| 2548 | 
            -
                 | 
| 2549 | 
            -
                 | 
| 2982 | 
            +
             | 
| 2983 | 
            +
                virtual void cloneChildren();
         | 
| 2984 | 
            +
                ATTACH_AST_OPERATIONS(Complex_Selector)
         | 
| 2550 2985 | 
             
                ATTACH_OPERATIONS()
         | 
| 2551 2986 | 
             
              };
         | 
| 2552 2987 |  | 
| 2553 | 
            -
              typedef std::deque< | 
| 2554 | 
            -
              typedef Subset_Map<std::string, std::pair<Sequence_Selector*, SimpleSequence_Selector*> > ExtensionSubsetMap;
         | 
| 2988 | 
            +
              typedef std::deque<Complex_Selector_Obj> ComplexSelectorDeque;
         | 
| 2555 2989 |  | 
| 2556 2990 | 
             
              ///////////////////////////////////
         | 
| 2557 2991 | 
             
              // Comma-separated selector groups.
         | 
| 2558 2992 | 
             
              ///////////////////////////////////
         | 
| 2559 | 
            -
              class  | 
| 2993 | 
            +
              class Selector_List : public Selector, public Vectorized<Complex_Selector_Obj> {
         | 
| 2560 2994 | 
             
                ADD_PROPERTY(std::vector<std::string>, wspace)
         | 
| 2561 2995 | 
             
              protected:
         | 
| 2562 | 
            -
                void adjust_after_pushing( | 
| 2996 | 
            +
                void adjust_after_pushing(Complex_Selector_Obj c);
         | 
| 2563 2997 | 
             
              public:
         | 
| 2564 | 
            -
                 | 
| 2565 | 
            -
                : Selector(pstate), Vectorized< | 
| 2998 | 
            +
                Selector_List(ParserState pstate, size_t s = 0)
         | 
| 2999 | 
            +
                : Selector(pstate), Vectorized<Complex_Selector_Obj>(s), wspace_(0)
         | 
| 3000 | 
            +
                { }
         | 
| 3001 | 
            +
                Selector_List(const Selector_List* ptr)
         | 
| 3002 | 
            +
                : Selector(ptr),
         | 
| 3003 | 
            +
                  Vectorized<Complex_Selector_Obj>(*ptr),
         | 
| 3004 | 
            +
                  wspace_(ptr->wspace_)
         | 
| 2566 3005 | 
             
                { }
         | 
| 2567 3006 | 
             
                std::string type() { return "list"; }
         | 
| 2568 3007 | 
             
                // remove parent selector references
         | 
| @@ -2570,13 +3009,12 @@ namespace Sass { | |
| 2570 3009 | 
             
                virtual bool has_parent_ref();
         | 
| 2571 3010 | 
             
                virtual bool has_real_parent_ref();
         | 
| 2572 3011 | 
             
                void remove_parent_selectors();
         | 
| 2573 | 
            -
                 | 
| 2574 | 
            -
                 | 
| 2575 | 
            -
                virtual bool is_superselector_of( | 
| 2576 | 
            -
                virtual bool is_superselector_of( | 
| 2577 | 
            -
                 | 
| 2578 | 
            -
                 | 
| 2579 | 
            -
                void populate_extends(CommaSequence_Selector*, Context&, ExtensionSubsetMap&);
         | 
| 3012 | 
            +
                Selector_List_Ptr resolve_parent_refs(Context& ctx, std::vector<Selector_List_Obj>& pstack, bool implicit_parent = true);
         | 
| 3013 | 
            +
                virtual bool is_superselector_of(Compound_Selector_Obj sub, std::string wrapping = "");
         | 
| 3014 | 
            +
                virtual bool is_superselector_of(Complex_Selector_Obj sub, std::string wrapping = "");
         | 
| 3015 | 
            +
                virtual bool is_superselector_of(Selector_List_Obj sub, std::string wrapping = "");
         | 
| 3016 | 
            +
                Selector_List_Ptr unify_with(Selector_List_Ptr, Context&);
         | 
| 3017 | 
            +
                void populate_extends(Selector_List_Obj, Context&, Subset_Map&);
         | 
| 2580 3018 | 
             
                virtual size_t hash()
         | 
| 2581 3019 | 
             
                {
         | 
| 2582 3020 | 
             
                  if (Selector::hash_ == 0) {
         | 
| @@ -2596,30 +3034,26 @@ namespace Sass { | |
| 2596 3034 | 
             
                  }
         | 
| 2597 3035 | 
             
                  return sum;
         | 
| 2598 3036 | 
             
                }
         | 
| 2599 | 
            -
                virtual void set_media_block( | 
| 3037 | 
            +
                virtual void set_media_block(Media_Block_Ptr mb) {
         | 
| 2600 3038 | 
             
                  media_block(mb);
         | 
| 2601 | 
            -
                  for ( | 
| 3039 | 
            +
                  for (Complex_Selector_Obj cs : elements()) {
         | 
| 2602 3040 | 
             
                    cs->set_media_block(mb);
         | 
| 2603 3041 | 
             
                  }
         | 
| 2604 3042 | 
             
                }
         | 
| 2605 | 
            -
                virtual bool has_wrapped_selector() {
         | 
| 2606 | 
            -
                  for (Sequence_Selector* cs : elements()) {
         | 
| 2607 | 
            -
                    if (cs->has_wrapped_selector()) return true;
         | 
| 2608 | 
            -
                  }
         | 
| 2609 | 
            -
                  return false;
         | 
| 2610 | 
            -
                }
         | 
| 2611 3043 | 
             
                virtual bool has_placeholder() {
         | 
| 2612 | 
            -
                  for ( | 
| 3044 | 
            +
                  for (Complex_Selector_Obj cs : elements()) {
         | 
| 2613 3045 | 
             
                    if (cs->has_placeholder()) return true;
         | 
| 2614 3046 | 
             
                  }
         | 
| 2615 3047 | 
             
                  return false;
         | 
| 2616 3048 | 
             
                }
         | 
| 2617 | 
            -
                 | 
| 2618 | 
            -
                CommaSequence_Selector* cloneFully(Context&) const; // clones SimpleSequence_Selector*s
         | 
| 3049 | 
            +
                virtual bool operator<(const Selector& rhs) const;
         | 
| 2619 3050 | 
             
                virtual bool operator==(const Selector& rhs) const;
         | 
| 2620 | 
            -
                virtual bool operator | 
| 3051 | 
            +
                virtual bool operator<(const Selector_List& rhs) const;
         | 
| 3052 | 
            +
                virtual bool operator==(const Selector_List& rhs) const;
         | 
| 2621 3053 | 
             
                // Selector Lists can be compared to comma lists
         | 
| 2622 3054 | 
             
                virtual bool operator==(const Expression& rhs) const;
         | 
| 3055 | 
            +
                virtual void cloneChildren();
         | 
| 3056 | 
            +
                ATTACH_AST_OPERATIONS(Selector_List)
         | 
| 2623 3057 | 
             
                ATTACH_OPERATIONS()
         | 
| 2624 3058 | 
             
              };
         | 
| 2625 3059 |  | 
| @@ -2630,10 +3064,10 @@ namespace Sass { | |
| 2630 3064 | 
             
                // is required for proper stl collection ordering) is implemented using string comparision. This gives stable sorting
         | 
| 2631 3065 | 
             
                // behavior, and can be used to determine if the selectors would have exactly idential output. operator== matches the
         | 
| 2632 3066 | 
             
                // ruby sass implementations for eql, which sometimes perform order independent comparisions (like set comparisons of the
         | 
| 2633 | 
            -
                // members of a SimpleSequence ( | 
| 3067 | 
            +
                // members of a SimpleSequence (Compound_Selector)).
         | 
| 2634 3068 | 
             
                //
         | 
| 2635 3069 | 
             
                // Due to the reliance on operator== and operater< behavior, this templated method is currently only intended for
         | 
| 2636 | 
            -
                // use with  | 
| 3070 | 
            +
                // use with Compound_Selector and Complex_Selector objects.
         | 
| 2637 3071 | 
             
                if (simpleSelectorOrderDependent) {
         | 
| 2638 3072 | 
             
                  return !(one < two) && !(two < one);
         | 
| 2639 3073 | 
             
                } else {
         | 
| @@ -2642,9 +3076,9 @@ namespace Sass { | |
| 2642 3076 | 
             
              }
         | 
| 2643 3077 |  | 
| 2644 3078 | 
             
              // compare function for sorting and probably other other uses
         | 
| 2645 | 
            -
              struct cmp_complex_selector { inline bool operator() (const  | 
| 2646 | 
            -
              struct cmp_compound_selector { inline bool operator() (const  | 
| 2647 | 
            -
              struct cmp_simple_selector { inline bool operator() (const  | 
| 3079 | 
            +
              struct cmp_complex_selector { inline bool operator() (const Complex_Selector_Obj l, const Complex_Selector_Obj r) { return (*l < *r); } };
         | 
| 3080 | 
            +
              struct cmp_compound_selector { inline bool operator() (const Compound_Selector_Obj l, const Compound_Selector_Obj r) { return (*l < *r); } };
         | 
| 3081 | 
            +
              struct cmp_simple_selector { inline bool operator() (const Simple_Selector_Obj l, const Simple_Selector_Obj r) { return (*l < *r); } };
         | 
| 2648 3082 |  | 
| 2649 3083 | 
             
            }
         | 
| 2650 3084 |  |