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.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -2
  3. data/README.md +3 -2
  4. data/ext/libsass/Makefile.conf +2 -1
  5. data/ext/libsass/appveyor.yml +10 -5
  6. data/ext/libsass/docs/dev-ast-memory.md +223 -0
  7. data/ext/libsass/include/sass/base.h +2 -0
  8. data/ext/libsass/script/bootstrap +7 -4
  9. data/ext/libsass/script/ci-build-libsass +3 -3
  10. data/ext/libsass/script/ci-install-compiler +2 -0
  11. data/ext/libsass/script/ci-report-coverage +2 -1
  12. data/ext/libsass/script/test-leaks.pl +103 -0
  13. data/ext/libsass/src/ast.cpp +621 -495
  14. data/ext/libsass/src/ast.hpp +801 -367
  15. data/ext/libsass/src/ast_def_macros.hpp +5 -5
  16. data/ext/libsass/src/ast_fwd_decl.hpp +312 -14
  17. data/ext/libsass/src/bind.cpp +54 -51
  18. data/ext/libsass/src/bind.hpp +3 -7
  19. data/ext/libsass/src/check_nesting.cpp +117 -120
  20. data/ext/libsass/src/check_nesting.hpp +38 -34
  21. data/ext/libsass/src/color_maps.cpp +3 -3
  22. data/ext/libsass/src/color_maps.hpp +3 -3
  23. data/ext/libsass/src/context.cpp +33 -34
  24. data/ext/libsass/src/context.hpp +12 -14
  25. data/ext/libsass/src/cssize.cpp +200 -228
  26. data/ext/libsass/src/cssize.hpp +49 -49
  27. data/ext/libsass/src/debugger.hpp +260 -241
  28. data/ext/libsass/src/emitter.cpp +6 -6
  29. data/ext/libsass/src/emitter.hpp +7 -7
  30. data/ext/libsass/src/environment.cpp +2 -2
  31. data/ext/libsass/src/environment.hpp +0 -2
  32. data/ext/libsass/src/error_handling.cpp +5 -5
  33. data/ext/libsass/src/error_handling.hpp +12 -12
  34. data/ext/libsass/src/eval.cpp +412 -401
  35. data/ext/libsass/src/eval.hpp +61 -62
  36. data/ext/libsass/src/expand.cpp +223 -204
  37. data/ext/libsass/src/expand.hpp +42 -42
  38. data/ext/libsass/src/extend.cpp +198 -201
  39. data/ext/libsass/src/extend.hpp +12 -14
  40. data/ext/libsass/src/file.hpp +4 -5
  41. data/ext/libsass/src/functions.cpp +413 -418
  42. data/ext/libsass/src/functions.hpp +7 -10
  43. data/ext/libsass/src/inspect.cpp +115 -109
  44. data/ext/libsass/src/inspect.hpp +69 -69
  45. data/ext/libsass/src/listize.cpp +31 -33
  46. data/ext/libsass/src/listize.hpp +8 -10
  47. data/ext/libsass/src/memory/SharedPtr.cpp +116 -0
  48. data/ext/libsass/src/memory/SharedPtr.hpp +202 -0
  49. data/ext/libsass/src/node.cpp +45 -43
  50. data/ext/libsass/src/node.hpp +15 -15
  51. data/ext/libsass/src/operation.hpp +136 -136
  52. data/ext/libsass/src/output.cpp +48 -49
  53. data/ext/libsass/src/output.hpp +14 -14
  54. data/ext/libsass/src/parser.cpp +530 -554
  55. data/ext/libsass/src/parser.hpp +91 -96
  56. data/ext/libsass/src/prelexer.cpp +13 -10
  57. data/ext/libsass/src/remove_placeholders.cpp +25 -21
  58. data/ext/libsass/src/remove_placeholders.hpp +7 -7
  59. data/ext/libsass/src/sass2scss.cpp +2 -1
  60. data/ext/libsass/src/sass_context.cpp +125 -107
  61. data/ext/libsass/src/sass_context.hpp +1 -1
  62. data/ext/libsass/src/sass_util.hpp +5 -5
  63. data/ext/libsass/src/sass_values.cpp +27 -27
  64. data/ext/libsass/src/source_map.cpp +2 -2
  65. data/ext/libsass/src/source_map.hpp +2 -2
  66. data/ext/libsass/src/subset_map.cpp +57 -0
  67. data/ext/libsass/src/subset_map.hpp +8 -76
  68. data/ext/libsass/src/to_c.cpp +13 -13
  69. data/ext/libsass/src/to_c.hpp +14 -14
  70. data/ext/libsass/src/to_value.cpp +20 -20
  71. data/ext/libsass/src/to_value.hpp +20 -21
  72. data/ext/libsass/src/util.cpp +55 -88
  73. data/ext/libsass/src/util.hpp +9 -13
  74. data/ext/libsass/src/values.cpp +27 -26
  75. data/ext/libsass/src/values.hpp +2 -2
  76. data/ext/libsass/test/test_subset_map.cpp +69 -69
  77. data/ext/libsass/win/libsass.targets +3 -2
  78. data/ext/libsass/win/libsass.vcxproj.filters +9 -6
  79. data/lib/sassc/version.rb +1 -1
  80. data/sassc.gemspec +0 -1
  81. data/test/native_test.rb +1 -1
  82. metadata +7 -5
  83. data/ext/libsass/src/ast_factory.hpp +0 -92
  84. data/ext/libsass/src/memory_manager.cpp +0 -77
  85. data/ext/libsass/src/memory_manager.hpp +0 -48
@@ -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 Memory_Object {
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
- // virtual Block* block() { return 0; }
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::Expression*>
245
+ struct hash<Sass::Expression_Obj>
198
246
  {
199
- size_t operator()(Sass::Expression* s) const
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::Expression*>
253
+ struct equal_to<Sass::Expression_Obj>
206
254
  {
207
- bool operator()( Sass::Expression* lhs, Sass::Expression* rhs) const
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 Vectorized& operator<<(T element)
289
+ virtual void append(T element)
240
290
  {
241
- if (!element) return *this;
242
- reset_hash();
243
- elements_.push_back(element);
244
- adjust_after_pushing(element);
245
- return *this;
291
+ if (element) {
292
+ reset_hash();
293
+ elements_.push_back(element);
294
+ adjust_after_pushing(element);
295
+ }
246
296
  }
247
- Vectorized& operator+=(Vectorized* v)
297
+ virtual void concat(Vectorized* v)
248
298
  {
249
- for (size_t i = 0, L = v->length(); i < L; ++i) *this << (*v)[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<Expression*> list_;
338
+ std::vector<Expression_Obj> list_;
306
339
  protected:
307
340
  size_t hash_;
308
- Expression* duplicate_key_;
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<Expression*, Expression*> p) { }
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<Expression*>())
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(Expression* k) const { return elements_.count(k) == 1; }
319
- Expression* at(Expression* k) const;
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
- Expression* get_duplicate_key() const { return duplicate_key_; }
354
+ Expression_Obj get_duplicate_key() const { return duplicate_key_; }
322
355
  const ExpressionMap elements() { return elements_; }
323
- Hashed& operator<<(std::pair<Expression*, Expression*> p)
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<Expression*>& keys() const { return list_; }
384
+ const std::vector<Expression_Obj>& keys() const { return list_; }
352
385
 
353
- std::unordered_map<Expression*, Expression*>::iterator end() { return elements_.end(); }
354
- std::unordered_map<Expression*, Expression*>::iterator begin() { return elements_.begin(); }
355
- std::unordered_map<Expression*, Expression*>::const_iterator end() const { return elements_.end(); }
356
- std::unordered_map<Expression*, Expression*>::const_iterator begin() const { return elements_.begin(); }
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), block_(0), statement_type_(st), tabs_(t), group_end_(false)
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<Statement*> {
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(Statement* s)
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<Statement*>(s),
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* block() { return this; }
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(Block*, block)
491
+ ADD_PROPERTY(Block_Obj, block)
449
492
  public:
450
- Has_Block(ParserState pstate, Block* b)
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(Selector*, selector)
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, Selector* s = 0, Block* b = 0)
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(Statement*, node)
534
+ ADD_PROPERTY(Statement_Obj, node)
482
535
  ADD_PROPERTY(bool, group_end)
483
536
  public:
484
- Bubble(ParserState pstate, Statement* n, Statement* g = 0, size_t t = 0)
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, Block* b = 0)
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(List*, media_queries)
571
+ ADD_PROPERTY(List_Obj, media_queries)
508
572
  public:
509
- Media_Block(ParserState pstate, List* mqs, Block* b)
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, List* mqs, Block* b, Selector* s)
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(Selector*, selector)
527
- ADD_PROPERTY(Expression*, value)
594
+ ADD_PROPERTY(Selector_Obj, selector)
595
+ ADD_PROPERTY(Expression_Obj, value)
528
596
  public:
529
- Directive(ParserState pstate, std::string kwd, Selector* sel = 0, Block* b = 0, Expression* val = 0)
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
- ADD_PROPERTY(Selector*, selector)
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, Block* b)
555
- : Has_Block(pstate, b), selector_(0)
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(String*, property)
565
- ADD_PROPERTY(Expression*, value)
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
- String* prop, Expression* val, bool i = false, Block* b = 0)
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(Expression*, value)
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, Expression* val,
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<Expression*> urls_;
696
+ std::vector<Expression_Obj> urls_;
600
697
  std::vector<Include> incs_;
601
- ADD_PROPERTY(List*, media_queries);
698
+ ADD_PROPERTY(List_Obj, import_queries);
602
699
  public:
603
700
  Import(ParserState pstate)
604
701
  : Statement(pstate),
605
- urls_(std::vector<Expression*>()),
702
+ urls_(std::vector<Expression_Obj>()),
606
703
  incs_(std::vector<Include>()),
607
- media_queries_(0)
704
+ import_queries_()
608
705
  { statement_type(IMPORT); }
609
- std::vector<Expression*>& urls() { return urls_; }
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(Expression*, message)
741
+ ADD_PROPERTY(Expression_Obj, message)
634
742
  public:
635
- Warning(ParserState pstate, Expression* msg)
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(Expression*, message)
757
+ ADD_PROPERTY(Expression_Obj, message)
646
758
  public:
647
- Error(ParserState pstate, Expression* msg)
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(Expression*, value)
773
+ ADD_PROPERTY(Expression_Obj, value)
658
774
  public:
659
- Debug(ParserState pstate, Expression* val)
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(String*, text)
789
+ ADD_PROPERTY(String_Obj, text)
670
790
  ADD_PROPERTY(bool, is_important)
671
791
  public:
672
- Comment(ParserState pstate, String* txt, bool is_important)
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(Expression*, predicate)
685
- ADD_PROPERTY(Block*, alternative)
810
+ ADD_PROPERTY(Expression_Obj, predicate)
811
+ ADD_PROPERTY(Block_Obj, alternative)
686
812
  public:
687
- If(ParserState pstate, Expression* pred, Block* con, Block* alt = 0)
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(Expression*, lower_bound)
703
- ADD_PROPERTY(Expression*, upper_bound)
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, Expression* lo, Expression* hi, Block* b, bool inc)
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(Expression*, list)
859
+ ADD_PROPERTY(Expression_Obj, list)
720
860
  public:
721
- Each(ParserState pstate, std::vector<std::string> vars, Expression* lst, Block* b)
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(Expression*, predicate)
875
+ ADD_PROPERTY(Expression_Obj, predicate)
732
876
  public:
733
- While(ParserState pstate, Expression* pred, Block* b)
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(Expression*, value)
891
+ ADD_PROPERTY(Expression_Obj, value)
744
892
  public:
745
- Return(ParserState pstate, Expression* val)
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(Selector*, selector)
907
+ ADD_PROPERTY(Selector_Obj, selector)
756
908
  public:
757
- Extension(ParserState pstate, Selector* s)
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<AST_Node*> Env;
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(Parameters*, parameters)
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
- Parameters* params,
788
- Block* b,
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
- Parameters* params,
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
- Parameters* params,
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(Arguments*, arguments)
1013
+ ADD_PROPERTY(Arguments_Obj, arguments)
845
1014
  public:
846
- Mixin_Call(ParserState pstate, std::string n, Arguments* args, Block* b = 0)
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(Media_Block*, media_block)
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<Expression*> {
868
- void adjust_after_pushing(Expression* e) { is_expanded(false); }
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<Expression*>(size),
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
- Expression* value_at_index(size_t i);
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<Expression*, Expression*> p) { is_expanded(false); }
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
- List* to_list(Context& ctx, ParserState& pstate);
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(Expression*, left)
977
- ADD_HASHED(Expression*, right)
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, Expression* lhs, Expression* rhs)
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
- const Binary_Expression* m = dynamic_cast<const Binary_Expression*>(&rhs);
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(Expression*, operand)
1273
+ ADD_HASHED(Expression_Obj, operand)
1075
1274
  size_t hash_;
1076
1275
  public:
1077
- Unary_Expression(ParserState pstate, Type t, Expression* o)
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
- const Unary_Expression* m = dynamic_cast<const Unary_Expression*>(&rhs);
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(Expression*, value)
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, Expression* val, std::string n = "", bool rest = false, bool keyword = false)
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", pstate);
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
- const Argument* m = dynamic_cast<const Argument*>(&rhs);
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<Argument*> {
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(Argument* a);
1389
+ void adjust_after_pushing(Argument_Obj a);
1171
1390
  public:
1172
1391
  Arguments(ParserState pstate)
1173
1392
  : Expression(pstate),
1174
- Vectorized<Argument*>(),
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
- Argument* get_rest_argument();
1183
- Argument* get_keyword_argument();
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(Arguments*, arguments)
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, Arguments* args, void* cookie)
1198
- : PreValue(pstate), name_(n), arguments_(args), cookie_(cookie), hash_(0)
1199
- { concrete_type(STRING); }
1200
- Function_Call(ParserState pstate, std::string n, Arguments* args)
1201
- : PreValue(pstate), name_(n), arguments_(args), cookie_(0), hash_(0)
1202
- { concrete_type(STRING); }
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
- const Function_Call* m = dynamic_cast<const Function_Call*>(&rhs);
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(String*, name)
1240
- ADD_PROPERTY(Arguments*, arguments)
1475
+ ADD_PROPERTY(String_Obj, name)
1476
+ ADD_PROPERTY(Arguments_Obj, arguments)
1241
1477
  public:
1242
- Function_Call_Schema(ParserState pstate, String* n, Arguments* args)
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
- const Variable* e = dynamic_cast<const Variable*>(&rhs);
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
- const Textual* e = dynamic_cast<const Textual*>(&rhs);
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<Expression*> {
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<Expression*>(size), hash_(0)
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
- bool keep_utf8_escapes = false, bool skip_unquoting = false,
1577
- bool strict_unquoting = true)
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<Media_Query_Expression*> {
1595
- ADD_PROPERTY(String*, media_type)
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
- String* t = 0, size_t s = 0, bool n = false, bool r = false)
1601
- : Expression(pstate), Vectorized<Media_Query_Expression*>(s),
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(Expression*, feature)
1612
- ADD_PROPERTY(Expression*, value)
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
- Expression* f, Expression* v, bool i = false)
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(Supports_Condition*, condition)
1952
+ ADD_PROPERTY(Supports_Condition_Obj, condition)
1627
1953
  public:
1628
- Supports_Block(ParserState pstate, Supports_Condition* condition, Block* block = 0)
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
- virtual bool needs_parens(Supports_Condition* cond) const { return false; }
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(Supports_Condition*, left);
1655
- ADD_PROPERTY(Supports_Condition*, right);
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, Supports_Condition* l, Supports_Condition* r, Operand o)
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
- virtual bool needs_parens(Supports_Condition* cond) const;
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(Supports_Condition*, condition);
2011
+ ADD_PROPERTY(Supports_Condition_Obj, condition);
1671
2012
  public:
1672
- Supports_Negation(ParserState pstate, Supports_Condition* c)
2013
+ Supports_Negation(ParserState pstate, Supports_Condition_Obj c)
1673
2014
  : Supports_Condition(pstate), condition_(c)
1674
2015
  { }
1675
- virtual bool needs_parens(Supports_Condition* cond) const;
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(Expression*, feature);
1685
- ADD_PROPERTY(Expression*, value);
2029
+ ADD_PROPERTY(Expression_Obj, feature);
2030
+ ADD_PROPERTY(Expression_Obj, value);
1686
2031
  public:
1687
- Supports_Declaration(ParserState pstate, Expression* f, Expression* v)
2032
+ Supports_Declaration(ParserState pstate, Expression_Obj f, Expression_Obj v)
1688
2033
  : Supports_Condition(pstate), feature_(f), value_(v)
1689
2034
  { }
1690
- virtual bool needs_parens(Supports_Condition* cond) const { return false; }
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(Expression*, value);
2050
+ ADD_PROPERTY(Expression_Obj, value);
1700
2051
  public:
1701
- Supports_Interpolation(ParserState pstate, Expression* v)
2052
+ Supports_Interpolation(ParserState pstate, Expression_Obj v)
1702
2053
  : Supports_Condition(pstate), value_(v)
1703
2054
  { }
1704
- virtual bool needs_parens(Supports_Condition* cond) const { return false; }
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(Expression*, feature)
1714
- ADD_PROPERTY(Expression*, value)
2069
+ ADD_PROPERTY(Expression_Obj, feature)
2070
+ ADD_PROPERTY(Expression_Obj, value)
1715
2071
  public:
1716
- At_Root_Query(ParserState pstate, Expression* f = 0, Expression* v = 0, bool i = false)
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(At_Root_Query*, expression)
2089
+ ADD_PROPERTY(At_Root_Query_Obj, expression)
1728
2090
  public:
1729
- At_Root_Block(ParserState pstate, Block* b = 0, At_Root_Query* e = 0)
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(Statement* s) {
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 (Directive* dir = dynamic_cast<Directive*>(s))
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 (Directive* dir = dynamic_cast<Directive*>(s))
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(Expression*, expression)
2163
+ ADD_PROPERTY(Expression_Obj, expression)
1796
2164
  ADD_PROPERTY(Env*, environment)
1797
2165
  public:
1798
- Thunk(ParserState pstate, Expression* exp, Env* env = 0)
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(Expression*, default_value)
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, Expression* def = 0, bool rest = false)
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", pstate);
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<Parameter*> {
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(Parameter* p)
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<Parameter*>(),
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
- ADD_PROPERTY(Media_Block*, media_block)
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(Media_Block* mb) {
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(String*, contents)
2313
+ ADD_PROPERTY(String_Obj, contents)
1918
2314
  ADD_PROPERTY(bool, at_root);
1919
2315
  public:
1920
- Selector_Schema(ParserState pstate, String* c)
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 SimpleSequence_Selector* unify_with(SimpleSequence_Selector*, Context&);
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(SimpleSequence_Selector* sub) { return false; }
2421
+ virtual bool is_superselector_of(Compound_Selector_Obj sub) { return false; }
2008
2422
 
2009
- bool operator==(const Simple_Selector& rhs) 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 (SimpleSequence_Selector).
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 Simple_Selector* unify_with(Simple_Selector*, Context&);
2077
- virtual SimpleSequence_Selector* unify_with(SimpleSequence_Selector*, Context&);
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 SimpleSequence_Selector* unify_with(SimpleSequence_Selector*, Context&);
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 SimpleSequence_Selector* unify_with(SimpleSequence_Selector*, Context&);
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
- ADD_PROPERTY(String*, value) // might be interpolated
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, String* v)
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(String*, expression)
2611
+ ADD_PROPERTY(String_Obj, expression)
2169
2612
  public:
2170
- Pseudo_Selector(ParserState pstate, std::string n, String* expr = 0)
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 SimpleSequence_Selector* unify_with(SimpleSequence_Selector*, Context&);
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(Selector*, selector)
2668
+ ADD_PROPERTY(Selector_Obj, selector)
2222
2669
  public:
2223
- Wrapped_Selector(ParserState pstate, std::string n, Selector* sel)
2670
+ Wrapped_Selector(ParserState pstate, std::string n, Selector_Obj sel)
2224
2671
  : Simple_Selector(pstate, n), selector_(sel)
2225
- { }
2226
- virtual bool is_superselector_of(Wrapped_Selector* sub);
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 Sequence_Selector_Pointer_Compare {
2263
- bool operator() (const Sequence_Selector* const pLeft, const Sequence_Selector* const pRight) 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<Sequence_Selector*, Sequence_Selector_Pointer_Compare> SourcesSet;
2271
- class SimpleSequence_Selector : public Selector, public Vectorized<Simple_Selector*> {
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(Simple_Selector* s)
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
- SimpleSequence_Selector(ParserState pstate, size_t s = 0)
2731
+ Compound_Selector(ParserState pstate, size_t s = 0)
2284
2732
  : Selector(pstate),
2285
- Vectorized<Simple_Selector*>(s),
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
- SimpleSequence_Selector& operator<<(Simple_Selector* element);
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
- Sequence_Selector* to_complex(Memory_Manager& mem);
2304
- SimpleSequence_Selector* unify_with(SimpleSequence_Selector* rhs, Context& ctx);
2305
- // virtual Placeholder_Selector* find_placeholder();
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
- Simple_Selector* base()
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<Simple_Selector*>(static_cast<const SimpleSequence_Selector*>(this)->base());
2765
+ return const_cast<Simple_Selector_Ptr>(static_cast<Compound_Selector_Ptr_Const>(this)->base());
2312
2766
  }
2313
- const Simple_Selector* base() const {
2767
+ Simple_Selector_Ptr_Const base() const {
2314
2768
  if (length() == 0) return 0;
2315
2769
  // ToDo: why is this needed?
2316
- if (dynamic_cast<Element_Selector*>((*this)[0]))
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(SimpleSequence_Selector* sub, std::string wrapped = "");
2321
- virtual bool is_superselector_of(Sequence_Selector* sub, std::string wrapped = "");
2322
- virtual bool is_superselector_of(CommaSequence_Selector* sub, std::string wrapped = "");
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 (Simple_Selector* ss = elements().front()) {
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
- dynamic_cast<Parent_Selector*>((*this)[0]);
2805
+ SASS_MEMORY_CAST(Parent_Selector, (*this)[0]);
2361
2806
  }
2362
- std::vector<std::string> to_str_vec(); // sometimes need to convert to a flat "by-value" data structure
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 SimpleSequence_Selector& rhs) const;
2365
-
2366
- bool operator==(const SimpleSequence_Selector& rhs) const;
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
- SimpleSequence_Selector* clone(Context&) const; // does not clone the Simple_Selector*s
2374
-
2375
- SimpleSequence_Selector* minus(SimpleSequence_Selector* rhs, Context& ctx);
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 Sequence_Selector : public Selector {
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(SimpleSequence_Selector*, head)
2390
- ADD_PROPERTY(Sequence_Selector*, tail)
2391
- ADD_PROPERTY(String*, reference);
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
- Sequence_Selector(ParserState pstate,
2842
+ Complex_Selector(ParserState pstate,
2399
2843
  Combinator c = ANCESTOR_OF,
2400
- SimpleSequence_Selector* h = 0,
2401
- Sequence_Selector* t = 0,
2402
- String* r = 0)
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
- // if ((h && h->has_reference()) || (t && t->has_reference())) has_reference(true);
2409
- // if ((h && h->has_placeholder()) || (t && t->has_placeholder())) has_placeholder(true);
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
- Sequence_Selector* skip_empty_reference()
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
- Sequence_Selector* context(Context&);
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
- const Sequence_Selector* first() const;
2440
-
2888
+ Complex_Selector_Obj first();
2441
2889
  // last returns the last real tail
2442
- const Sequence_Selector* last() const;
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
- const Sequence_Selector* innermost() const { return last(); };
2452
- Sequence_Selector* innermost() { return last(); };
2893
+ Complex_Selector_Obj innermost() { return last(); };
2453
2894
 
2454
2895
  size_t length() const;
2455
- CommaSequence_Selector* resolve_parent_refs(Context& ctx, CommaSequence_Selector* parents, bool implicit_parent = true);
2456
- virtual bool is_superselector_of(SimpleSequence_Selector* sub, std::string wrapping = "");
2457
- virtual bool is_superselector_of(Sequence_Selector* sub, std::string wrapping = "");
2458
- virtual bool is_superselector_of(CommaSequence_Selector* sub, std::string wrapping = "");
2459
- // virtual Placeholder_Selector* find_placeholder();
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&, Sequence_Selector*);
2463
- void set_innermost(Sequence_Selector*, Combinator);
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(Media_Block* mb) {
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 Sequence_Selector& rhs) const;
2497
- bool operator==(const Sequence_Selector& rhs) const;
2498
- inline bool operator!=(const Sequence_Selector& rhs) const { return !(*this == rhs); }
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
- SimpleSequence_Selector* pHead = head();
2508
- Sequence_Selector* pTail = tail();
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
- Sequence_Selector* pIter = this;
2959
+ Complex_Selector_Ptr pIter = this;
2525
2960
  while (pIter) {
2526
- SimpleSequence_Selector* pHead = pIter->head();
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
- Sequence_Selector* pIter = this;
2971
+ Complex_Selector_Ptr pIter = this;
2537
2972
  while (pIter) {
2538
- SimpleSequence_Selector* pHead = pIter->head();
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
- Sequence_Selector* clone(Context&) const; // does not clone SimpleSequence_Selector*s
2548
- Sequence_Selector* cloneFully(Context&) const; // clones SimpleSequence_Selector*s
2549
- // std::vector<SimpleSequence_Selector*> to_vector();
2982
+
2983
+ virtual void cloneChildren();
2984
+ ATTACH_AST_OPERATIONS(Complex_Selector)
2550
2985
  ATTACH_OPERATIONS()
2551
2986
  };
2552
2987
 
2553
- typedef std::deque<Sequence_Selector*> ComplexSelectorDeque;
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 CommaSequence_Selector : public Selector, public Vectorized<Sequence_Selector*> {
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(Sequence_Selector* c);
2996
+ void adjust_after_pushing(Complex_Selector_Obj c);
2563
2997
  public:
2564
- CommaSequence_Selector(ParserState pstate, size_t s = 0)
2565
- : Selector(pstate), Vectorized<Sequence_Selector*>(s), wspace_(0)
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
- // virtual Placeholder_Selector* find_placeholder();
2574
- CommaSequence_Selector* resolve_parent_refs(Context& ctx, CommaSequence_Selector* parents, bool implicit_parent = true);
2575
- virtual bool is_superselector_of(SimpleSequence_Selector* sub, std::string wrapping = "");
2576
- virtual bool is_superselector_of(Sequence_Selector* sub, std::string wrapping = "");
2577
- virtual bool is_superselector_of(CommaSequence_Selector* sub, std::string wrapping = "");
2578
- CommaSequence_Selector* unify_with(CommaSequence_Selector*, Context&);
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(Media_Block* mb) {
3037
+ virtual void set_media_block(Media_Block_Ptr mb) {
2600
3038
  media_block(mb);
2601
- for (Sequence_Selector* cs : elements()) {
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 (Sequence_Selector* cs : elements()) {
3044
+ for (Complex_Selector_Obj cs : elements()) {
2613
3045
  if (cs->has_placeholder()) return true;
2614
3046
  }
2615
3047
  return false;
2616
3048
  }
2617
- CommaSequence_Selector* clone(Context&) const; // does not clone SimpleSequence_Selector*s
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==(const CommaSequence_Selector& rhs) const;
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 (SimpleSequence_Selector)).
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 SimpleSequence_Selector and Sequence_Selector objects.
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 Sequence_Selector* l, const Sequence_Selector* r) { return (*l < *r); } };
2646
- struct cmp_compound_selector { inline bool operator() (const SimpleSequence_Selector* l, const SimpleSequence_Selector* r) { return (*l < *r); } };
2647
- struct cmp_simple_selector { inline bool operator() (const Simple_Selector* l, const Simple_Selector* r) { return (*l < *r); } };
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