sassc 2.0.1 → 2.1.0.pre1

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 (200) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +7 -3
  5. data/CHANGELOG.md +3 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +23 -8
  9. data/ext/extconf.rb +39 -0
  10. data/ext/libsass/.gitignore +1 -0
  11. data/ext/libsass/GNUmakefile.am +23 -39
  12. data/ext/libsass/Makefile +56 -91
  13. data/ext/libsass/Makefile.conf +16 -2
  14. data/ext/libsass/configure.ac +8 -12
  15. data/ext/libsass/include/sass/base.h +1 -0
  16. data/ext/libsass/include/sass/context.h +1 -1
  17. data/ext/libsass/src/GNUmakefile.am +1 -5
  18. data/ext/libsass/src/ast.cpp +747 -2010
  19. data/ext/libsass/src/ast.hpp +239 -2383
  20. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  21. data/ext/libsass/src/ast2c.hpp +39 -0
  22. data/ext/libsass/src/ast_def_macros.hpp +62 -10
  23. data/ext/libsass/src/ast_fwd_decl.cpp +1 -0
  24. data/ext/libsass/src/ast_fwd_decl.hpp +43 -165
  25. data/ext/libsass/src/ast_sel_cmp.cpp +909 -0
  26. data/ext/libsass/src/ast_sel_unify.cpp +280 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1475 -0
  28. data/ext/libsass/src/ast_selectors.hpp +568 -0
  29. data/ext/libsass/src/ast_supports.cpp +130 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +967 -0
  32. data/ext/libsass/src/ast_values.hpp +489 -0
  33. data/ext/libsass/src/backtrace.cpp +4 -0
  34. data/ext/libsass/src/base64vlq.cpp +3 -0
  35. data/ext/libsass/src/bind.cpp +18 -17
  36. data/ext/libsass/src/bind.hpp +3 -1
  37. data/ext/libsass/src/c2ast.cpp +64 -0
  38. data/ext/libsass/src/c2ast.hpp +14 -0
  39. data/ext/libsass/src/cencode.c +2 -2
  40. data/ext/libsass/src/check_nesting.cpp +52 -56
  41. data/ext/libsass/src/check_nesting.hpp +35 -34
  42. data/ext/libsass/src/color_maps.cpp +156 -153
  43. data/ext/libsass/src/color_maps.hpp +152 -152
  44. data/ext/libsass/src/constants.cpp +15 -0
  45. data/ext/libsass/src/constants.hpp +13 -0
  46. data/ext/libsass/src/context.cpp +24 -14
  47. data/ext/libsass/src/context.hpp +6 -6
  48. data/ext/libsass/src/cssize.cpp +69 -71
  49. data/ext/libsass/src/cssize.hpp +50 -50
  50. data/ext/libsass/src/debugger.hpp +117 -110
  51. data/ext/libsass/src/emitter.cpp +13 -12
  52. data/ext/libsass/src/emitter.hpp +13 -9
  53. data/ext/libsass/src/environment.cpp +15 -1
  54. data/ext/libsass/src/environment.hpp +6 -0
  55. data/ext/libsass/src/error_handling.cpp +36 -59
  56. data/ext/libsass/src/error_handling.hpp +29 -16
  57. data/ext/libsass/src/eval.cpp +302 -323
  58. data/ext/libsass/src/eval.hpp +64 -55
  59. data/ext/libsass/src/expand.cpp +94 -88
  60. data/ext/libsass/src/expand.hpp +33 -37
  61. data/ext/libsass/src/extend.cpp +38 -36
  62. data/ext/libsass/src/extend.hpp +15 -15
  63. data/ext/libsass/src/file.cpp +34 -2
  64. data/ext/libsass/src/fn_colors.cpp +594 -0
  65. data/ext/libsass/src/fn_colors.hpp +85 -0
  66. data/ext/libsass/src/fn_lists.cpp +284 -0
  67. data/ext/libsass/src/fn_lists.hpp +34 -0
  68. data/ext/libsass/src/fn_maps.cpp +94 -0
  69. data/ext/libsass/src/fn_maps.hpp +30 -0
  70. data/ext/libsass/src/fn_miscs.cpp +256 -0
  71. data/ext/libsass/src/fn_miscs.hpp +40 -0
  72. data/ext/libsass/src/fn_numbers.cpp +220 -0
  73. data/ext/libsass/src/fn_numbers.hpp +45 -0
  74. data/ext/libsass/src/fn_selectors.cpp +235 -0
  75. data/ext/libsass/src/fn_selectors.hpp +35 -0
  76. data/ext/libsass/src/fn_strings.cpp +254 -0
  77. data/ext/libsass/src/fn_strings.hpp +34 -0
  78. data/ext/libsass/src/fn_utils.cpp +156 -0
  79. data/ext/libsass/src/fn_utils.hpp +56 -0
  80. data/ext/libsass/src/inspect.cpp +101 -152
  81. data/ext/libsass/src/inspect.hpp +69 -73
  82. data/ext/libsass/src/json.cpp +2 -2
  83. data/ext/libsass/src/lexer.cpp +6 -3
  84. data/ext/libsass/src/listize.cpp +9 -11
  85. data/ext/libsass/src/listize.hpp +11 -7
  86. data/ext/libsass/src/memory/SharedPtr.cpp +2 -83
  87. data/ext/libsass/src/memory/SharedPtr.hpp +127 -143
  88. data/ext/libsass/src/node.cpp +13 -10
  89. data/ext/libsass/src/node.hpp +3 -3
  90. data/ext/libsass/src/operation.hpp +184 -144
  91. data/ext/libsass/src/operators.cpp +43 -17
  92. data/ext/libsass/src/operators.hpp +5 -5
  93. data/ext/libsass/src/output.cpp +21 -18
  94. data/ext/libsass/src/output.hpp +14 -21
  95. data/ext/libsass/src/parser.cpp +215 -183
  96. data/ext/libsass/src/parser.hpp +28 -24
  97. data/ext/libsass/src/plugins.cpp +5 -1
  98. data/ext/libsass/src/position.cpp +3 -0
  99. data/ext/libsass/src/prelexer.cpp +9 -3
  100. data/ext/libsass/src/prelexer.hpp +9 -9
  101. data/ext/libsass/src/remove_placeholders.cpp +14 -11
  102. data/ext/libsass/src/remove_placeholders.hpp +8 -9
  103. data/ext/libsass/src/sass.cpp +9 -3
  104. data/ext/libsass/src/sass.hpp +12 -9
  105. data/ext/libsass/src/sass2scss.cpp +45 -14
  106. data/ext/libsass/src/sass_context.cpp +18 -15
  107. data/ext/libsass/src/sass_functions.cpp +6 -3
  108. data/ext/libsass/src/sass_functions.hpp +1 -1
  109. data/ext/libsass/src/sass_util.cpp +3 -0
  110. data/ext/libsass/src/sass_values.cpp +21 -13
  111. data/ext/libsass/src/source_map.cpp +5 -2
  112. data/ext/libsass/src/source_map.hpp +2 -2
  113. data/ext/libsass/src/subset_map.cpp +4 -1
  114. data/ext/libsass/src/to_value.cpp +23 -21
  115. data/ext/libsass/src/to_value.hpp +18 -22
  116. data/ext/libsass/src/units.cpp +4 -0
  117. data/ext/libsass/src/units.hpp +1 -0
  118. data/ext/libsass/src/utf8/checked.h +12 -10
  119. data/ext/libsass/src/utf8/core.h +3 -0
  120. data/ext/libsass/src/utf8_string.cpp +3 -0
  121. data/ext/libsass/src/util.cpp +67 -75
  122. data/ext/libsass/src/util.hpp +64 -19
  123. data/ext/libsass/src/util_string.cpp +75 -0
  124. data/ext/libsass/src/util_string.hpp +19 -0
  125. data/ext/libsass/src/values.cpp +22 -13
  126. data/ext/libsass/src/values.hpp +2 -2
  127. data/ext/libsass/win/libsass.targets +30 -4
  128. data/ext/libsass/win/libsass.vcxproj.filters +82 -4
  129. data/lib/sassc.rb +24 -0
  130. data/lib/sassc/engine.rb +2 -2
  131. data/lib/sassc/native.rb +8 -1
  132. data/lib/sassc/version.rb +1 -1
  133. data/sassc.gemspec +19 -11
  134. data/test/engine_test.rb +26 -1
  135. data/test/native_test.rb +1 -1
  136. metadata +66 -72
  137. data/ext/Rakefile +0 -3
  138. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  139. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  140. data/ext/libsass/.travis.yml +0 -64
  141. data/ext/libsass/Readme.md +0 -104
  142. data/ext/libsass/SECURITY.md +0 -10
  143. data/ext/libsass/appveyor.yml +0 -91
  144. data/ext/libsass/docs/README.md +0 -20
  145. data/ext/libsass/docs/api-context-example.md +0 -45
  146. data/ext/libsass/docs/api-context-internal.md +0 -163
  147. data/ext/libsass/docs/api-context.md +0 -295
  148. data/ext/libsass/docs/api-doc.md +0 -215
  149. data/ext/libsass/docs/api-function-example.md +0 -67
  150. data/ext/libsass/docs/api-function-internal.md +0 -8
  151. data/ext/libsass/docs/api-function.md +0 -74
  152. data/ext/libsass/docs/api-importer-example.md +0 -112
  153. data/ext/libsass/docs/api-importer-internal.md +0 -20
  154. data/ext/libsass/docs/api-importer.md +0 -86
  155. data/ext/libsass/docs/api-value-example.md +0 -55
  156. data/ext/libsass/docs/api-value-internal.md +0 -76
  157. data/ext/libsass/docs/api-value.md +0 -154
  158. data/ext/libsass/docs/build-on-darwin.md +0 -27
  159. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  160. data/ext/libsass/docs/build-on-windows.md +0 -139
  161. data/ext/libsass/docs/build-shared-library.md +0 -35
  162. data/ext/libsass/docs/build-with-autotools.md +0 -78
  163. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  164. data/ext/libsass/docs/build-with-mingw.md +0 -107
  165. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  166. data/ext/libsass/docs/build.md +0 -97
  167. data/ext/libsass/docs/compatibility-plan.md +0 -48
  168. data/ext/libsass/docs/contributing.md +0 -17
  169. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  170. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  171. data/ext/libsass/docs/implementations.md +0 -56
  172. data/ext/libsass/docs/plugins.md +0 -47
  173. data/ext/libsass/docs/setup-environment.md +0 -68
  174. data/ext/libsass/docs/source-map-internals.md +0 -51
  175. data/ext/libsass/docs/trace.md +0 -26
  176. data/ext/libsass/docs/triage.md +0 -17
  177. data/ext/libsass/docs/unicode.md +0 -39
  178. data/ext/libsass/extconf.rb +0 -6
  179. data/ext/libsass/script/bootstrap +0 -13
  180. data/ext/libsass/script/branding +0 -10
  181. data/ext/libsass/script/ci-build-libsass +0 -134
  182. data/ext/libsass/script/ci-build-plugin +0 -62
  183. data/ext/libsass/script/ci-install-compiler +0 -6
  184. data/ext/libsass/script/ci-install-deps +0 -20
  185. data/ext/libsass/script/ci-report-coverage +0 -42
  186. data/ext/libsass/script/spec +0 -5
  187. data/ext/libsass/script/tap-driver +0 -652
  188. data/ext/libsass/script/tap-runner +0 -1
  189. data/ext/libsass/script/test-leaks.pl +0 -103
  190. data/ext/libsass/src/functions.cpp +0 -2234
  191. data/ext/libsass/src/functions.hpp +0 -198
  192. data/ext/libsass/src/to_c.hpp +0 -39
  193. data/ext/libsass/test/test_node.cpp +0 -94
  194. data/ext/libsass/test/test_paths.cpp +0 -28
  195. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  196. data/ext/libsass/test/test_specificity.cpp +0 -25
  197. data/ext/libsass/test/test_subset_map.cpp +0 -472
  198. data/ext/libsass/test/test_superselector.cpp +0 -69
  199. data/ext/libsass/test/test_unification.cpp +0 -31
  200. data/lib/tasks/libsass.rb +0 -33
@@ -12,10 +12,7 @@ namespace Sass {
12
12
  class Expand;
13
13
  class Context;
14
14
 
15
- class Eval : public Operation_CRTP<Expression_Ptr, Eval> {
16
-
17
- private:
18
- Expression_Ptr fallback_impl(AST_Node_Ptr n);
15
+ class Eval : public Operation_CRTP<Expression*, Eval> {
19
16
 
20
17
  public:
21
18
  Expand& exp;
@@ -32,72 +29,84 @@ namespace Sass {
32
29
  Boolean_Obj bool_false;
33
30
 
34
31
  Env* environment();
32
+ EnvStack& env_stack();
33
+ const std::string cwd();
35
34
  Selector_List_Obj selector();
35
+ CalleeStack& callee_stack();
36
+ SelectorStack& selector_stack();
37
+ bool& old_at_root_without_rule();
38
+ struct Sass_Inspect_Options& options();
39
+ struct Sass_Inspect_Options options2();
40
+ struct Sass_Compiler* compiler();
36
41
 
37
42
  // for evaluating function bodies
38
- Expression_Ptr operator()(Block_Ptr);
39
- Expression_Ptr operator()(Assignment_Ptr);
40
- Expression_Ptr operator()(If_Ptr);
41
- Expression_Ptr operator()(For_Ptr);
42
- Expression_Ptr operator()(Each_Ptr);
43
- Expression_Ptr operator()(While_Ptr);
44
- Expression_Ptr operator()(Return_Ptr);
45
- Expression_Ptr operator()(Warning_Ptr);
46
- Expression_Ptr operator()(Error_Ptr);
47
- Expression_Ptr operator()(Debug_Ptr);
48
-
49
- Expression_Ptr operator()(List_Ptr);
50
- Expression_Ptr operator()(Map_Ptr);
51
- Expression_Ptr operator()(Binary_Expression_Ptr);
52
- Expression_Ptr operator()(Unary_Expression_Ptr);
53
- Expression_Ptr operator()(Function_Call_Ptr);
54
- Expression_Ptr operator()(Function_Call_Schema_Ptr);
55
- Expression_Ptr operator()(Variable_Ptr);
56
- Expression_Ptr operator()(Number_Ptr);
57
- Expression_Ptr operator()(Color_Ptr);
58
- Expression_Ptr operator()(Boolean_Ptr);
59
- Expression_Ptr operator()(String_Schema_Ptr);
60
- Expression_Ptr operator()(String_Quoted_Ptr);
61
- Expression_Ptr operator()(String_Constant_Ptr);
62
- // Expression_Ptr operator()(Selector_List_Ptr);
63
- Media_Query_Ptr operator()(Media_Query_Ptr);
64
- Expression_Ptr operator()(Media_Query_Expression_Ptr);
65
- Expression_Ptr operator()(At_Root_Query_Ptr);
66
- Expression_Ptr operator()(Supports_Operator_Ptr);
67
- Expression_Ptr operator()(Supports_Negation_Ptr);
68
- Expression_Ptr operator()(Supports_Declaration_Ptr);
69
- Expression_Ptr operator()(Supports_Interpolation_Ptr);
70
- Expression_Ptr operator()(Null_Ptr);
71
- Expression_Ptr operator()(Argument_Ptr);
72
- Expression_Ptr operator()(Arguments_Ptr);
73
- Expression_Ptr operator()(Comment_Ptr);
43
+ Expression* operator()(Block*);
44
+ Expression* operator()(Assignment*);
45
+ Expression* operator()(If*);
46
+ Expression* operator()(For*);
47
+ Expression* operator()(Each*);
48
+ Expression* operator()(While*);
49
+ Expression* operator()(Return*);
50
+ Expression* operator()(Warning*);
51
+ Expression* operator()(Error*);
52
+ Expression* operator()(Debug*);
53
+
54
+ Expression* operator()(List*);
55
+ Expression* operator()(Map*);
56
+ Expression* operator()(Binary_Expression*);
57
+ Expression* operator()(Unary_Expression*);
58
+ Expression* operator()(Function_Call*);
59
+ Expression* operator()(Variable*);
60
+ Expression* operator()(Number*);
61
+ Expression* operator()(Color_RGBA*);
62
+ Expression* operator()(Color_HSLA*);
63
+ Expression* operator()(Boolean*);
64
+ Expression* operator()(String_Schema*);
65
+ Expression* operator()(String_Quoted*);
66
+ Expression* operator()(String_Constant*);
67
+ // Expression* operator()(Selector_List*);
68
+ Media_Query* operator()(Media_Query*);
69
+ Expression* operator()(Media_Query_Expression*);
70
+ Expression* operator()(At_Root_Query*);
71
+ Expression* operator()(Supports_Operator*);
72
+ Expression* operator()(Supports_Negation*);
73
+ Expression* operator()(Supports_Declaration*);
74
+ Expression* operator()(Supports_Interpolation*);
75
+ Expression* operator()(Null*);
76
+ Expression* operator()(Argument*);
77
+ Expression* operator()(Arguments*);
78
+ Expression* operator()(Comment*);
74
79
 
75
80
  // these will return selectors
76
- Selector_List_Ptr operator()(Selector_List_Ptr);
77
- Selector_List_Ptr operator()(Complex_Selector_Ptr);
78
- Compound_Selector_Ptr operator()(Compound_Selector_Ptr);
79
- Simple_Selector_Ptr operator()(Simple_Selector_Ptr s);
80
- Wrapped_Selector_Ptr operator()(Wrapped_Selector_Ptr s);
81
+ Selector_List* operator()(Selector_List*);
82
+ Selector_List* operator()(Complex_Selector*);
83
+ Compound_Selector* operator()(Compound_Selector*);
84
+ Simple_Selector* operator()(Simple_Selector* s);
85
+ Wrapped_Selector* operator()(Wrapped_Selector* s);
86
+
81
87
  // they don't have any specific implementation (yet)
82
- // Element_Selector_Ptr operator()(Element_Selector_Ptr s) { return s; };
83
- // Pseudo_Selector_Ptr operator()(Pseudo_Selector_Ptr s) { return s; };
84
- // Class_Selector_Ptr operator()(Class_Selector_Ptr s) { return s; };
85
- // Id_Selector_Ptr operator()(Id_Selector_Ptr s) { return s; };
86
- // Placeholder_Selector_Ptr operator()(Placeholder_Selector_Ptr s) { return s; };
88
+ Id_Selector* operator()(Id_Selector* s) { return s; };
89
+ Class_Selector* operator()(Class_Selector* s) { return s; };
90
+ Pseudo_Selector* operator()(Pseudo_Selector* s) { return s; };
91
+ Type_Selector* operator()(Type_Selector* s) { return s; };
92
+ Attribute_Selector* operator()(Attribute_Selector* s) { return s; };
93
+ Placeholder_Selector* operator()(Placeholder_Selector* s) { return s; };
94
+
87
95
  // actual evaluated selectors
88
- Selector_List_Ptr operator()(Selector_Schema_Ptr);
89
- Expression_Ptr operator()(Parent_Selector_Ptr);
96
+ Selector_List* operator()(Selector_Schema*);
97
+ Expression* operator()(Parent_Selector*);
98
+ Expression* operator()(Parent_Reference*);
90
99
 
100
+ // generic fallback
91
101
  template <typename U>
92
- Expression_Ptr fallback(U x) { return fallback_impl(x); }
102
+ Expression* fallback(U x)
103
+ { return Cast<Expression>(x); }
93
104
 
94
105
  private:
95
106
  void interpolation(Context& ctx, std::string& res, Expression_Obj ex, bool into_quotes, bool was_itpl = false);
96
107
 
97
108
  };
98
109
 
99
- Expression_Ptr cval_to_astnode(union Sass_Value* v, Backtraces traces, ParserState pstate = ParserState("[AST]"));
100
-
101
110
  }
102
111
 
103
112
  #endif
@@ -1,4 +1,7 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include <iostream>
3
6
  #include <typeinfo>
4
7
 
@@ -16,7 +19,7 @@ namespace Sass {
16
19
  // simple endless recursion protection
17
20
  const size_t maxRecursion = 500;
18
21
 
19
- Expand::Expand(Context& ctx, Env* env, std::vector<Selector_List_Obj>* stack)
22
+ Expand::Expand(Context& ctx, Env* env, SelectorStack* stack)
20
23
  : ctx(ctx),
21
24
  traces(ctx.traces),
22
25
  eval(Eval(*this)),
@@ -24,19 +27,19 @@ namespace Sass {
24
27
  in_keyframes(false),
25
28
  at_root_without_rule(false),
26
29
  old_at_root_without_rule(false),
27
- env_stack(std::vector<Env*>()),
28
- block_stack(std::vector<Block_Ptr>()),
29
- call_stack(std::vector<AST_Node_Obj>()),
30
- selector_stack(std::vector<Selector_List_Obj>()),
31
- media_block_stack(std::vector<Media_Block_Ptr>())
30
+ env_stack(EnvStack()),
31
+ block_stack(BlockStack()),
32
+ call_stack(CallStack()),
33
+ selector_stack(SelectorStack()),
34
+ media_stack(MediaStack())
32
35
  {
33
- env_stack.push_back(0);
36
+ env_stack.push_back(nullptr);
34
37
  env_stack.push_back(env);
35
- block_stack.push_back(0);
36
- call_stack.push_back(0);
37
- if (stack == NULL) { selector_stack.push_back(0); }
38
+ block_stack.push_back(nullptr);
39
+ call_stack.push_back({});
40
+ if (stack == NULL) { selector_stack.push_back({}); }
38
41
  else { selector_stack.insert(selector_stack.end(), stack->begin(), stack->end()); }
39
- media_block_stack.push_back(0);
42
+ media_stack.push_back(nullptr);
40
43
  }
41
44
 
42
45
  Env* Expand::environment()
@@ -50,11 +53,11 @@ namespace Sass {
50
53
  {
51
54
  if (selector_stack.size() > 0)
52
55
  return selector_stack.back();
53
- return 0;
56
+ return {};
54
57
  }
55
58
 
56
59
  // blocks create new variable scopes
57
- Block_Ptr Expand::operator()(Block_Ptr b)
60
+ Block* Expand::operator()(Block* b)
58
61
  {
59
62
  // create new local environment
60
63
  // set the current env as parent
@@ -77,16 +80,16 @@ namespace Sass {
77
80
  return bb.detach();
78
81
  }
79
82
 
80
- Statement_Ptr Expand::operator()(Ruleset_Ptr r)
83
+ Statement* Expand::operator()(Ruleset* r)
81
84
  {
82
85
  LOCAL_FLAG(old_at_root_without_rule, at_root_without_rule);
83
86
 
84
87
  if (in_keyframes) {
85
- Block_Ptr bb = operator()(r->block());
88
+ Block* bb = operator()(r->block());
86
89
  Keyframe_Rule_Obj k = SASS_MEMORY_NEW(Keyframe_Rule, r->pstate(), bb);
87
90
  if (r->selector()) {
88
- if (Selector_List_Ptr s = r->selector()) {
89
- selector_stack.push_back(0);
91
+ if (Selector_List* s = r->selector()) {
92
+ selector_stack.push_back({});
90
93
  k->name(s->eval(eval));
91
94
  selector_stack.pop_back();
92
95
  }
@@ -109,12 +112,12 @@ namespace Sass {
109
112
 
110
113
  // check for parent selectors in base level rules
111
114
  if (r->is_root() || (block_stack.back() && block_stack.back()->is_root())) {
112
- if (Selector_List_Ptr selector_list = Cast<Selector_List>(r->selector())) {
115
+ if (Selector_List* selector_list = Cast<Selector_List>(r->selector())) {
113
116
  for (Complex_Selector_Obj complex_selector : selector_list->elements()) {
114
- Complex_Selector_Ptr tail = complex_selector;
117
+ Complex_Selector* tail = complex_selector;
115
118
  while (tail) {
116
119
  if (tail->head()) for (Simple_Selector_Obj header : tail->head()->elements()) {
117
- Parent_Selector_Ptr ptr = Cast<Parent_Selector>(header);
120
+ Parent_Selector* ptr = Cast<Parent_Selector>(header);
118
121
  if (ptr == NULL || (!ptr->real() || has_parent_selector)) continue;
119
122
  std::string sel_str(complex_selector->to_string(ctx.c_options));
120
123
  error("Base-level rules cannot contain the parent-selector-referencing character '&'.", header->pstate(), traces);
@@ -139,10 +142,10 @@ namespace Sass {
139
142
  if (block_stack.back()->is_root()) {
140
143
  env_stack.push_back(&env);
141
144
  }
142
- sel->set_media_block(media_block_stack.back());
143
- Block_Obj blk = 0;
145
+ sel->set_media_block(media_stack.back());
146
+ Block_Obj blk;
144
147
  if (r->block()) blk = operator()(r->block());
145
- Ruleset_Ptr rr = SASS_MEMORY_NEW(Ruleset,
148
+ Ruleset* rr = SASS_MEMORY_NEW(Ruleset,
146
149
  r->pstate(),
147
150
  sel,
148
151
  blk);
@@ -157,7 +160,7 @@ namespace Sass {
157
160
  return rr;
158
161
  }
159
162
 
160
- Statement_Ptr Expand::operator()(Supports_Block_Ptr f)
163
+ Statement* Expand::operator()(Supports_Block* f)
161
164
  {
162
165
  Expression_Obj condition = f->condition()->perform(&eval);
163
166
  Supports_Block_Obj ff = SASS_MEMORY_NEW(Supports_Block,
@@ -167,7 +170,7 @@ namespace Sass {
167
170
  return ff.detach();
168
171
  }
169
172
 
170
- Statement_Ptr Expand::operator()(Media_Block_Ptr m)
173
+ Statement* Expand::operator()(Media_Block* m)
171
174
  {
172
175
  Media_Block_Obj cpy = SASS_MEMORY_COPY(m);
173
176
  // Media_Blocks are prone to have circular references
@@ -175,7 +178,7 @@ namespace Sass {
175
178
  // Looks like we are able to reset block reference for copy
176
179
  // Good as it will ensure a low memory overhead for this fix
177
180
  // So this is a cheap solution with a minimal price
178
- ctx.ast_gc.push_back(cpy); cpy->block(0);
181
+ ctx.ast_gc.push_back(cpy); cpy->block({});
179
182
  Expression_Obj mq = eval(m->media_queries());
180
183
  std::string str_mq(mq->to_string(ctx.c_options));
181
184
  char* str = sass_copy_c_string(str_mq.c_str());
@@ -183,18 +186,18 @@ namespace Sass {
183
186
  Parser p(Parser::from_c_str(str, ctx, traces, mq->pstate()));
184
187
  mq = p.parse_media_queries(); // re-assign now
185
188
  cpy->media_queries(mq);
186
- media_block_stack.push_back(cpy);
189
+ media_stack.push_back(cpy);
187
190
  Block_Obj blk = operator()(m->block());
188
- Media_Block_Ptr mm = SASS_MEMORY_NEW(Media_Block,
191
+ Media_Block* mm = SASS_MEMORY_NEW(Media_Block,
189
192
  m->pstate(),
190
193
  mq,
191
194
  blk);
192
- media_block_stack.pop_back();
195
+ media_stack.pop_back();
193
196
  mm->tabs(m->tabs());
194
197
  return mm;
195
198
  }
196
199
 
197
- Statement_Ptr Expand::operator()(At_Root_Block_Ptr a)
200
+ Statement* Expand::operator()(At_Root_Block* a)
198
201
  {
199
202
  Block_Obj ab = a->block();
200
203
  Expression_Obj ae = a->expression();
@@ -202,7 +205,7 @@ namespace Sass {
202
205
  if (ae) ae = ae->perform(&eval);
203
206
  else ae = SASS_MEMORY_NEW(At_Root_Query, a->pstate());
204
207
 
205
- LOCAL_FLAG(at_root_without_rule, true);
208
+ LOCAL_FLAG(at_root_without_rule, Cast<At_Root_Query>(ae)->exclude("rule"));
206
209
  LOCAL_FLAG(in_keyframes, false);
207
210
 
208
211
  ;
@@ -215,18 +218,18 @@ namespace Sass {
215
218
  return aa.detach();
216
219
  }
217
220
 
218
- Statement_Ptr Expand::operator()(Directive_Ptr a)
221
+ Statement* Expand::operator()(Directive* a)
219
222
  {
220
223
  LOCAL_FLAG(in_keyframes, a->is_keyframes());
221
- Block_Ptr ab = a->block();
222
- Selector_List_Ptr as = a->selector();
223
- Expression_Ptr av = a->value();
224
- selector_stack.push_back(0);
224
+ Block* ab = a->block();
225
+ Selector_List* as = a->selector();
226
+ Expression* av = a->value();
227
+ selector_stack.push_back({});
225
228
  if (av) av = av->perform(&eval);
226
229
  if (as) as = eval(as);
227
230
  selector_stack.pop_back();
228
- Block_Ptr bb = ab ? operator()(ab) : NULL;
229
- Directive_Ptr aa = SASS_MEMORY_NEW(Directive,
231
+ Block* bb = ab ? operator()(ab) : NULL;
232
+ Directive* aa = SASS_MEMORY_NEW(Directive,
230
233
  a->pstate(),
231
234
  a->keyword(),
232
235
  as,
@@ -235,7 +238,7 @@ namespace Sass {
235
238
  return aa;
236
239
  }
237
240
 
238
- Statement_Ptr Expand::operator()(Declaration_Ptr d)
241
+ Statement* Expand::operator()(Declaration* d)
239
242
  {
240
243
  Block_Obj ab = d->block();
241
244
  String_Obj old_p = d->property();
@@ -246,12 +249,19 @@ namespace Sass {
246
249
  std::string str(prop->to_string(ctx.c_options));
247
250
  new_p = SASS_MEMORY_NEW(String_Constant, old_p->pstate(), str);
248
251
  }
249
- Expression_Obj value = d->value()->perform(&eval);
252
+ Expression_Obj value = d->value();
253
+ if (value) value = value->perform(&eval);
250
254
  Block_Obj bb = ab ? operator()(ab) : NULL;
251
255
  if (!bb) {
252
- if (!value || (value->is_invisible() && !d->is_important())) return 0;
256
+ if (!value || (value->is_invisible() && !d->is_important())) {
257
+ if (d->is_custom_property()) {
258
+ error("Custom property values may not be empty.", d->value()->pstate(), traces);
259
+ } else {
260
+ return nullptr;
261
+ }
262
+ }
253
263
  }
254
- Declaration_Ptr decl = SASS_MEMORY_NEW(Declaration,
264
+ Declaration* decl = SASS_MEMORY_NEW(Declaration,
255
265
  d->pstate(),
256
266
  new_p,
257
267
  value,
@@ -262,7 +272,7 @@ namespace Sass {
262
272
  return decl;
263
273
  }
264
274
 
265
- Statement_Ptr Expand::operator()(Assignment_Ptr a)
275
+ Statement* Expand::operator()(Assignment* a)
266
276
  {
267
277
  Env* env = environment();
268
278
  const std::string& var(a->variable());
@@ -323,7 +333,7 @@ namespace Sass {
323
333
  return 0;
324
334
  }
325
335
 
326
- Statement_Ptr Expand::operator()(Import_Ptr imp)
336
+ Statement* Expand::operator()(Import* imp)
327
337
  {
328
338
  Import_Obj result = SASS_MEMORY_NEW(Import, imp->pstate());
329
339
  if (imp->import_queries() && imp->import_queries()->size()) {
@@ -338,7 +348,7 @@ namespace Sass {
338
348
  return result.detach();
339
349
  }
340
350
 
341
- Statement_Ptr Expand::operator()(Import_Stub_Ptr i)
351
+ Statement* Expand::operator()(Import_Stub* i)
342
352
  {
343
353
  traces.push_back(Backtrace(i->pstate()));
344
354
  // get parent node from call stack
@@ -368,28 +378,28 @@ namespace Sass {
368
378
  return 0;
369
379
  }
370
380
 
371
- Statement_Ptr Expand::operator()(Warning_Ptr w)
381
+ Statement* Expand::operator()(Warning* w)
372
382
  {
373
383
  // eval handles this too, because warnings may occur in functions
374
384
  w->perform(&eval);
375
385
  return 0;
376
386
  }
377
387
 
378
- Statement_Ptr Expand::operator()(Error_Ptr e)
388
+ Statement* Expand::operator()(Error* e)
379
389
  {
380
390
  // eval handles this too, because errors may occur in functions
381
391
  e->perform(&eval);
382
392
  return 0;
383
393
  }
384
394
 
385
- Statement_Ptr Expand::operator()(Debug_Ptr d)
395
+ Statement* Expand::operator()(Debug* d)
386
396
  {
387
397
  // eval handles this too, because warnings may occur in functions
388
398
  d->perform(&eval);
389
399
  return 0;
390
400
  }
391
401
 
392
- Statement_Ptr Expand::operator()(Comment_Ptr c)
402
+ Statement* Expand::operator()(Comment* c)
393
403
  {
394
404
  if (ctx.output_style() == COMPRESSED) {
395
405
  // comments should not be evaluated in compact
@@ -397,13 +407,13 @@ namespace Sass {
397
407
  if (!c->is_important()) return NULL;
398
408
  }
399
409
  eval.is_in_comment = true;
400
- Comment_Ptr rv = SASS_MEMORY_NEW(Comment, c->pstate(), Cast<String>(c->text()->perform(&eval)), c->is_important());
410
+ Comment* rv = SASS_MEMORY_NEW(Comment, c->pstate(), Cast<String>(c->text()->perform(&eval)), c->is_important());
401
411
  eval.is_in_comment = false;
402
412
  // TODO: eval the text, once we're parsing/storing it as a String_Schema
403
413
  return rv;
404
414
  }
405
415
 
406
- Statement_Ptr Expand::operator()(If_Ptr i)
416
+ Statement* Expand::operator()(If* i)
407
417
  {
408
418
  Env env(environment(), true);
409
419
  env_stack.push_back(&env);
@@ -413,7 +423,7 @@ namespace Sass {
413
423
  append_block(i->block());
414
424
  }
415
425
  else {
416
- Block_Ptr alt = i->alternative();
426
+ Block* alt = i->alternative();
417
427
  if (alt) append_block(alt);
418
428
  }
419
429
  call_stack.pop_back();
@@ -423,7 +433,7 @@ namespace Sass {
423
433
 
424
434
  // For does not create a new env scope
425
435
  // But iteration vars are reset afterwards
426
- Statement_Ptr Expand::operator()(For_Ptr f)
436
+ Statement* Expand::operator()(For* f)
427
437
  {
428
438
  std::string variable(f->variable());
429
439
  Expression_Obj low = f->lower_bound()->perform(&eval);
@@ -451,7 +461,7 @@ namespace Sass {
451
461
  Env env(environment(), true);
452
462
  env_stack.push_back(&env);
453
463
  call_stack.push_back(f);
454
- Block_Ptr body = f->block();
464
+ Block* body = f->block();
455
465
  if (start < end) {
456
466
  if (f->is_inclusive()) ++end;
457
467
  for (double i = start;
@@ -478,16 +488,16 @@ namespace Sass {
478
488
 
479
489
  // Eval does not create a new env scope
480
490
  // But iteration vars are reset afterwards
481
- Statement_Ptr Expand::operator()(Each_Ptr e)
491
+ Statement* Expand::operator()(Each* e)
482
492
  {
483
493
  std::vector<std::string> variables(e->variables());
484
494
  Expression_Obj expr = e->list()->perform(&eval);
485
- List_Obj list = 0;
495
+ List_Obj list;
486
496
  Map_Obj map;
487
497
  if (expr->concrete_type() == Expression::MAP) {
488
498
  map = Cast<Map>(expr);
489
499
  }
490
- else if (Selector_List_Ptr ls = Cast<Selector_List>(expr)) {
500
+ else if (Selector_List* ls = Cast<Selector_List>(expr)) {
491
501
  Listize listize;
492
502
  Expression_Obj rv = ls->perform(&listize);
493
503
  list = Cast<List>(rv);
@@ -503,7 +513,7 @@ namespace Sass {
503
513
  Env env(environment(), true);
504
514
  env_stack.push_back(&env);
505
515
  call_stack.push_back(e);
506
- Block_Ptr body = e->block();
516
+ Block* body = e->block();
507
517
 
508
518
  if (map) {
509
519
  for (auto key : map->keys()) {
@@ -562,10 +572,10 @@ namespace Sass {
562
572
  return 0;
563
573
  }
564
574
 
565
- Statement_Ptr Expand::operator()(While_Ptr w)
575
+ Statement* Expand::operator()(While* w)
566
576
  {
567
577
  Expression_Obj pred = w->predicate();
568
- Block_Ptr body = w->block();
578
+ Block* body = w->block();
569
579
  Env env(environment(), true);
570
580
  env_stack.push_back(&env);
571
581
  call_stack.push_back(w);
@@ -579,7 +589,7 @@ namespace Sass {
579
589
  return 0;
580
590
  }
581
591
 
582
- Statement_Ptr Expand::operator()(Return_Ptr r)
592
+ Statement* Expand::operator()(Return* r)
583
593
  {
584
594
  error("@return may only be used within a function", r->pstate(), traces);
585
595
  return 0;
@@ -637,13 +647,13 @@ namespace Sass {
637
647
 
638
648
  }
639
649
 
640
- Statement* Expand::operator()(Extension_Ptr e)
650
+ Statement* Expand::operator()(Extension* e)
641
651
  {
642
- if (Selector_List_Ptr extender = selector()) {
643
- Selector_List_Ptr sl = e->selector();
652
+ if (Selector_List_Obj extender = selector()) {
653
+ Selector_List* sl = e->selector();
644
654
  // abort on invalid selector
645
655
  if (sl == NULL) return NULL;
646
- if (Selector_Schema_Ptr schema = sl->schema()) {
656
+ if (Selector_Schema* schema = sl->schema()) {
647
657
  if (schema->has_real_parent_ref()) {
648
658
  // put root block on stack again (ignore parents)
649
659
  // selector schema must not connect in eval!
@@ -651,24 +661,24 @@ namespace Sass {
651
661
  sl = eval(sl->schema());
652
662
  block_stack.pop_back();
653
663
  } else {
654
- selector_stack.push_back(0);
664
+ selector_stack.push_back({});
655
665
  sl = eval(sl->schema());
656
666
  selector_stack.pop_back();
657
667
  }
658
668
  }
659
669
  for (Complex_Selector_Obj cs : sl->elements()) {
660
670
  if (!cs.isNull() && !cs->head().isNull()) {
661
- cs->head()->media_block(media_block_stack.back());
671
+ cs->head()->media_block(media_stack.back());
662
672
  }
663
673
  }
664
- selector_stack.push_back(0);
674
+ selector_stack.push_back({});
665
675
  expand_selector_list(sl, extender);
666
676
  selector_stack.pop_back();
667
677
  }
668
678
  return 0;
669
679
  }
670
680
 
671
- Statement_Ptr Expand::operator()(Definition_Ptr d)
681
+ Statement* Expand::operator()(Definition* d)
672
682
  {
673
683
  Env* env = environment();
674
684
  Definition_Obj dd = SASS_MEMORY_COPY(d);
@@ -693,7 +703,7 @@ namespace Sass {
693
703
  return 0;
694
704
  }
695
705
 
696
- Statement_Ptr Expand::operator()(Mixin_Call_Ptr c)
706
+ Statement* Expand::operator()(Mixin_Call* c)
697
707
  {
698
708
  if (recursions > maxRecursion) {
699
709
  throw Exception::StackError(traces, *c);
@@ -729,29 +739,31 @@ namespace Sass {
729
739
  Env new_env(def->environment());
730
740
  env_stack.push_back(&new_env);
731
741
  if (c->block()) {
742
+ Parameters_Obj params = c->block_parameters();
743
+ if (!params) params = SASS_MEMORY_NEW(Parameters, c->pstate());
732
744
  // represent mixin content blocks as thunks/closures
733
745
  Definition_Obj thunk = SASS_MEMORY_NEW(Definition,
734
746
  c->pstate(),
735
747
  "@content",
736
- SASS_MEMORY_NEW(Parameters, c->pstate()),
748
+ params,
737
749
  c->block(),
738
750
  Definition::MIXIN);
739
751
  thunk->environment(env);
740
752
  new_env.local_frame()["@content[m]"] = thunk;
741
753
  }
742
754
 
743
- bind(std::string("Mixin"), c->name(), params, args, &ctx, &new_env, &eval);
755
+ bind(std::string("Mixin"), c->name(), params, args, &new_env, &eval, traces);
744
756
 
745
757
  Block_Obj trace_block = SASS_MEMORY_NEW(Block, c->pstate());
746
758
  Trace_Obj trace = SASS_MEMORY_NEW(Trace, c->pstate(), c->name(), trace_block);
747
759
 
748
760
  env->set_global("is_in_mixin", bool_true);
749
- if (Block_Ptr pr = block_stack.back()) {
761
+ if (Block* pr = block_stack.back()) {
750
762
  trace_block->is_root(pr->is_root());
751
763
  }
752
764
  block_stack.push_back(trace_block);
753
765
  for (auto bb : body->elements()) {
754
- if (Ruleset_Ptr r = Cast<Ruleset>(bb)) {
766
+ if (Ruleset* r = Cast<Ruleset>(bb)) {
755
767
  r->is_root(trace_block->is_root());
756
768
  }
757
769
  Statement_Obj ith = bb->perform(this);
@@ -768,20 +780,23 @@ namespace Sass {
768
780
  return trace.detach();
769
781
  }
770
782
 
771
- Statement_Ptr Expand::operator()(Content_Ptr c)
783
+ Statement* Expand::operator()(Content* c)
772
784
  {
773
785
  Env* env = environment();
774
786
  // convert @content directives into mixin calls to the underlying thunk
775
787
  if (!env->has("@content[m]")) return 0;
776
788
 
777
789
  if (block_stack.back()->is_root()) {
778
- selector_stack.push_back(0);
790
+ selector_stack.push_back({});
779
791
  }
780
792
 
793
+ Arguments_Obj args = c->arguments();
794
+ if (!args) args = SASS_MEMORY_NEW(Arguments, c->pstate());
795
+
781
796
  Mixin_Call_Obj call = SASS_MEMORY_NEW(Mixin_Call,
782
797
  c->pstate(),
783
798
  "@content",
784
- SASS_MEMORY_NEW(Arguments, c->pstate()));
799
+ args);
785
800
 
786
801
  Trace_Obj trace = Cast<Trace>(call->perform(this));
787
802
 
@@ -792,21 +807,12 @@ namespace Sass {
792
807
  return trace.detach();
793
808
  }
794
809
 
795
- // produce an error if something is not implemented
796
- inline Statement_Ptr Expand::fallback_impl(AST_Node_Ptr n)
797
- {
798
- std::string err =std:: string("`Expand` doesn't handle ") + typeid(*n).name();
799
- String_Quoted_Obj msg = SASS_MEMORY_NEW(String_Quoted, ParserState("[WARN]"), err);
800
- error("unknown internal error; please contact the LibSass maintainers", n->pstate(), traces);
801
- return SASS_MEMORY_NEW(Warning, ParserState("[WARN]"), msg);
802
- }
803
-
804
810
  // process and add to last block on stack
805
- inline void Expand::append_block(Block_Ptr b)
811
+ inline void Expand::append_block(Block* b)
806
812
  {
807
813
  if (b->is_root()) call_stack.push_back(b);
808
814
  for (size_t i = 0, L = b->length(); i < L; ++i) {
809
- Statement_Ptr stm = b->at(i);
815
+ Statement* stm = b->at(i);
810
816
  Statement_Obj ith = stm->perform(this);
811
817
  if (ith) block_stack.back()->append(ith);
812
818
  }