sassc 1.11.4 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +2 -2
  3. data/CODE_OF_CONDUCT.md +10 -0
  4. data/README.md +4 -1
  5. data/ext/libsass/.editorconfig +1 -1
  6. data/ext/libsass/.github/CONTRIBUTING.md +7 -7
  7. data/ext/libsass/.github/ISSUE_TEMPLATE.md +31 -6
  8. data/ext/libsass/.gitignore +3 -0
  9. data/ext/libsass/.travis.yml +37 -18
  10. data/ext/libsass/GNUmakefile.am +23 -37
  11. data/ext/libsass/Makefile +10 -6
  12. data/ext/libsass/Makefile.conf +3 -0
  13. data/ext/libsass/Readme.md +68 -63
  14. data/ext/libsass/appveyor.yml +7 -3
  15. data/ext/libsass/configure.ac +10 -14
  16. data/ext/libsass/docs/api-context-internal.md +29 -21
  17. data/ext/libsass/docs/api-context.md +26 -6
  18. data/ext/libsass/docs/api-doc.md +49 -16
  19. data/ext/libsass/docs/api-function-example.md +1 -1
  20. data/ext/libsass/docs/api-function.md +31 -7
  21. data/ext/libsass/docs/api-importer.md +19 -19
  22. data/ext/libsass/docs/api-value.md +4 -2
  23. data/ext/libsass/docs/build-on-windows.md +4 -4
  24. data/ext/libsass/docs/build-with-mingw.md +3 -3
  25. data/ext/libsass/docs/build.md +9 -9
  26. data/ext/libsass/docs/custom-functions-internal.md +10 -8
  27. data/ext/libsass/docs/implementations.md +20 -8
  28. data/ext/libsass/docs/unicode.md +16 -10
  29. data/ext/libsass/include/sass/base.h +0 -3
  30. data/ext/libsass/include/sass/context.h +20 -2
  31. data/ext/libsass/include/sass/functions.h +31 -0
  32. data/ext/libsass/include/sass/values.h +3 -1
  33. data/ext/libsass/include/sass/version.h +1 -1
  34. data/ext/libsass/include/sass/version.h.in +1 -1
  35. data/ext/libsass/include/sass2scss.h +1 -1
  36. data/ext/libsass/res/resource.rc +6 -6
  37. data/ext/libsass/script/ci-build-libsass +10 -5
  38. data/ext/libsass/script/ci-build-plugin +62 -0
  39. data/ext/libsass/script/ci-install-compiler +1 -1
  40. data/ext/libsass/script/ci-install-deps +4 -7
  41. data/ext/libsass/script/ci-report-coverage +13 -3
  42. data/ext/libsass/script/tap-driver +1 -1
  43. data/ext/libsass/script/tap-runner +1 -1
  44. data/ext/libsass/src/GNUmakefile.am +1 -1
  45. data/ext/libsass/src/ast.cpp +537 -762
  46. data/ext/libsass/src/ast.hpp +377 -419
  47. data/ext/libsass/src/ast_def_macros.hpp +26 -1
  48. data/ext/libsass/src/ast_fwd_decl.cpp +29 -0
  49. data/ext/libsass/src/ast_fwd_decl.hpp +94 -21
  50. data/ext/libsass/src/b64/encode.h +3 -1
  51. data/ext/libsass/src/backtrace.cpp +46 -0
  52. data/ext/libsass/src/backtrace.hpp +7 -54
  53. data/ext/libsass/src/bind.cpp +72 -50
  54. data/ext/libsass/src/bind.hpp +0 -1
  55. data/ext/libsass/src/cencode.c +6 -0
  56. data/ext/libsass/src/check_nesting.cpp +157 -135
  57. data/ext/libsass/src/check_nesting.hpp +11 -10
  58. data/ext/libsass/src/color_maps.cpp +10 -6
  59. data/ext/libsass/src/color_maps.hpp +6 -8
  60. data/ext/libsass/src/constants.cpp +4 -3
  61. data/ext/libsass/src/constants.hpp +4 -3
  62. data/ext/libsass/src/context.cpp +110 -47
  63. data/ext/libsass/src/context.hpp +11 -1
  64. data/ext/libsass/src/cssize.cpp +105 -94
  65. data/ext/libsass/src/cssize.hpp +4 -5
  66. data/ext/libsass/src/debugger.hpp +247 -244
  67. data/ext/libsass/src/emitter.cpp +30 -6
  68. data/ext/libsass/src/emitter.hpp +7 -0
  69. data/ext/libsass/src/environment.cpp +67 -16
  70. data/ext/libsass/src/environment.hpp +28 -7
  71. data/ext/libsass/src/error_handling.cpp +92 -64
  72. data/ext/libsass/src/error_handling.hpp +64 -43
  73. data/ext/libsass/src/eval.cpp +494 -544
  74. data/ext/libsass/src/eval.hpp +17 -23
  75. data/ext/libsass/src/expand.cpp +182 -154
  76. data/ext/libsass/src/expand.hpp +4 -5
  77. data/ext/libsass/src/extend.cpp +299 -291
  78. data/ext/libsass/src/extend.hpp +46 -11
  79. data/ext/libsass/src/file.cpp +103 -36
  80. data/ext/libsass/src/file.hpp +21 -4
  81. data/ext/libsass/src/functions.cpp +561 -312
  82. data/ext/libsass/src/functions.hpp +8 -5
  83. data/ext/libsass/src/inspect.cpp +108 -53
  84. data/ext/libsass/src/inspect.hpp +5 -2
  85. data/ext/libsass/src/lexer.cpp +15 -7
  86. data/ext/libsass/src/lexer.hpp +13 -4
  87. data/ext/libsass/src/listize.cpp +3 -2
  88. data/ext/libsass/src/listize.hpp +0 -1
  89. data/ext/libsass/src/memory/SharedPtr.cpp +16 -18
  90. data/ext/libsass/src/memory/SharedPtr.hpp +47 -43
  91. data/ext/libsass/src/node.cpp +34 -38
  92. data/ext/libsass/src/node.hpp +6 -8
  93. data/ext/libsass/src/operation.hpp +2 -2
  94. data/ext/libsass/src/operators.cpp +240 -0
  95. data/ext/libsass/src/operators.hpp +30 -0
  96. data/ext/libsass/src/output.cpp +22 -20
  97. data/ext/libsass/src/parser.cpp +719 -358
  98. data/ext/libsass/src/parser.hpp +57 -22
  99. data/ext/libsass/src/plugins.cpp +28 -10
  100. data/ext/libsass/src/position.cpp +21 -3
  101. data/ext/libsass/src/position.hpp +2 -1
  102. data/ext/libsass/src/prelexer.cpp +104 -19
  103. data/ext/libsass/src/prelexer.hpp +10 -3
  104. data/ext/libsass/src/remove_placeholders.cpp +9 -10
  105. data/ext/libsass/src/remove_placeholders.hpp +1 -5
  106. data/ext/libsass/src/sass.cpp +62 -4
  107. data/ext/libsass/src/sass.hpp +5 -2
  108. data/ext/libsass/src/sass_context.cpp +96 -58
  109. data/ext/libsass/src/sass_context.hpp +7 -5
  110. data/ext/libsass/src/sass_functions.cpp +63 -1
  111. data/ext/libsass/src/sass_functions.hpp +19 -1
  112. data/ext/libsass/src/sass_util.cpp +3 -3
  113. data/ext/libsass/src/sass_util.hpp +4 -4
  114. data/ext/libsass/src/sass_values.cpp +42 -39
  115. data/ext/libsass/src/sass_values.hpp +2 -1
  116. data/ext/libsass/src/source_map.cpp +16 -18
  117. data/ext/libsass/src/subset_map.cpp +6 -8
  118. data/ext/libsass/src/subset_map.hpp +6 -6
  119. data/ext/libsass/src/to_c.cpp +2 -2
  120. data/ext/libsass/src/to_value.cpp +8 -3
  121. data/ext/libsass/src/to_value.hpp +1 -0
  122. data/ext/libsass/src/units.cpp +349 -45
  123. data/ext/libsass/src/units.hpp +39 -22
  124. data/ext/libsass/src/utf8/checked.h +7 -0
  125. data/ext/libsass/src/utf8/unchecked.h +7 -0
  126. data/ext/libsass/src/utf8_string.cpp +1 -1
  127. data/ext/libsass/src/util.cpp +139 -45
  128. data/ext/libsass/src/util.hpp +4 -7
  129. data/ext/libsass/src/values.cpp +15 -23
  130. data/ext/libsass/win/libsass.sln +13 -2
  131. data/ext/libsass/win/libsass.sln.DotSettings +9 -0
  132. data/ext/libsass/win/libsass.targets +3 -0
  133. data/ext/libsass/win/libsass.vcxproj.filters +9 -0
  134. data/lib/sassc/version.rb +1 -1
  135. data/sassc.gemspec +1 -1
  136. data/test/native_test.rb +1 -1
  137. metadata +11 -4
@@ -8,13 +8,12 @@
8
8
  #include "sass/functions.h"
9
9
 
10
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
+ name(Env& env, Env& d_env, Context& ctx, Signature sig, ParserState pstate, Backtraces traces, std::vector<Selector_List_Obj> selector_stack)
12
12
 
13
13
  namespace Sass {
14
14
  struct Backtrace;
15
- typedef Environment<AST_Node_Obj> Env;
16
15
  typedef const char* Signature;
17
- typedef Expression_Ptr (*Native_Function)(Env&, Env&, Context&, Signature, ParserState, Backtrace*, std::vector<Selector_List_Obj>);
16
+ typedef Expression_Ptr (*Native_Function)(Env&, Env&, Context&, Signature, ParserState, Backtraces, std::vector<Selector_List_Obj>);
18
17
 
19
18
  Definition_Ptr make_native_function(Signature, Native_Function, Context& ctx);
20
19
  Definition_Ptr make_c_function(Sass_Function_Entry c_func, Context& ctx);
@@ -89,7 +88,6 @@ namespace Sass {
89
88
  extern Signature call_sig;
90
89
  extern Signature not_sig;
91
90
  extern Signature if_sig;
92
- extern Signature image_url_sig;
93
91
  extern Signature map_get_sig;
94
92
  extern Signature map_merge_sig;
95
93
  extern Signature map_remove_sig;
@@ -107,6 +105,9 @@ namespace Sass {
107
105
  extern Signature is_superselector_sig;
108
106
  extern Signature simple_selectors_sig;
109
107
  extern Signature selector_parse_sig;
108
+ extern Signature is_bracketed_sig;
109
+ extern Signature content_exists_sig;
110
+ extern Signature get_function_sig;
110
111
 
111
112
  BUILT_IN(rgb);
112
113
  BUILT_IN(rgba_4);
@@ -171,7 +172,6 @@ namespace Sass {
171
172
  BUILT_IN(call);
172
173
  BUILT_IN(sass_not);
173
174
  BUILT_IN(sass_if);
174
- BUILT_IN(image_url);
175
175
  BUILT_IN(map_get);
176
176
  BUILT_IN(map_merge);
177
177
  BUILT_IN(map_remove);
@@ -189,6 +189,9 @@ namespace Sass {
189
189
  BUILT_IN(is_superselector);
190
190
  BUILT_IN(simple_selectors);
191
191
  BUILT_IN(selector_parse);
192
+ BUILT_IN(is_bracketed);
193
+ BUILT_IN(content_exists);
194
+ BUILT_IN(get_function);
192
195
  }
193
196
  }
194
197
 
@@ -15,7 +15,7 @@
15
15
 
16
16
  namespace Sass {
17
17
 
18
- Inspect::Inspect(Emitter emi)
18
+ Inspect::Inspect(const Emitter& emi)
19
19
  : Emitter(emi)
20
20
  { }
21
21
  Inspect::~Inspect() { }
@@ -42,7 +42,9 @@ namespace Sass {
42
42
  void Inspect::operator()(Ruleset_Ptr ruleset)
43
43
  {
44
44
  if (ruleset->selector()) {
45
+ opt.in_selector = true;
45
46
  ruleset->selector()->perform(this);
47
+ opt.in_selector = false;
46
48
  }
47
49
  if (ruleset->block()) {
48
50
  ruleset->block()->perform(this);
@@ -90,7 +92,7 @@ namespace Sass {
90
92
  append_token("@at-root ", at_root_block);
91
93
  append_mandatory_space();
92
94
  if(at_root_block->expression()) at_root_block->expression()->perform(this);
93
- at_root_block->block()->perform(this);
95
+ if(at_root_block->block()) at_root_block->block()->perform(this);
94
96
  }
95
97
 
96
98
  void Inspect::operator()(Directive_Ptr at_rule)
@@ -121,6 +123,8 @@ namespace Sass {
121
123
  if (dec->value()->concrete_type() == Expression::NULL_VAL) return;
122
124
  bool was_decl = in_declaration;
123
125
  in_declaration = true;
126
+ LOCAL_FLAG(in_custom_property, dec->is_custom_property());
127
+
124
128
  if (output_style() == NESTED)
125
129
  indentation += dec->tabs();
126
130
  append_indentation();
@@ -166,7 +170,7 @@ namespace Sass {
166
170
 
167
171
  import->urls().front()->perform(this);
168
172
  if (import->urls().size() == 1) {
169
- if (&import->import_queries()) {
173
+ if (import->import_queries()) {
170
174
  append_mandatory_space();
171
175
  import->import_queries()->perform(this);
172
176
  }
@@ -179,7 +183,7 @@ namespace Sass {
179
183
 
180
184
  import->urls()[i]->perform(this);
181
185
  if (import->urls().size() - 1 == i) {
182
- if (&import->import_queries()) {
186
+ if (import->import_queries()) {
183
187
  append_mandatory_space();
184
188
  import->import_queries()->perform(this);
185
189
  }
@@ -354,16 +358,27 @@ namespace Sass {
354
358
  if (items_output) append_comma_separator();
355
359
  key->perform(this);
356
360
  append_colon_separator();
361
+ LOCAL_FLAG(in_space_array, true);
362
+ LOCAL_FLAG(in_comma_array, true);
357
363
  map->at(key)->perform(this);
358
364
  items_output = true;
359
365
  }
360
366
  append_string(")");
361
367
  }
362
368
 
369
+ std::string Inspect::lbracket(List_Ptr list) {
370
+ return list->is_bracketed() ? "[" : "(";
371
+ }
372
+
373
+ std::string Inspect::rbracket(List_Ptr list) {
374
+ return list->is_bracketed() ? "]" : ")";
375
+ }
376
+
363
377
  void Inspect::operator()(List_Ptr list)
364
378
  {
365
- if (output_style() == TO_SASS && list->empty()) {
366
- append_string("()");
379
+ if (list->empty() && (output_style() == TO_SASS || list->is_bracketed())) {
380
+ append_string(lbracket(list));
381
+ append_string(rbracket(list));
367
382
  return;
368
383
  }
369
384
  std::string sep(list->separator() == SASS_SPACE ? " " : ",");
@@ -374,19 +389,24 @@ namespace Sass {
374
389
 
375
390
  bool was_space_array = in_space_array;
376
391
  bool was_comma_array = in_comma_array;
392
+ // if the list is bracketed, always include the left bracket
393
+ if (list->is_bracketed()) {
394
+ append_string(lbracket(list));
395
+ }
377
396
  // probably ruby sass eqivalent of element_needs_parens
378
- if (output_style() == TO_SASS &&
397
+ else if (output_style() == TO_SASS &&
379
398
  list->length() == 1 &&
380
399
  !list->from_selector() &&
381
- !SASS_MEMORY_CAST(List, list->at(0)) &&
382
- !SASS_MEMORY_CAST(Selector_List, list->at(0))) {
383
- append_string("(");
400
+ !Cast<List>(list->at(0)) &&
401
+ !Cast<Selector_List>(list->at(0))
402
+ ) {
403
+ append_string(lbracket(list));
384
404
  }
385
405
  else if (!in_declaration && (list->separator() == SASS_HASH ||
386
406
  (list->separator() == SASS_SPACE && in_space_array) ||
387
407
  (list->separator() == SASS_COMMA && in_comma_array)
388
408
  )) {
389
- append_string("(");
409
+ append_string(lbracket(list));
390
410
  }
391
411
 
392
412
  if (list->separator() == SASS_SPACE) in_space_array = true;
@@ -399,7 +419,7 @@ namespace Sass {
399
419
  if (output_style() != TO_SASS) {
400
420
  if (list_item->is_invisible()) {
401
421
  // this fixes an issue with "" in a list
402
- if (!SASS_MEMORY_CAST(String_Constant, list_item)) {
422
+ if (!Cast<String_Constant>(list_item)) {
403
423
  continue;
404
424
  }
405
425
  }
@@ -415,19 +435,29 @@ namespace Sass {
415
435
 
416
436
  in_comma_array = was_comma_array;
417
437
  in_space_array = was_space_array;
438
+
439
+ // if the list is bracketed, always include the right bracket
440
+ if (list->is_bracketed()) {
441
+ if (list->separator() == SASS_COMMA && list->size() == 1) {
442
+ append_string(",");
443
+ }
444
+ append_string(rbracket(list));
445
+ }
418
446
  // probably ruby sass eqivalent of element_needs_parens
419
- if (output_style() == TO_SASS &&
447
+ else if (output_style() == TO_SASS &&
420
448
  list->length() == 1 &&
421
449
  !list->from_selector() &&
422
- !SASS_MEMORY_CAST(List, list->at(0)) &&
423
- !SASS_MEMORY_CAST(Selector_List, list->at(0))) {
424
- append_string(",)");
450
+ !Cast<List>(list->at(0)) &&
451
+ !Cast<Selector_List>(list->at(0))
452
+ ) {
453
+ append_string(",");
454
+ append_string(rbracket(list));
425
455
  }
426
456
  else if (!in_declaration && (list->separator() == SASS_HASH ||
427
457
  (list->separator() == SASS_SPACE && in_space_array) ||
428
458
  (list->separator() == SASS_COMMA && in_comma_array)
429
459
  )) {
430
- append_string(")");
460
+ append_string(rbracket(list));
431
461
  }
432
462
 
433
463
  }
@@ -443,7 +473,7 @@ namespace Sass {
443
473
  expr->is_right_interpolant())
444
474
 
445
475
  )) append_string(" ");
446
- switch (expr->type()) {
476
+ switch (expr->optype()) {
447
477
  case Sass_OP::AND: append_string("&&"); break;
448
478
  case Sass_OP::OR: append_string("||"); break;
449
479
  case Sass_OP::EQ: append_string("=="); break;
@@ -471,8 +501,9 @@ namespace Sass {
471
501
 
472
502
  void Inspect::operator()(Unary_Expression_Ptr expr)
473
503
  {
474
- if (expr->type() == Unary_Expression::PLUS) append_string("+");
475
- else append_string("-");
504
+ if (expr->optype() == Unary_Expression::PLUS) append_string("+");
505
+ else if (expr->optype() == Unary_Expression::SLASH) append_string("/");
506
+ else append_string("-");
476
507
  expr->operand()->perform(this);
477
508
  }
478
509
 
@@ -493,16 +524,14 @@ namespace Sass {
493
524
  append_token(var->name(), var);
494
525
  }
495
526
 
496
- void Inspect::operator()(Textual_Ptr txt)
497
- {
498
- append_token(txt->value(), txt);
499
- }
500
-
501
527
  void Inspect::operator()(Number_Ptr n)
502
528
  {
503
529
 
504
530
  std::string res;
505
531
 
532
+ // reduce units
533
+ n->reduce();
534
+
506
535
  // check if the fractional part of the value equals to zero
507
536
  // neat trick from http://stackoverflow.com/a/1521682/1550314
508
537
  // double int_part; bool is_int = modf(value, &int_part) == 0.0;
@@ -600,6 +629,11 @@ namespace Sass {
600
629
  // maybe an unknown token
601
630
  std::string name = c->disp();
602
631
 
632
+ if (opt.in_selector && name != "") {
633
+ append_token(name, c);
634
+ return;
635
+ }
636
+
603
637
  // resolved color
604
638
  std::string res_name = name;
605
639
 
@@ -624,6 +658,9 @@ namespace Sass {
624
658
  }
625
659
 
626
660
  std::stringstream hexlet;
661
+ // dart sass compressed all colors in regular css always
662
+ // ruby sass and libsass does it only when not delayed
663
+ // since color math is going to be removed, this can go too
627
664
  bool compressed = opt.output_style == COMPRESSED;
628
665
  hexlet << '#' << std::setw(1) << std::setfill('0');
629
666
  // create a short color hexlet if there is any need for it
@@ -647,9 +684,6 @@ namespace Sass {
647
684
  if (name != "") {
648
685
  ss << name;
649
686
  }
650
- else if (r == 0 && g == 0 && b == 0 && a == 0) {
651
- ss << "transparent";
652
- }
653
687
  else if (a >= 1) {
654
688
  if (res_name != "") {
655
689
  if (compressed && hexlet.str().size() < res_name.size()) {
@@ -744,9 +778,9 @@ namespace Sass {
744
778
  {
745
779
  append_token("not", sn);
746
780
  append_mandatory_space();
747
- if (sn->needs_parens(&sn->condition())) append_string("(");
781
+ if (sn->needs_parens(sn->condition())) append_string("(");
748
782
  sn->condition()->perform(this);
749
- if (sn->needs_parens(&sn->condition())) append_string(")");
783
+ if (sn->needs_parens(sn->condition())) append_string(")");
750
784
  }
751
785
 
752
786
  void Inspect::operator()(Supports_Declaration_Ptr sd)
@@ -766,7 +800,7 @@ namespace Sass {
766
800
  void Inspect::operator()(Media_Query_Ptr mq)
767
801
  {
768
802
  size_t i = 0;
769
- if (&mq->media_type()) {
803
+ if (mq->media_type()) {
770
804
  if (mq->is_negated()) append_string("not ");
771
805
  else if (mq->is_restricted()) append_string("only ");
772
806
  mq->media_type()->perform(this);
@@ -798,12 +832,22 @@ namespace Sass {
798
832
 
799
833
  void Inspect::operator()(At_Root_Query_Ptr ae)
800
834
  {
801
- append_string("(");
802
- ae->feature()->perform(this);
803
- if (ae->value()) {
804
- append_colon_separator();
805
- ae->value()->perform(this);
835
+ if (ae->feature()) {
836
+ append_string("(");
837
+ ae->feature()->perform(this);
838
+ if (ae->value()) {
839
+ append_colon_separator();
840
+ ae->value()->perform(this);
841
+ }
842
+ append_string(")");
806
843
  }
844
+ }
845
+
846
+ void Inspect::operator()(Function_Ptr f)
847
+ {
848
+ append_token("get-function", f);
849
+ append_string("(");
850
+ append_string(quote(f->name()));
807
851
  append_string(")");
808
852
  }
809
853
 
@@ -851,7 +895,7 @@ namespace Sass {
851
895
  return;
852
896
  }
853
897
  if (a->value()->concrete_type() == Expression::STRING) {
854
- String_Constant_Ptr s = SASS_MEMORY_CAST(String_Constant, a->value());
898
+ String_Constant_Ptr s = Cast<String_Constant>(a->value());
855
899
  if (s) s->perform(this);
856
900
  } else {
857
901
  a->value()->perform(this);
@@ -877,7 +921,9 @@ namespace Sass {
877
921
 
878
922
  void Inspect::operator()(Selector_Schema_Ptr s)
879
923
  {
924
+ opt.in_selector = true;
880
925
  s->contents()->perform(this);
926
+ opt.in_selector = false;
881
927
  }
882
928
 
883
929
  void Inspect::operator()(Parent_Selector_Ptr p)
@@ -919,11 +965,15 @@ namespace Sass {
919
965
  append_token(s->ns_name(), s);
920
966
  if (!s->matcher().empty()) {
921
967
  append_string(s->matcher());
922
- if (&s->value() && *s->value()) {
968
+ if (s->value() && *s->value()) {
923
969
  s->value()->perform(this);
924
970
  }
925
971
  }
926
972
  add_close_mapping(s);
973
+ if (s->modifier() != 0) {
974
+ append_mandatory_space();
975
+ append_char(s->modifier());
976
+ }
927
977
  append_string("]");
928
978
  }
929
979
 
@@ -939,16 +989,20 @@ namespace Sass {
939
989
 
940
990
  void Inspect::operator()(Wrapped_Selector_Ptr s)
941
991
  {
942
- bool was = in_wrapped;
943
- in_wrapped = true;
944
- append_token(s->name(), s);
945
- append_string("(");
946
- bool was_comma_array = in_comma_array;
947
- in_comma_array = false;
948
- s->selector()->perform(this);
949
- in_comma_array = was_comma_array;
950
- append_string(")");
951
- in_wrapped = was;
992
+ if (s->name() == " ") {
993
+ append_string("");
994
+ } else {
995
+ bool was = in_wrapped;
996
+ in_wrapped = true;
997
+ append_token(s->name(), s);
998
+ append_string("(");
999
+ bool was_comma_array = in_comma_array;
1000
+ in_comma_array = false;
1001
+ s->selector()->perform(this);
1002
+ in_comma_array = was_comma_array;
1003
+ append_string(")");
1004
+ in_wrapped = was;
1005
+ }
952
1006
  }
953
1007
 
954
1008
  void Inspect::operator()(Compound_Selector_Ptr s)
@@ -1014,6 +1068,7 @@ namespace Sass {
1014
1068
  if (tail) append_mandatory_space();
1015
1069
  else append_optional_space();
1016
1070
  break;
1071
+ default: break;
1017
1072
  }
1018
1073
  if (tail && comb != Complex_Selector::ANCESTOR_OF) {
1019
1074
  if (c->has_line_break()) append_optional_linefeed();
@@ -1040,8 +1095,8 @@ namespace Sass {
1040
1095
  bool was_comma_array = in_comma_array;
1041
1096
  // probably ruby sass eqivalent of element_needs_parens
1042
1097
  if (output_style() == TO_SASS && g->length() == 1 &&
1043
- (!SASS_MEMORY_CAST(List, (*g)[0]) &&
1044
- !SASS_MEMORY_CAST(Selector_List, (*g)[0]))) {
1098
+ (!Cast<List>((*g)[0]) &&
1099
+ !Cast<Selector_List>((*g)[0]))) {
1045
1100
  append_string("(");
1046
1101
  }
1047
1102
  else if (!in_declaration && in_comma_array) {
@@ -1053,7 +1108,7 @@ namespace Sass {
1053
1108
  for (size_t i = 0, L = g->length(); i < L; ++i) {
1054
1109
  if (!in_wrapped && i == 0) append_indentation();
1055
1110
  if ((*g)[i] == 0) continue;
1056
- schedule_mapping(&g->at(i)->last());
1111
+ schedule_mapping(g->at(i)->last());
1057
1112
  // add_open_mapping((*g)[i]->last());
1058
1113
  (*g)[i]->perform(this);
1059
1114
  // add_close_mapping((*g)[i]->last());
@@ -1066,8 +1121,8 @@ namespace Sass {
1066
1121
  in_comma_array = was_comma_array;
1067
1122
  // probably ruby sass eqivalent of element_needs_parens
1068
1123
  if (output_style() == TO_SASS && g->length() == 1 &&
1069
- (!SASS_MEMORY_CAST(List, (*g)[0]) &&
1070
- !SASS_MEMORY_CAST(Selector_List, (*g)[0]))) {
1124
+ (!Cast<List>((*g)[0]) &&
1125
+ !Cast<Selector_List>((*g)[0]))) {
1071
1126
  append_string(",)");
1072
1127
  }
1073
1128
  else if (!in_declaration && in_comma_array) {
@@ -17,7 +17,7 @@ namespace Sass {
17
17
 
18
18
  public:
19
19
 
20
- Inspect(Emitter emi);
20
+ Inspect(const Emitter& emi);
21
21
  virtual ~Inspect();
22
22
 
23
23
  // statements
@@ -48,6 +48,7 @@ namespace Sass {
48
48
  virtual void operator()(Content_Ptr);
49
49
  // expressions
50
50
  virtual void operator()(Map_Ptr);
51
+ virtual void operator()(Function_Ptr);
51
52
  virtual void operator()(List_Ptr);
52
53
  virtual void operator()(Binary_Expression_Ptr);
53
54
  virtual void operator()(Unary_Expression_Ptr);
@@ -56,7 +57,6 @@ namespace Sass {
56
57
  // virtual void operator()(Custom_Warning_Ptr);
57
58
  // virtual void operator()(Custom_Error_Ptr);
58
59
  virtual void operator()(Variable_Ptr);
59
- virtual void operator()(Textual_Ptr);
60
60
  virtual void operator()(Number_Ptr);
61
61
  virtual void operator()(Color_Ptr);
62
62
  virtual void operator()(Boolean_Ptr);
@@ -92,6 +92,9 @@ namespace Sass {
92
92
  virtual void operator()(Complex_Selector_Ptr);
93
93
  virtual void operator()(Selector_List_Ptr);
94
94
 
95
+ virtual std::string lbracket(List_Ptr);
96
+ virtual std::string rbracket(List_Ptr);
97
+
95
98
  // template <typename U>
96
99
  // void fallback(U x) { fallback_impl(reinterpret_cast<AST_Node_Ptr>(x)); }
97
100
  };