sassc 1.11.1 → 1.11.2

Sign up to get free protection for your applications and to get access to all the features.
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