sassc 2.2.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG.md +18 -0
  4. data/Rakefile +1 -3
  5. data/ext/extconf.rb +13 -5
  6. data/ext/libsass/VERSION +1 -1
  7. data/ext/libsass/include/sass/base.h +2 -1
  8. data/ext/libsass/include/sass/context.h +4 -0
  9. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  10. data/ext/libsass/src/ast.cpp +158 -168
  11. data/ext/libsass/src/ast.hpp +389 -230
  12. data/ext/libsass/src/ast_def_macros.hpp +18 -10
  13. data/ext/libsass/src/ast_fwd_decl.cpp +4 -3
  14. data/ext/libsass/src/ast_fwd_decl.hpp +98 -165
  15. data/ext/libsass/src/ast_helpers.hpp +292 -0
  16. data/ext/libsass/src/ast_sel_cmp.cpp +219 -732
  17. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  18. data/ext/libsass/src/ast_sel_unify.cpp +207 -212
  19. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  20. data/ext/libsass/src/ast_selectors.cpp +594 -1026
  21. data/ext/libsass/src/ast_selectors.hpp +339 -385
  22. data/ext/libsass/src/ast_supports.cpp +36 -52
  23. data/ext/libsass/src/ast_supports.hpp +29 -29
  24. data/ext/libsass/src/ast_values.cpp +271 -84
  25. data/ext/libsass/src/ast_values.hpp +116 -107
  26. data/ext/libsass/src/backtrace.cpp +9 -9
  27. data/ext/libsass/src/backtrace.hpp +5 -5
  28. data/ext/libsass/src/base64vlq.cpp +2 -2
  29. data/ext/libsass/src/base64vlq.hpp +1 -1
  30. data/ext/libsass/src/bind.cpp +18 -18
  31. data/ext/libsass/src/bind.hpp +1 -1
  32. data/ext/libsass/src/c2ast.cpp +3 -3
  33. data/ext/libsass/src/c2ast.hpp +1 -1
  34. data/ext/libsass/src/cencode.c +4 -6
  35. data/ext/libsass/src/check_nesting.cpp +40 -41
  36. data/ext/libsass/src/check_nesting.hpp +6 -2
  37. data/ext/libsass/src/color_maps.cpp +14 -13
  38. data/ext/libsass/src/color_maps.hpp +1 -9
  39. data/ext/libsass/src/constants.cpp +5 -0
  40. data/ext/libsass/src/constants.hpp +6 -0
  41. data/ext/libsass/src/context.cpp +92 -119
  42. data/ext/libsass/src/context.hpp +41 -53
  43. data/ext/libsass/src/cssize.cpp +66 -149
  44. data/ext/libsass/src/cssize.hpp +17 -23
  45. data/ext/libsass/src/dart_helpers.hpp +199 -0
  46. data/ext/libsass/src/debugger.hpp +451 -295
  47. data/ext/libsass/src/emitter.cpp +15 -16
  48. data/ext/libsass/src/emitter.hpp +10 -12
  49. data/ext/libsass/src/environment.cpp +27 -27
  50. data/ext/libsass/src/environment.hpp +29 -24
  51. data/ext/libsass/src/error_handling.cpp +62 -41
  52. data/ext/libsass/src/error_handling.hpp +61 -51
  53. data/ext/libsass/src/eval.cpp +167 -281
  54. data/ext/libsass/src/eval.hpp +27 -29
  55. data/ext/libsass/src/eval_selectors.cpp +75 -0
  56. data/ext/libsass/src/expand.cpp +275 -222
  57. data/ext/libsass/src/expand.hpp +36 -16
  58. data/ext/libsass/src/extender.cpp +1188 -0
  59. data/ext/libsass/src/extender.hpp +399 -0
  60. data/ext/libsass/src/extension.cpp +43 -0
  61. data/ext/libsass/src/extension.hpp +89 -0
  62. data/ext/libsass/src/file.cpp +81 -72
  63. data/ext/libsass/src/file.hpp +28 -37
  64. data/ext/libsass/src/fn_colors.cpp +20 -18
  65. data/ext/libsass/src/fn_lists.cpp +30 -29
  66. data/ext/libsass/src/fn_maps.cpp +3 -3
  67. data/ext/libsass/src/fn_miscs.cpp +34 -46
  68. data/ext/libsass/src/fn_numbers.cpp +20 -13
  69. data/ext/libsass/src/fn_selectors.cpp +98 -128
  70. data/ext/libsass/src/fn_strings.cpp +47 -33
  71. data/ext/libsass/src/fn_utils.cpp +31 -29
  72. data/ext/libsass/src/fn_utils.hpp +17 -11
  73. data/ext/libsass/src/inspect.cpp +186 -148
  74. data/ext/libsass/src/inspect.hpp +31 -29
  75. data/ext/libsass/src/lexer.cpp +20 -82
  76. data/ext/libsass/src/lexer.hpp +5 -16
  77. data/ext/libsass/src/listize.cpp +23 -37
  78. data/ext/libsass/src/listize.hpp +8 -9
  79. data/ext/libsass/src/mapping.hpp +1 -0
  80. data/ext/libsass/src/memory/allocator.cpp +48 -0
  81. data/ext/libsass/src/memory/allocator.hpp +138 -0
  82. data/ext/libsass/src/memory/config.hpp +20 -0
  83. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  84. data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
  85. data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
  86. data/ext/libsass/src/memory.hpp +12 -0
  87. data/ext/libsass/src/operation.hpp +71 -61
  88. data/ext/libsass/src/operators.cpp +19 -18
  89. data/ext/libsass/src/operators.hpp +11 -11
  90. data/ext/libsass/src/ordered_map.hpp +112 -0
  91. data/ext/libsass/src/output.cpp +45 -64
  92. data/ext/libsass/src/output.hpp +6 -6
  93. data/ext/libsass/src/parser.cpp +512 -700
  94. data/ext/libsass/src/parser.hpp +89 -97
  95. data/ext/libsass/src/parser_selectors.cpp +189 -0
  96. data/ext/libsass/src/permutate.hpp +164 -0
  97. data/ext/libsass/src/plugins.cpp +7 -7
  98. data/ext/libsass/src/plugins.hpp +8 -8
  99. data/ext/libsass/src/position.cpp +7 -26
  100. data/ext/libsass/src/position.hpp +44 -21
  101. data/ext/libsass/src/prelexer.cpp +6 -6
  102. data/ext/libsass/src/remove_placeholders.cpp +55 -56
  103. data/ext/libsass/src/remove_placeholders.hpp +21 -18
  104. data/ext/libsass/src/sass.cpp +16 -15
  105. data/ext/libsass/src/sass.hpp +10 -5
  106. data/ext/libsass/src/sass2scss.cpp +4 -4
  107. data/ext/libsass/src/sass_context.cpp +91 -122
  108. data/ext/libsass/src/sass_context.hpp +2 -2
  109. data/ext/libsass/src/sass_functions.cpp +1 -1
  110. data/ext/libsass/src/sass_values.cpp +8 -11
  111. data/ext/libsass/src/settings.hpp +19 -0
  112. data/ext/libsass/src/source.cpp +69 -0
  113. data/ext/libsass/src/source.hpp +95 -0
  114. data/ext/libsass/src/source_data.hpp +32 -0
  115. data/ext/libsass/src/source_map.cpp +22 -18
  116. data/ext/libsass/src/source_map.hpp +12 -9
  117. data/ext/libsass/src/stylesheet.cpp +22 -0
  118. data/ext/libsass/src/stylesheet.hpp +57 -0
  119. data/ext/libsass/src/to_value.cpp +2 -2
  120. data/ext/libsass/src/to_value.hpp +1 -1
  121. data/ext/libsass/src/units.cpp +24 -22
  122. data/ext/libsass/src/units.hpp +8 -8
  123. data/ext/libsass/src/utf8_string.cpp +9 -10
  124. data/ext/libsass/src/utf8_string.hpp +7 -6
  125. data/ext/libsass/src/util.cpp +48 -50
  126. data/ext/libsass/src/util.hpp +20 -21
  127. data/ext/libsass/src/util_string.cpp +111 -61
  128. data/ext/libsass/src/util_string.hpp +62 -8
  129. data/ext/libsass/src/values.cpp +12 -12
  130. data/lib/sassc/engine.rb +5 -3
  131. data/lib/sassc/functions_handler.rb +8 -8
  132. data/lib/sassc/native.rb +4 -6
  133. data/lib/sassc/script.rb +4 -4
  134. data/lib/sassc/version.rb +1 -1
  135. data/test/functions_test.rb +18 -1
  136. data/test/native_test.rb +4 -4
  137. metadata +29 -15
  138. data/ext/libsass/src/extend.cpp +0 -2132
  139. data/ext/libsass/src/extend.hpp +0 -86
  140. data/ext/libsass/src/node.cpp +0 -322
  141. data/ext/libsass/src/node.hpp +0 -118
  142. data/ext/libsass/src/paths.hpp +0 -71
  143. data/ext/libsass/src/sass_util.cpp +0 -152
  144. data/ext/libsass/src/sass_util.hpp +0 -256
  145. data/ext/libsass/src/subset_map.cpp +0 -58
  146. data/ext/libsass/src/subset_map.hpp +0 -76
  147. data/lib/sassc/native/lib_c.rb +0 -21
@@ -2,6 +2,7 @@
2
2
  // __EXTENSIONS__ fix on Solaris.
3
3
  #include "sass.hpp"
4
4
 
5
+ #include <cmath>
5
6
  #include "operators.hpp"
6
7
 
7
8
  namespace Sass {
@@ -30,7 +31,7 @@ namespace Sass {
30
31
  };
31
32
 
32
33
  /* static function, has no pstate or traces */
33
- bool eq(Expression_Obj lhs, Expression_Obj rhs)
34
+ bool eq(ExpressionObj lhs, ExpressionObj rhs)
34
35
  {
35
36
  // operation is undefined if one is not a number
36
37
  if (!lhs || !rhs) throw Exception::UndefinedOperation(lhs, rhs, Sass_OP::EQ);
@@ -39,7 +40,7 @@ namespace Sass {
39
40
  }
40
41
 
41
42
  /* static function, throws OperationError, has no pstate or traces */
42
- bool cmp(Expression_Obj lhs, Expression_Obj rhs, const Sass_OP op)
43
+ bool cmp(ExpressionObj lhs, ExpressionObj rhs, const Sass_OP op)
43
44
  {
44
45
  // can only compare numbers!?
45
46
  Number_Obj l = Cast<Number>(lhs);
@@ -51,14 +52,14 @@ namespace Sass {
51
52
  }
52
53
 
53
54
  /* static functions, throws OperationError, has no pstate or traces */
54
- bool lt(Expression_Obj lhs, Expression_Obj rhs) { return cmp(lhs, rhs, Sass_OP::LT); }
55
- bool neq(Expression_Obj lhs, Expression_Obj rhs) { return eq(lhs, rhs) == false; }
56
- bool gt(Expression_Obj lhs, Expression_Obj rhs) { return !cmp(lhs, rhs, Sass_OP::GT) && neq(lhs, rhs); }
57
- bool lte(Expression_Obj lhs, Expression_Obj rhs) { return cmp(lhs, rhs, Sass_OP::LTE) || eq(lhs, rhs); }
58
- bool gte(Expression_Obj lhs, Expression_Obj rhs) { return !cmp(lhs, rhs, Sass_OP::GTE) || eq(lhs, rhs); }
55
+ bool lt(ExpressionObj lhs, ExpressionObj rhs) { return cmp(lhs, rhs, Sass_OP::LT); }
56
+ bool neq(ExpressionObj lhs, ExpressionObj rhs) { return eq(lhs, rhs) == false; }
57
+ bool gt(ExpressionObj lhs, ExpressionObj rhs) { return !cmp(lhs, rhs, Sass_OP::GT) && neq(lhs, rhs); }
58
+ bool lte(ExpressionObj lhs, ExpressionObj rhs) { return cmp(lhs, rhs, Sass_OP::LTE) || eq(lhs, rhs); }
59
+ bool gte(ExpressionObj lhs, ExpressionObj rhs) { return !cmp(lhs, rhs, Sass_OP::GTE) || eq(lhs, rhs); }
59
60
 
60
61
  /* colour math deprecation warning */
61
- void op_color_deprecation(enum Sass_OP op, std::string lsh, std::string rhs, const ParserState& pstate)
62
+ void op_color_deprecation(enum Sass_OP op, sass::string lsh, sass::string rhs, const SourceSpan& pstate)
62
63
  {
63
64
  deprecated(
64
65
  "The operation `" + lsh + " " + sass_op_to_name(op) + " " + rhs +
@@ -69,20 +70,20 @@ namespace Sass {
69
70
  }
70
71
 
71
72
  /* static function, throws OperationError, has no traces but optional pstate for returned value */
72
- Value* op_strings(Sass::Operand operand, Value& lhs, Value& rhs, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed)
73
+ Value* op_strings(Sass::Operand operand, Value& lhs, Value& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
73
74
  {
74
75
  enum Sass_OP op = operand.operand;
75
76
 
76
77
  String_Quoted* lqstr = Cast<String_Quoted>(&lhs);
77
78
  String_Quoted* rqstr = Cast<String_Quoted>(&rhs);
78
79
 
79
- std::string lstr(lqstr ? lqstr->value() : lhs.to_string(opt));
80
- std::string rstr(rqstr ? rqstr->value() : rhs.to_string(opt));
80
+ sass::string lstr(lqstr ? lqstr->value() : lhs.to_string(opt));
81
+ sass::string rstr(rqstr ? rqstr->value() : rhs.to_string(opt));
81
82
 
82
83
  if (Cast<Null>(&lhs)) throw Exception::InvalidNullOperation(&lhs, &rhs, op);
83
84
  if (Cast<Null>(&rhs)) throw Exception::InvalidNullOperation(&lhs, &rhs, op);
84
85
 
85
- std::string sep;
86
+ sass::string sep;
86
87
  switch (op) {
87
88
  case Sass_OP::ADD: sep = ""; break;
88
89
  case Sass_OP::SUB: sep = "-"; break;
@@ -120,7 +121,7 @@ namespace Sass {
120
121
 
121
122
  /* ToDo: allow to operate also with hsla colors */
122
123
  /* static function, throws OperationError, has no traces but optional pstate for returned value */
123
- Value* op_colors(enum Sass_OP op, const Color_RGBA& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed)
124
+ Value* op_colors(enum Sass_OP op, const Color_RGBA& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
124
125
  {
125
126
 
126
127
  if (lhs.a() != rhs.a()) {
@@ -141,7 +142,7 @@ namespace Sass {
141
142
  }
142
143
 
143
144
  /* static function, throws OperationError, has no traces but optional pstate for returned value */
144
- Value* op_numbers(enum Sass_OP op, const Number& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed)
145
+ Value* op_numbers(enum Sass_OP op, const Number& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
145
146
  {
146
147
  double lval = lhs.value();
147
148
  double rval = rhs.value();
@@ -151,7 +152,7 @@ namespace Sass {
151
152
  }
152
153
 
153
154
  if (op == Sass_OP::DIV && rval == 0) {
154
- std::string result(lval ? "Infinity" : "NaN");
155
+ sass::string result(lval ? "Infinity" : "NaN");
155
156
  return SASS_MEMORY_NEW(String_Quoted, pstate, result);
156
157
  }
157
158
 
@@ -211,7 +212,7 @@ namespace Sass {
211
212
  }
212
213
 
213
214
  /* static function, throws OperationError, has no traces but optional pstate for returned value */
214
- Value* op_number_color(enum Sass_OP op, const Number& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed)
215
+ Value* op_number_color(enum Sass_OP op, const Number& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
215
216
  {
216
217
  double lval = lhs.value();
217
218
 
@@ -228,7 +229,7 @@ namespace Sass {
228
229
  }
229
230
  case Sass_OP::SUB:
230
231
  case Sass_OP::DIV: {
231
- std::string color(rhs.to_string(opt));
232
+ sass::string color(rhs.to_string(opt));
232
233
  op_color_deprecation(op, lhs.to_string(), color, pstate);
233
234
  return SASS_MEMORY_NEW(String_Quoted,
234
235
  pstate,
@@ -242,7 +243,7 @@ namespace Sass {
242
243
  }
243
244
 
244
245
  /* static function, throws OperationError, has no traces but optional pstate for returned value */
245
- Value* op_color_number(enum Sass_OP op, const Color_RGBA& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed)
246
+ Value* op_color_number(enum Sass_OP op, const Color_RGBA& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
246
247
  {
247
248
  double rval = rhs.value();
248
249
 
@@ -9,19 +9,19 @@ namespace Sass {
9
9
  namespace Operators {
10
10
 
11
11
  // equality operator using AST Node operator==
12
- bool eq(Expression_Obj, Expression_Obj);
13
- bool neq(Expression_Obj, Expression_Obj);
12
+ bool eq(ExpressionObj, ExpressionObj);
13
+ bool neq(ExpressionObj, ExpressionObj);
14
14
  // specific operators based on cmp and eq
15
- bool lt(Expression_Obj, Expression_Obj);
16
- bool gt(Expression_Obj, Expression_Obj);
17
- bool lte(Expression_Obj, Expression_Obj);
18
- bool gte(Expression_Obj, Expression_Obj);
15
+ bool lt(ExpressionObj, ExpressionObj);
16
+ bool gt(ExpressionObj, ExpressionObj);
17
+ bool lte(ExpressionObj, ExpressionObj);
18
+ bool gte(ExpressionObj, ExpressionObj);
19
19
  // arithmetic for all the combinations that matter
20
- Value* op_strings(Sass::Operand, Value&, Value&, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed = false);
21
- Value* op_colors(enum Sass_OP, const Color_RGBA&, const Color_RGBA&, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed = false);
22
- Value* op_numbers(enum Sass_OP, const Number&, const Number&, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed = false);
23
- Value* op_number_color(enum Sass_OP, const Number&, const Color_RGBA&, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed = false);
24
- Value* op_color_number(enum Sass_OP, const Color_RGBA&, const Number&, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed = false);
20
+ Value* op_strings(Sass::Operand, Value&, Value&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
21
+ Value* op_colors(enum Sass_OP, const Color_RGBA&, const Color_RGBA&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
22
+ Value* op_numbers(enum Sass_OP, const Number&, const Number&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
23
+ Value* op_number_color(enum Sass_OP, const Number&, const Color_RGBA&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
24
+ Value* op_color_number(enum Sass_OP, const Color_RGBA&, const Number&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
25
25
 
26
26
  };
27
27
 
@@ -0,0 +1,112 @@
1
+ #ifndef SASS_ORDERED_MAP_H
2
+ #define SASS_ORDERED_MAP_H
3
+
4
+ namespace Sass {
5
+
6
+ // ##########################################################################
7
+ // Very simple and limited container for insert ordered hash map.
8
+ // Piggy-back implementation on std::unordered_map and sass::vector
9
+ // ##########################################################################
10
+ template<
11
+ class Key,
12
+ class T,
13
+ class Hash = std::hash<Key>,
14
+ class KeyEqual = std::equal_to<Key>,
15
+ class Allocator = std::allocator<std::pair<const Key, T>>
16
+ >
17
+ class ordered_map {
18
+
19
+ private:
20
+
21
+ using map_type = typename std::unordered_map< Key, T, Hash, KeyEqual, Allocator>;
22
+ using map_iterator = typename std::unordered_map< Key, T, Hash, KeyEqual, Allocator>::iterator;
23
+ using map_const_iterator = typename std::unordered_map< Key, T, Hash, KeyEqual, Allocator>::const_iterator;
24
+
25
+ // The main unordered map
26
+ map_type _map;
27
+
28
+ // Keep insertion order
29
+ sass::vector<Key> _keys;
30
+ sass::vector<T> _values;
31
+
32
+ const KeyEqual _keyEqual;
33
+
34
+ public:
35
+
36
+ ordered_map() :
37
+ _keyEqual(KeyEqual())
38
+ {
39
+ }
40
+
41
+ ordered_map& operator= (const ordered_map& other) {
42
+ _map = other._map;
43
+ _keys = other._keys;
44
+ _values = other._values;
45
+ return *this;
46
+ }
47
+
48
+ std::pair<Key, T> front() {
49
+ return std::make_pair(
50
+ _keys.front(),
51
+ _values.front()
52
+ );
53
+ }
54
+
55
+ bool empty() const {
56
+ return _keys.empty();
57
+ }
58
+
59
+ void insert(const Key& key, const T& val) {
60
+ if (!hasKey(key)) {
61
+ _values.push_back(val);
62
+ _keys.push_back(key);
63
+ }
64
+ _map[key] = val;
65
+ }
66
+
67
+ bool hasKey(const Key& key) const {
68
+ return _map.find(key) != _map.end();
69
+ }
70
+
71
+ bool erase(const Key& key) {
72
+ _map.erase(key);
73
+ // find the position in the array
74
+ for (size_t i = 0; i < _keys.size(); i += 1) {
75
+ if (_keyEqual(key, _keys[i])) {
76
+ _keys.erase(_keys.begin() + i);
77
+ _values.erase(_values.begin() + i);
78
+ return true;
79
+ }
80
+ }
81
+ return false;
82
+ }
83
+
84
+ const sass::vector<Key>& keys() const { return _keys; }
85
+ const sass::vector<T>& values() const { return _values; }
86
+
87
+ const T& get(const Key& key) {
88
+ if (hasKey(key)) {
89
+ return _map[key];
90
+ }
91
+ throw std::runtime_error("Key does not exist");
92
+ }
93
+
94
+ using iterator = typename sass::vector<Key>::iterator;
95
+ using const_iterator = typename sass::vector<Key>::const_iterator;
96
+ using reverse_iterator = typename sass::vector<Key>::reverse_iterator;
97
+ using const_reverse_iterator = typename sass::vector<Key>::const_reverse_iterator;
98
+
99
+ typename sass::vector<Key>::iterator end() { return _keys.end(); }
100
+ typename sass::vector<Key>::iterator begin() { return _keys.begin(); }
101
+ typename sass::vector<Key>::reverse_iterator rend() { return _keys.rend(); }
102
+ typename sass::vector<Key>::reverse_iterator rbegin() { return _keys.rbegin(); }
103
+ typename sass::vector<Key>::const_iterator end() const { return _keys.end(); }
104
+ typename sass::vector<Key>::const_iterator begin() const { return _keys.begin(); }
105
+ typename sass::vector<Key>::const_reverse_iterator rend() const { return _keys.rend(); }
106
+ typename sass::vector<Key>::const_reverse_iterator rbegin() const { return _keys.rbegin(); }
107
+
108
+ };
109
+
110
+ }
111
+
112
+ #endif
@@ -30,7 +30,7 @@ namespace Sass {
30
30
  throw Exception::InvalidValue({}, *n);
31
31
  }
32
32
  // use values to_string facility
33
- std::string res = n->to_string(opt);
33
+ sass::string res = n->to_string(opt);
34
34
  // output the final token
35
35
  append_token(res, n);
36
36
  }
@@ -77,7 +77,7 @@ namespace Sass {
77
77
  // declare the charset
78
78
  if (output_style() != COMPRESSED)
79
79
  charset = "@charset \"UTF-8\";"
80
- + std::string(opt.linefeed);
80
+ + sass::string(opt.linefeed);
81
81
  else charset = "\xEF\xBB\xBF";
82
82
  // abort search
83
83
  break;
@@ -111,16 +111,18 @@ namespace Sass {
111
111
  }
112
112
  }
113
113
 
114
- void Output::operator()(Ruleset* r)
114
+ void Output::operator()(StyleRule* r)
115
115
  {
116
- Selector_Obj s = r->selector();
117
- Block_Obj b = r->block();
116
+ Block_Obj b = r->block();
117
+ SelectorListObj s = r->selector();
118
+
119
+ if (!s || s->empty()) return;
118
120
 
119
121
  // Filter out rulesets that aren't printable (process its children though)
120
122
  if (!Util::isPrintable(r, output_style())) {
121
123
  for (size_t i = 0, L = b->length(); i < L; ++i) {
122
- const Statement_Obj& stm = b->at(i);
123
- if (Cast<Has_Block>(stm)) {
124
+ const Statement_Obj& stm = b->get(i);
125
+ if (Cast<ParentStatement>(stm)) {
124
126
  if (!Cast<Declaration>(stm)) {
125
127
  stm->perform(this);
126
128
  }
@@ -129,12 +131,14 @@ namespace Sass {
129
131
  return;
130
132
  }
131
133
 
132
- if (output_style() == NESTED) indentation += r->tabs();
134
+ if (output_style() == NESTED) {
135
+ indentation += r->tabs();
136
+ }
133
137
  if (opt.source_comments) {
134
- std::stringstream ss;
138
+ sass::ostream ss;
135
139
  append_indentation();
136
- std::string path(File::abs2rel(r->pstate().path));
137
- ss << "/* line " << r->pstate().line + 1 << ", " << path << " */";
140
+ sass::string path(File::abs2rel(r->pstate().getPath()));
141
+ ss << "/* line " << r->pstate().getLine() << ", " << path << " */";
138
142
  append_string(ss.str());
139
143
  append_optional_linefeed();
140
144
  }
@@ -142,13 +146,13 @@ namespace Sass {
142
146
  if (s) s->perform(this);
143
147
  append_scope_opener(b);
144
148
  for (size_t i = 0, L = b->length(); i < L; ++i) {
145
- Statement_Obj stm = b->at(i);
149
+ Statement_Obj stm = b->get(i);
146
150
  bool bPrintExpression = true;
147
151
  // Check print conditions
148
152
  if (Declaration* dec = Cast<Declaration>(stm)) {
149
- if (String_Constant* valConst = Cast<String_Constant>(dec->value())) {
150
- std::string val(valConst->value());
151
- if (String_Quoted* qstr = Cast<String_Quoted>(valConst)) {
153
+ if (const String_Constant* valConst = Cast<String_Constant>(dec->value())) {
154
+ const sass::string& val = valConst->value();
155
+ if (const String_Quoted* qstr = Cast<const String_Quoted>(valConst)) {
152
156
  if (!qstr->quote_mark() && val.empty()) {
153
157
  bPrintExpression = false;
154
158
  }
@@ -157,7 +161,7 @@ namespace Sass {
157
161
  else if (List* list = Cast<List>(dec->value())) {
158
162
  bool all_invisible = true;
159
163
  for (size_t list_i = 0, list_L = list->length(); list_i < list_L; ++list_i) {
160
- Expression* item = list->at(list_i);
164
+ Expression* item = list->get(list_i);
161
165
  if (!item->is_invisible()) all_invisible = false;
162
166
  }
163
167
  if (all_invisible && !list->is_bracketed()) bPrintExpression = false;
@@ -188,25 +192,25 @@ namespace Sass {
188
192
 
189
193
  append_scope_opener();
190
194
  for (size_t i = 0, L = b->length(); i < L; ++i) {
191
- Statement_Obj stm = b->at(i);
195
+ Statement_Obj stm = b->get(i);
192
196
  stm->perform(this);
193
197
  if (i < L - 1) append_special_linefeed();
194
198
  }
195
199
  append_scope_closer();
196
200
  }
197
201
 
198
- void Output::operator()(Supports_Block* f)
202
+ void Output::operator()(SupportsRule* f)
199
203
  {
200
204
  if (f->is_invisible()) return;
201
205
 
202
- Supports_Condition_Obj c = f->condition();
206
+ SupportsConditionObj c = f->condition();
203
207
  Block_Obj b = f->block();
204
208
 
205
209
  // Filter out feature blocks that aren't printable (process its children though)
206
210
  if (!Util::isPrintable(f, output_style())) {
207
211
  for (size_t i = 0, L = b->length(); i < L; ++i) {
208
- Statement_Obj stm = b->at(i);
209
- if (Cast<Has_Block>(stm)) {
212
+ Statement_Obj stm = b->get(i);
213
+ if (Cast<ParentStatement>(stm)) {
210
214
  stm->perform(this);
211
215
  }
212
216
  }
@@ -221,7 +225,7 @@ namespace Sass {
221
225
  append_scope_opener();
222
226
 
223
227
  for (size_t i = 0, L = b->length(); i < L; ++i) {
224
- Statement_Obj stm = b->at(i);
228
+ Statement_Obj stm = b->get(i);
225
229
  stm->perform(this);
226
230
  if (i < L - 1) append_special_linefeed();
227
231
  }
@@ -232,48 +236,28 @@ namespace Sass {
232
236
 
233
237
  }
234
238
 
235
- void Output::operator()(Media_Block* m)
239
+ void Output::operator()(CssMediaRule* rule)
236
240
  {
237
- if (m->is_invisible()) return;
238
-
239
- Block_Obj b = m->block();
240
-
241
- // Filter out media blocks that aren't printable (process its children though)
242
- if (!Util::isPrintable(m, output_style())) {
243
- for (size_t i = 0, L = b->length(); i < L; ++i) {
244
- Statement_Obj stm = b->at(i);
245
- if (Cast<Has_Block>(stm)) {
246
- stm->perform(this);
247
- }
248
- }
249
- return;
241
+ // Avoid null pointer exception
242
+ if (rule == nullptr) return;
243
+ // Skip empty/invisible rule
244
+ if (rule->isInvisible()) return;
245
+ // Avoid null pointer exception
246
+ if (rule->block() == nullptr) return;
247
+ // Skip empty/invisible rule
248
+ if (rule->block()->isInvisible()) return;
249
+ // Skip if block is empty/invisible
250
+ if (Util::isPrintable(rule, output_style())) {
251
+ // Let inspect do its magic
252
+ Inspect::operator()(rule);
250
253
  }
251
- if (output_style() == NESTED) indentation += m->tabs();
252
- append_indentation();
253
- append_token("@media", m);
254
- append_mandatory_space();
255
- in_media_block = true;
256
- m->media_queries()->perform(this);
257
- in_media_block = false;
258
- append_scope_opener();
259
-
260
- for (size_t i = 0, L = b->length(); i < L; ++i) {
261
- if (b->at(i)) {
262
- Statement_Obj stm = b->at(i);
263
- stm->perform(this);
264
- }
265
- if (i < L - 1) append_special_linefeed();
266
- }
267
-
268
- if (output_style() == NESTED) indentation -= m->tabs();
269
- append_scope_closer();
270
254
  }
271
255
 
272
- void Output::operator()(Directive* a)
256
+ void Output::operator()(AtRule* a)
273
257
  {
274
- std::string kwd = a->keyword();
258
+ sass::string kwd = a->keyword();
275
259
  Selector_Obj s = a->selector();
276
- Expression_Obj v = a->value();
260
+ ExpressionObj v = a->value();
277
261
  Block_Obj b = a->block();
278
262
 
279
263
  append_indentation();
@@ -304,8 +288,8 @@ namespace Sass {
304
288
  bool format = kwd != "@font-face";;
305
289
 
306
290
  for (size_t i = 0, L = b->length(); i < L; ++i) {
307
- Statement_Obj stm = b->at(i);
308
- stm->perform(this);
291
+ Statement_Obj stm = b->get(i);
292
+ if (stm) stm->perform(this);
309
293
  if (i < L - 1 && format) append_special_linefeed();
310
294
  }
311
295
 
@@ -325,10 +309,7 @@ namespace Sass {
325
309
 
326
310
  void Output::operator()(String_Constant* s)
327
311
  {
328
- std::string value(s->value());
329
- if (s->can_compress_whitespace() && output_style() == COMPRESSED) {
330
- value.erase(std::remove_if(value.begin(), value.end(), ::isspace), value.end());
331
- }
312
+ sass::string value(s->value());
332
313
  if (!in_comment && !in_custom_property) {
333
314
  append_token(string_to_output(value), s);
334
315
  } else {
@@ -20,17 +20,17 @@ namespace Sass {
20
20
  virtual ~Output();
21
21
 
22
22
  protected:
23
- std::string charset;
24
- std::vector<AST_Node*> top_nodes;
23
+ sass::string charset;
24
+ sass::vector<AST_Node*> top_nodes;
25
25
 
26
26
  public:
27
27
  OutputBuffer get_buffer(void);
28
28
 
29
29
  virtual void operator()(Map*);
30
- virtual void operator()(Ruleset*);
31
- virtual void operator()(Supports_Block*);
32
- virtual void operator()(Media_Block*);
33
- virtual void operator()(Directive*);
30
+ virtual void operator()(StyleRule*);
31
+ virtual void operator()(SupportsRule*);
32
+ virtual void operator()(CssMediaRule*);
33
+ virtual void operator()(AtRule*);
34
34
  virtual void operator()(Keyframe_Rule*);
35
35
  virtual void operator()(Import*);
36
36
  virtual void operator()(Comment*);