sassc 2.0.1 → 2.1.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
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
  }