sassc 2.3.0 → 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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +5 -0
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/context.h +3 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +117 -117
- data/ext/libsass/src/ast.hpp +160 -162
- data/ext/libsass/src/ast_def_macros.hpp +10 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +2 -2
- data/ext/libsass/src/ast_fwd_decl.hpp +61 -52
- data/ext/libsass/src/ast_helpers.hpp +5 -5
- data/ext/libsass/src/ast_sel_cmp.cpp +18 -18
- data/ext/libsass/src/ast_sel_super.cpp +52 -52
- data/ext/libsass/src/ast_sel_unify.cpp +16 -16
- data/ext/libsass/src/ast_sel_weave.cpp +62 -62
- data/ext/libsass/src/ast_selectors.cpp +87 -77
- data/ext/libsass/src/ast_selectors.hpp +72 -62
- data/ext/libsass/src/ast_supports.cpp +35 -35
- data/ext/libsass/src/ast_supports.hpp +29 -29
- data/ext/libsass/src/ast_values.cpp +58 -58
- data/ext/libsass/src/ast_values.hpp +75 -75
- data/ext/libsass/src/backtrace.cpp +9 -9
- data/ext/libsass/src/backtrace.hpp +5 -5
- data/ext/libsass/src/base64vlq.cpp +2 -2
- data/ext/libsass/src/base64vlq.hpp +1 -1
- data/ext/libsass/src/bind.cpp +17 -17
- data/ext/libsass/src/bind.hpp +1 -1
- data/ext/libsass/src/c2ast.cpp +3 -3
- data/ext/libsass/src/c2ast.hpp +1 -1
- data/ext/libsass/src/check_nesting.cpp +36 -36
- data/ext/libsass/src/check_nesting.hpp +2 -2
- data/ext/libsass/src/color_maps.cpp +5 -5
- data/ext/libsass/src/color_maps.hpp +1 -1
- data/ext/libsass/src/context.cpp +63 -60
- data/ext/libsass/src/context.hpp +33 -33
- data/ext/libsass/src/cssize.cpp +30 -29
- data/ext/libsass/src/cssize.hpp +13 -13
- data/ext/libsass/src/dart_helpers.hpp +5 -5
- data/ext/libsass/src/debugger.hpp +127 -128
- data/ext/libsass/src/emitter.cpp +12 -12
- data/ext/libsass/src/emitter.hpp +10 -10
- data/ext/libsass/src/environment.cpp +27 -27
- data/ext/libsass/src/environment.hpp +24 -24
- data/ext/libsass/src/error_handling.cpp +42 -42
- data/ext/libsass/src/error_handling.hpp +38 -50
- data/ext/libsass/src/eval.cpp +138 -132
- data/ext/libsass/src/eval.hpp +17 -17
- data/ext/libsass/src/eval_selectors.cpp +3 -3
- data/ext/libsass/src/expand.cpp +70 -64
- data/ext/libsass/src/expand.hpp +12 -12
- data/ext/libsass/src/extender.cpp +55 -53
- data/ext/libsass/src/extender.hpp +14 -14
- data/ext/libsass/src/file.cpp +66 -58
- data/ext/libsass/src/file.hpp +23 -25
- data/ext/libsass/src/fn_colors.cpp +9 -9
- data/ext/libsass/src/fn_lists.cpp +18 -18
- data/ext/libsass/src/fn_maps.cpp +3 -3
- data/ext/libsass/src/fn_miscs.cpp +15 -15
- data/ext/libsass/src/fn_numbers.cpp +7 -7
- data/ext/libsass/src/fn_selectors.cpp +8 -8
- data/ext/libsass/src/fn_strings.cpp +34 -22
- data/ext/libsass/src/fn_utils.cpp +29 -26
- data/ext/libsass/src/fn_utils.hpp +10 -10
- data/ext/libsass/src/inspect.cpp +35 -34
- data/ext/libsass/src/inspect.hpp +21 -21
- data/ext/libsass/src/lexer.cpp +3 -1
- data/ext/libsass/src/listize.cpp +2 -2
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
- data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +18 -6
- data/ext/libsass/src/operation.hpp +44 -44
- data/ext/libsass/src/operators.cpp +18 -18
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +18 -18
- data/ext/libsass/src/output.cpp +16 -16
- data/ext/libsass/src/output.hpp +5 -5
- data/ext/libsass/src/parser.cpp +327 -345
- data/ext/libsass/src/parser.hpp +77 -87
- data/ext/libsass/src/parser_selectors.cpp +6 -6
- data/ext/libsass/src/permutate.hpp +39 -15
- data/ext/libsass/src/plugins.cpp +7 -7
- data/ext/libsass/src/plugins.hpp +8 -8
- data/ext/libsass/src/position.cpp +7 -26
- data/ext/libsass/src/position.hpp +44 -21
- data/ext/libsass/src/remove_placeholders.cpp +4 -4
- data/ext/libsass/src/remove_placeholders.hpp +3 -3
- data/ext/libsass/src/sass.cpp +16 -15
- data/ext/libsass/src/sass.hpp +9 -5
- data/ext/libsass/src/sass_context.cpp +52 -34
- data/ext/libsass/src/sass_values.cpp +8 -10
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +22 -18
- data/ext/libsass/src/source_map.hpp +12 -9
- data/ext/libsass/src/units.cpp +19 -19
- data/ext/libsass/src/units.hpp +8 -8
- data/ext/libsass/src/utf8_string.cpp +9 -10
- data/ext/libsass/src/utf8_string.hpp +7 -6
- data/ext/libsass/src/util.cpp +38 -38
- data/ext/libsass/src/util.hpp +18 -18
- data/ext/libsass/src/util_string.cpp +13 -13
- data/ext/libsass/src/util_string.hpp +9 -8
- data/ext/libsass/src/values.cpp +12 -12
- data/lib/sassc/native.rb +3 -5
- data/lib/sassc/version.rb +1 -1
- data/test/native_test.rb +4 -4
- metadata +14 -5
- data/lib/sassc/native/lib_c.rb +0 -21
data/ext/libsass/src/ast.hpp
CHANGED
@@ -55,9 +55,9 @@ namespace Sass {
|
|
55
55
|
// Abstract base class for all abstract syntax tree nodes.
|
56
56
|
//////////////////////////////////////////////////////////
|
57
57
|
class AST_Node : public SharedObj {
|
58
|
-
ADD_PROPERTY(
|
58
|
+
ADD_PROPERTY(SourceSpan, pstate)
|
59
59
|
public:
|
60
|
-
AST_Node(
|
60
|
+
AST_Node(SourceSpan pstate)
|
61
61
|
: pstate_(pstate)
|
62
62
|
{ }
|
63
63
|
AST_Node(const AST_Node* ptr)
|
@@ -66,7 +66,7 @@ namespace Sass {
|
|
66
66
|
|
67
67
|
// allow implicit conversion to string
|
68
68
|
// needed for by SharedPtr implementation
|
69
|
-
operator
|
69
|
+
operator sass::string() {
|
70
70
|
return to_string();
|
71
71
|
}
|
72
72
|
|
@@ -74,27 +74,25 @@ namespace Sass {
|
|
74
74
|
|
75
75
|
virtual ~AST_Node() = 0;
|
76
76
|
virtual size_t hash() const { return 0; }
|
77
|
-
virtual
|
78
|
-
virtual
|
79
|
-
virtual
|
80
|
-
virtual
|
81
|
-
virtual
|
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;
|
82
82
|
virtual void cloneChildren() {};
|
83
83
|
// generic find function (not fully implemented yet)
|
84
|
-
// ToDo: add specific
|
84
|
+
// ToDo: add specific implementations to all children
|
85
85
|
virtual bool find ( bool (*f)(AST_Node_Obj) ) { return f(this); };
|
86
|
-
void update_pstate(const
|
87
|
-
Offset off() { return pstate(); }
|
88
|
-
Position pos() { return pstate(); }
|
86
|
+
void update_pstate(const SourceSpan& pstate);
|
89
87
|
|
90
|
-
// Some
|
91
|
-
// ToDo: maybe
|
88
|
+
// Some objects are not meant to be compared
|
89
|
+
// ToDo: maybe fall-back to pointer comparison?
|
92
90
|
virtual bool operator== (const AST_Node& rhs) const {
|
93
91
|
throw std::runtime_error("operator== not implemented");
|
94
92
|
}
|
95
93
|
|
96
94
|
// We can give some reasonable implementations by using
|
97
|
-
//
|
95
|
+
// invert operators on the specialized implementations
|
98
96
|
virtual bool operator!= (const AST_Node& rhs) const {
|
99
97
|
// Unequal if not equal
|
100
98
|
return !(*this == rhs);
|
@@ -153,13 +151,13 @@ namespace Sass {
|
|
153
151
|
ADD_PROPERTY(bool, is_interpolant)
|
154
152
|
ADD_PROPERTY(Type, concrete_type)
|
155
153
|
public:
|
156
|
-
Expression(
|
154
|
+
Expression(SourceSpan pstate, bool d = false, bool e = false, bool i = false, Type ct = NONE);
|
157
155
|
virtual operator bool() { return true; }
|
158
156
|
virtual ~Expression() { }
|
159
157
|
virtual bool is_invisible() const { return false; }
|
160
158
|
|
161
|
-
virtual
|
162
|
-
static
|
159
|
+
virtual sass::string type() const { return ""; }
|
160
|
+
static sass::string type_name() { return ""; }
|
163
161
|
|
164
162
|
virtual bool is_false() { return false; }
|
165
163
|
// virtual bool is_true() { return !is_false(); }
|
@@ -184,17 +182,17 @@ namespace Sass {
|
|
184
182
|
|
185
183
|
namespace std {
|
186
184
|
template<>
|
187
|
-
struct hash<Sass::
|
185
|
+
struct hash<Sass::ExpressionObj>
|
188
186
|
{
|
189
|
-
size_t operator()(Sass::
|
187
|
+
size_t operator()(Sass::ExpressionObj s) const
|
190
188
|
{
|
191
189
|
return s->hash();
|
192
190
|
}
|
193
191
|
};
|
194
192
|
template<>
|
195
|
-
struct equal_to<Sass::
|
193
|
+
struct equal_to<Sass::ExpressionObj>
|
196
194
|
{
|
197
|
-
bool operator()( Sass::
|
195
|
+
bool operator()( Sass::ExpressionObj lhs, Sass::ExpressionObj rhs) const
|
198
196
|
{
|
199
197
|
return lhs->hash() == rhs->hash();
|
200
198
|
}
|
@@ -210,7 +208,7 @@ namespace Sass {
|
|
210
208
|
/////////////////////////////////////////////////////////////////////////////
|
211
209
|
template <typename T>
|
212
210
|
class Vectorized {
|
213
|
-
|
211
|
+
sass::vector<T> elements_;
|
214
212
|
protected:
|
215
213
|
mutable size_t hash_;
|
216
214
|
void reset_hash() { hash_ = 0; }
|
@@ -218,7 +216,7 @@ namespace Sass {
|
|
218
216
|
public:
|
219
217
|
Vectorized(size_t s = 0) : hash_(0)
|
220
218
|
{ elements_.reserve(s); }
|
221
|
-
Vectorized(
|
219
|
+
Vectorized(sass::vector<T> vec) :
|
222
220
|
elements_(std::move(vec)),
|
223
221
|
hash_(0)
|
224
222
|
{}
|
@@ -248,23 +246,23 @@ namespace Sass {
|
|
248
246
|
const T& get(size_t i) const { return elements_[i]; }
|
249
247
|
const T& operator[](size_t i) const { return elements_[i]; }
|
250
248
|
|
251
|
-
// Implicitly get the
|
252
|
-
// Makes the Vector directly assignable to
|
249
|
+
// Implicitly get the sass::vector from our object
|
250
|
+
// Makes the Vector directly assignable to sass::vector
|
253
251
|
// You are responsible to make a copy if needed
|
254
252
|
// Note: since this returns the real object, we can't
|
255
253
|
// Note: guarantee that the hash will not get out of sync
|
256
|
-
operator
|
257
|
-
operator const
|
254
|
+
operator sass::vector<T>&() { return elements_; }
|
255
|
+
operator const sass::vector<T>&() const { return elements_; }
|
258
256
|
|
259
|
-
// Explicitly request all elements as a real
|
257
|
+
// Explicitly request all elements as a real sass::vector
|
260
258
|
// You are responsible to make a copy if needed
|
261
259
|
// Note: since this returns the real object, we can't
|
262
260
|
// Note: guarantee that the hash will not get out of sync
|
263
|
-
|
264
|
-
const
|
261
|
+
sass::vector<T>& elements() { return elements_; }
|
262
|
+
const sass::vector<T>& elements() const { return elements_; }
|
265
263
|
|
266
264
|
// Insert all items from compatible vector
|
267
|
-
void concat(const
|
265
|
+
void concat(const sass::vector<T>& v)
|
268
266
|
{
|
269
267
|
if (!v.empty()) reset_hash();
|
270
268
|
elements().insert(end(), v.begin(), v.end());
|
@@ -320,7 +318,7 @@ namespace Sass {
|
|
320
318
|
}
|
321
319
|
|
322
320
|
// This might be better implemented as `operator=`?
|
323
|
-
void elements(
|
321
|
+
void elements(sass::vector<T> e) {
|
324
322
|
reset_hash();
|
325
323
|
elements_ = std::move(e);
|
326
324
|
}
|
@@ -336,17 +334,17 @@ namespace Sass {
|
|
336
334
|
}
|
337
335
|
|
338
336
|
template <typename P, typename V>
|
339
|
-
typename
|
337
|
+
typename sass::vector<T>::iterator insert(P position, const V& val) {
|
340
338
|
reset_hash();
|
341
339
|
return elements_.insert(position, val);
|
342
340
|
}
|
343
341
|
|
344
|
-
typename
|
345
|
-
typename
|
346
|
-
typename
|
347
|
-
typename
|
348
|
-
typename
|
349
|
-
typename
|
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); }
|
350
348
|
|
351
349
|
};
|
352
350
|
template <typename T>
|
@@ -354,7 +352,7 @@ namespace Sass {
|
|
354
352
|
|
355
353
|
/////////////////////////////////////////////////////////////////////////////
|
356
354
|
// Mixin class for AST nodes that should behave like a hash table. Uses an
|
357
|
-
// extra <
|
355
|
+
// extra <sass::vector> internally to maintain insertion order for interation.
|
358
356
|
/////////////////////////////////////////////////////////////////////////////
|
359
357
|
template <typename K, typename T, typename U>
|
360
358
|
class Hashed {
|
@@ -363,8 +361,8 @@ namespace Sass {
|
|
363
361
|
K, T, ObjHash, ObjEquality
|
364
362
|
> elements_;
|
365
363
|
|
366
|
-
|
367
|
-
|
364
|
+
sass::vector<K> _keys;
|
365
|
+
sass::vector<T> _values;
|
368
366
|
protected:
|
369
367
|
mutable size_t hash_;
|
370
368
|
K duplicate_key_;
|
@@ -437,13 +435,13 @@ namespace Sass {
|
|
437
435
|
K, T, ObjHash, ObjEquality
|
438
436
|
>& pairs() const { return elements_; }
|
439
437
|
|
440
|
-
const
|
441
|
-
const
|
438
|
+
const sass::vector<K>& keys() const { return _keys; }
|
439
|
+
const sass::vector<T>& values() const { return _values; }
|
442
440
|
|
443
|
-
// std::unordered_map<
|
444
|
-
// std::unordered_map<
|
445
|
-
// std::unordered_map<
|
446
|
-
// std::unordered_map<
|
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(); }
|
447
445
|
|
448
446
|
};
|
449
447
|
template <typename K, typename T, typename U>
|
@@ -486,7 +484,7 @@ namespace Sass {
|
|
486
484
|
ADD_PROPERTY(size_t, tabs)
|
487
485
|
ADD_PROPERTY(bool, group_end)
|
488
486
|
public:
|
489
|
-
Statement(
|
487
|
+
Statement(SourceSpan pstate, Type st = NONE, size_t t = 0);
|
490
488
|
virtual ~Statement() = 0; // virtual destructor
|
491
489
|
// needed for rearranging nested rulesets during CSS emission
|
492
490
|
virtual bool bubbles();
|
@@ -505,7 +503,7 @@ namespace Sass {
|
|
505
503
|
protected:
|
506
504
|
void adjust_after_pushing(Statement_Obj s) override {}
|
507
505
|
public:
|
508
|
-
Block(
|
506
|
+
Block(SourceSpan pstate, size_t s = 0, bool r = false);
|
509
507
|
bool isInvisible() const;
|
510
508
|
bool has_content() override;
|
511
509
|
ATTACH_AST_OPERATIONS(Block)
|
@@ -515,28 +513,28 @@ namespace Sass {
|
|
515
513
|
////////////////////////////////////////////////////////////////////////
|
516
514
|
// Abstract base class for statements that contain blocks of statements.
|
517
515
|
////////////////////////////////////////////////////////////////////////
|
518
|
-
class
|
516
|
+
class ParentStatement : public Statement {
|
519
517
|
ADD_PROPERTY(Block_Obj, block)
|
520
518
|
public:
|
521
|
-
|
522
|
-
|
523
|
-
virtual ~
|
519
|
+
ParentStatement(SourceSpan pstate, Block_Obj b);
|
520
|
+
ParentStatement(const ParentStatement* ptr); // copy constructor
|
521
|
+
virtual ~ParentStatement() = 0; // virtual destructor
|
524
522
|
virtual bool has_content() override;
|
525
523
|
};
|
526
|
-
inline
|
524
|
+
inline ParentStatement::~ParentStatement() { }
|
527
525
|
|
528
526
|
/////////////////////////////////////////////////////////////////////////////
|
529
527
|
// Rulesets (i.e., sets of styles headed by a selector and containing a block
|
530
528
|
// of style declarations.
|
531
529
|
/////////////////////////////////////////////////////////////////////////////
|
532
|
-
class
|
530
|
+
class StyleRule final : public ParentStatement {
|
533
531
|
ADD_PROPERTY(SelectorListObj, selector)
|
534
532
|
ADD_PROPERTY(Selector_Schema_Obj, schema)
|
535
533
|
ADD_PROPERTY(bool, is_root);
|
536
534
|
public:
|
537
|
-
|
535
|
+
StyleRule(SourceSpan pstate, SelectorListObj s = {}, Block_Obj b = {});
|
538
536
|
bool is_invisible() const override;
|
539
|
-
ATTACH_AST_OPERATIONS(
|
537
|
+
ATTACH_AST_OPERATIONS(StyleRule)
|
540
538
|
ATTACH_CRTP_PERFORM_METHODS()
|
541
539
|
};
|
542
540
|
|
@@ -547,7 +545,7 @@ namespace Sass {
|
|
547
545
|
ADD_PROPERTY(Statement_Obj, node)
|
548
546
|
ADD_PROPERTY(bool, group_end)
|
549
547
|
public:
|
550
|
-
Bubble(
|
548
|
+
Bubble(SourceSpan pstate, Statement_Obj n, Statement_Obj g = {}, size_t t = 0);
|
551
549
|
bool bubbles() override;
|
552
550
|
ATTACH_AST_OPERATIONS(Bubble)
|
553
551
|
ATTACH_CRTP_PERFORM_METHODS()
|
@@ -556,11 +554,11 @@ namespace Sass {
|
|
556
554
|
/////////////////
|
557
555
|
// Trace.
|
558
556
|
/////////////////
|
559
|
-
class Trace final : public
|
557
|
+
class Trace final : public ParentStatement {
|
560
558
|
ADD_CONSTREF(char, type)
|
561
|
-
ADD_CONSTREF(
|
559
|
+
ADD_CONSTREF(sass::string, name)
|
562
560
|
public:
|
563
|
-
Trace(
|
561
|
+
Trace(SourceSpan pstate, sass::string n, Block_Obj b = {}, char type = 'm');
|
564
562
|
ATTACH_AST_OPERATIONS(Trace)
|
565
563
|
ATTACH_CRTP_PERFORM_METHODS()
|
566
564
|
};
|
@@ -569,28 +567,28 @@ namespace Sass {
|
|
569
567
|
// At-rules -- arbitrary directives beginning with "@" that may have an
|
570
568
|
// optional statement block.
|
571
569
|
///////////////////////////////////////////////////////////////////////
|
572
|
-
class
|
573
|
-
ADD_CONSTREF(
|
570
|
+
class AtRule final : public ParentStatement {
|
571
|
+
ADD_CONSTREF(sass::string, keyword)
|
574
572
|
ADD_PROPERTY(SelectorListObj, selector)
|
575
|
-
ADD_PROPERTY(
|
573
|
+
ADD_PROPERTY(ExpressionObj, value)
|
576
574
|
public:
|
577
|
-
|
575
|
+
AtRule(SourceSpan pstate, sass::string kwd, SelectorListObj sel = {}, Block_Obj b = {}, ExpressionObj val = {});
|
578
576
|
bool bubbles() override;
|
579
577
|
bool is_media();
|
580
578
|
bool is_keyframes();
|
581
|
-
ATTACH_AST_OPERATIONS(
|
579
|
+
ATTACH_AST_OPERATIONS(AtRule)
|
582
580
|
ATTACH_CRTP_PERFORM_METHODS()
|
583
581
|
};
|
584
582
|
|
585
583
|
///////////////////////////////////////////////////////////////////////
|
586
584
|
// Keyframe-rules -- the child blocks of "@keyframes" nodes.
|
587
585
|
///////////////////////////////////////////////////////////////////////
|
588
|
-
class Keyframe_Rule final : public
|
586
|
+
class Keyframe_Rule final : public ParentStatement {
|
589
587
|
// according to css spec, this should be <keyframes-name>
|
590
588
|
// <keyframes-name> = <custom-ident> | <string>
|
591
589
|
ADD_PROPERTY(SelectorListObj, name)
|
592
590
|
public:
|
593
|
-
Keyframe_Rule(
|
591
|
+
Keyframe_Rule(SourceSpan pstate, Block_Obj b);
|
594
592
|
ATTACH_AST_OPERATIONS(Keyframe_Rule)
|
595
593
|
ATTACH_CRTP_PERFORM_METHODS()
|
596
594
|
};
|
@@ -598,14 +596,14 @@ namespace Sass {
|
|
598
596
|
////////////////////////////////////////////////////////////////////////
|
599
597
|
// Declarations -- style rules consisting of a property name and values.
|
600
598
|
////////////////////////////////////////////////////////////////////////
|
601
|
-
class Declaration final : public
|
599
|
+
class Declaration final : public ParentStatement {
|
602
600
|
ADD_PROPERTY(String_Obj, property)
|
603
|
-
ADD_PROPERTY(
|
601
|
+
ADD_PROPERTY(ExpressionObj, value)
|
604
602
|
ADD_PROPERTY(bool, is_important)
|
605
603
|
ADD_PROPERTY(bool, is_custom_property)
|
606
604
|
ADD_PROPERTY(bool, is_indented)
|
607
605
|
public:
|
608
|
-
Declaration(
|
606
|
+
Declaration(SourceSpan pstate, String_Obj prop, ExpressionObj val, bool i = false, bool c = false, Block_Obj b = {});
|
609
607
|
bool is_invisible() const override;
|
610
608
|
ATTACH_AST_OPERATIONS(Declaration)
|
611
609
|
ATTACH_CRTP_PERFORM_METHODS()
|
@@ -615,12 +613,12 @@ namespace Sass {
|
|
615
613
|
// Assignments -- variable and value.
|
616
614
|
/////////////////////////////////////
|
617
615
|
class Assignment final : public Statement {
|
618
|
-
ADD_CONSTREF(
|
619
|
-
ADD_PROPERTY(
|
616
|
+
ADD_CONSTREF(sass::string, variable)
|
617
|
+
ADD_PROPERTY(ExpressionObj, value)
|
620
618
|
ADD_PROPERTY(bool, is_default)
|
621
619
|
ADD_PROPERTY(bool, is_global)
|
622
620
|
public:
|
623
|
-
Assignment(
|
621
|
+
Assignment(SourceSpan pstate, sass::string var, ExpressionObj val, bool is_default = false, bool is_global = false);
|
624
622
|
ATTACH_AST_OPERATIONS(Assignment)
|
625
623
|
ATTACH_CRTP_PERFORM_METHODS()
|
626
624
|
};
|
@@ -630,13 +628,13 @@ namespace Sass {
|
|
630
628
|
// necessary to store a list of each in an Import node.
|
631
629
|
////////////////////////////////////////////////////////////////////////////
|
632
630
|
class Import final : public Statement {
|
633
|
-
|
634
|
-
|
631
|
+
sass::vector<ExpressionObj> urls_;
|
632
|
+
sass::vector<Include> incs_;
|
635
633
|
ADD_PROPERTY(List_Obj, import_queries);
|
636
634
|
public:
|
637
|
-
Import(
|
638
|
-
|
639
|
-
|
635
|
+
Import(SourceSpan pstate);
|
636
|
+
sass::vector<Include>& incs();
|
637
|
+
sass::vector<ExpressionObj>& urls();
|
640
638
|
ATTACH_AST_OPERATIONS(Import)
|
641
639
|
ATTACH_CRTP_PERFORM_METHODS()
|
642
640
|
};
|
@@ -646,10 +644,10 @@ namespace Sass {
|
|
646
644
|
class Import_Stub final : public Statement {
|
647
645
|
Include resource_;
|
648
646
|
public:
|
649
|
-
Import_Stub(
|
647
|
+
Import_Stub(SourceSpan pstate, Include res);
|
650
648
|
Include resource();
|
651
|
-
|
652
|
-
|
649
|
+
sass::string imp_path();
|
650
|
+
sass::string abs_path();
|
653
651
|
ATTACH_AST_OPERATIONS(Import_Stub)
|
654
652
|
ATTACH_CRTP_PERFORM_METHODS()
|
655
653
|
};
|
@@ -657,33 +655,33 @@ namespace Sass {
|
|
657
655
|
//////////////////////////////
|
658
656
|
// The Sass `@warn` directive.
|
659
657
|
//////////////////////////////
|
660
|
-
class
|
661
|
-
ADD_PROPERTY(
|
658
|
+
class WarningRule final : public Statement {
|
659
|
+
ADD_PROPERTY(ExpressionObj, message)
|
662
660
|
public:
|
663
|
-
|
664
|
-
ATTACH_AST_OPERATIONS(
|
661
|
+
WarningRule(SourceSpan pstate, ExpressionObj msg);
|
662
|
+
ATTACH_AST_OPERATIONS(WarningRule)
|
665
663
|
ATTACH_CRTP_PERFORM_METHODS()
|
666
664
|
};
|
667
665
|
|
668
666
|
///////////////////////////////
|
669
667
|
// The Sass `@error` directive.
|
670
668
|
///////////////////////////////
|
671
|
-
class
|
672
|
-
ADD_PROPERTY(
|
669
|
+
class ErrorRule final : public Statement {
|
670
|
+
ADD_PROPERTY(ExpressionObj, message)
|
673
671
|
public:
|
674
|
-
|
675
|
-
ATTACH_AST_OPERATIONS(
|
672
|
+
ErrorRule(SourceSpan pstate, ExpressionObj msg);
|
673
|
+
ATTACH_AST_OPERATIONS(ErrorRule)
|
676
674
|
ATTACH_CRTP_PERFORM_METHODS()
|
677
675
|
};
|
678
676
|
|
679
677
|
///////////////////////////////
|
680
678
|
// The Sass `@debug` directive.
|
681
679
|
///////////////////////////////
|
682
|
-
class
|
683
|
-
ADD_PROPERTY(
|
680
|
+
class DebugRule final : public Statement {
|
681
|
+
ADD_PROPERTY(ExpressionObj, value)
|
684
682
|
public:
|
685
|
-
|
686
|
-
ATTACH_AST_OPERATIONS(
|
683
|
+
DebugRule(SourceSpan pstate, ExpressionObj val);
|
684
|
+
ATTACH_AST_OPERATIONS(DebugRule)
|
687
685
|
ATTACH_CRTP_PERFORM_METHODS()
|
688
686
|
};
|
689
687
|
|
@@ -694,7 +692,7 @@ namespace Sass {
|
|
694
692
|
ADD_PROPERTY(String_Obj, text)
|
695
693
|
ADD_PROPERTY(bool, is_important)
|
696
694
|
public:
|
697
|
-
Comment(
|
695
|
+
Comment(SourceSpan pstate, String_Obj txt, bool is_important);
|
698
696
|
virtual bool is_invisible() const override;
|
699
697
|
ATTACH_AST_OPERATIONS(Comment)
|
700
698
|
ATTACH_CRTP_PERFORM_METHODS()
|
@@ -703,11 +701,11 @@ namespace Sass {
|
|
703
701
|
////////////////////////////////////
|
704
702
|
// The Sass `@if` control directive.
|
705
703
|
////////////////////////////////////
|
706
|
-
class If final : public
|
707
|
-
ADD_PROPERTY(
|
704
|
+
class If final : public ParentStatement {
|
705
|
+
ADD_PROPERTY(ExpressionObj, predicate)
|
708
706
|
ADD_PROPERTY(Block_Obj, alternative)
|
709
707
|
public:
|
710
|
-
If(
|
708
|
+
If(SourceSpan pstate, ExpressionObj pred, Block_Obj con, Block_Obj alt = {});
|
711
709
|
virtual bool has_content() override;
|
712
710
|
ATTACH_AST_OPERATIONS(If)
|
713
711
|
ATTACH_CRTP_PERFORM_METHODS()
|
@@ -716,37 +714,37 @@ namespace Sass {
|
|
716
714
|
/////////////////////////////////////
|
717
715
|
// The Sass `@for` control directive.
|
718
716
|
/////////////////////////////////////
|
719
|
-
class
|
720
|
-
ADD_CONSTREF(
|
721
|
-
ADD_PROPERTY(
|
722
|
-
ADD_PROPERTY(
|
717
|
+
class ForRule final : public ParentStatement {
|
718
|
+
ADD_CONSTREF(sass::string, variable)
|
719
|
+
ADD_PROPERTY(ExpressionObj, lower_bound)
|
720
|
+
ADD_PROPERTY(ExpressionObj, upper_bound)
|
723
721
|
ADD_PROPERTY(bool, is_inclusive)
|
724
722
|
public:
|
725
|
-
|
726
|
-
ATTACH_AST_OPERATIONS(
|
723
|
+
ForRule(SourceSpan pstate, sass::string var, ExpressionObj lo, ExpressionObj hi, Block_Obj b, bool inc);
|
724
|
+
ATTACH_AST_OPERATIONS(ForRule)
|
727
725
|
ATTACH_CRTP_PERFORM_METHODS()
|
728
726
|
};
|
729
727
|
|
730
728
|
//////////////////////////////////////
|
731
729
|
// The Sass `@each` control directive.
|
732
730
|
//////////////////////////////////////
|
733
|
-
class
|
734
|
-
ADD_PROPERTY(
|
735
|
-
ADD_PROPERTY(
|
731
|
+
class EachRule final : public ParentStatement {
|
732
|
+
ADD_PROPERTY(sass::vector<sass::string>, variables)
|
733
|
+
ADD_PROPERTY(ExpressionObj, list)
|
736
734
|
public:
|
737
|
-
|
738
|
-
ATTACH_AST_OPERATIONS(
|
735
|
+
EachRule(SourceSpan pstate, sass::vector<sass::string> vars, ExpressionObj lst, Block_Obj b);
|
736
|
+
ATTACH_AST_OPERATIONS(EachRule)
|
739
737
|
ATTACH_CRTP_PERFORM_METHODS()
|
740
738
|
};
|
741
739
|
|
742
740
|
///////////////////////////////////////
|
743
741
|
// The Sass `@while` control directive.
|
744
742
|
///////////////////////////////////////
|
745
|
-
class
|
746
|
-
ADD_PROPERTY(
|
743
|
+
class WhileRule final : public ParentStatement {
|
744
|
+
ADD_PROPERTY(ExpressionObj, predicate)
|
747
745
|
public:
|
748
|
-
|
749
|
-
ATTACH_AST_OPERATIONS(
|
746
|
+
WhileRule(SourceSpan pstate, ExpressionObj pred, Block_Obj b);
|
747
|
+
ATTACH_AST_OPERATIONS(WhileRule)
|
750
748
|
ATTACH_CRTP_PERFORM_METHODS()
|
751
749
|
};
|
752
750
|
|
@@ -754,9 +752,9 @@ namespace Sass {
|
|
754
752
|
// The @return directive for use inside SassScript functions.
|
755
753
|
/////////////////////////////////////////////////////////////
|
756
754
|
class Return final : public Statement {
|
757
|
-
ADD_PROPERTY(
|
755
|
+
ADD_PROPERTY(ExpressionObj, value)
|
758
756
|
public:
|
759
|
-
Return(
|
757
|
+
Return(SourceSpan pstate, ExpressionObj val);
|
760
758
|
ATTACH_AST_OPERATIONS(Return)
|
761
759
|
ATTACH_CRTP_PERFORM_METHODS()
|
762
760
|
};
|
@@ -765,10 +763,10 @@ namespace Sass {
|
|
765
763
|
// Definitions for both mixins and functions. The two cases are distinguished
|
766
764
|
// by a type tag.
|
767
765
|
/////////////////////////////////////////////////////////////////////////////
|
768
|
-
class Definition final : public
|
766
|
+
class Definition final : public ParentStatement {
|
769
767
|
public:
|
770
768
|
enum Type { MIXIN, FUNCTION };
|
771
|
-
ADD_CONSTREF(
|
769
|
+
ADD_CONSTREF(sass::string, name)
|
772
770
|
ADD_PROPERTY(Parameters_Obj, parameters)
|
773
771
|
ADD_PROPERTY(Env*, environment)
|
774
772
|
ADD_PROPERTY(Type, type)
|
@@ -778,20 +776,20 @@ namespace Sass {
|
|
778
776
|
ADD_PROPERTY(bool, is_overload_stub)
|
779
777
|
ADD_PROPERTY(Signature, signature)
|
780
778
|
public:
|
781
|
-
Definition(
|
782
|
-
|
779
|
+
Definition(SourceSpan pstate,
|
780
|
+
sass::string n,
|
783
781
|
Parameters_Obj params,
|
784
782
|
Block_Obj b,
|
785
783
|
Type t);
|
786
|
-
Definition(
|
784
|
+
Definition(SourceSpan pstate,
|
787
785
|
Signature sig,
|
788
|
-
|
786
|
+
sass::string n,
|
789
787
|
Parameters_Obj params,
|
790
788
|
Native_Function func_ptr,
|
791
789
|
bool overload_stub = false);
|
792
|
-
Definition(
|
790
|
+
Definition(SourceSpan pstate,
|
793
791
|
Signature sig,
|
794
|
-
|
792
|
+
sass::string n,
|
795
793
|
Parameters_Obj params,
|
796
794
|
Sass_Function_Entry c_func);
|
797
795
|
ATTACH_AST_OPERATIONS(Definition)
|
@@ -801,12 +799,12 @@ namespace Sass {
|
|
801
799
|
//////////////////////////////////////
|
802
800
|
// Mixin calls (i.e., `@include ...`).
|
803
801
|
//////////////////////////////////////
|
804
|
-
class Mixin_Call final : public
|
805
|
-
ADD_CONSTREF(
|
802
|
+
class Mixin_Call final : public ParentStatement {
|
803
|
+
ADD_CONSTREF(sass::string, name)
|
806
804
|
ADD_PROPERTY(Arguments_Obj, arguments)
|
807
805
|
ADD_PROPERTY(Parameters_Obj, block_parameters)
|
808
806
|
public:
|
809
|
-
Mixin_Call(
|
807
|
+
Mixin_Call(SourceSpan pstate, sass::string n, Arguments_Obj args, Parameters_Obj b_params = {}, Block_Obj b = {});
|
810
808
|
ATTACH_AST_OPERATIONS(Mixin_Call)
|
811
809
|
ATTACH_CRTP_PERFORM_METHODS()
|
812
810
|
};
|
@@ -817,7 +815,7 @@ namespace Sass {
|
|
817
815
|
class Content final : public Statement {
|
818
816
|
ADD_PROPERTY(Arguments_Obj, arguments)
|
819
817
|
public:
|
820
|
-
Content(
|
818
|
+
Content(SourceSpan pstate, Arguments_Obj args);
|
821
819
|
ATTACH_AST_OPERATIONS(Content)
|
822
820
|
ATTACH_CRTP_PERFORM_METHODS()
|
823
821
|
};
|
@@ -830,11 +828,11 @@ namespace Sass {
|
|
830
828
|
enum Type { PLUS, MINUS, NOT, SLASH };
|
831
829
|
private:
|
832
830
|
HASH_PROPERTY(Type, optype)
|
833
|
-
HASH_PROPERTY(
|
831
|
+
HASH_PROPERTY(ExpressionObj, operand)
|
834
832
|
mutable size_t hash_;
|
835
833
|
public:
|
836
|
-
Unary_Expression(
|
837
|
-
const
|
834
|
+
Unary_Expression(SourceSpan pstate, Type t, ExpressionObj o);
|
835
|
+
const sass::string type_name();
|
838
836
|
virtual bool operator==(const Expression& rhs) const override;
|
839
837
|
size_t hash() const override;
|
840
838
|
ATTACH_AST_OPERATIONS(Unary_Expression)
|
@@ -845,13 +843,13 @@ namespace Sass {
|
|
845
843
|
// Individual argument objects for mixin and function calls.
|
846
844
|
////////////////////////////////////////////////////////////
|
847
845
|
class Argument final : public Expression {
|
848
|
-
HASH_PROPERTY(
|
849
|
-
HASH_CONSTREF(
|
846
|
+
HASH_PROPERTY(ExpressionObj, value)
|
847
|
+
HASH_CONSTREF(sass::string, name)
|
850
848
|
ADD_PROPERTY(bool, is_rest_argument)
|
851
849
|
ADD_PROPERTY(bool, is_keyword_argument)
|
852
850
|
mutable size_t hash_;
|
853
851
|
public:
|
854
|
-
Argument(
|
852
|
+
Argument(SourceSpan pstate, ExpressionObj val, sass::string n = "", bool rest = false, bool keyword = false);
|
855
853
|
void set_delayed(bool delayed) override;
|
856
854
|
bool operator==(const Expression& rhs) const override;
|
857
855
|
size_t hash() const override;
|
@@ -871,7 +869,7 @@ namespace Sass {
|
|
871
869
|
protected:
|
872
870
|
void adjust_after_pushing(Argument_Obj a) override;
|
873
871
|
public:
|
874
|
-
Arguments(
|
872
|
+
Arguments(SourceSpan pstate);
|
875
873
|
void set_delayed(bool delayed) override;
|
876
874
|
Argument_Obj get_rest_argument();
|
877
875
|
Argument_Obj get_keyword_argument();
|
@@ -880,12 +878,12 @@ namespace Sass {
|
|
880
878
|
};
|
881
879
|
|
882
880
|
|
883
|
-
// A Media
|
881
|
+
// A Media StyleRule before it has been evaluated
|
884
882
|
// Could be already final or an interpolation
|
885
|
-
class MediaRule final : public
|
883
|
+
class MediaRule final : public ParentStatement {
|
886
884
|
ADD_PROPERTY(List_Obj, schema)
|
887
885
|
public:
|
888
|
-
MediaRule(
|
886
|
+
MediaRule(SourceSpan pstate, Block_Obj block = {});
|
889
887
|
|
890
888
|
bool bubbles() override { return true; };
|
891
889
|
bool is_invisible() const override { return false; };
|
@@ -893,12 +891,12 @@ namespace Sass {
|
|
893
891
|
ATTACH_CRTP_PERFORM_METHODS()
|
894
892
|
};
|
895
893
|
|
896
|
-
// A Media
|
894
|
+
// A Media StyleRule after it has been evaluated
|
897
895
|
// Representing the static or resulting css
|
898
|
-
class CssMediaRule final : public
|
896
|
+
class CssMediaRule final : public ParentStatement,
|
899
897
|
public Vectorized<CssMediaQuery_Obj> {
|
900
898
|
public:
|
901
|
-
CssMediaRule(
|
899
|
+
CssMediaRule(SourceSpan pstate, Block_Obj b);
|
902
900
|
bool bubbles() override { return true; };
|
903
901
|
bool isInvisible() const { return empty(); }
|
904
902
|
bool is_invisible() const override { return false; };
|
@@ -925,17 +923,17 @@ namespace Sass {
|
|
925
923
|
|
926
924
|
// The modifier, probably either "not" or "only".
|
927
925
|
// This may be `null` if no modifier is in use.
|
928
|
-
ADD_PROPERTY(
|
926
|
+
ADD_PROPERTY(sass::string, modifier);
|
929
927
|
|
930
928
|
// The media type, for example "screen" or "print".
|
931
929
|
// This may be `null`. If so, [features] will not be empty.
|
932
|
-
ADD_PROPERTY(
|
930
|
+
ADD_PROPERTY(sass::string, type);
|
933
931
|
|
934
932
|
// Feature queries, including parentheses.
|
935
|
-
ADD_PROPERTY(
|
933
|
+
ADD_PROPERTY(sass::vector<sass::string>, features);
|
936
934
|
|
937
935
|
public:
|
938
|
-
CssMediaQuery(
|
936
|
+
CssMediaQuery(SourceSpan pstate);
|
939
937
|
|
940
938
|
// Check if two instances are considered equal
|
941
939
|
bool operator== (const CssMediaQuery& rhs) const;
|
@@ -970,12 +968,12 @@ namespace Sass {
|
|
970
968
|
// ToDo: only used for interpolation case
|
971
969
|
////////////////////////////////////////////////////
|
972
970
|
class Media_Query final : public Expression,
|
973
|
-
public Vectorized<
|
971
|
+
public Vectorized<Media_Query_ExpressionObj> {
|
974
972
|
ADD_PROPERTY(String_Obj, media_type)
|
975
973
|
ADD_PROPERTY(bool, is_negated)
|
976
974
|
ADD_PROPERTY(bool, is_restricted)
|
977
975
|
public:
|
978
|
-
Media_Query(
|
976
|
+
Media_Query(SourceSpan pstate, String_Obj t = {}, size_t s = 0, bool n = false, bool r = false);
|
979
977
|
ATTACH_AST_OPERATIONS(Media_Query)
|
980
978
|
ATTACH_CRTP_PERFORM_METHODS()
|
981
979
|
};
|
@@ -985,11 +983,11 @@ namespace Sass {
|
|
985
983
|
// ToDo: only used for interpolation case
|
986
984
|
////////////////////////////////////////////////////
|
987
985
|
class Media_Query_Expression final : public Expression {
|
988
|
-
ADD_PROPERTY(
|
989
|
-
ADD_PROPERTY(
|
986
|
+
ADD_PROPERTY(ExpressionObj, feature)
|
987
|
+
ADD_PROPERTY(ExpressionObj, value)
|
990
988
|
ADD_PROPERTY(bool, is_interpolated)
|
991
989
|
public:
|
992
|
-
Media_Query_Expression(
|
990
|
+
Media_Query_Expression(SourceSpan pstate, ExpressionObj f, ExpressionObj v, bool i = false);
|
993
991
|
ATTACH_AST_OPERATIONS(Media_Query_Expression)
|
994
992
|
ATTACH_CRTP_PERFORM_METHODS()
|
995
993
|
};
|
@@ -999,11 +997,11 @@ namespace Sass {
|
|
999
997
|
/////////////////////////////////////////////////
|
1000
998
|
class At_Root_Query final : public Expression {
|
1001
999
|
private:
|
1002
|
-
ADD_PROPERTY(
|
1003
|
-
ADD_PROPERTY(
|
1000
|
+
ADD_PROPERTY(ExpressionObj, feature)
|
1001
|
+
ADD_PROPERTY(ExpressionObj, value)
|
1004
1002
|
public:
|
1005
|
-
At_Root_Query(
|
1006
|
-
bool exclude(
|
1003
|
+
At_Root_Query(SourceSpan pstate, ExpressionObj f = {}, ExpressionObj v = {}, bool i = false);
|
1004
|
+
bool exclude(sass::string str);
|
1007
1005
|
ATTACH_AST_OPERATIONS(At_Root_Query)
|
1008
1006
|
ATTACH_CRTP_PERFORM_METHODS()
|
1009
1007
|
};
|
@@ -1011,13 +1009,13 @@ namespace Sass {
|
|
1011
1009
|
///////////
|
1012
1010
|
// At-root.
|
1013
1011
|
///////////
|
1014
|
-
class
|
1012
|
+
class AtRootRule final : public ParentStatement {
|
1015
1013
|
ADD_PROPERTY(At_Root_Query_Obj, expression)
|
1016
1014
|
public:
|
1017
|
-
|
1015
|
+
AtRootRule(SourceSpan pstate, Block_Obj b = {}, At_Root_Query_Obj e = {});
|
1018
1016
|
bool bubbles() override;
|
1019
1017
|
bool exclude_node(Statement_Obj s);
|
1020
|
-
ATTACH_AST_OPERATIONS(
|
1018
|
+
ATTACH_AST_OPERATIONS(AtRootRule)
|
1021
1019
|
ATTACH_CRTP_PERFORM_METHODS()
|
1022
1020
|
};
|
1023
1021
|
|
@@ -1025,11 +1023,11 @@ namespace Sass {
|
|
1025
1023
|
// Individual parameter objects for mixins and functions.
|
1026
1024
|
/////////////////////////////////////////////////////////
|
1027
1025
|
class Parameter final : public AST_Node {
|
1028
|
-
ADD_CONSTREF(
|
1029
|
-
ADD_PROPERTY(
|
1026
|
+
ADD_CONSTREF(sass::string, name)
|
1027
|
+
ADD_PROPERTY(ExpressionObj, default_value)
|
1030
1028
|
ADD_PROPERTY(bool, is_rest_parameter)
|
1031
1029
|
public:
|
1032
|
-
Parameter(
|
1030
|
+
Parameter(SourceSpan pstate, sass::string n, ExpressionObj def = {}, bool rest = false);
|
1033
1031
|
ATTACH_AST_OPERATIONS(Parameter)
|
1034
1032
|
ATTACH_CRTP_PERFORM_METHODS()
|
1035
1033
|
};
|
@@ -1045,7 +1043,7 @@ namespace Sass {
|
|
1045
1043
|
protected:
|
1046
1044
|
void adjust_after_pushing(Parameter_Obj p) override;
|
1047
1045
|
public:
|
1048
|
-
Parameters(
|
1046
|
+
Parameters(SourceSpan pstate);
|
1049
1047
|
ATTACH_AST_OPERATIONS(Parameters)
|
1050
1048
|
ATTACH_CRTP_PERFORM_METHODS()
|
1051
1049
|
};
|