sassc 1.11.1 → 1.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -2
  3. data/README.md +3 -2
  4. data/ext/libsass/Makefile.conf +2 -1
  5. data/ext/libsass/appveyor.yml +10 -5
  6. data/ext/libsass/docs/dev-ast-memory.md +223 -0
  7. data/ext/libsass/include/sass/base.h +2 -0
  8. data/ext/libsass/script/bootstrap +7 -4
  9. data/ext/libsass/script/ci-build-libsass +3 -3
  10. data/ext/libsass/script/ci-install-compiler +2 -0
  11. data/ext/libsass/script/ci-report-coverage +2 -1
  12. data/ext/libsass/script/test-leaks.pl +103 -0
  13. data/ext/libsass/src/ast.cpp +621 -495
  14. data/ext/libsass/src/ast.hpp +801 -367
  15. data/ext/libsass/src/ast_def_macros.hpp +5 -5
  16. data/ext/libsass/src/ast_fwd_decl.hpp +312 -14
  17. data/ext/libsass/src/bind.cpp +54 -51
  18. data/ext/libsass/src/bind.hpp +3 -7
  19. data/ext/libsass/src/check_nesting.cpp +117 -120
  20. data/ext/libsass/src/check_nesting.hpp +38 -34
  21. data/ext/libsass/src/color_maps.cpp +3 -3
  22. data/ext/libsass/src/color_maps.hpp +3 -3
  23. data/ext/libsass/src/context.cpp +33 -34
  24. data/ext/libsass/src/context.hpp +12 -14
  25. data/ext/libsass/src/cssize.cpp +200 -228
  26. data/ext/libsass/src/cssize.hpp +49 -49
  27. data/ext/libsass/src/debugger.hpp +260 -241
  28. data/ext/libsass/src/emitter.cpp +6 -6
  29. data/ext/libsass/src/emitter.hpp +7 -7
  30. data/ext/libsass/src/environment.cpp +2 -2
  31. data/ext/libsass/src/environment.hpp +0 -2
  32. data/ext/libsass/src/error_handling.cpp +5 -5
  33. data/ext/libsass/src/error_handling.hpp +12 -12
  34. data/ext/libsass/src/eval.cpp +412 -401
  35. data/ext/libsass/src/eval.hpp +61 -62
  36. data/ext/libsass/src/expand.cpp +223 -204
  37. data/ext/libsass/src/expand.hpp +42 -42
  38. data/ext/libsass/src/extend.cpp +198 -201
  39. data/ext/libsass/src/extend.hpp +12 -14
  40. data/ext/libsass/src/file.hpp +4 -5
  41. data/ext/libsass/src/functions.cpp +413 -418
  42. data/ext/libsass/src/functions.hpp +7 -10
  43. data/ext/libsass/src/inspect.cpp +115 -109
  44. data/ext/libsass/src/inspect.hpp +69 -69
  45. data/ext/libsass/src/listize.cpp +31 -33
  46. data/ext/libsass/src/listize.hpp +8 -10
  47. data/ext/libsass/src/memory/SharedPtr.cpp +116 -0
  48. data/ext/libsass/src/memory/SharedPtr.hpp +202 -0
  49. data/ext/libsass/src/node.cpp +45 -43
  50. data/ext/libsass/src/node.hpp +15 -15
  51. data/ext/libsass/src/operation.hpp +136 -136
  52. data/ext/libsass/src/output.cpp +48 -49
  53. data/ext/libsass/src/output.hpp +14 -14
  54. data/ext/libsass/src/parser.cpp +530 -554
  55. data/ext/libsass/src/parser.hpp +91 -96
  56. data/ext/libsass/src/prelexer.cpp +13 -10
  57. data/ext/libsass/src/remove_placeholders.cpp +25 -21
  58. data/ext/libsass/src/remove_placeholders.hpp +7 -7
  59. data/ext/libsass/src/sass2scss.cpp +2 -1
  60. data/ext/libsass/src/sass_context.cpp +125 -107
  61. data/ext/libsass/src/sass_context.hpp +1 -1
  62. data/ext/libsass/src/sass_util.hpp +5 -5
  63. data/ext/libsass/src/sass_values.cpp +27 -27
  64. data/ext/libsass/src/source_map.cpp +2 -2
  65. data/ext/libsass/src/source_map.hpp +2 -2
  66. data/ext/libsass/src/subset_map.cpp +57 -0
  67. data/ext/libsass/src/subset_map.hpp +8 -76
  68. data/ext/libsass/src/to_c.cpp +13 -13
  69. data/ext/libsass/src/to_c.hpp +14 -14
  70. data/ext/libsass/src/to_value.cpp +20 -20
  71. data/ext/libsass/src/to_value.hpp +20 -21
  72. data/ext/libsass/src/util.cpp +55 -88
  73. data/ext/libsass/src/util.hpp +9 -13
  74. data/ext/libsass/src/values.cpp +27 -26
  75. data/ext/libsass/src/values.hpp +2 -2
  76. data/ext/libsass/test/test_subset_map.cpp +69 -69
  77. data/ext/libsass/win/libsass.targets +3 -2
  78. data/ext/libsass/win/libsass.vcxproj.filters +9 -6
  79. data/lib/sassc/version.rb +1 -1
  80. data/sassc.gemspec +0 -1
  81. data/test/native_test.rb +1 -1
  82. metadata +7 -5
  83. data/ext/libsass/src/ast_factory.hpp +0 -92
  84. data/ext/libsass/src/memory_manager.cpp +0 -77
  85. data/ext/libsass/src/memory_manager.hpp +0 -48
@@ -4,23 +4,20 @@
4
4
  #include "listize.hpp"
5
5
  #include "position.hpp"
6
6
  #include "environment.hpp"
7
+ #include "ast_fwd_decl.hpp"
7
8
  #include "sass/functions.h"
8
9
 
9
- #define BUILT_IN(name) Expression*\
10
- name(Env& env, Env& d_env, Context& ctx, Signature sig, ParserState pstate, Backtrace* backtrace, std::vector<CommaSequence_Selector*> selector_stack)
10
+ #define BUILT_IN(name) Expression_Ptr \
11
+ name(Env& env, Env& d_env, Context& ctx, Signature sig, ParserState pstate, Backtrace* backtrace, std::vector<Selector_List_Obj> selector_stack)
11
12
 
12
13
  namespace Sass {
13
- class Context;
14
14
  struct Backtrace;
15
- class AST_Node;
16
- class Expression;
17
- class Definition;
18
- typedef Environment<AST_Node*> Env;
15
+ typedef Environment<AST_Node_Obj> Env;
19
16
  typedef const char* Signature;
20
- typedef Expression* (*Native_Function)(Env&, Env&, Context&, Signature, ParserState, Backtrace*, std::vector<CommaSequence_Selector*>);
17
+ typedef Expression_Ptr (*Native_Function)(Env&, Env&, Context&, Signature, ParserState, Backtrace*, std::vector<Selector_List_Obj>);
21
18
 
22
- Definition* make_native_function(Signature, Native_Function, Context& ctx);
23
- Definition* make_c_function(Sass_Function_Entry c_func, Context& ctx);
19
+ Definition_Ptr make_native_function(Signature, Native_Function, Context& ctx);
20
+ Definition_Ptr make_c_function(Sass_Function_Entry c_func, Context& ctx);
24
21
 
25
22
  std::string function_name(Signature);
26
23
 
@@ -21,7 +21,7 @@ namespace Sass {
21
21
  Inspect::~Inspect() { }
22
22
 
23
23
  // statements
24
- void Inspect::operator()(Block* block)
24
+ void Inspect::operator()(Block_Ptr block)
25
25
  {
26
26
  if (!block->is_root()) {
27
27
  add_open_mapping(block);
@@ -39,19 +39,23 @@ namespace Sass {
39
39
 
40
40
  }
41
41
 
42
- void Inspect::operator()(Ruleset* ruleset)
42
+ void Inspect::operator()(Ruleset_Ptr ruleset)
43
43
  {
44
- ruleset->selector()->perform(this);
45
- ruleset->block()->perform(this);
44
+ if (ruleset->selector()) {
45
+ ruleset->selector()->perform(this);
46
+ }
47
+ if (ruleset->block()) {
48
+ ruleset->block()->perform(this);
49
+ }
46
50
  }
47
51
 
48
- void Inspect::operator()(Keyframe_Rule* rule)
52
+ void Inspect::operator()(Keyframe_Rule_Ptr rule)
49
53
  {
50
- if (rule->selector()) rule->selector()->perform(this);
54
+ if (rule->name()) rule->name()->perform(this);
51
55
  if (rule->block()) rule->block()->perform(this);
52
56
  }
53
57
 
54
- void Inspect::operator()(Bubble* bubble)
58
+ void Inspect::operator()(Bubble_Ptr bubble)
55
59
  {
56
60
  append_indentation();
57
61
  append_token("::BUBBLE", bubble);
@@ -60,7 +64,7 @@ namespace Sass {
60
64
  append_scope_closer();
61
65
  }
62
66
 
63
- void Inspect::operator()(Media_Block* media_block)
67
+ void Inspect::operator()(Media_Block_Ptr media_block)
64
68
  {
65
69
  append_indentation();
66
70
  append_token("@media", media_block);
@@ -71,7 +75,7 @@ namespace Sass {
71
75
  media_block->block()->perform(this);
72
76
  }
73
77
 
74
- void Inspect::operator()(Supports_Block* feature_block)
78
+ void Inspect::operator()(Supports_Block_Ptr feature_block)
75
79
  {
76
80
  append_indentation();
77
81
  append_token("@supports", feature_block);
@@ -80,7 +84,7 @@ namespace Sass {
80
84
  feature_block->block()->perform(this);
81
85
  }
82
86
 
83
- void Inspect::operator()(At_Root_Block* at_root_block)
87
+ void Inspect::operator()(At_Root_Block_Ptr at_root_block)
84
88
  {
85
89
  append_indentation();
86
90
  append_token("@at-root ", at_root_block);
@@ -89,7 +93,7 @@ namespace Sass {
89
93
  at_root_block->block()->perform(this);
90
94
  }
91
95
 
92
- void Inspect::operator()(Directive* at_rule)
96
+ void Inspect::operator()(Directive_Ptr at_rule)
93
97
  {
94
98
  append_indentation();
95
99
  append_token(at_rule->keyword(), at_rule);
@@ -112,7 +116,7 @@ namespace Sass {
112
116
  }
113
117
  }
114
118
 
115
- void Inspect::operator()(Declaration* dec)
119
+ void Inspect::operator()(Declaration_Ptr dec)
116
120
  {
117
121
  if (dec->value()->concrete_type() == Expression::NULL_VAL) return;
118
122
  bool was_decl = in_declaration;
@@ -120,13 +124,14 @@ namespace Sass {
120
124
  if (output_style() == NESTED)
121
125
  indentation += dec->tabs();
122
126
  append_indentation();
123
- dec->property()->perform(this);
127
+ if (dec->property())
128
+ dec->property()->perform(this);
124
129
  append_colon_separator();
125
130
 
126
131
  if (dec->value()->concrete_type() == Expression::SELECTOR) {
127
- Memory_Manager mem;
128
- Listize listize(mem);
129
- dec->value()->perform(&listize)->perform(this);
132
+ Listize listize;
133
+ Expression_Obj ls = dec->value()->perform(&listize);
134
+ ls->perform(this);
130
135
  } else {
131
136
  dec->value()->perform(this);
132
137
  }
@@ -141,7 +146,7 @@ namespace Sass {
141
146
  in_declaration = was_decl;
142
147
  }
143
148
 
144
- void Inspect::operator()(Assignment* assn)
149
+ void Inspect::operator()(Assignment_Ptr assn)
145
150
  {
146
151
  append_token(assn->variable(), assn);
147
152
  append_colon_separator();
@@ -153,7 +158,7 @@ namespace Sass {
153
158
  append_delimiter();
154
159
  }
155
160
 
156
- void Inspect::operator()(Import* import)
161
+ void Inspect::operator()(Import_Ptr import)
157
162
  {
158
163
  if (!import->urls().empty()) {
159
164
  append_token("@import", import);
@@ -161,9 +166,9 @@ namespace Sass {
161
166
 
162
167
  import->urls().front()->perform(this);
163
168
  if (import->urls().size() == 1) {
164
- if (import->media_queries()) {
169
+ if (&import->import_queries()) {
165
170
  append_mandatory_space();
166
- import->media_queries()->perform(this);
171
+ import->import_queries()->perform(this);
167
172
  }
168
173
  }
169
174
  append_delimiter();
@@ -174,9 +179,9 @@ namespace Sass {
174
179
 
175
180
  import->urls()[i]->perform(this);
176
181
  if (import->urls().size() - 1 == i) {
177
- if (import->media_queries()) {
182
+ if (&import->import_queries()) {
178
183
  append_mandatory_space();
179
- import->media_queries()->perform(this);
184
+ import->import_queries()->perform(this);
180
185
  }
181
186
  }
182
187
  append_delimiter();
@@ -184,7 +189,7 @@ namespace Sass {
184
189
  }
185
190
  }
186
191
 
187
- void Inspect::operator()(Import_Stub* import)
192
+ void Inspect::operator()(Import_Stub_Ptr import)
188
193
  {
189
194
  append_indentation();
190
195
  append_token("@import", import);
@@ -193,7 +198,7 @@ namespace Sass {
193
198
  append_delimiter();
194
199
  }
195
200
 
196
- void Inspect::operator()(Warning* warning)
201
+ void Inspect::operator()(Warning_Ptr warning)
197
202
  {
198
203
  append_indentation();
199
204
  append_token("@warn", warning);
@@ -202,7 +207,7 @@ namespace Sass {
202
207
  append_delimiter();
203
208
  }
204
209
 
205
- void Inspect::operator()(Error* error)
210
+ void Inspect::operator()(Error_Ptr error)
206
211
  {
207
212
  append_indentation();
208
213
  append_token("@error", error);
@@ -211,7 +216,7 @@ namespace Sass {
211
216
  append_delimiter();
212
217
  }
213
218
 
214
- void Inspect::operator()(Debug* debug)
219
+ void Inspect::operator()(Debug_Ptr debug)
215
220
  {
216
221
  append_indentation();
217
222
  append_token("@debug", debug);
@@ -220,14 +225,14 @@ namespace Sass {
220
225
  append_delimiter();
221
226
  }
222
227
 
223
- void Inspect::operator()(Comment* comment)
228
+ void Inspect::operator()(Comment_Ptr comment)
224
229
  {
225
230
  in_comment = true;
226
231
  comment->text()->perform(this);
227
232
  in_comment = false;
228
233
  }
229
234
 
230
- void Inspect::operator()(If* cond)
235
+ void Inspect::operator()(If_Ptr cond)
231
236
  {
232
237
  append_indentation();
233
238
  append_token("@if", cond);
@@ -242,7 +247,7 @@ namespace Sass {
242
247
  }
243
248
  }
244
249
 
245
- void Inspect::operator()(For* loop)
250
+ void Inspect::operator()(For_Ptr loop)
246
251
  {
247
252
  append_indentation();
248
253
  append_token("@for", loop);
@@ -255,7 +260,7 @@ namespace Sass {
255
260
  loop->block()->perform(this);
256
261
  }
257
262
 
258
- void Inspect::operator()(Each* loop)
263
+ void Inspect::operator()(Each_Ptr loop)
259
264
  {
260
265
  append_indentation();
261
266
  append_token("@each", loop);
@@ -270,7 +275,7 @@ namespace Sass {
270
275
  loop->block()->perform(this);
271
276
  }
272
277
 
273
- void Inspect::operator()(While* loop)
278
+ void Inspect::operator()(While_Ptr loop)
274
279
  {
275
280
  append_indentation();
276
281
  append_token("@while", loop);
@@ -279,7 +284,7 @@ namespace Sass {
279
284
  loop->block()->perform(this);
280
285
  }
281
286
 
282
- void Inspect::operator()(Return* ret)
287
+ void Inspect::operator()(Return_Ptr ret)
283
288
  {
284
289
  append_indentation();
285
290
  append_token("@return", ret);
@@ -288,7 +293,7 @@ namespace Sass {
288
293
  append_delimiter();
289
294
  }
290
295
 
291
- void Inspect::operator()(Extension* extend)
296
+ void Inspect::operator()(Extension_Ptr extend)
292
297
  {
293
298
  append_indentation();
294
299
  append_token("@extend", extend);
@@ -297,7 +302,7 @@ namespace Sass {
297
302
  append_delimiter();
298
303
  }
299
304
 
300
- void Inspect::operator()(Definition* def)
305
+ void Inspect::operator()(Definition_Ptr def)
301
306
  {
302
307
  append_indentation();
303
308
  if (def->type() == Definition::MIXIN) {
@@ -312,7 +317,7 @@ namespace Sass {
312
317
  def->block()->perform(this);
313
318
  }
314
319
 
315
- void Inspect::operator()(Mixin_Call* call)
320
+ void Inspect::operator()(Mixin_Call_Ptr call)
316
321
  {
317
322
  append_indentation();
318
323
  append_token("@include", call);
@@ -328,14 +333,14 @@ namespace Sass {
328
333
  if (!call->block()) append_delimiter();
329
334
  }
330
335
 
331
- void Inspect::operator()(Content* content)
336
+ void Inspect::operator()(Content_Ptr content)
332
337
  {
333
338
  append_indentation();
334
339
  append_token("@content", content);
335
340
  append_delimiter();
336
341
  }
337
342
 
338
- void Inspect::operator()(Map* map)
343
+ void Inspect::operator()(Map_Ptr map)
339
344
  {
340
345
  if (output_style() == TO_SASS && map->empty()) {
341
346
  append_string("()");
@@ -355,7 +360,7 @@ namespace Sass {
355
360
  append_string(")");
356
361
  }
357
362
 
358
- void Inspect::operator()(List* list)
363
+ void Inspect::operator()(List_Ptr list)
359
364
  {
360
365
  if (output_style() == TO_SASS && list->empty()) {
361
366
  append_string("()");
@@ -373,9 +378,8 @@ namespace Sass {
373
378
  if (output_style() == TO_SASS &&
374
379
  list->length() == 1 &&
375
380
  !list->from_selector() &&
376
- !dynamic_cast<List*>((*list)[0]) &&
377
- !dynamic_cast<List*>((*list)[0]) &&
378
- !dynamic_cast<CommaSequence_Selector*>((*list)[0])) {
381
+ !SASS_MEMORY_CAST(List, list->at(0)) &&
382
+ !SASS_MEMORY_CAST(Selector_List, list->at(0))) {
379
383
  append_string("(");
380
384
  }
381
385
  else if (!in_declaration && (list->separator() == SASS_HASH ||
@@ -391,11 +395,11 @@ namespace Sass {
391
395
  for (size_t i = 0, L = list->size(); i < L; ++i) {
392
396
  if (list->separator() == SASS_HASH)
393
397
  { sep[0] = i % 2 ? ':' : ','; }
394
- Expression* list_item = (*list)[i];
398
+ Expression_Obj list_item = list->at(i);
395
399
  if (output_style() != TO_SASS) {
396
400
  if (list_item->is_invisible()) {
397
401
  // this fixes an issue with "" in a list
398
- if (!dynamic_cast<String_Constant*>(list_item)) {
402
+ if (!SASS_MEMORY_CAST(String_Constant, list_item)) {
399
403
  continue;
400
404
  }
401
405
  }
@@ -415,9 +419,8 @@ namespace Sass {
415
419
  if (output_style() == TO_SASS &&
416
420
  list->length() == 1 &&
417
421
  !list->from_selector() &&
418
- !dynamic_cast<List*>((*list)[0]) &&
419
- !dynamic_cast<List*>((*list)[0]) &&
420
- !dynamic_cast<CommaSequence_Selector*>((*list)[0])) {
422
+ !SASS_MEMORY_CAST(List, list->at(0)) &&
423
+ !SASS_MEMORY_CAST(Selector_List, list->at(0))) {
421
424
  append_string(",)");
422
425
  }
423
426
  else if (!in_declaration && (list->separator() == SASS_HASH ||
@@ -429,7 +432,7 @@ namespace Sass {
429
432
 
430
433
  }
431
434
 
432
- void Inspect::operator()(Binary_Expression* expr)
435
+ void Inspect::operator()(Binary_Expression_Ptr expr)
433
436
  {
434
437
  expr->left()->perform(this);
435
438
  if ( in_media_block ||
@@ -466,36 +469,36 @@ namespace Sass {
466
469
  expr->right()->perform(this);
467
470
  }
468
471
 
469
- void Inspect::operator()(Unary_Expression* expr)
472
+ void Inspect::operator()(Unary_Expression_Ptr expr)
470
473
  {
471
474
  if (expr->type() == Unary_Expression::PLUS) append_string("+");
472
475
  else append_string("-");
473
476
  expr->operand()->perform(this);
474
477
  }
475
478
 
476
- void Inspect::operator()(Function_Call* call)
479
+ void Inspect::operator()(Function_Call_Ptr call)
477
480
  {
478
481
  append_token(call->name(), call);
479
482
  call->arguments()->perform(this);
480
483
  }
481
484
 
482
- void Inspect::operator()(Function_Call_Schema* call)
485
+ void Inspect::operator()(Function_Call_Schema_Ptr call)
483
486
  {
484
487
  call->name()->perform(this);
485
488
  call->arguments()->perform(this);
486
489
  }
487
490
 
488
- void Inspect::operator()(Variable* var)
491
+ void Inspect::operator()(Variable_Ptr var)
489
492
  {
490
493
  append_token(var->name(), var);
491
494
  }
492
495
 
493
- void Inspect::operator()(Textual* txt)
496
+ void Inspect::operator()(Textual_Ptr txt)
494
497
  {
495
498
  append_token(txt->value(), txt);
496
499
  }
497
500
 
498
- void Inspect::operator()(Number* n)
501
+ void Inspect::operator()(Number_Ptr n)
499
502
  {
500
503
 
501
504
  std::string res;
@@ -588,7 +591,7 @@ namespace Sass {
588
591
  else return c;
589
592
  }
590
593
 
591
- void Inspect::operator()(Color* c)
594
+ void Inspect::operator()(Color_Ptr c)
592
595
  {
593
596
  // output the final token
594
597
  std::stringstream ss;
@@ -607,7 +610,7 @@ namespace Sass {
607
610
 
608
611
  // get color from given name (if one was given at all)
609
612
  if (name != "" && name_to_color(name)) {
610
- const Color* n = name_to_color(name);
613
+ Color_Ptr_Const n = name_to_color(name);
611
614
  r = Sass::round(cap_channel<0xff>(n->r()), opt.precision);
612
615
  g = Sass::round(cap_channel<0xff>(n->g()), opt.precision);
613
616
  b = Sass::round(cap_channel<0xff>(n->b()), opt.precision);
@@ -674,13 +677,13 @@ namespace Sass {
674
677
 
675
678
  }
676
679
 
677
- void Inspect::operator()(Boolean* b)
680
+ void Inspect::operator()(Boolean_Ptr b)
678
681
  {
679
682
  // output the final token
680
683
  append_token(b->value() ? "true" : "false", b);
681
684
  }
682
685
 
683
- void Inspect::operator()(String_Schema* ss)
686
+ void Inspect::operator()(String_Schema_Ptr ss)
684
687
  {
685
688
  // Evaluation should turn these into String_Constants,
686
689
  // so this method is only for inspection purposes.
@@ -691,12 +694,12 @@ namespace Sass {
691
694
  }
692
695
  }
693
696
 
694
- void Inspect::operator()(String_Constant* s)
697
+ void Inspect::operator()(String_Constant_Ptr s)
695
698
  {
696
699
  append_token(s->value(), s);
697
700
  }
698
701
 
699
- void Inspect::operator()(String_Quoted* s)
702
+ void Inspect::operator()(String_Quoted_Ptr s)
700
703
  {
701
704
  if (const char q = s->quote_mark()) {
702
705
  append_token(quote(s->value(), q), s);
@@ -705,17 +708,17 @@ namespace Sass {
705
708
  }
706
709
  }
707
710
 
708
- void Inspect::operator()(Custom_Error* e)
711
+ void Inspect::operator()(Custom_Error_Ptr e)
709
712
  {
710
713
  append_token(e->message(), e);
711
714
  }
712
715
 
713
- void Inspect::operator()(Custom_Warning* w)
716
+ void Inspect::operator()(Custom_Warning_Ptr w)
714
717
  {
715
718
  append_token(w->message(), w);
716
719
  }
717
720
 
718
- void Inspect::operator()(Supports_Operator* so)
721
+ void Inspect::operator()(Supports_Operator_Ptr so)
719
722
  {
720
723
 
721
724
  if (so->needs_parens(so->left())) append_string("(");
@@ -737,16 +740,16 @@ namespace Sass {
737
740
  if (so->needs_parens(so->right())) append_string(")");
738
741
  }
739
742
 
740
- void Inspect::operator()(Supports_Negation* sn)
743
+ void Inspect::operator()(Supports_Negation_Ptr sn)
741
744
  {
742
745
  append_token("not", sn);
743
746
  append_mandatory_space();
744
- if (sn->needs_parens(sn->condition())) append_string("(");
747
+ if (sn->needs_parens(&sn->condition())) append_string("(");
745
748
  sn->condition()->perform(this);
746
- if (sn->needs_parens(sn->condition())) append_string(")");
749
+ if (sn->needs_parens(&sn->condition())) append_string(")");
747
750
  }
748
751
 
749
- void Inspect::operator()(Supports_Declaration* sd)
752
+ void Inspect::operator()(Supports_Declaration_Ptr sd)
750
753
  {
751
754
  append_string("(");
752
755
  sd->feature()->perform(this);
@@ -755,15 +758,15 @@ namespace Sass {
755
758
  append_string(")");
756
759
  }
757
760
 
758
- void Inspect::operator()(Supports_Interpolation* sd)
761
+ void Inspect::operator()(Supports_Interpolation_Ptr sd)
759
762
  {
760
763
  sd->value()->perform(this);
761
764
  }
762
765
 
763
- void Inspect::operator()(Media_Query* mq)
766
+ void Inspect::operator()(Media_Query_Ptr mq)
764
767
  {
765
768
  size_t i = 0;
766
- if (mq->media_type()) {
769
+ if (&mq->media_type()) {
767
770
  if (mq->is_negated()) append_string("not ");
768
771
  else if (mq->is_restricted()) append_string("only ");
769
772
  mq->media_type()->perform(this);
@@ -777,7 +780,7 @@ namespace Sass {
777
780
  }
778
781
  }
779
782
 
780
- void Inspect::operator()(Media_Query_Expression* mqe)
783
+ void Inspect::operator()(Media_Query_Expression_Ptr mqe)
781
784
  {
782
785
  if (mqe->is_interpolated()) {
783
786
  mqe->feature()->perform(this);
@@ -793,7 +796,7 @@ namespace Sass {
793
796
  }
794
797
  }
795
798
 
796
- void Inspect::operator()(At_Root_Query* ae)
799
+ void Inspect::operator()(At_Root_Query_Ptr ae)
797
800
  {
798
801
  append_string("(");
799
802
  ae->feature()->perform(this);
@@ -804,14 +807,14 @@ namespace Sass {
804
807
  append_string(")");
805
808
  }
806
809
 
807
- void Inspect::operator()(Null* n)
810
+ void Inspect::operator()(Null_Ptr n)
808
811
  {
809
812
  // output the final token
810
813
  append_token("null", n);
811
814
  }
812
815
 
813
816
  // parameters and arguments
814
- void Inspect::operator()(Parameter* p)
817
+ void Inspect::operator()(Parameter_Ptr p)
815
818
  {
816
819
  append_token(p->name(), p);
817
820
  if (p->default_value()) {
@@ -823,7 +826,7 @@ namespace Sass {
823
826
  }
824
827
  }
825
828
 
826
- void Inspect::operator()(Parameters* p)
829
+ void Inspect::operator()(Parameters_Ptr p)
827
830
  {
828
831
  append_string("(");
829
832
  if (!p->empty()) {
@@ -836,26 +839,29 @@ namespace Sass {
836
839
  append_string(")");
837
840
  }
838
841
 
839
- void Inspect::operator()(Argument* a)
842
+ void Inspect::operator()(Argument_Ptr a)
840
843
  {
841
844
  if (!a->name().empty()) {
842
845
  append_token(a->name(), a);
843
846
  append_colon_separator();
844
847
  }
848
+ if (!a->value()) return;
845
849
  // Special case: argument nulls can be ignored
846
850
  if (a->value()->concrete_type() == Expression::NULL_VAL) {
847
851
  return;
848
852
  }
849
853
  if (a->value()->concrete_type() == Expression::STRING) {
850
- String_Constant* s = static_cast<String_Constant*>(a->value());
851
- s->perform(this);
852
- } else a->value()->perform(this);
854
+ String_Constant_Ptr s = SASS_MEMORY_CAST(String_Constant, a->value());
855
+ if (s) s->perform(this);
856
+ } else {
857
+ a->value()->perform(this);
858
+ }
853
859
  if (a->is_rest_argument()) {
854
860
  append_string("...");
855
861
  }
856
862
  }
857
863
 
858
- void Inspect::operator()(Arguments* a)
864
+ void Inspect::operator()(Arguments_Ptr a)
859
865
  {
860
866
  append_string("(");
861
867
  if (!a->empty()) {
@@ -869,17 +875,17 @@ namespace Sass {
869
875
  append_string(")");
870
876
  }
871
877
 
872
- void Inspect::operator()(Selector_Schema* s)
878
+ void Inspect::operator()(Selector_Schema_Ptr s)
873
879
  {
874
880
  s->contents()->perform(this);
875
881
  }
876
882
 
877
- void Inspect::operator()(Parent_Selector* p)
883
+ void Inspect::operator()(Parent_Selector_Ptr p)
878
884
  {
879
885
  if (p->is_real_parent_ref()) append_string("&");
880
886
  }
881
887
 
882
- void Inspect::operator()(Placeholder_Selector* s)
888
+ void Inspect::operator()(Placeholder_Selector_Ptr s)
883
889
  {
884
890
  append_token(s->name(), s);
885
891
  if (s->has_line_break()) append_optional_linefeed();
@@ -887,33 +893,33 @@ namespace Sass {
887
893
 
888
894
  }
889
895
 
890
- void Inspect::operator()(Element_Selector* s)
896
+ void Inspect::operator()(Element_Selector_Ptr s)
891
897
  {
892
898
  append_token(s->ns_name(), s);
893
899
  }
894
900
 
895
- void Inspect::operator()(Class_Selector* s)
901
+ void Inspect::operator()(Class_Selector_Ptr s)
896
902
  {
897
903
  append_token(s->ns_name(), s);
898
904
  if (s->has_line_break()) append_optional_linefeed();
899
905
  if (s->has_line_break()) append_indentation();
900
906
  }
901
907
 
902
- void Inspect::operator()(Id_Selector* s)
908
+ void Inspect::operator()(Id_Selector_Ptr s)
903
909
  {
904
910
  append_token(s->ns_name(), s);
905
911
  if (s->has_line_break()) append_optional_linefeed();
906
912
  if (s->has_line_break()) append_indentation();
907
913
  }
908
914
 
909
- void Inspect::operator()(Attribute_Selector* s)
915
+ void Inspect::operator()(Attribute_Selector_Ptr s)
910
916
  {
911
917
  append_string("[");
912
918
  add_open_mapping(s);
913
919
  append_token(s->ns_name(), s);
914
920
  if (!s->matcher().empty()) {
915
921
  append_string(s->matcher());
916
- if (s->value()) {
922
+ if (&s->value() && *s->value()) {
917
923
  s->value()->perform(this);
918
924
  }
919
925
  }
@@ -921,7 +927,7 @@ namespace Sass {
921
927
  append_string("]");
922
928
  }
923
929
 
924
- void Inspect::operator()(Pseudo_Selector* s)
930
+ void Inspect::operator()(Pseudo_Selector_Ptr s)
925
931
  {
926
932
  append_token(s->ns_name(), s);
927
933
  if (s->expression()) {
@@ -931,7 +937,7 @@ namespace Sass {
931
937
  }
932
938
  }
933
939
 
934
- void Inspect::operator()(Wrapped_Selector* s)
940
+ void Inspect::operator()(Wrapped_Selector_Ptr s)
935
941
  {
936
942
  bool was = in_wrapped;
937
943
  in_wrapped = true;
@@ -945,7 +951,7 @@ namespace Sass {
945
951
  in_wrapped = was;
946
952
  }
947
953
 
948
- void Inspect::operator()(SimpleSequence_Selector* s)
954
+ void Inspect::operator()(Compound_Selector_Ptr s)
949
955
  {
950
956
  for (size_t i = 0, L = s->length(); i < L; ++i) {
951
957
  (*s)[i]->perform(this);
@@ -957,13 +963,13 @@ namespace Sass {
957
963
  }
958
964
  }
959
965
 
960
- void Inspect::operator()(Sequence_Selector* c)
966
+ void Inspect::operator()(Complex_Selector_Ptr c)
961
967
  {
962
- SimpleSequence_Selector* head = c->head();
963
- Sequence_Selector* tail = c->tail();
964
- Sequence_Selector::Combinator comb = c->combinator();
968
+ Compound_Selector_Obj head = c->head();
969
+ Complex_Selector_Obj tail = c->tail();
970
+ Complex_Selector::Combinator comb = c->combinator();
965
971
 
966
- if (comb == Sequence_Selector::ANCESTOR_OF && (!head || head->empty())) {
972
+ if (comb == Complex_Selector::ANCESTOR_OF && (!head || head->empty())) {
967
973
  if (tail) tail->perform(this);
968
974
  return;
969
975
  }
@@ -978,30 +984,30 @@ namespace Sass {
978
984
  if (head && head->length() != 0) head->perform(this);
979
985
  bool is_empty = !head || head->length() == 0 || head->is_empty_reference();
980
986
  bool is_tail = head && !head->is_empty_reference() && tail;
981
- if (output_style() == COMPRESSED && comb != Sequence_Selector::ANCESTOR_OF) scheduled_space = 0;
987
+ if (output_style() == COMPRESSED && comb != Complex_Selector::ANCESTOR_OF) scheduled_space = 0;
982
988
 
983
989
  switch (comb) {
984
- case Sequence_Selector::ANCESTOR_OF:
990
+ case Complex_Selector::ANCESTOR_OF:
985
991
  if (is_tail) append_mandatory_space();
986
992
  break;
987
- case Sequence_Selector::PARENT_OF:
993
+ case Complex_Selector::PARENT_OF:
988
994
  append_optional_space();
989
995
  append_string(">");
990
996
  append_optional_space();
991
997
  break;
992
- case Sequence_Selector::ADJACENT_TO:
998
+ case Complex_Selector::ADJACENT_TO:
993
999
  append_optional_space();
994
1000
  append_string("+");
995
1001
  append_optional_space();
996
1002
  break;
997
- case Sequence_Selector::REFERENCE:
1003
+ case Complex_Selector::REFERENCE:
998
1004
  append_mandatory_space();
999
1005
  append_string("/");
1000
1006
  c->reference()->perform(this);
1001
1007
  append_string("/");
1002
1008
  append_mandatory_space();
1003
1009
  break;
1004
- case Sequence_Selector::PRECEDES:
1010
+ case Complex_Selector::PRECEDES:
1005
1011
  if (is_empty) append_optional_space();
1006
1012
  else append_mandatory_space();
1007
1013
  append_string("~");
@@ -1009,7 +1015,7 @@ namespace Sass {
1009
1015
  else append_optional_space();
1010
1016
  break;
1011
1017
  }
1012
- if (tail && comb != Sequence_Selector::ANCESTOR_OF) {
1018
+ if (tail && comb != Complex_Selector::ANCESTOR_OF) {
1013
1019
  if (c->has_line_break()) append_optional_linefeed();
1014
1020
  }
1015
1021
  if (tail) tail->perform(this);
@@ -1020,7 +1026,7 @@ namespace Sass {
1020
1026
  }
1021
1027
  }
1022
1028
 
1023
- void Inspect::operator()(CommaSequence_Selector* g)
1029
+ void Inspect::operator()(Selector_List_Ptr g)
1024
1030
  {
1025
1031
 
1026
1032
  if (g->empty()) {
@@ -1034,8 +1040,8 @@ namespace Sass {
1034
1040
  bool was_comma_array = in_comma_array;
1035
1041
  // probably ruby sass eqivalent of element_needs_parens
1036
1042
  if (output_style() == TO_SASS && g->length() == 1 &&
1037
- (!dynamic_cast<List*>((*g)[0]) &&
1038
- !dynamic_cast<CommaSequence_Selector*>((*g)[0]))) {
1043
+ (!SASS_MEMORY_CAST(List, (*g)[0]) &&
1044
+ !SASS_MEMORY_CAST(Selector_List, (*g)[0]))) {
1039
1045
  append_string("(");
1040
1046
  }
1041
1047
  else if (!in_declaration && in_comma_array) {
@@ -1047,7 +1053,7 @@ namespace Sass {
1047
1053
  for (size_t i = 0, L = g->length(); i < L; ++i) {
1048
1054
  if (!in_wrapped && i == 0) append_indentation();
1049
1055
  if ((*g)[i] == 0) continue;
1050
- schedule_mapping((*g)[i]->last());
1056
+ schedule_mapping(&g->at(i)->last());
1051
1057
  // add_open_mapping((*g)[i]->last());
1052
1058
  (*g)[i]->perform(this);
1053
1059
  // add_close_mapping((*g)[i]->last());
@@ -1060,8 +1066,8 @@ namespace Sass {
1060
1066
  in_comma_array = was_comma_array;
1061
1067
  // probably ruby sass eqivalent of element_needs_parens
1062
1068
  if (output_style() == TO_SASS && g->length() == 1 &&
1063
- (!dynamic_cast<List*>((*g)[0]) &&
1064
- !dynamic_cast<CommaSequence_Selector*>((*g)[0]))) {
1069
+ (!SASS_MEMORY_CAST(List, (*g)[0]) &&
1070
+ !SASS_MEMORY_CAST(Selector_List, (*g)[0]))) {
1065
1071
  append_string(",)");
1066
1072
  }
1067
1073
  else if (!in_declaration && in_comma_array) {
@@ -1070,7 +1076,7 @@ namespace Sass {
1070
1076
 
1071
1077
  }
1072
1078
 
1073
- void Inspect::fallback_impl(AST_Node* n)
1079
+ void Inspect::fallback_impl(AST_Node_Ptr n)
1074
1080
  {
1075
1081
  }
1076
1082