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
@@ -5,47 +5,22 @@
5
5
  // __EXTENSIONS__ fix on Solaris.
6
6
  #include "sass.hpp"
7
7
 
8
- #include <set>
9
- #include <deque>
10
- #include <vector>
11
- #include <string>
12
- #include <sstream>
13
- #include <iostream>
14
8
  #include <typeinfo>
15
- #include <algorithm>
9
+ #include <unordered_map>
10
+
16
11
  #include "sass/base.h"
12
+ #include "ast_helpers.hpp"
17
13
  #include "ast_fwd_decl.hpp"
14
+ #include "ast_def_macros.hpp"
18
15
 
19
- #include "util.hpp"
20
- #include "units.hpp"
21
- #include "context.hpp"
16
+ #include "file.hpp"
22
17
  #include "position.hpp"
23
- #include "constants.hpp"
24
18
  #include "operation.hpp"
25
- #include "position.hpp"
26
- #include "inspect.hpp"
27
- #include "source_map.hpp"
28
19
  #include "environment.hpp"
29
- #include "error_handling.hpp"
30
- #include "ast_def_macros.hpp"
31
- #include "ast_fwd_decl.hpp"
32
- #include "source_map.hpp"
33
20
  #include "fn_utils.hpp"
34
21
 
35
- #include "sass.h"
36
-
37
22
  namespace Sass {
38
23
 
39
- // easier to search with name
40
- const bool DELAYED = true;
41
-
42
- // ToDo: should this really be hardcoded
43
- // Note: most methods follow precision option
44
- const double NUMBER_EPSILON = 1e-12;
45
-
46
- // macro to test if numbers are equal within a small error margin
47
- #define NEAR_EQUAL(lhs, rhs) std::fabs(lhs - rhs) < NUMBER_EPSILON
48
-
49
24
  // ToDo: where does this fit best?
50
25
  // We don't share this with C-API?
51
26
  class Operand {
@@ -80,9 +55,9 @@ namespace Sass {
80
55
  // Abstract base class for all abstract syntax tree nodes.
81
56
  //////////////////////////////////////////////////////////
82
57
  class AST_Node : public SharedObj {
83
- ADD_PROPERTY(ParserState, pstate)
58
+ ADD_PROPERTY(SourceSpan, pstate)
84
59
  public:
85
- AST_Node(ParserState pstate)
60
+ AST_Node(SourceSpan pstate)
86
61
  : pstate_(pstate)
87
62
  { }
88
63
  AST_Node(const AST_Node* ptr)
@@ -91,7 +66,7 @@ namespace Sass {
91
66
 
92
67
  // allow implicit conversion to string
93
68
  // needed for by SharedPtr implementation
94
- operator std::string() {
69
+ operator sass::string() {
95
70
  return to_string();
96
71
  }
97
72
 
@@ -99,17 +74,30 @@ namespace Sass {
99
74
 
100
75
  virtual ~AST_Node() = 0;
101
76
  virtual size_t hash() const { return 0; }
102
- virtual std::string inspect() const { return to_string({ INSPECT, 5 }); }
103
- virtual std::string to_sass() const { return to_string({ TO_SASS, 5 }); }
104
- virtual const std::string to_string(Sass_Inspect_Options opt) const;
105
- virtual const std::string to_string() const;
77
+ virtual sass::string inspect() const { return to_string({ INSPECT, 5 }); }
78
+ virtual sass::string to_sass() const { return to_string({ TO_SASS, 5 }); }
79
+ virtual sass::string to_string(Sass_Inspect_Options opt) const;
80
+ virtual sass::string to_css(Sass_Inspect_Options opt) const;
81
+ virtual sass::string to_string() const;
106
82
  virtual void cloneChildren() {};
107
83
  // generic find function (not fully implemented yet)
108
- // ToDo: add specific implementions to all children
84
+ // ToDo: add specific implementations to all children
109
85
  virtual bool find ( bool (*f)(AST_Node_Obj) ) { return f(this); };
110
- void update_pstate(const ParserState& pstate);
111
- Offset off() { return pstate(); }
112
- Position pos() { return pstate(); }
86
+ void update_pstate(const SourceSpan& pstate);
87
+
88
+ // Some objects are not meant to be compared
89
+ // ToDo: maybe fall-back to pointer comparison?
90
+ virtual bool operator== (const AST_Node& rhs) const {
91
+ throw std::runtime_error("operator== not implemented");
92
+ }
93
+
94
+ // We can give some reasonable implementations by using
95
+ // invert operators on the specialized implementations
96
+ virtual bool operator!= (const AST_Node& rhs) const {
97
+ // Unequal if not equal
98
+ return !(*this == rhs);
99
+ }
100
+
113
101
  ATTACH_ABSTRACT_AST_OPERATIONS(AST_Node);
114
102
  ATTACH_ABSTRACT_CRTP_PERFORM_METHODS()
115
103
  };
@@ -163,13 +151,13 @@ namespace Sass {
163
151
  ADD_PROPERTY(bool, is_interpolant)
164
152
  ADD_PROPERTY(Type, concrete_type)
165
153
  public:
166
- Expression(ParserState pstate, bool d = false, bool e = false, bool i = false, Type ct = NONE);
154
+ Expression(SourceSpan pstate, bool d = false, bool e = false, bool i = false, Type ct = NONE);
167
155
  virtual operator bool() { return true; }
168
156
  virtual ~Expression() { }
169
157
  virtual bool is_invisible() const { return false; }
170
158
 
171
- virtual std::string type() const { return ""; }
172
- static std::string type_name() { return ""; }
159
+ virtual sass::string type() const { return ""; }
160
+ static sass::string type_name() { return ""; }
173
161
 
174
162
  virtual bool is_false() { return false; }
175
163
  // virtual bool is_true() { return !is_false(); }
@@ -194,17 +182,17 @@ namespace Sass {
194
182
 
195
183
  namespace std {
196
184
  template<>
197
- struct hash<Sass::Expression_Obj>
185
+ struct hash<Sass::ExpressionObj>
198
186
  {
199
- size_t operator()(Sass::Expression_Obj s) const
187
+ size_t operator()(Sass::ExpressionObj s) const
200
188
  {
201
189
  return s->hash();
202
190
  }
203
191
  };
204
192
  template<>
205
- struct equal_to<Sass::Expression_Obj>
193
+ struct equal_to<Sass::ExpressionObj>
206
194
  {
207
- bool operator()( Sass::Expression_Obj lhs, Sass::Expression_Obj rhs) const
195
+ bool operator()( Sass::ExpressionObj lhs, Sass::ExpressionObj rhs) const
208
196
  {
209
197
  return lhs->hash() == rhs->hash();
210
198
  }
@@ -220,7 +208,7 @@ namespace Sass {
220
208
  /////////////////////////////////////////////////////////////////////////////
221
209
  template <typename T>
222
210
  class Vectorized {
223
- std::vector<T> elements_;
211
+ sass::vector<T> elements_;
224
212
  protected:
225
213
  mutable size_t hash_;
226
214
  void reset_hash() { hash_ = 0; }
@@ -228,37 +216,112 @@ namespace Sass {
228
216
  public:
229
217
  Vectorized(size_t s = 0) : hash_(0)
230
218
  { elements_.reserve(s); }
219
+ Vectorized(sass::vector<T> vec) :
220
+ elements_(std::move(vec)),
221
+ hash_(0)
222
+ {}
231
223
  virtual ~Vectorized() = 0;
232
224
  size_t length() const { return elements_.size(); }
233
225
  bool empty() const { return elements_.empty(); }
234
226
  void clear() { return elements_.clear(); }
235
- T last() const { return elements_.back(); }
236
- T first() const { return elements_.front(); }
227
+ T& last() { return elements_.back(); }
228
+ T& first() { return elements_.front(); }
229
+ const T& last() const { return elements_.back(); }
230
+ const T& first() const { return elements_.front(); }
231
+
232
+ bool operator== (const Vectorized<T>& rhs) const {
233
+ // Abort early if sizes do not match
234
+ if (length() != rhs.length()) return false;
235
+ // Otherwise test each node for object equalicy in order
236
+ return std::equal(begin(), end(), rhs.begin(), ObjEqualityFn<T>);
237
+ }
238
+
239
+ bool operator!= (const Vectorized<T>& rhs) const {
240
+ return !(*this == rhs);
241
+ }
242
+
237
243
  T& operator[](size_t i) { return elements_[i]; }
238
244
  virtual const T& at(size_t i) const { return elements_.at(i); }
239
245
  virtual T& at(size_t i) { return elements_.at(i); }
240
246
  const T& get(size_t i) const { return elements_[i]; }
241
247
  const T& operator[](size_t i) const { return elements_[i]; }
242
- virtual void append(T element)
248
+
249
+ // Implicitly get the sass::vector from our object
250
+ // Makes the Vector directly assignable to sass::vector
251
+ // You are responsible to make a copy if needed
252
+ // Note: since this returns the real object, we can't
253
+ // Note: guarantee that the hash will not get out of sync
254
+ operator sass::vector<T>&() { return elements_; }
255
+ operator const sass::vector<T>&() const { return elements_; }
256
+
257
+ // Explicitly request all elements as a real sass::vector
258
+ // You are responsible to make a copy if needed
259
+ // Note: since this returns the real object, we can't
260
+ // Note: guarantee that the hash will not get out of sync
261
+ sass::vector<T>& elements() { return elements_; }
262
+ const sass::vector<T>& elements() const { return elements_; }
263
+
264
+ // Insert all items from compatible vector
265
+ void concat(const sass::vector<T>& v)
266
+ {
267
+ if (!v.empty()) reset_hash();
268
+ elements().insert(end(), v.begin(), v.end());
269
+ }
270
+
271
+ // Syntatic sugar for pointers
272
+ void concat(const Vectorized<T>* v)
243
273
  {
244
- if (element) {
245
- reset_hash();
246
- elements_.push_back(element);
247
- adjust_after_pushing(element);
274
+ if (v != nullptr) {
275
+ return concat(*v);
248
276
  }
249
277
  }
250
- virtual void concat(Vectorized* v)
278
+
279
+ // Insert one item on the front
280
+ void unshift(T element)
251
281
  {
252
- for (size_t i = 0, L = v->length(); i < L; ++i) this->append((*v)[i]);
282
+ reset_hash();
283
+ elements_.insert(begin(), element);
253
284
  }
254
- Vectorized& unshift(T element)
285
+
286
+ // Remove and return item on the front
287
+ // ToDo: handle empty vectors
288
+ T shift() {
289
+ reset_hash();
290
+ T first = get(0);
291
+ elements_.erase(begin());
292
+ return first;
293
+ }
294
+
295
+ // Insert one item on the back
296
+ // ToDo: rename this to push
297
+ void append(T element)
255
298
  {
256
- elements_.insert(elements_.begin(), element);
257
- return *this;
299
+ reset_hash();
300
+ elements_.insert(end(), element);
301
+ // ToDo: Mostly used by parameters and arguments
302
+ // ToDo: Find a more elegant way to support this
303
+ adjust_after_pushing(element);
304
+ }
305
+
306
+ // Check if an item already exists
307
+ // Uses underlying object `operator==`
308
+ // E.g. compares the actual objects
309
+ bool contains(const T& el) const {
310
+ for (const T& rhs : elements_) {
311
+ // Test the underlying objects for equality
312
+ // A std::find checks for pointer equality
313
+ if (ObjEqualityFn(el, rhs)) {
314
+ return true;
315
+ }
316
+ }
317
+ return false;
318
+ }
319
+
320
+ // This might be better implemented as `operator=`?
321
+ void elements(sass::vector<T> e) {
322
+ reset_hash();
323
+ elements_ = std::move(e);
258
324
  }
259
- std::vector<T>& elements() { return elements_; }
260
- const std::vector<T>& elements() const { return elements_; }
261
- std::vector<T>& elements(std::vector<T>& e) { elements_ = e; return elements_; }
262
325
 
263
326
  virtual size_t hash() const
264
327
  {
@@ -271,17 +334,17 @@ namespace Sass {
271
334
  }
272
335
 
273
336
  template <typename P, typename V>
274
- typename std::vector<T>::iterator insert(P position, const V& val) {
337
+ typename sass::vector<T>::iterator insert(P position, const V& val) {
275
338
  reset_hash();
276
339
  return elements_.insert(position, val);
277
340
  }
278
341
 
279
- typename std::vector<T>::iterator end() { return elements_.end(); }
280
- typename std::vector<T>::iterator begin() { return elements_.begin(); }
281
- typename std::vector<T>::const_iterator end() const { return elements_.end(); }
282
- typename std::vector<T>::const_iterator begin() const { return elements_.begin(); }
283
- typename std::vector<T>::iterator erase(typename std::vector<T>::iterator el) { return elements_.erase(el); }
284
- typename std::vector<T>::const_iterator erase(typename std::vector<T>::const_iterator el) { return elements_.erase(el); }
342
+ typename sass::vector<T>::iterator end() { return elements_.end(); }
343
+ typename sass::vector<T>::iterator begin() { return elements_.begin(); }
344
+ typename sass::vector<T>::const_iterator end() const { return elements_.end(); }
345
+ typename sass::vector<T>::const_iterator begin() const { return elements_.begin(); }
346
+ typename sass::vector<T>::iterator erase(typename sass::vector<T>::iterator el) { reset_hash(); return elements_.erase(el); }
347
+ typename sass::vector<T>::const_iterator erase(typename sass::vector<T>::const_iterator el) { reset_hash(); return elements_.erase(el); }
285
348
 
286
349
  };
287
350
  template <typename T>
@@ -289,38 +352,63 @@ namespace Sass {
289
352
 
290
353
  /////////////////////////////////////////////////////////////////////////////
291
354
  // Mixin class for AST nodes that should behave like a hash table. Uses an
292
- // extra <std::vector> internally to maintain insertion order for interation.
355
+ // extra <sass::vector> internally to maintain insertion order for interation.
293
356
  /////////////////////////////////////////////////////////////////////////////
357
+ template <typename K, typename T, typename U>
294
358
  class Hashed {
295
359
  private:
296
- ExpressionMap elements_;
297
- std::vector<Expression_Obj> list_;
360
+ std::unordered_map<
361
+ K, T, ObjHash, ObjEquality
362
+ > elements_;
363
+
364
+ sass::vector<K> _keys;
365
+ sass::vector<T> _values;
298
366
  protected:
299
367
  mutable size_t hash_;
300
- Expression_Obj duplicate_key_;
368
+ K duplicate_key_;
301
369
  void reset_hash() { hash_ = 0; }
302
370
  void reset_duplicate_key() { duplicate_key_ = {}; }
303
- virtual void adjust_after_pushing(std::pair<Expression_Obj, Expression_Obj> p) { }
371
+ virtual void adjust_after_pushing(std::pair<K, T> p) { }
304
372
  public:
305
373
  Hashed(size_t s = 0)
306
- : elements_(ExpressionMap(s)),
307
- list_(std::vector<Expression_Obj>()),
374
+ : elements_(),
375
+ _keys(),
376
+ _values(),
308
377
  hash_(0), duplicate_key_({})
309
- { elements_.reserve(s); list_.reserve(s); }
378
+ {
379
+ _keys.reserve(s);
380
+ _values.reserve(s);
381
+ elements_.reserve(s);
382
+ }
310
383
  virtual ~Hashed();
311
- size_t length() const { return list_.size(); }
312
- bool empty() const { return list_.empty(); }
313
- bool has(Expression_Obj k) const { return elements_.count(k) == 1; }
314
- Expression_Obj at(Expression_Obj k) const;
384
+ size_t length() const { return _keys.size(); }
385
+ bool empty() const { return _keys.empty(); }
386
+ bool has(K k) const {
387
+ return elements_.find(k) != elements_.end();
388
+ }
389
+ T at(K k) const {
390
+ if (elements_.count(k))
391
+ {
392
+ return elements_.at(k);
393
+ }
394
+ else { return {}; }
395
+ }
315
396
  bool has_duplicate_key() const { return duplicate_key_ != nullptr; }
316
- Expression_Obj get_duplicate_key() const { return duplicate_key_; }
317
- const ExpressionMap elements() { return elements_; }
318
- Hashed& operator<<(std::pair<Expression_Obj, Expression_Obj> p)
397
+ K get_duplicate_key() const { return duplicate_key_; }
398
+ const std::unordered_map<
399
+ K, T, ObjHash, ObjEquality
400
+ >& elements() { return elements_; }
401
+ Hashed& operator<<(std::pair<K, T> p)
319
402
  {
320
403
  reset_hash();
321
404
 
322
- if (!has(p.first)) list_.push_back(p.first);
323
- else if (!duplicate_key_) duplicate_key_ = p.first;
405
+ if (!has(p.first)) {
406
+ _keys.push_back(p.first);
407
+ _values.push_back(p.second);
408
+ }
409
+ else if (!duplicate_key_) {
410
+ duplicate_key_ = p.first;
411
+ }
324
412
 
325
413
  elements_[p.first] = p.second;
326
414
 
@@ -331,7 +419,8 @@ namespace Sass {
331
419
  {
332
420
  if (length() == 0) {
333
421
  this->elements_ = h->elements_;
334
- this->list_ = h->list_;
422
+ this->_values = h->_values;
423
+ this->_keys = h->_keys;
335
424
  return *this;
336
425
  }
337
426
 
@@ -342,17 +431,21 @@ namespace Sass {
342
431
  reset_duplicate_key();
343
432
  return *this;
344
433
  }
345
- const ExpressionMap& pairs() const { return elements_; }
346
- const std::vector<Expression_Obj>& keys() const { return list_; }
434
+ const std::unordered_map<
435
+ K, T, ObjHash, ObjEquality
436
+ >& pairs() const { return elements_; }
347
437
 
348
- // std::unordered_map<Expression_Obj, Expression_Obj>::iterator end() { return elements_.end(); }
349
- // std::unordered_map<Expression_Obj, Expression_Obj>::iterator begin() { return elements_.begin(); }
350
- // std::unordered_map<Expression_Obj, Expression_Obj>::const_iterator end() const { return elements_.end(); }
351
- // std::unordered_map<Expression_Obj, Expression_Obj>::const_iterator begin() const { return elements_.begin(); }
438
+ const sass::vector<K>& keys() const { return _keys; }
439
+ const sass::vector<T>& values() const { return _values; }
352
440
 
353
- };
354
- inline Hashed::~Hashed() { }
441
+ // std::unordered_map<ExpressionObj, ExpressionObj>::iterator end() { return elements_.end(); }
442
+ // std::unordered_map<ExpressionObj, ExpressionObj>::iterator begin() { return elements_.begin(); }
443
+ // std::unordered_map<ExpressionObj, ExpressionObj>::const_iterator end() const { return elements_.end(); }
444
+ // std::unordered_map<ExpressionObj, ExpressionObj>::const_iterator begin() const { return elements_.begin(); }
355
445
 
446
+ };
447
+ template <typename K, typename T, typename U>
448
+ inline Hashed<K, T, U>::~Hashed() { }
356
449
 
357
450
  /////////////////////////////////////////////////////////////////////////
358
451
  // Abstract base class for statements. This side of the AST hierarchy
@@ -391,7 +484,7 @@ namespace Sass {
391
484
  ADD_PROPERTY(size_t, tabs)
392
485
  ADD_PROPERTY(bool, group_end)
393
486
  public:
394
- Statement(ParserState pstate, Type st = NONE, size_t t = 0);
487
+ Statement(SourceSpan pstate, Type st = NONE, size_t t = 0);
395
488
  virtual ~Statement() = 0; // virtual destructor
396
489
  // needed for rearranging nested rulesets during CSS emission
397
490
  virtual bool bubbles();
@@ -410,7 +503,8 @@ namespace Sass {
410
503
  protected:
411
504
  void adjust_after_pushing(Statement_Obj s) override {}
412
505
  public:
413
- Block(ParserState pstate, size_t s = 0, bool r = false);
506
+ Block(SourceSpan pstate, size_t s = 0, bool r = false);
507
+ bool isInvisible() const;
414
508
  bool has_content() override;
415
509
  ATTACH_AST_OPERATIONS(Block)
416
510
  ATTACH_CRTP_PERFORM_METHODS()
@@ -419,27 +513,28 @@ namespace Sass {
419
513
  ////////////////////////////////////////////////////////////////////////
420
514
  // Abstract base class for statements that contain blocks of statements.
421
515
  ////////////////////////////////////////////////////////////////////////
422
- class Has_Block : public Statement {
516
+ class ParentStatement : public Statement {
423
517
  ADD_PROPERTY(Block_Obj, block)
424
518
  public:
425
- Has_Block(ParserState pstate, Block_Obj b);
426
- Has_Block(const Has_Block* ptr); // copy constructor
427
- virtual ~Has_Block() = 0; // virtual destructor
519
+ ParentStatement(SourceSpan pstate, Block_Obj b);
520
+ ParentStatement(const ParentStatement* ptr); // copy constructor
521
+ virtual ~ParentStatement() = 0; // virtual destructor
428
522
  virtual bool has_content() override;
429
523
  };
430
- inline Has_Block::~Has_Block() { }
524
+ inline ParentStatement::~ParentStatement() { }
431
525
 
432
526
  /////////////////////////////////////////////////////////////////////////////
433
527
  // Rulesets (i.e., sets of styles headed by a selector and containing a block
434
528
  // of style declarations.
435
529
  /////////////////////////////////////////////////////////////////////////////
436
- class Ruleset final : public Has_Block {
437
- ADD_PROPERTY(Selector_List_Obj, selector)
530
+ class StyleRule final : public ParentStatement {
531
+ ADD_PROPERTY(SelectorListObj, selector)
532
+ ADD_PROPERTY(Selector_Schema_Obj, schema)
438
533
  ADD_PROPERTY(bool, is_root);
439
534
  public:
440
- Ruleset(ParserState pstate, Selector_List_Obj s = {}, Block_Obj b = {});
535
+ StyleRule(SourceSpan pstate, SelectorListObj s = {}, Block_Obj b = {});
441
536
  bool is_invisible() const override;
442
- ATTACH_AST_OPERATIONS(Ruleset)
537
+ ATTACH_AST_OPERATIONS(StyleRule)
443
538
  ATTACH_CRTP_PERFORM_METHODS()
444
539
  };
445
540
 
@@ -450,7 +545,7 @@ namespace Sass {
450
545
  ADD_PROPERTY(Statement_Obj, node)
451
546
  ADD_PROPERTY(bool, group_end)
452
547
  public:
453
- Bubble(ParserState pstate, Statement_Obj n, Statement_Obj g = {}, size_t t = 0);
548
+ Bubble(SourceSpan pstate, Statement_Obj n, Statement_Obj g = {}, size_t t = 0);
454
549
  bool bubbles() override;
455
550
  ATTACH_AST_OPERATIONS(Bubble)
456
551
  ATTACH_CRTP_PERFORM_METHODS()
@@ -459,54 +554,41 @@ namespace Sass {
459
554
  /////////////////
460
555
  // Trace.
461
556
  /////////////////
462
- class Trace final : public Has_Block {
557
+ class Trace final : public ParentStatement {
463
558
  ADD_CONSTREF(char, type)
464
- ADD_CONSTREF(std::string, name)
559
+ ADD_CONSTREF(sass::string, name)
465
560
  public:
466
- Trace(ParserState pstate, std::string n, Block_Obj b = {}, char type = 'm');
561
+ Trace(SourceSpan pstate, sass::string n, Block_Obj b = {}, char type = 'm');
467
562
  ATTACH_AST_OPERATIONS(Trace)
468
563
  ATTACH_CRTP_PERFORM_METHODS()
469
564
  };
470
565
 
471
- /////////////////
472
- // Media queries.
473
- /////////////////
474
- class Media_Block final : public Has_Block {
475
- ADD_PROPERTY(List_Obj, media_queries)
476
- public:
477
- Media_Block(ParserState pstate, List_Obj mqs, Block_Obj b);
478
- bool bubbles() override;
479
- bool is_invisible() const override;
480
- ATTACH_AST_OPERATIONS(Media_Block)
481
- ATTACH_CRTP_PERFORM_METHODS()
482
- };
483
-
484
566
  ///////////////////////////////////////////////////////////////////////
485
567
  // At-rules -- arbitrary directives beginning with "@" that may have an
486
568
  // optional statement block.
487
569
  ///////////////////////////////////////////////////////////////////////
488
- class Directive final : public Has_Block {
489
- ADD_CONSTREF(std::string, keyword)
490
- ADD_PROPERTY(Selector_List_Obj, selector)
491
- ADD_PROPERTY(Expression_Obj, value)
570
+ class AtRule final : public ParentStatement {
571
+ ADD_CONSTREF(sass::string, keyword)
572
+ ADD_PROPERTY(SelectorListObj, selector)
573
+ ADD_PROPERTY(ExpressionObj, value)
492
574
  public:
493
- Directive(ParserState pstate, std::string kwd, Selector_List_Obj sel = {}, Block_Obj b = {}, Expression_Obj val = {});
575
+ AtRule(SourceSpan pstate, sass::string kwd, SelectorListObj sel = {}, Block_Obj b = {}, ExpressionObj val = {});
494
576
  bool bubbles() override;
495
577
  bool is_media();
496
578
  bool is_keyframes();
497
- ATTACH_AST_OPERATIONS(Directive)
579
+ ATTACH_AST_OPERATIONS(AtRule)
498
580
  ATTACH_CRTP_PERFORM_METHODS()
499
581
  };
500
582
 
501
583
  ///////////////////////////////////////////////////////////////////////
502
584
  // Keyframe-rules -- the child blocks of "@keyframes" nodes.
503
585
  ///////////////////////////////////////////////////////////////////////
504
- class Keyframe_Rule final : public Has_Block {
586
+ class Keyframe_Rule final : public ParentStatement {
505
587
  // according to css spec, this should be <keyframes-name>
506
588
  // <keyframes-name> = <custom-ident> | <string>
507
- ADD_PROPERTY(Selector_List_Obj, name)
589
+ ADD_PROPERTY(SelectorListObj, name)
508
590
  public:
509
- Keyframe_Rule(ParserState pstate, Block_Obj b);
591
+ Keyframe_Rule(SourceSpan pstate, Block_Obj b);
510
592
  ATTACH_AST_OPERATIONS(Keyframe_Rule)
511
593
  ATTACH_CRTP_PERFORM_METHODS()
512
594
  };
@@ -514,14 +596,14 @@ namespace Sass {
514
596
  ////////////////////////////////////////////////////////////////////////
515
597
  // Declarations -- style rules consisting of a property name and values.
516
598
  ////////////////////////////////////////////////////////////////////////
517
- class Declaration final : public Has_Block {
599
+ class Declaration final : public ParentStatement {
518
600
  ADD_PROPERTY(String_Obj, property)
519
- ADD_PROPERTY(Expression_Obj, value)
601
+ ADD_PROPERTY(ExpressionObj, value)
520
602
  ADD_PROPERTY(bool, is_important)
521
603
  ADD_PROPERTY(bool, is_custom_property)
522
604
  ADD_PROPERTY(bool, is_indented)
523
605
  public:
524
- Declaration(ParserState pstate, String_Obj prop, Expression_Obj val, bool i = false, bool c = false, Block_Obj b = {});
606
+ Declaration(SourceSpan pstate, String_Obj prop, ExpressionObj val, bool i = false, bool c = false, Block_Obj b = {});
525
607
  bool is_invisible() const override;
526
608
  ATTACH_AST_OPERATIONS(Declaration)
527
609
  ATTACH_CRTP_PERFORM_METHODS()
@@ -531,12 +613,12 @@ namespace Sass {
531
613
  // Assignments -- variable and value.
532
614
  /////////////////////////////////////
533
615
  class Assignment final : public Statement {
534
- ADD_CONSTREF(std::string, variable)
535
- ADD_PROPERTY(Expression_Obj, value)
616
+ ADD_CONSTREF(sass::string, variable)
617
+ ADD_PROPERTY(ExpressionObj, value)
536
618
  ADD_PROPERTY(bool, is_default)
537
619
  ADD_PROPERTY(bool, is_global)
538
620
  public:
539
- Assignment(ParserState pstate, std::string var, Expression_Obj val, bool is_default = false, bool is_global = false);
621
+ Assignment(SourceSpan pstate, sass::string var, ExpressionObj val, bool is_default = false, bool is_global = false);
540
622
  ATTACH_AST_OPERATIONS(Assignment)
541
623
  ATTACH_CRTP_PERFORM_METHODS()
542
624
  };
@@ -546,13 +628,13 @@ namespace Sass {
546
628
  // necessary to store a list of each in an Import node.
547
629
  ////////////////////////////////////////////////////////////////////////////
548
630
  class Import final : public Statement {
549
- std::vector<Expression_Obj> urls_;
550
- std::vector<Include> incs_;
631
+ sass::vector<ExpressionObj> urls_;
632
+ sass::vector<Include> incs_;
551
633
  ADD_PROPERTY(List_Obj, import_queries);
552
634
  public:
553
- Import(ParserState pstate);
554
- std::vector<Include>& incs();
555
- std::vector<Expression_Obj>& urls();
635
+ Import(SourceSpan pstate);
636
+ sass::vector<Include>& incs();
637
+ sass::vector<ExpressionObj>& urls();
556
638
  ATTACH_AST_OPERATIONS(Import)
557
639
  ATTACH_CRTP_PERFORM_METHODS()
558
640
  };
@@ -562,10 +644,10 @@ namespace Sass {
562
644
  class Import_Stub final : public Statement {
563
645
  Include resource_;
564
646
  public:
565
- Import_Stub(ParserState pstate, Include res);
647
+ Import_Stub(SourceSpan pstate, Include res);
566
648
  Include resource();
567
- std::string imp_path();
568
- std::string abs_path();
649
+ sass::string imp_path();
650
+ sass::string abs_path();
569
651
  ATTACH_AST_OPERATIONS(Import_Stub)
570
652
  ATTACH_CRTP_PERFORM_METHODS()
571
653
  };
@@ -573,33 +655,33 @@ namespace Sass {
573
655
  //////////////////////////////
574
656
  // The Sass `@warn` directive.
575
657
  //////////////////////////////
576
- class Warning final : public Statement {
577
- ADD_PROPERTY(Expression_Obj, message)
658
+ class WarningRule final : public Statement {
659
+ ADD_PROPERTY(ExpressionObj, message)
578
660
  public:
579
- Warning(ParserState pstate, Expression_Obj msg);
580
- ATTACH_AST_OPERATIONS(Warning)
661
+ WarningRule(SourceSpan pstate, ExpressionObj msg);
662
+ ATTACH_AST_OPERATIONS(WarningRule)
581
663
  ATTACH_CRTP_PERFORM_METHODS()
582
664
  };
583
665
 
584
666
  ///////////////////////////////
585
667
  // The Sass `@error` directive.
586
668
  ///////////////////////////////
587
- class Error final : public Statement {
588
- ADD_PROPERTY(Expression_Obj, message)
669
+ class ErrorRule final : public Statement {
670
+ ADD_PROPERTY(ExpressionObj, message)
589
671
  public:
590
- Error(ParserState pstate, Expression_Obj msg);
591
- ATTACH_AST_OPERATIONS(Error)
672
+ ErrorRule(SourceSpan pstate, ExpressionObj msg);
673
+ ATTACH_AST_OPERATIONS(ErrorRule)
592
674
  ATTACH_CRTP_PERFORM_METHODS()
593
675
  };
594
676
 
595
677
  ///////////////////////////////
596
678
  // The Sass `@debug` directive.
597
679
  ///////////////////////////////
598
- class Debug final : public Statement {
599
- ADD_PROPERTY(Expression_Obj, value)
680
+ class DebugRule final : public Statement {
681
+ ADD_PROPERTY(ExpressionObj, value)
600
682
  public:
601
- Debug(ParserState pstate, Expression_Obj val);
602
- ATTACH_AST_OPERATIONS(Debug)
683
+ DebugRule(SourceSpan pstate, ExpressionObj val);
684
+ ATTACH_AST_OPERATIONS(DebugRule)
603
685
  ATTACH_CRTP_PERFORM_METHODS()
604
686
  };
605
687
 
@@ -610,7 +692,7 @@ namespace Sass {
610
692
  ADD_PROPERTY(String_Obj, text)
611
693
  ADD_PROPERTY(bool, is_important)
612
694
  public:
613
- Comment(ParserState pstate, String_Obj txt, bool is_important);
695
+ Comment(SourceSpan pstate, String_Obj txt, bool is_important);
614
696
  virtual bool is_invisible() const override;
615
697
  ATTACH_AST_OPERATIONS(Comment)
616
698
  ATTACH_CRTP_PERFORM_METHODS()
@@ -619,11 +701,11 @@ namespace Sass {
619
701
  ////////////////////////////////////
620
702
  // The Sass `@if` control directive.
621
703
  ////////////////////////////////////
622
- class If final : public Has_Block {
623
- ADD_PROPERTY(Expression_Obj, predicate)
704
+ class If final : public ParentStatement {
705
+ ADD_PROPERTY(ExpressionObj, predicate)
624
706
  ADD_PROPERTY(Block_Obj, alternative)
625
707
  public:
626
- If(ParserState pstate, Expression_Obj pred, Block_Obj con, Block_Obj alt = {});
708
+ If(SourceSpan pstate, ExpressionObj pred, Block_Obj con, Block_Obj alt = {});
627
709
  virtual bool has_content() override;
628
710
  ATTACH_AST_OPERATIONS(If)
629
711
  ATTACH_CRTP_PERFORM_METHODS()
@@ -632,37 +714,37 @@ namespace Sass {
632
714
  /////////////////////////////////////
633
715
  // The Sass `@for` control directive.
634
716
  /////////////////////////////////////
635
- class For final : public Has_Block {
636
- ADD_CONSTREF(std::string, variable)
637
- ADD_PROPERTY(Expression_Obj, lower_bound)
638
- ADD_PROPERTY(Expression_Obj, upper_bound)
717
+ class ForRule final : public ParentStatement {
718
+ ADD_CONSTREF(sass::string, variable)
719
+ ADD_PROPERTY(ExpressionObj, lower_bound)
720
+ ADD_PROPERTY(ExpressionObj, upper_bound)
639
721
  ADD_PROPERTY(bool, is_inclusive)
640
722
  public:
641
- For(ParserState pstate, std::string var, Expression_Obj lo, Expression_Obj hi, Block_Obj b, bool inc);
642
- ATTACH_AST_OPERATIONS(For)
723
+ ForRule(SourceSpan pstate, sass::string var, ExpressionObj lo, ExpressionObj hi, Block_Obj b, bool inc);
724
+ ATTACH_AST_OPERATIONS(ForRule)
643
725
  ATTACH_CRTP_PERFORM_METHODS()
644
726
  };
645
727
 
646
728
  //////////////////////////////////////
647
729
  // The Sass `@each` control directive.
648
730
  //////////////////////////////////////
649
- class Each final : public Has_Block {
650
- ADD_PROPERTY(std::vector<std::string>, variables)
651
- ADD_PROPERTY(Expression_Obj, list)
731
+ class EachRule final : public ParentStatement {
732
+ ADD_PROPERTY(sass::vector<sass::string>, variables)
733
+ ADD_PROPERTY(ExpressionObj, list)
652
734
  public:
653
- Each(ParserState pstate, std::vector<std::string> vars, Expression_Obj lst, Block_Obj b);
654
- ATTACH_AST_OPERATIONS(Each)
735
+ EachRule(SourceSpan pstate, sass::vector<sass::string> vars, ExpressionObj lst, Block_Obj b);
736
+ ATTACH_AST_OPERATIONS(EachRule)
655
737
  ATTACH_CRTP_PERFORM_METHODS()
656
738
  };
657
739
 
658
740
  ///////////////////////////////////////
659
741
  // The Sass `@while` control directive.
660
742
  ///////////////////////////////////////
661
- class While final : public Has_Block {
662
- ADD_PROPERTY(Expression_Obj, predicate)
743
+ class WhileRule final : public ParentStatement {
744
+ ADD_PROPERTY(ExpressionObj, predicate)
663
745
  public:
664
- While(ParserState pstate, Expression_Obj pred, Block_Obj b);
665
- ATTACH_AST_OPERATIONS(While)
746
+ WhileRule(SourceSpan pstate, ExpressionObj pred, Block_Obj b);
747
+ ATTACH_AST_OPERATIONS(WhileRule)
666
748
  ATTACH_CRTP_PERFORM_METHODS()
667
749
  };
668
750
 
@@ -670,32 +752,21 @@ namespace Sass {
670
752
  // The @return directive for use inside SassScript functions.
671
753
  /////////////////////////////////////////////////////////////
672
754
  class Return final : public Statement {
673
- ADD_PROPERTY(Expression_Obj, value)
755
+ ADD_PROPERTY(ExpressionObj, value)
674
756
  public:
675
- Return(ParserState pstate, Expression_Obj val);
757
+ Return(SourceSpan pstate, ExpressionObj val);
676
758
  ATTACH_AST_OPERATIONS(Return)
677
759
  ATTACH_CRTP_PERFORM_METHODS()
678
760
  };
679
761
 
680
- ////////////////////////////////
681
- // The Sass `@extend` directive.
682
- ////////////////////////////////
683
- class Extension final : public Statement {
684
- ADD_PROPERTY(Selector_List_Obj, selector)
685
- public:
686
- Extension(ParserState pstate, Selector_List_Obj s);
687
- ATTACH_AST_OPERATIONS(Extension)
688
- ATTACH_CRTP_PERFORM_METHODS()
689
- };
690
-
691
762
  /////////////////////////////////////////////////////////////////////////////
692
763
  // Definitions for both mixins and functions. The two cases are distinguished
693
764
  // by a type tag.
694
765
  /////////////////////////////////////////////////////////////////////////////
695
- class Definition final : public Has_Block {
766
+ class Definition final : public ParentStatement {
696
767
  public:
697
768
  enum Type { MIXIN, FUNCTION };
698
- ADD_CONSTREF(std::string, name)
769
+ ADD_CONSTREF(sass::string, name)
699
770
  ADD_PROPERTY(Parameters_Obj, parameters)
700
771
  ADD_PROPERTY(Env*, environment)
701
772
  ADD_PROPERTY(Type, type)
@@ -705,20 +776,20 @@ namespace Sass {
705
776
  ADD_PROPERTY(bool, is_overload_stub)
706
777
  ADD_PROPERTY(Signature, signature)
707
778
  public:
708
- Definition(ParserState pstate,
709
- std::string n,
779
+ Definition(SourceSpan pstate,
780
+ sass::string n,
710
781
  Parameters_Obj params,
711
782
  Block_Obj b,
712
783
  Type t);
713
- Definition(ParserState pstate,
784
+ Definition(SourceSpan pstate,
714
785
  Signature sig,
715
- std::string n,
786
+ sass::string n,
716
787
  Parameters_Obj params,
717
788
  Native_Function func_ptr,
718
789
  bool overload_stub = false);
719
- Definition(ParserState pstate,
790
+ Definition(SourceSpan pstate,
720
791
  Signature sig,
721
- std::string n,
792
+ sass::string n,
722
793
  Parameters_Obj params,
723
794
  Sass_Function_Entry c_func);
724
795
  ATTACH_AST_OPERATIONS(Definition)
@@ -728,12 +799,12 @@ namespace Sass {
728
799
  //////////////////////////////////////
729
800
  // Mixin calls (i.e., `@include ...`).
730
801
  //////////////////////////////////////
731
- class Mixin_Call final : public Has_Block {
732
- ADD_CONSTREF(std::string, name)
802
+ class Mixin_Call final : public ParentStatement {
803
+ ADD_CONSTREF(sass::string, name)
733
804
  ADD_PROPERTY(Arguments_Obj, arguments)
734
805
  ADD_PROPERTY(Parameters_Obj, block_parameters)
735
806
  public:
736
- Mixin_Call(ParserState pstate, std::string n, Arguments_Obj args, Parameters_Obj b_params = {}, Block_Obj b = {});
807
+ Mixin_Call(SourceSpan pstate, sass::string n, Arguments_Obj args, Parameters_Obj b_params = {}, Block_Obj b = {});
737
808
  ATTACH_AST_OPERATIONS(Mixin_Call)
738
809
  ATTACH_CRTP_PERFORM_METHODS()
739
810
  };
@@ -744,7 +815,7 @@ namespace Sass {
744
815
  class Content final : public Statement {
745
816
  ADD_PROPERTY(Arguments_Obj, arguments)
746
817
  public:
747
- Content(ParserState pstate, Arguments_Obj args);
818
+ Content(SourceSpan pstate, Arguments_Obj args);
748
819
  ATTACH_AST_OPERATIONS(Content)
749
820
  ATTACH_CRTP_PERFORM_METHODS()
750
821
  };
@@ -757,11 +828,11 @@ namespace Sass {
757
828
  enum Type { PLUS, MINUS, NOT, SLASH };
758
829
  private:
759
830
  HASH_PROPERTY(Type, optype)
760
- HASH_PROPERTY(Expression_Obj, operand)
831
+ HASH_PROPERTY(ExpressionObj, operand)
761
832
  mutable size_t hash_;
762
833
  public:
763
- Unary_Expression(ParserState pstate, Type t, Expression_Obj o);
764
- const std::string type_name();
834
+ Unary_Expression(SourceSpan pstate, Type t, ExpressionObj o);
835
+ const sass::string type_name();
765
836
  virtual bool operator==(const Expression& rhs) const override;
766
837
  size_t hash() const override;
767
838
  ATTACH_AST_OPERATIONS(Unary_Expression)
@@ -772,13 +843,13 @@ namespace Sass {
772
843
  // Individual argument objects for mixin and function calls.
773
844
  ////////////////////////////////////////////////////////////
774
845
  class Argument final : public Expression {
775
- HASH_PROPERTY(Expression_Obj, value)
776
- HASH_CONSTREF(std::string, name)
846
+ HASH_PROPERTY(ExpressionObj, value)
847
+ HASH_CONSTREF(sass::string, name)
777
848
  ADD_PROPERTY(bool, is_rest_argument)
778
849
  ADD_PROPERTY(bool, is_keyword_argument)
779
850
  mutable size_t hash_;
780
851
  public:
781
- Argument(ParserState pstate, Expression_Obj val, std::string n = "", bool rest = false, bool keyword = false);
852
+ Argument(SourceSpan pstate, ExpressionObj val, sass::string n = "", bool rest = false, bool keyword = false);
782
853
  void set_delayed(bool delayed) override;
783
854
  bool operator==(const Expression& rhs) const override;
784
855
  size_t hash() const override;
@@ -798,7 +869,7 @@ namespace Sass {
798
869
  protected:
799
870
  void adjust_after_pushing(Argument_Obj a) override;
800
871
  public:
801
- Arguments(ParserState pstate);
872
+ Arguments(SourceSpan pstate);
802
873
  void set_delayed(bool delayed) override;
803
874
  Argument_Obj get_rest_argument();
804
875
  Argument_Obj get_keyword_argument();
@@ -806,29 +877,117 @@ namespace Sass {
806
877
  ATTACH_CRTP_PERFORM_METHODS()
807
878
  };
808
879
 
809
- /////////////////
810
- // Media queries.
811
- /////////////////
880
+
881
+ // A Media StyleRule before it has been evaluated
882
+ // Could be already final or an interpolation
883
+ class MediaRule final : public ParentStatement {
884
+ ADD_PROPERTY(List_Obj, schema)
885
+ public:
886
+ MediaRule(SourceSpan pstate, Block_Obj block = {});
887
+
888
+ bool bubbles() override { return true; };
889
+ bool is_invisible() const override { return false; };
890
+ ATTACH_AST_OPERATIONS(MediaRule)
891
+ ATTACH_CRTP_PERFORM_METHODS()
892
+ };
893
+
894
+ // A Media StyleRule after it has been evaluated
895
+ // Representing the static or resulting css
896
+ class CssMediaRule final : public ParentStatement,
897
+ public Vectorized<CssMediaQuery_Obj> {
898
+ public:
899
+ CssMediaRule(SourceSpan pstate, Block_Obj b);
900
+ bool bubbles() override { return true; };
901
+ bool isInvisible() const { return empty(); }
902
+ bool is_invisible() const override { return false; };
903
+
904
+ public:
905
+ // Hash and equality implemtation from vector
906
+ size_t hash() const override { return Vectorized::hash(); }
907
+ // Check if two instances are considered equal
908
+ bool operator== (const CssMediaRule& rhs) const {
909
+ return Vectorized::operator== (rhs);
910
+ }
911
+ bool operator!=(const CssMediaRule& rhs) const {
912
+ // Invert from equality
913
+ return !(*this == rhs);
914
+ }
915
+
916
+ ATTACH_AST_OPERATIONS(CssMediaRule)
917
+ ATTACH_CRTP_PERFORM_METHODS()
918
+ };
919
+
920
+ // Media Queries after they have been evaluated
921
+ // Representing the static or resulting css
922
+ class CssMediaQuery final : public AST_Node {
923
+
924
+ // The modifier, probably either "not" or "only".
925
+ // This may be `null` if no modifier is in use.
926
+ ADD_PROPERTY(sass::string, modifier);
927
+
928
+ // The media type, for example "screen" or "print".
929
+ // This may be `null`. If so, [features] will not be empty.
930
+ ADD_PROPERTY(sass::string, type);
931
+
932
+ // Feature queries, including parentheses.
933
+ ADD_PROPERTY(sass::vector<sass::string>, features);
934
+
935
+ public:
936
+ CssMediaQuery(SourceSpan pstate);
937
+
938
+ // Check if two instances are considered equal
939
+ bool operator== (const CssMediaQuery& rhs) const;
940
+ bool operator!=(const CssMediaQuery& rhs) const {
941
+ // Invert from equality
942
+ return !(*this == rhs);
943
+ }
944
+
945
+ // Returns true if this query is empty
946
+ // Meaning it has no type and features
947
+ bool empty() const {
948
+ return type_.empty()
949
+ && modifier_.empty()
950
+ && features_.empty();
951
+ }
952
+
953
+ // Whether this media query matches all media types.
954
+ bool matchesAllTypes() const {
955
+ return type_.empty() || Util::equalsLiteral("all", type_);
956
+ }
957
+
958
+ // Merges this with [other] and adds a query that matches the intersection
959
+ // of both inputs to [result]. Returns false if the result is unrepresentable
960
+ CssMediaQuery_Obj merge(CssMediaQuery_Obj& other);
961
+
962
+ ATTACH_AST_OPERATIONS(CssMediaQuery)
963
+ ATTACH_CRTP_PERFORM_METHODS()
964
+ };
965
+
966
+ ////////////////////////////////////////////////////
967
+ // Media queries (replaced by MediaRule at al).
968
+ // ToDo: only used for interpolation case
969
+ ////////////////////////////////////////////////////
812
970
  class Media_Query final : public Expression,
813
- public Vectorized<Media_Query_Expression_Obj> {
971
+ public Vectorized<Media_Query_ExpressionObj> {
814
972
  ADD_PROPERTY(String_Obj, media_type)
815
973
  ADD_PROPERTY(bool, is_negated)
816
974
  ADD_PROPERTY(bool, is_restricted)
817
975
  public:
818
- Media_Query(ParserState pstate, String_Obj t = {}, size_t s = 0, bool n = false, bool r = false);
976
+ Media_Query(SourceSpan pstate, String_Obj t = {}, size_t s = 0, bool n = false, bool r = false);
819
977
  ATTACH_AST_OPERATIONS(Media_Query)
820
978
  ATTACH_CRTP_PERFORM_METHODS()
821
979
  };
822
980
 
823
981
  ////////////////////////////////////////////////////
824
982
  // Media expressions (for use inside media queries).
983
+ // ToDo: only used for interpolation case
825
984
  ////////////////////////////////////////////////////
826
985
  class Media_Query_Expression final : public Expression {
827
- ADD_PROPERTY(Expression_Obj, feature)
828
- ADD_PROPERTY(Expression_Obj, value)
986
+ ADD_PROPERTY(ExpressionObj, feature)
987
+ ADD_PROPERTY(ExpressionObj, value)
829
988
  ADD_PROPERTY(bool, is_interpolated)
830
989
  public:
831
- Media_Query_Expression(ParserState pstate, Expression_Obj f, Expression_Obj v, bool i = false);
990
+ Media_Query_Expression(SourceSpan pstate, ExpressionObj f, ExpressionObj v, bool i = false);
832
991
  ATTACH_AST_OPERATIONS(Media_Query_Expression)
833
992
  ATTACH_CRTP_PERFORM_METHODS()
834
993
  };
@@ -838,11 +997,11 @@ namespace Sass {
838
997
  /////////////////////////////////////////////////
839
998
  class At_Root_Query final : public Expression {
840
999
  private:
841
- ADD_PROPERTY(Expression_Obj, feature)
842
- ADD_PROPERTY(Expression_Obj, value)
1000
+ ADD_PROPERTY(ExpressionObj, feature)
1001
+ ADD_PROPERTY(ExpressionObj, value)
843
1002
  public:
844
- At_Root_Query(ParserState pstate, Expression_Obj f = {}, Expression_Obj v = {}, bool i = false);
845
- bool exclude(std::string str);
1003
+ At_Root_Query(SourceSpan pstate, ExpressionObj f = {}, ExpressionObj v = {}, bool i = false);
1004
+ bool exclude(sass::string str);
846
1005
  ATTACH_AST_OPERATIONS(At_Root_Query)
847
1006
  ATTACH_CRTP_PERFORM_METHODS()
848
1007
  };
@@ -850,13 +1009,13 @@ namespace Sass {
850
1009
  ///////////
851
1010
  // At-root.
852
1011
  ///////////
853
- class At_Root_Block final : public Has_Block {
1012
+ class AtRootRule final : public ParentStatement {
854
1013
  ADD_PROPERTY(At_Root_Query_Obj, expression)
855
1014
  public:
856
- At_Root_Block(ParserState pstate, Block_Obj b = {}, At_Root_Query_Obj e = {});
1015
+ AtRootRule(SourceSpan pstate, Block_Obj b = {}, At_Root_Query_Obj e = {});
857
1016
  bool bubbles() override;
858
1017
  bool exclude_node(Statement_Obj s);
859
- ATTACH_AST_OPERATIONS(At_Root_Block)
1018
+ ATTACH_AST_OPERATIONS(AtRootRule)
860
1019
  ATTACH_CRTP_PERFORM_METHODS()
861
1020
  };
862
1021
 
@@ -864,11 +1023,11 @@ namespace Sass {
864
1023
  // Individual parameter objects for mixins and functions.
865
1024
  /////////////////////////////////////////////////////////
866
1025
  class Parameter final : public AST_Node {
867
- ADD_CONSTREF(std::string, name)
868
- ADD_PROPERTY(Expression_Obj, default_value)
1026
+ ADD_CONSTREF(sass::string, name)
1027
+ ADD_PROPERTY(ExpressionObj, default_value)
869
1028
  ADD_PROPERTY(bool, is_rest_parameter)
870
1029
  public:
871
- Parameter(ParserState pstate, std::string n, Expression_Obj def = {}, bool rest = false);
1030
+ Parameter(SourceSpan pstate, sass::string n, ExpressionObj def = {}, bool rest = false);
872
1031
  ATTACH_AST_OPERATIONS(Parameter)
873
1032
  ATTACH_CRTP_PERFORM_METHODS()
874
1033
  };
@@ -884,7 +1043,7 @@ namespace Sass {
884
1043
  protected:
885
1044
  void adjust_after_pushing(Parameter_Obj p) override;
886
1045
  public:
887
- Parameters(ParserState pstate);
1046
+ Parameters(SourceSpan pstate);
888
1047
  ATTACH_AST_OPERATIONS(Parameters)
889
1048
  ATTACH_CRTP_PERFORM_METHODS()
890
1049
  };