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
@@ -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