sassc 1.10.1 → 1.11.0

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/README.md +5 -2
  3. data/ext/libsass/.github/CONTRIBUTING.md +65 -0
  4. data/ext/libsass/.github/ISSUE_TEMPLATE.md +29 -0
  5. data/ext/libsass/Makefile +8 -3
  6. data/ext/libsass/Makefile.conf +28 -22
  7. data/ext/libsass/Readme.md +14 -7
  8. data/ext/libsass/configure.ac +5 -8
  9. data/ext/libsass/docs/api-context-internal.md +3 -0
  10. data/ext/libsass/docs/api-context.md +7 -0
  11. data/ext/libsass/docs/api-doc.md +4 -0
  12. data/ext/libsass/docs/api-importer.md +2 -0
  13. data/ext/libsass/docs/api-value-example.md +55 -0
  14. data/ext/libsass/docs/api-value.md +49 -22
  15. data/ext/libsass/docs/implementations.md +4 -0
  16. data/ext/libsass/include/sass/base.h +5 -4
  17. data/ext/libsass/include/sass/context.h +3 -0
  18. data/ext/libsass/include/sass/values.h +28 -27
  19. data/ext/libsass/include/sass/version.h +1 -1
  20. data/ext/libsass/include/sass2scss.h +1 -1
  21. data/ext/libsass/script/ci-build-libsass +3 -3
  22. data/ext/libsass/script/ci-install-deps +12 -3
  23. data/ext/libsass/src/ast.cpp +321 -212
  24. data/ext/libsass/src/ast.hpp +273 -165
  25. data/ext/libsass/src/ast_factory.hpp +4 -5
  26. data/ext/libsass/src/ast_fwd_decl.hpp +8 -7
  27. data/ext/libsass/src/bind.cpp +2 -7
  28. data/ext/libsass/src/bind.hpp +0 -1
  29. data/ext/libsass/src/check_nesting.cpp +379 -0
  30. data/ext/libsass/src/check_nesting.hpp +60 -0
  31. data/ext/libsass/src/constants.cpp +7 -6
  32. data/ext/libsass/src/constants.hpp +2 -1
  33. data/ext/libsass/src/context.cpp +7 -1
  34. data/ext/libsass/src/context.hpp +1 -1
  35. data/ext/libsass/src/cssize.cpp +76 -32
  36. data/ext/libsass/src/cssize.hpp +7 -8
  37. data/ext/libsass/src/debugger.hpp +70 -40
  38. data/ext/libsass/src/error_handling.cpp +15 -2
  39. data/ext/libsass/src/error_handling.hpp +19 -0
  40. data/ext/libsass/src/eval.cpp +107 -161
  41. data/ext/libsass/src/eval.hpp +12 -8
  42. data/ext/libsass/src/expand.cpp +81 -74
  43. data/ext/libsass/src/expand.hpp +13 -12
  44. data/ext/libsass/src/extend.cpp +149 -142
  45. data/ext/libsass/src/extend.hpp +10 -3
  46. data/ext/libsass/src/file.cpp +2 -1
  47. data/ext/libsass/src/functions.cpp +96 -59
  48. data/ext/libsass/src/functions.hpp +2 -2
  49. data/ext/libsass/src/inspect.cpp +33 -45
  50. data/ext/libsass/src/inspect.hpp +7 -7
  51. data/ext/libsass/src/json.cpp +17 -5
  52. data/ext/libsass/src/lexer.cpp +3 -3
  53. data/ext/libsass/src/listize.cpp +10 -10
  54. data/ext/libsass/src/listize.hpp +3 -3
  55. data/ext/libsass/src/node.cpp +30 -30
  56. data/ext/libsass/src/node.hpp +13 -13
  57. data/ext/libsass/src/operation.hpp +21 -19
  58. data/ext/libsass/src/output.cpp +48 -103
  59. data/ext/libsass/src/output.hpp +0 -1
  60. data/ext/libsass/src/parser.cpp +161 -133
  61. data/ext/libsass/src/parser.hpp +10 -7
  62. data/ext/libsass/src/remove_placeholders.cpp +6 -6
  63. data/ext/libsass/src/remove_placeholders.hpp +1 -1
  64. data/ext/libsass/src/sass.cpp +21 -0
  65. data/ext/libsass/src/sass.hpp +8 -1
  66. data/ext/libsass/src/sass2scss.cpp +14 -3
  67. data/ext/libsass/src/sass_context.cpp +69 -24
  68. data/ext/libsass/src/sass_context.hpp +3 -0
  69. data/ext/libsass/src/source_map.cpp +22 -10
  70. data/ext/libsass/src/to_value.cpp +2 -2
  71. data/ext/libsass/src/to_value.hpp +1 -1
  72. data/ext/libsass/src/units.hpp +3 -1
  73. data/ext/libsass/src/util.cpp +20 -16
  74. data/ext/libsass/src/util.hpp +2 -1
  75. data/ext/libsass/win/libsass.targets +2 -0
  76. data/ext/libsass/win/libsass.vcxproj.filters +6 -0
  77. data/lib/sassc/engine.rb +5 -0
  78. data/lib/sassc/native/native_functions_api.rb +13 -1
  79. data/lib/sassc/script/value_conversion.rb +11 -1
  80. data/lib/sassc/script/value_conversion/list.rb +23 -0
  81. data/lib/sassc/version.rb +1 -1
  82. data/test/engine_test.rb +18 -2
  83. data/test/functions_test.rb +30 -0
  84. data/test/native_test.rb +1 -1
  85. metadata +8 -3
@@ -0,0 +1,60 @@
1
+ #ifndef SASS_CHECK_NESTING_H
2
+ #define SASS_CHECK_NESTING_H
3
+
4
+ #include "ast.hpp"
5
+ #include "operation.hpp"
6
+
7
+ namespace Sass {
8
+
9
+ typedef Environment<AST_Node*> Env;
10
+
11
+ class CheckNesting : public Operation_CRTP<Statement*, CheckNesting> {
12
+
13
+ std::vector<Statement*> parents;
14
+ Statement* parent;
15
+ Definition* current_mixin_definition;
16
+
17
+ Statement* fallback_impl(Statement*);
18
+ Statement* before(Statement*);
19
+ Statement* visit_children(Statement*);
20
+
21
+ public:
22
+ CheckNesting();
23
+ ~CheckNesting() { }
24
+
25
+ Statement* operator()(Block*);
26
+ Statement* operator()(Definition*);
27
+
28
+ template <typename U>
29
+ Statement* fallback(U x) {
30
+ return fallback_impl(this->before(dynamic_cast<Statement*>(x)));
31
+ }
32
+
33
+ private:
34
+ void invalid_content_parent(Statement*);
35
+ void invalid_charset_parent(Statement*);
36
+ void invalid_extend_parent(Statement*);
37
+ // void invalid_import_parent(Statement*);
38
+ void invalid_mixin_definition_parent(Statement*);
39
+ void invalid_function_parent(Statement*);
40
+
41
+ void invalid_function_child(Statement*);
42
+ void invalid_prop_child(Statement*);
43
+ void invalid_prop_parent(Statement*);
44
+ void invalid_return_parent(Statement*);
45
+
46
+ bool is_transparent_parent(Statement*, Statement*);
47
+
48
+ bool should_visit(Statement*);
49
+
50
+ bool is_charset(Statement*);
51
+ bool is_mixin(Statement*);
52
+ bool is_function(Statement*);
53
+ bool is_root_node(Statement*);
54
+ bool is_at_root_node(Statement*);
55
+ bool is_directive_node(Statement*);
56
+ };
57
+
58
+ }
59
+
60
+ #endif
@@ -10,12 +10,13 @@ namespace Sass {
10
10
  // https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity
11
11
  // https://github.com/sass/sass/issues/1495#issuecomment-61189114
12
12
  extern const unsigned long Specificity_Star = 0;
13
- extern const unsigned long Specificity_Universal = 1 << 0;
14
- extern const unsigned long Specificity_Type = 1 << 8;
15
- extern const unsigned long Specificity_Class = 1 << 16;
16
- extern const unsigned long Specificity_Attr = 1 << 16;
17
- extern const unsigned long Specificity_Pseudo = 1 << 16;
18
- extern const unsigned long Specificity_ID = 1 << 24;
13
+ extern const unsigned long Specificity_Universal = 0;
14
+ extern const unsigned long Specificity_Element = 1;
15
+ extern const unsigned long Specificity_Base = 1000;
16
+ extern const unsigned long Specificity_Class = 1000;
17
+ extern const unsigned long Specificity_Attr = 1000;
18
+ extern const unsigned long Specificity_Pseudo = 1000;
19
+ extern const unsigned long Specificity_ID = 1000000;
19
20
 
20
21
  // sass keywords
21
22
  extern const char at_root_kwd[] = "@at-root";
@@ -11,7 +11,8 @@ namespace Sass {
11
11
  // The following list of selectors is by increasing specificity:
12
12
  extern const unsigned long Specificity_Star;
13
13
  extern const unsigned long Specificity_Universal;
14
- extern const unsigned long Specificity_Type;
14
+ extern const unsigned long Specificity_Element;
15
+ extern const unsigned long Specificity_Base;
15
16
  extern const unsigned long Specificity_Class;
16
17
  extern const unsigned long Specificity_Attr;
17
18
  extern const unsigned long Specificity_Pseudo;
@@ -18,6 +18,7 @@
18
18
  #include "output.hpp"
19
19
  #include "expand.hpp"
20
20
  #include "eval.hpp"
21
+ #include "check_nesting.hpp"
21
22
  #include "cssize.hpp"
22
23
  #include "listize.hpp"
23
24
  #include "extend.hpp"
@@ -398,7 +399,7 @@ namespace Sass {
398
399
  const Importer importer(imp_path, ctx_path);
399
400
  Include include(load_import(importer, pstate));
400
401
  if (include.abs_path.empty()) {
401
- error("File to import not found or unreadable: " + imp_path + "\nParent style sheet: " + ctx_path, pstate);
402
+ error("File to import not found or unreadable: " + imp_path + ".\nParent style sheet: " + ctx_path, pstate);
402
403
  }
403
404
  imp->incs().push_back(include);
404
405
  }
@@ -648,8 +649,13 @@ namespace Sass {
648
649
  // create crtp visitor objects
649
650
  Expand expand(*this, &global, &backtrace);
650
651
  Cssize cssize(*this, &backtrace);
652
+ CheckNesting check_nesting;
653
+ // check nesting
654
+ root->perform(&check_nesting)->block();
651
655
  // expand and eval the tree
652
656
  root = root->perform(&expand)->block();
657
+ // check nesting
658
+ root->perform(&check_nesting)->block();
653
659
  // merge and bubble certain rules
654
660
  root = root->perform(&cssize)->block();
655
661
  // should we extend something?
@@ -50,7 +50,7 @@ namespace Sass {
50
50
  std::vector<char*> strings;
51
51
  std::vector<Resource> resources;
52
52
  std::map<const std::string, const StyleSheet> sheets;
53
- Subset_Map<std::string, std::pair<Complex_Selector*, Compound_Selector*> > subset_map;
53
+ Subset_Map<std::string, std::pair<Sequence_Selector*, SimpleSequence_Selector*> > subset_map;
54
54
  std::vector<Sass_Import_Entry> import_stack;
55
55
 
56
56
  struct Sass_Compiler* c_compiler;
@@ -13,22 +13,14 @@ namespace Sass {
13
13
  : ctx(ctx),
14
14
  block_stack(std::vector<Block*>()),
15
15
  p_stack(std::vector<Statement*>()),
16
- s_stack(std::vector<Selector_List*>()),
17
16
  backtrace(bt)
18
- {
19
- s_stack.push_back(NULL);
20
- }
17
+ { }
21
18
 
22
19
  Statement* Cssize::parent()
23
20
  {
24
21
  return p_stack.size() ? p_stack.back() : block_stack.front();
25
22
  }
26
23
 
27
- Selector_List* Cssize::selector()
28
- {
29
- return s_stack.size() ? s_stack.back() : NULL;
30
- }
31
-
32
24
  Statement* Cssize::operator()(Block* b)
33
25
  {
34
26
  Block* bb = SASS_MEMORY_NEW(ctx.mem, Block, b->pstate(), b->length(), b->is_root());
@@ -39,6 +31,50 @@ namespace Sass {
39
31
  return bb;
40
32
  }
41
33
 
34
+ Statement* Cssize::operator()(Trace* t)
35
+ {
36
+ return t->block()->perform(this);
37
+ }
38
+
39
+ Statement* Cssize::operator()(Declaration* d)
40
+ {
41
+ String* property = dynamic_cast<String*>(d->property());
42
+
43
+ if (Declaration* dd = dynamic_cast<Declaration*>(parent())) {
44
+ String* parent_property = dynamic_cast<String*>(dd->property());
45
+ property = SASS_MEMORY_NEW(ctx.mem, String_Constant,
46
+ d->property()->pstate(),
47
+ parent_property->to_string() + "-" + property->to_string());
48
+ if (!dd->value()) {
49
+ d->tabs(dd->tabs() + 1);
50
+ }
51
+ }
52
+
53
+ Declaration* dd = SASS_MEMORY_NEW(ctx.mem, Declaration,
54
+ d->pstate(),
55
+ property,
56
+ d->value(),
57
+ d->is_important());
58
+ dd->is_indented(d->is_indented());
59
+ dd->tabs(d->tabs());
60
+
61
+ p_stack.push_back(dd);
62
+ Block* bb = d->block() ? d->block()->perform(this)->block() : 0;
63
+ p_stack.pop_back();
64
+
65
+ if (bb && bb->length()) {
66
+ if (dd->value() && !dd->value()->is_invisible()) {
67
+ bb->unshift(dd);
68
+ }
69
+ return bb;
70
+ }
71
+ else if (dd->value() && !dd->value()->is_invisible()) {
72
+ return dd;
73
+ }
74
+
75
+ return 0;
76
+ }
77
+
42
78
  Statement* Cssize::operator()(Directive* r)
43
79
  {
44
80
  if (!r->block() || !r->block()->length()) return r;
@@ -101,14 +137,22 @@ namespace Sass {
101
137
  Statement* Cssize::operator()(Ruleset* r)
102
138
  {
103
139
  p_stack.push_back(r);
104
- s_stack.push_back(dynamic_cast<Selector_List*>(r->selector()));
140
+ // this can return a string schema
141
+ // string schema is not a statement!
142
+ // r->block() is already a string schema
143
+ // and that is comming from propset expand
144
+ Statement* stmt = r->block()->perform(this);
145
+ // this should protect us (at least a bit) from our mess
146
+ // fixing this properly is harder that it should be ...
147
+ if (dynamic_cast<Statement*>((AST_Node*)stmt) == NULL) {
148
+ error("Illegal nesting: Only properties may be nested beneath properties.", r->block()->pstate());
149
+ }
105
150
  Ruleset* rr = SASS_MEMORY_NEW(ctx.mem, Ruleset,
106
151
  r->pstate(),
107
152
  r->selector(),
108
- r->block()->perform(this)->block());
153
+ stmt->block());
109
154
  rr->is_root(r->is_root());
110
155
  // rr->tabs(r->block()->tabs());
111
- s_stack.pop_back();
112
156
  p_stack.pop_back();
113
157
 
114
158
  if (!rr->block()) {
@@ -419,46 +463,40 @@ namespace Sass {
419
463
  }
420
464
  else {
421
465
  previous_parent = static_cast<Has_Block*>(shallow_copy(parent));
466
+ previous_parent->block(slice);
422
467
  previous_parent->tabs(parent->tabs());
423
468
 
424
- Has_Block* new_parent = static_cast<Has_Block*>(shallow_copy(parent));
425
- new_parent->block(slice);
426
- new_parent->tabs(parent->tabs());
469
+ Has_Block* new_parent = previous_parent;
427
470
 
428
471
  *result << new_parent;
429
472
  }
430
473
  continue;
431
474
  }
432
475
 
433
- Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block,
434
- children->block()->pstate(),
435
- children->block()->length(),
436
- children->block()->is_root());
437
-
438
476
  for (size_t j = 0, K = slice->length(); j < K; ++j)
439
477
  {
440
478
  Statement* ss = 0;
441
- Bubble* b = static_cast<Bubble*>((*slice)[j]);
479
+ Bubble* node = static_cast<Bubble*>((*slice)[j]);
442
480
 
443
481
  if (!parent ||
444
482
  parent->statement_type() != Statement::MEDIA ||
445
- b->node()->statement_type() != Statement::MEDIA ||
446
- static_cast<Media_Block*>(b->node())->media_queries() == static_cast<Media_Block*>(parent)->media_queries())
483
+ node->node()->statement_type() != Statement::MEDIA ||
484
+ static_cast<Media_Block*>(node->node())->media_queries() == static_cast<Media_Block*>(parent)->media_queries())
447
485
  {
448
- ss = b->node();
486
+ ss = node->node();
449
487
  }
450
488
  else
451
489
  {
452
- List* mq = merge_media_queries(static_cast<Media_Block*>(b->node()), static_cast<Media_Block*>(parent));
490
+ List* mq = merge_media_queries(static_cast<Media_Block*>(node->node()), static_cast<Media_Block*>(parent));
453
491
  if (!mq->length()) continue;
454
- static_cast<Media_Block*>(b->node())->media_queries(mq);
455
- ss = b->node();
492
+ static_cast<Media_Block*>(node->node())->media_queries(mq);
493
+ ss = node->node();
456
494
  }
457
495
 
458
496
  if (!ss) continue;
459
497
 
460
- ss->tabs(ss->tabs() + b->tabs());
461
- ss->group_end(b->group_end());
498
+ ss->tabs(ss->tabs() + node->tabs());
499
+ ss->group_end(node->group_end());
462
500
 
463
501
  if (!ss) continue;
464
502
 
@@ -467,16 +505,22 @@ namespace Sass {
467
505
  children->block()->length(),
468
506
  children->block()->is_root());
469
507
  *bb << ss->perform(this);
508
+
509
+ Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block,
510
+ children->block()->pstate(),
511
+ children->block()->length(),
512
+ children->block()->is_root());
513
+
470
514
  Statement* wrapper = flatten(bb);
471
515
  *wrapper_block << wrapper;
472
516
 
473
517
  if (wrapper->block()->length()) {
474
518
  previous_parent = 0;
475
519
  }
476
- }
477
520
 
478
- if (wrapper_block) {
479
- *result << flatten(wrapper_block);
521
+ if (wrapper_block) {
522
+ *result << wrapper_block;
523
+ }
480
524
  }
481
525
  }
482
526
 
@@ -13,11 +13,10 @@ namespace Sass {
13
13
 
14
14
  class Cssize : public Operation_CRTP<Statement*, Cssize> {
15
15
 
16
- Context& ctx;
17
- std::vector<Block*> block_stack;
18
- std::vector<Statement*> p_stack;
19
- std::vector<Selector_List*> s_stack;
20
- Backtrace* backtrace;
16
+ Context& ctx;
17
+ std::vector<Block*> block_stack;
18
+ std::vector<Statement*> p_stack;
19
+ Backtrace* backtrace;
21
20
 
22
21
  Statement* fallback_impl(AST_Node* n);
23
22
 
@@ -25,18 +24,18 @@ namespace Sass {
25
24
  Cssize(Context&, Backtrace*);
26
25
  ~Cssize() { }
27
26
 
28
- Selector_List* selector();
27
+ CommaSequence_Selector* selector();
29
28
 
30
29
  Statement* operator()(Block*);
31
30
  Statement* operator()(Ruleset*);
32
- // Statement* operator()(Propset*);
33
31
  // Statement* operator()(Bubble*);
34
32
  Statement* operator()(Media_Block*);
35
33
  Statement* operator()(Supports_Block*);
36
34
  Statement* operator()(At_Root_Block*);
37
35
  Statement* operator()(Directive*);
38
36
  Statement* operator()(Keyframe_Rule*);
39
- // Statement* operator()(Declaration*);
37
+ Statement* operator()(Trace*);
38
+ Statement* operator()(Declaration*);
40
39
  // Statement* operator()(Assignment*);
41
40
  // Statement* operator()(Import*);
42
41
  // Statement* operator()(Import_Stub*);
@@ -65,6 +65,14 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
65
65
  std::cerr << " (" << pstate_source_position(node) << ")";
66
66
  std::cerr << " " << bubble->tabs();
67
67
  std::cerr << std::endl;
68
+ debug_ast(bubble->node(), ind + " ", env);
69
+ } else if (dynamic_cast<Trace*>(node)) {
70
+ Trace* trace = dynamic_cast<Trace*>(node);
71
+ std::cerr << ind << "Trace " << trace;
72
+ std::cerr << " (" << pstate_source_position(node) << ")"
73
+ << " [name:" << trace->name() << "]"
74
+ << std::endl;
75
+ debug_ast(trace->block(), ind + " ", env);
68
76
  } else if (dynamic_cast<At_Root_Block*>(node)) {
69
77
  At_Root_Block* root_block = dynamic_cast<At_Root_Block*>(node);
70
78
  std::cerr << ind << "At_Root_Block " << root_block;
@@ -73,12 +81,14 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
73
81
  std::cerr << std::endl;
74
82
  debug_ast(root_block->expression(), ind + ":", env);
75
83
  debug_ast(root_block->block(), ind + " ", env);
76
- } else if (dynamic_cast<Selector_List*>(node)) {
77
- Selector_List* selector = dynamic_cast<Selector_List*>(node);
78
- std::cerr << ind << "Selector_List " << selector;
84
+ } else if (dynamic_cast<CommaSequence_Selector*>(node)) {
85
+ CommaSequence_Selector* selector = dynamic_cast<CommaSequence_Selector*>(node);
86
+ std::cerr << ind << "CommaSequence_Selector " << selector;
79
87
  std::cerr << " (" << pstate_source_position(node) << ")";
80
88
  std::cerr << " <" << selector->hash() << ">";
81
89
  std::cerr << " [@media:" << selector->media_block() << "]";
90
+ std::cerr << (selector->is_invisible() ? " [INVISIBLE]": " -");
91
+ std::cerr << (selector->has_placeholder() ? " [PLACEHOLDER]": " -");
82
92
  std::cerr << (selector->is_optional() ? " [is_optional]": " -");
83
93
  std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
84
94
  std::cerr << (selector->has_line_break() ? " [line-break]": " -");
@@ -97,16 +107,20 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
97
107
  // if (selector->not_selector()) cerr << " [in_declaration]";
98
108
  std::cerr << " (" << pstate_source_position(node) << ")";
99
109
  std::cerr << " <" << selector->hash() << ">";
110
+ std::cerr << " [" << (selector->is_real_parent_ref() ? "REAL" : "FAKE") << "]";
100
111
  std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
101
112
  // debug_ast(selector->selector(), ind + "->", env);
102
113
 
103
- } else if (dynamic_cast<Complex_Selector*>(node)) {
104
- Complex_Selector* selector = dynamic_cast<Complex_Selector*>(node);
105
- std::cerr << ind << "Complex_Selector " << selector
114
+ } else if (dynamic_cast<Sequence_Selector*>(node)) {
115
+ Sequence_Selector* selector = dynamic_cast<Sequence_Selector*>(node);
116
+ std::cerr << ind << "Sequence_Selector " << selector
106
117
  << " (" << pstate_source_position(node) << ")"
107
118
  << " <" << selector->hash() << ">"
119
+ << " [length:" << longToHex(selector->length()) << "]"
108
120
  << " [weight:" << longToHex(selector->specificity()) << "]"
109
121
  << " [@media:" << selector->media_block() << "]"
122
+ << (selector->is_invisible() ? " [INVISIBLE]": " -")
123
+ << (selector->has_placeholder() ? " [PLACEHOLDER]": " -")
110
124
  << (selector->is_optional() ? " [is_optional]": " -")
111
125
  << (selector->has_parent_ref() ? " [has parent]": " -")
112
126
  << (selector->has_line_feed() ? " [line-feed]": " -")
@@ -114,11 +128,11 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
114
128
  << " -- ";
115
129
  std::string del;
116
130
  switch (selector->combinator()) {
117
- case Complex_Selector::PARENT_OF: del = ">"; break;
118
- case Complex_Selector::PRECEDES: del = "~"; break;
119
- case Complex_Selector::ADJACENT_TO: del = "+"; break;
120
- case Complex_Selector::ANCESTOR_OF: del = " "; break;
121
- case Complex_Selector::REFERENCE: del = "//"; break;
131
+ case Sequence_Selector::PARENT_OF: del = ">"; break;
132
+ case Sequence_Selector::PRECEDES: del = "~"; break;
133
+ case Sequence_Selector::ADJACENT_TO: del = "+"; break;
134
+ case Sequence_Selector::ANCESTOR_OF: del = " "; break;
135
+ case Sequence_Selector::REFERENCE: del = "//"; break;
122
136
  }
123
137
  // if (del = "/") del += selector->reference()->perform(&to_string) + "/";
124
138
  std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
@@ -130,9 +144,9 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
130
144
  }
131
145
  SourcesSet set = selector->sources();
132
146
  // debug_sources_set(set, ind + " @--> ");
133
- } else if (dynamic_cast<Compound_Selector*>(node)) {
134
- Compound_Selector* selector = dynamic_cast<Compound_Selector*>(node);
135
- std::cerr << ind << "Compound_Selector " << selector;
147
+ } else if (dynamic_cast<SimpleSequence_Selector*>(node)) {
148
+ SimpleSequence_Selector* selector = dynamic_cast<SimpleSequence_Selector*>(node);
149
+ std::cerr << ind << "SimpleSequence_Selector " << selector;
136
150
  std::cerr << " (" << pstate_source_position(node) << ")";
137
151
  std::cerr << " <" << selector->hash() << ">";
138
152
  std::cerr << " [weight:" << longToHex(selector->specificity()) << "]";
@@ -144,12 +158,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
144
158
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
145
159
  std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
146
160
  for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }
147
- } else if (dynamic_cast<Propset*>(node)) {
148
- Propset* selector = dynamic_cast<Propset*>(node);
149
- std::cerr << ind << "Propset " << selector;
150
- std::cerr << " (" << pstate_source_position(node) << ")";
151
- std::cerr << " " << selector->tabs() << std::endl;
152
- if (selector->block()) for(auto i : selector->block()->elements()) { debug_ast(i, ind + " ", env); }
153
161
  } else if (dynamic_cast<Wrapped_Selector*>(node)) {
154
162
  Wrapped_Selector* selector = dynamic_cast<Wrapped_Selector*>(node);
155
163
  std::cerr << ind << "Wrapped_Selector " << selector;
@@ -186,9 +194,20 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
186
194
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
187
195
  std::cerr << std::endl;
188
196
  debug_ast(selector->value(), ind + "[" + selector->matcher() + "] ", env);
189
- } else if (dynamic_cast<Selector_Qualifier*>(node)) {
190
- Selector_Qualifier* selector = dynamic_cast<Selector_Qualifier*>(node);
191
- std::cerr << ind << "Selector_Qualifier " << selector;
197
+ } else if (dynamic_cast<Class_Selector*>(node)) {
198
+ Class_Selector* selector = dynamic_cast<Class_Selector*>(node);
199
+ std::cerr << ind << "Class_Selector " << selector;
200
+ std::cerr << " (" << pstate_source_position(node) << ")";
201
+ std::cerr << " <" << selector->hash() << ">";
202
+ std::cerr << " <<" << selector->ns_name() << ">>";
203
+ std::cerr << (selector->is_optional() ? " [is_optional]": " -");
204
+ std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
205
+ std::cerr << (selector->has_line_break() ? " [line-break]": " -");
206
+ std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
207
+ std::cerr << std::endl;
208
+ } else if (dynamic_cast<Id_Selector*>(node)) {
209
+ Id_Selector* selector = dynamic_cast<Id_Selector*>(node);
210
+ std::cerr << ind << "Id_Selector " << selector;
192
211
  std::cerr << " (" << pstate_source_position(node) << ")";
193
212
  std::cerr << " <" << selector->hash() << ">";
194
213
  std::cerr << " <<" << selector->ns_name() << ">>";
@@ -197,9 +216,9 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
197
216
  std::cerr << (selector->has_line_break() ? " [line-break]": " -");
198
217
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
199
218
  std::cerr << std::endl;
200
- } else if (dynamic_cast<Type_Selector*>(node)) {
201
- Type_Selector* selector = dynamic_cast<Type_Selector*>(node);
202
- std::cerr << ind << "Type_Selector " << selector;
219
+ } else if (dynamic_cast<Element_Selector*>(node)) {
220
+ Element_Selector* selector = dynamic_cast<Element_Selector*>(node);
221
+ std::cerr << ind << "Element_Selector " << selector;
203
222
  std::cerr << " (" << pstate_source_position(node) << ")";
204
223
  std::cerr << " <" << selector->hash() << ">";
205
224
  std::cerr << " <<" << selector->ns_name() << ">>";
@@ -209,10 +228,10 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
209
228
  std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
210
229
  std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">";
211
230
  std::cerr << std::endl;
212
- } else if (dynamic_cast<Selector_Placeholder*>(node)) {
231
+ } else if (dynamic_cast<Placeholder_Selector*>(node)) {
213
232
 
214
- Selector_Placeholder* selector = dynamic_cast<Selector_Placeholder*>(node);
215
- std::cerr << ind << "Selector_Placeholder [" << selector->ns_name() << "] " << selector
233
+ Placeholder_Selector* selector = dynamic_cast<Placeholder_Selector*>(node);
234
+ std::cerr << ind << "Placeholder_Selector [" << selector->ns_name() << "] " << selector
216
235
  << " <" << selector->hash() << ">"
217
236
  << " [@media:" << selector->media_block() << "]"
218
237
  << (selector->is_optional() ? " [is_optional]": " -")
@@ -279,6 +298,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
279
298
  std::cerr << " (" << pstate_source_position(node) << ")";
280
299
  std::cerr << " " << block->tabs() << std::endl;
281
300
  debug_ast(block->condition(), ind + " =@ ");
301
+ debug_ast(block->block(), ind + " <>");
282
302
  } else if (dynamic_cast<Supports_Operator*>(node)) {
283
303
  Supports_Operator* block = dynamic_cast<Supports_Operator*>(node);
284
304
  std::cerr << ind << "Supports_Operator " << block;
@@ -292,6 +312,13 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
292
312
  std::cerr << " (" << pstate_source_position(node) << ")"
293
313
  << std::endl;
294
314
  debug_ast(block->condition(), ind + " condition) ");
315
+ } else if (dynamic_cast<At_Root_Query*>(node)) {
316
+ At_Root_Query* block = dynamic_cast<At_Root_Query*>(node);
317
+ std::cerr << ind << "At_Root_Query " << block;
318
+ std::cerr << " (" << pstate_source_position(node) << ")"
319
+ << std::endl;
320
+ debug_ast(block->feature(), ind + " feature) ");
321
+ debug_ast(block->value(), ind + " value) ");
295
322
  } else if (dynamic_cast<Supports_Declaration*>(node)) {
296
323
  Supports_Declaration* block = dynamic_cast<Supports_Declaration*>(node);
297
324
  std::cerr << ind << "Supports_Declaration " << block;
@@ -311,6 +338,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
311
338
  std::cerr << ind << "Warning " << block;
312
339
  std::cerr << " (" << pstate_source_position(node) << ")";
313
340
  std::cerr << " " << block->tabs() << std::endl;
341
+ debug_ast(block->message(), ind + " : ");
314
342
  } else if (dynamic_cast<Error*>(node)) {
315
343
  Error* block = dynamic_cast<Error*>(node);
316
344
  std::cerr << ind << "Error " << block;
@@ -381,6 +409,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
381
409
  std::cerr << " " << block->tabs() << std::endl;
382
410
  debug_ast(block->property(), ind + " prop: ", env);
383
411
  debug_ast(block->value(), ind + " value: ", env);
412
+ debug_ast(block->block(), ind + " ", env);
384
413
  } else if (dynamic_cast<Keyframe_Rule*>(node)) {
385
414
  Keyframe_Rule* has_block = dynamic_cast<Keyframe_Rule*>(node);
386
415
  std::cerr << ind << "Keyframe_Rule " << has_block;
@@ -425,18 +454,19 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
425
454
  std::cerr << " [native: " << block->native_function() << "] ";
426
455
  std::cerr << " " << block->tabs() << std::endl;
427
456
  debug_ast(block->parameters(), ind + " params: ", env);
428
- if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
457
+ if (block->block()) debug_ast(block->block(), ind + " ", env);
429
458
  } else if (dynamic_cast<Mixin_Call*>(node)) {
430
459
  Mixin_Call* block = dynamic_cast<Mixin_Call*>(node);
431
460
  std::cerr << ind << "Mixin_Call " << block << " " << block->tabs();
432
461
  std::cerr << " [" << block->name() << "]";
433
462
  std::cerr << " [has_content: " << block->has_content() << "] " << std::endl;
434
463
  debug_ast(block->arguments(), ind + " args: ");
435
- if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
464
+ if (block->block()) debug_ast(block->block(), ind + " ", env);
436
465
  } else if (Ruleset* ruleset = dynamic_cast<Ruleset*>(node)) {
437
466
  std::cerr << ind << "Ruleset " << ruleset;
438
467
  std::cerr << " (" << pstate_source_position(node) << ")";
439
468
  std::cerr << " [indent: " << ruleset->tabs() << "]";
469
+ std::cerr << (ruleset->is_invisible() ? " [INVISIBLE]" : "");
440
470
  std::cerr << (ruleset->at_root() ? " [@ROOT]" : "");
441
471
  std::cerr << (ruleset->is_root() ? " [root]" : "");
442
472
  std::cerr << std::endl;
@@ -446,6 +476,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
446
476
  Block* block = dynamic_cast<Block*>(node);
447
477
  std::cerr << ind << "Block " << block;
448
478
  std::cerr << " (" << pstate_source_position(node) << ")";
479
+ std::cerr << (block->is_invisible() ? " [INVISIBLE]" : "");
449
480
  std::cerr << " [indent: " << block->tabs() << "]" << std::endl;
450
481
  for(auto i : block->elements()) { debug_ast(i, ind + " ", env); }
451
482
  } else if (dynamic_cast<Textual*>(node)) {
@@ -523,6 +554,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
523
554
  Unary_Expression* expression = dynamic_cast<Unary_Expression*>(node);
524
555
  std::cerr << ind << "Unary_Expression " << expression;
525
556
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
557
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
526
558
  std::cerr << " (" << pstate_source_position(node) << ")";
527
559
  std::cerr << " [" << expression->type() << "]" << std::endl;
528
560
  debug_ast(expression->operand(), ind + " operand: ", env);
@@ -578,6 +610,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
578
610
  Color* expression = dynamic_cast<Color*>(node);
579
611
  std::cerr << ind << "Color " << expression;
580
612
  std::cerr << " (" << pstate_source_position(node) << ")";
613
+ std::cerr << " [delayed: " << expression->is_delayed() << "] ";
581
614
  std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
582
615
  std::cerr << " [" << expression->r() << ":" << expression->g() << ":" << expression->b() << "@" << expression->a() << "]" << std::endl;
583
616
  } else if (dynamic_cast<Number*>(node)) {
@@ -594,7 +627,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
594
627
  std::cerr << " (" << pstate_source_position(node) << ")";
595
628
  std::cerr << " [" << prettyprint(expression->value()) << "]";
596
629
  if (expression->is_delayed()) std::cerr << " [delayed]";
597
- if (expression->sass_fix_1291()) std::cerr << " [sass_fix_1291]";
598
630
  if (expression->is_interpolant()) std::cerr << " [interpolant]";
599
631
  if (expression->quote_mark()) std::cerr << " [quote_mark: " << expression->quote_mark() << "]";
600
632
  std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
@@ -607,7 +639,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
607
639
  std::cerr << " (" << pstate_source_position(node) << ")";
608
640
  std::cerr << " [" << prettyprint(expression->value()) << "]";
609
641
  if (expression->is_delayed()) std::cerr << " [delayed]";
610
- if (expression->sass_fix_1291()) std::cerr << " [sass_fix_1291]";
611
642
  if (expression->is_interpolant()) std::cerr << " [interpolant]";
612
643
  std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
613
644
  } else if (dynamic_cast<String_Schema*>(node)) {
@@ -626,7 +657,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
626
657
  std::cerr << ind << "String " << expression;
627
658
  std::cerr << " " << expression->concrete_type();
628
659
  std::cerr << " (" << pstate_source_position(node) << ")";
629
- if (expression->sass_fix_1291()) std::cerr << " [sass_fix_1291]";
630
660
  if (expression->is_interpolant()) std::cerr << " [interpolant]";
631
661
  std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
632
662
  } else if (dynamic_cast<Expression*>(node)) {
@@ -673,11 +703,11 @@ inline void debug_node(Node* node, std::string ind = "")
673
703
  std::cerr << node << " ";
674
704
  if (node->got_line_feed) std::cerr << "[LF] ";
675
705
  switch (node->combinator()) {
676
- case Complex_Selector::ADJACENT_TO: std::cerr << "{+} "; break;
677
- case Complex_Selector::PARENT_OF: std::cerr << "{>} "; break;
678
- case Complex_Selector::PRECEDES: std::cerr << "{~} "; break;
679
- case Complex_Selector::REFERENCE: std::cerr << "{@} "; break;
680
- case Complex_Selector::ANCESTOR_OF: std::cerr << "{ } "; break;
706
+ case Sequence_Selector::ADJACENT_TO: std::cerr << "{+} "; break;
707
+ case Sequence_Selector::PARENT_OF: std::cerr << "{>} "; break;
708
+ case Sequence_Selector::PRECEDES: std::cerr << "{~} "; break;
709
+ case Sequence_Selector::REFERENCE: std::cerr << "{@} "; break;
710
+ case Sequence_Selector::ANCESTOR_OF: std::cerr << "{ } "; break;
681
711
  }
682
712
  std::cerr << std::endl;
683
713
  // debug_ast(node->combinator(), ind + " ");
@@ -733,7 +763,7 @@ inline void debug_subset_map(Sass::ExtensionSubsetMap& map, std::string ind = ""
733
763
  if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
734
764
  }
735
765
 
736
- typedef std::pair<Complex_Selector*, Compound_Selector*> ExtensionPair;
766
+ typedef std::pair<Sequence_Selector*, SimpleSequence_Selector*> ExtensionPair;
737
767
  typedef std::vector<ExtensionPair> SubsetMapEntries;
738
768
 
739
769
  inline void debug_subset_entries(SubsetMapEntries* entries, std::string ind = "")