sassc 1.10.1 → 1.11.0

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/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 = "")