sassc 1.11.1 → 1.11.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/README.md +3 -2
- data/ext/libsass/Makefile.conf +2 -1
- data/ext/libsass/appveyor.yml +10 -5
- data/ext/libsass/docs/dev-ast-memory.md +223 -0
- data/ext/libsass/include/sass/base.h +2 -0
- data/ext/libsass/script/bootstrap +7 -4
- data/ext/libsass/script/ci-build-libsass +3 -3
- data/ext/libsass/script/ci-install-compiler +2 -0
- data/ext/libsass/script/ci-report-coverage +2 -1
- data/ext/libsass/script/test-leaks.pl +103 -0
- data/ext/libsass/src/ast.cpp +621 -495
- data/ext/libsass/src/ast.hpp +801 -367
- data/ext/libsass/src/ast_def_macros.hpp +5 -5
- data/ext/libsass/src/ast_fwd_decl.hpp +312 -14
- data/ext/libsass/src/bind.cpp +54 -51
- data/ext/libsass/src/bind.hpp +3 -7
- data/ext/libsass/src/check_nesting.cpp +117 -120
- data/ext/libsass/src/check_nesting.hpp +38 -34
- data/ext/libsass/src/color_maps.cpp +3 -3
- data/ext/libsass/src/color_maps.hpp +3 -3
- data/ext/libsass/src/context.cpp +33 -34
- data/ext/libsass/src/context.hpp +12 -14
- data/ext/libsass/src/cssize.cpp +200 -228
- data/ext/libsass/src/cssize.hpp +49 -49
- data/ext/libsass/src/debugger.hpp +260 -241
- data/ext/libsass/src/emitter.cpp +6 -6
- data/ext/libsass/src/emitter.hpp +7 -7
- data/ext/libsass/src/environment.cpp +2 -2
- data/ext/libsass/src/environment.hpp +0 -2
- data/ext/libsass/src/error_handling.cpp +5 -5
- data/ext/libsass/src/error_handling.hpp +12 -12
- data/ext/libsass/src/eval.cpp +412 -401
- data/ext/libsass/src/eval.hpp +61 -62
- data/ext/libsass/src/expand.cpp +223 -204
- data/ext/libsass/src/expand.hpp +42 -42
- data/ext/libsass/src/extend.cpp +198 -201
- data/ext/libsass/src/extend.hpp +12 -14
- data/ext/libsass/src/file.hpp +4 -5
- data/ext/libsass/src/functions.cpp +413 -418
- data/ext/libsass/src/functions.hpp +7 -10
- data/ext/libsass/src/inspect.cpp +115 -109
- data/ext/libsass/src/inspect.hpp +69 -69
- data/ext/libsass/src/listize.cpp +31 -33
- data/ext/libsass/src/listize.hpp +8 -10
- data/ext/libsass/src/memory/SharedPtr.cpp +116 -0
- data/ext/libsass/src/memory/SharedPtr.hpp +202 -0
- data/ext/libsass/src/node.cpp +45 -43
- data/ext/libsass/src/node.hpp +15 -15
- data/ext/libsass/src/operation.hpp +136 -136
- data/ext/libsass/src/output.cpp +48 -49
- data/ext/libsass/src/output.hpp +14 -14
- data/ext/libsass/src/parser.cpp +530 -554
- data/ext/libsass/src/parser.hpp +91 -96
- data/ext/libsass/src/prelexer.cpp +13 -10
- data/ext/libsass/src/remove_placeholders.cpp +25 -21
- data/ext/libsass/src/remove_placeholders.hpp +7 -7
- data/ext/libsass/src/sass2scss.cpp +2 -1
- data/ext/libsass/src/sass_context.cpp +125 -107
- data/ext/libsass/src/sass_context.hpp +1 -1
- data/ext/libsass/src/sass_util.hpp +5 -5
- data/ext/libsass/src/sass_values.cpp +27 -27
- data/ext/libsass/src/source_map.cpp +2 -2
- data/ext/libsass/src/source_map.hpp +2 -2
- data/ext/libsass/src/subset_map.cpp +57 -0
- data/ext/libsass/src/subset_map.hpp +8 -76
- data/ext/libsass/src/to_c.cpp +13 -13
- data/ext/libsass/src/to_c.hpp +14 -14
- data/ext/libsass/src/to_value.cpp +20 -20
- data/ext/libsass/src/to_value.hpp +20 -21
- data/ext/libsass/src/util.cpp +55 -88
- data/ext/libsass/src/util.hpp +9 -13
- data/ext/libsass/src/values.cpp +27 -26
- data/ext/libsass/src/values.hpp +2 -2
- data/ext/libsass/test/test_subset_map.cpp +69 -69
- data/ext/libsass/win/libsass.targets +3 -2
- data/ext/libsass/win/libsass.vcxproj.filters +9 -6
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +0 -1
- data/test/native_test.rb +1 -1
- metadata +7 -5
- data/ext/libsass/src/ast_factory.hpp +0 -92
- data/ext/libsass/src/memory_manager.cpp +0 -77
- data/ext/libsass/src/memory_manager.hpp +0 -48
data/ext/libsass/src/ast.hpp
CHANGED
@@ -9,8 +9,30 @@
|
|
9
9
|
#include <iostream>
|
10
10
|
#include <typeinfo>
|
11
11
|
#include <algorithm>
|
12
|
-
#include <unordered_map>
|
13
12
|
#include "sass/base.h"
|
13
|
+
#include "ast_fwd_decl.hpp"
|
14
|
+
|
15
|
+
#ifdef DEBUG_SHARED_PTR
|
16
|
+
|
17
|
+
#define ATTACH_VIRTUAL_AST_OPERATIONS(klass) \
|
18
|
+
virtual klass##_Ptr copy(std::string, size_t) const = 0; \
|
19
|
+
virtual klass##_Ptr clone(std::string, size_t) const = 0; \
|
20
|
+
|
21
|
+
#define ATTACH_AST_OPERATIONS(klass) \
|
22
|
+
virtual klass##_Ptr copy(std::string, size_t) const; \
|
23
|
+
virtual klass##_Ptr clone(std::string, size_t) const; \
|
24
|
+
|
25
|
+
#else
|
26
|
+
|
27
|
+
#define ATTACH_VIRTUAL_AST_OPERATIONS(klass) \
|
28
|
+
virtual klass##_Ptr copy() const = 0; \
|
29
|
+
virtual klass##_Ptr clone() const = 0; \
|
30
|
+
|
31
|
+
#define ATTACH_AST_OPERATIONS(klass) \
|
32
|
+
virtual klass##_Ptr copy() const; \
|
33
|
+
virtual klass##_Ptr clone() const; \
|
34
|
+
|
35
|
+
#endif
|
14
36
|
|
15
37
|
#ifdef __clang__
|
16
38
|
|
@@ -20,12 +42,7 @@
|
|
20
42
|
*
|
21
43
|
* Type type() which hides string type() from Expression
|
22
44
|
*
|
23
|
-
* and
|
24
|
-
*
|
25
|
-
* Block* block() which hides virtual Block* block() from Statement
|
26
|
-
*
|
27
45
|
*/
|
28
|
-
|
29
46
|
#pragma clang diagnostic push
|
30
47
|
#pragma clang diagnostic ignored "-Woverloaded-virtual"
|
31
48
|
|
@@ -86,19 +103,26 @@ namespace Sass {
|
|
86
103
|
//////////////////////////////////////////////////////////
|
87
104
|
// Abstract base class for all abstract syntax tree nodes.
|
88
105
|
//////////////////////////////////////////////////////////
|
89
|
-
class AST_Node : public
|
106
|
+
class AST_Node : public SharedObj {
|
90
107
|
ADD_PROPERTY(ParserState, pstate)
|
91
108
|
public:
|
92
109
|
AST_Node(ParserState pstate)
|
93
110
|
: pstate_(pstate)
|
94
111
|
{ }
|
112
|
+
AST_Node(const AST_Node* ptr)
|
113
|
+
: pstate_(ptr->pstate_)
|
114
|
+
{ }
|
115
|
+
|
116
|
+
// AST_Node(AST_Node& ptr) = delete;
|
117
|
+
|
95
118
|
virtual ~AST_Node() = 0;
|
96
119
|
virtual size_t hash() { return 0; }
|
120
|
+
ATTACH_VIRTUAL_AST_OPERATIONS(AST_Node);
|
97
121
|
virtual std::string inspect() const { return to_string({ INSPECT, 5 }); }
|
98
122
|
virtual std::string to_sass() const { return to_string({ TO_SASS, 5 }); }
|
99
123
|
virtual std::string to_string(Sass_Inspect_Options opt) const;
|
100
124
|
virtual std::string to_string() const;
|
101
|
-
|
125
|
+
virtual void cloneChildren() {};
|
102
126
|
public:
|
103
127
|
void update_pstate(const ParserState& pstate);
|
104
128
|
void set_pstate_offset(const Offset& offset);
|
@@ -129,8 +153,15 @@ namespace Sass {
|
|
129
153
|
NULL_VAL,
|
130
154
|
C_WARNING,
|
131
155
|
C_ERROR,
|
156
|
+
FUNCTION,
|
132
157
|
NUM_TYPES
|
133
158
|
};
|
159
|
+
enum Simple_Type {
|
160
|
+
SIMPLE,
|
161
|
+
ATTR_SEL,
|
162
|
+
PSEUDO_SEL,
|
163
|
+
WRAPPED_SEL,
|
164
|
+
};
|
134
165
|
private:
|
135
166
|
// expressions in some contexts shouldn't be evaluated
|
136
167
|
ADD_PROPERTY(bool, is_delayed)
|
@@ -146,12 +177,20 @@ namespace Sass {
|
|
146
177
|
is_interpolant_(i),
|
147
178
|
concrete_type_(ct)
|
148
179
|
{ }
|
180
|
+
Expression(const Expression* ptr)
|
181
|
+
: AST_Node(ptr),
|
182
|
+
is_delayed_(ptr->is_delayed_),
|
183
|
+
is_expanded_(ptr->is_expanded_),
|
184
|
+
is_interpolant_(ptr->is_interpolant_),
|
185
|
+
concrete_type_(ptr->concrete_type_)
|
186
|
+
{ }
|
149
187
|
virtual operator bool() { return true; }
|
150
188
|
virtual ~Expression() { }
|
151
189
|
virtual std::string type() { return ""; /* TODO: raise an error? */ }
|
152
190
|
virtual bool is_invisible() const { return false; }
|
153
191
|
static std::string type_name() { return ""; }
|
154
192
|
virtual bool is_false() { return false; }
|
193
|
+
// virtual bool is_true() { return !is_false(); }
|
155
194
|
virtual bool operator== (const Expression& rhs) const { return false; }
|
156
195
|
virtual bool eq(const Expression& rhs) const { return *this == rhs; };
|
157
196
|
virtual void set_delayed(bool delayed) { is_delayed(delayed); }
|
@@ -160,6 +199,7 @@ namespace Sass {
|
|
160
199
|
virtual bool is_right_interpolant() const { return is_interpolant(); }
|
161
200
|
virtual std::string inspect() const { return to_string({ INSPECT, 5 }); }
|
162
201
|
virtual std::string to_sass() const { return to_string({ TO_SASS, 5 }); }
|
202
|
+
ATTACH_VIRTUAL_AST_OPERATIONS(Expression);
|
163
203
|
virtual size_t hash() { return 0; }
|
164
204
|
};
|
165
205
|
|
@@ -172,6 +212,10 @@ namespace Sass {
|
|
172
212
|
bool d = false, bool e = false, bool i = false, Concrete_Type ct = NONE)
|
173
213
|
: Expression(pstate, d, e, i, ct)
|
174
214
|
{ }
|
215
|
+
PreValue(const PreValue* ptr)
|
216
|
+
: Expression(ptr)
|
217
|
+
{ }
|
218
|
+
ATTACH_VIRTUAL_AST_OPERATIONS(PreValue);
|
175
219
|
virtual ~PreValue() { }
|
176
220
|
};
|
177
221
|
|
@@ -184,6 +228,10 @@ namespace Sass {
|
|
184
228
|
bool d = false, bool e = false, bool i = false, Concrete_Type ct = NONE)
|
185
229
|
: Expression(pstate, d, e, i, ct)
|
186
230
|
{ }
|
231
|
+
Value(const Value* ptr)
|
232
|
+
: Expression(ptr)
|
233
|
+
{ }
|
234
|
+
ATTACH_VIRTUAL_AST_OPERATIONS(Value);
|
187
235
|
virtual bool operator== (const Expression& rhs) const = 0;
|
188
236
|
};
|
189
237
|
}
|
@@ -194,17 +242,17 @@ namespace Sass {
|
|
194
242
|
|
195
243
|
namespace std {
|
196
244
|
template<>
|
197
|
-
struct hash<Sass::
|
245
|
+
struct hash<Sass::Expression_Obj>
|
198
246
|
{
|
199
|
-
size_t operator()(Sass::
|
247
|
+
size_t operator()(Sass::Expression_Obj s) const
|
200
248
|
{
|
201
249
|
return s->hash();
|
202
250
|
}
|
203
251
|
};
|
204
252
|
template<>
|
205
|
-
struct equal_to<Sass::
|
253
|
+
struct equal_to<Sass::Expression_Obj>
|
206
254
|
{
|
207
|
-
bool operator()( Sass::
|
255
|
+
bool operator()( Sass::Expression_Obj lhs, Sass::Expression_Obj rhs) const
|
208
256
|
{
|
209
257
|
return lhs->hash() == rhs->hash();
|
210
258
|
}
|
@@ -231,23 +279,24 @@ namespace Sass {
|
|
231
279
|
virtual ~Vectorized() = 0;
|
232
280
|
size_t length() const { return elements_.size(); }
|
233
281
|
bool empty() const { return elements_.empty(); }
|
282
|
+
void clear() { return elements_.clear(); }
|
234
283
|
T last() const { return elements_.back(); }
|
235
284
|
T first() const { return elements_.front(); }
|
236
285
|
T& operator[](size_t i) { return elements_[i]; }
|
237
286
|
virtual const T& at(size_t i) const { return elements_.at(i); }
|
287
|
+
virtual T& at(size_t i) { return elements_.at(i); }
|
238
288
|
const T& operator[](size_t i) const { return elements_[i]; }
|
239
|
-
virtual
|
289
|
+
virtual void append(T element)
|
240
290
|
{
|
241
|
-
if (
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
291
|
+
if (element) {
|
292
|
+
reset_hash();
|
293
|
+
elements_.push_back(element);
|
294
|
+
adjust_after_pushing(element);
|
295
|
+
}
|
246
296
|
}
|
247
|
-
|
297
|
+
virtual void concat(Vectorized* v)
|
248
298
|
{
|
249
|
-
for (size_t i = 0, L = v->length(); i < L; ++i)
|
250
|
-
return *this;
|
299
|
+
for (size_t i = 0, L = v->length(); i < L; ++i) this->append((*v)[i]);
|
251
300
|
}
|
252
301
|
Vectorized& unshift(T element)
|
253
302
|
{
|
@@ -284,43 +333,27 @@ namespace Sass {
|
|
284
333
|
// extra <std::vector> internally to maintain insertion order for interation.
|
285
334
|
/////////////////////////////////////////////////////////////////////////////
|
286
335
|
class Hashed {
|
287
|
-
struct HashExpression {
|
288
|
-
size_t operator() (Expression* ex) const {
|
289
|
-
return ex ? ex->hash() : 0;
|
290
|
-
}
|
291
|
-
};
|
292
|
-
struct CompareExpression {
|
293
|
-
bool operator()(const Expression* lhs, const Expression* rhs) const {
|
294
|
-
return lhs && rhs && lhs->eq(*rhs);
|
295
|
-
}
|
296
|
-
};
|
297
|
-
typedef std::unordered_map<
|
298
|
-
Expression*, // key
|
299
|
-
Expression*, // value
|
300
|
-
HashExpression, // hasher
|
301
|
-
CompareExpression // compare
|
302
|
-
> ExpressionMap;
|
303
336
|
private:
|
304
337
|
ExpressionMap elements_;
|
305
|
-
std::vector<
|
338
|
+
std::vector<Expression_Obj> list_;
|
306
339
|
protected:
|
307
340
|
size_t hash_;
|
308
|
-
|
341
|
+
Expression_Obj duplicate_key_;
|
309
342
|
void reset_hash() { hash_ = 0; }
|
310
343
|
void reset_duplicate_key() { duplicate_key_ = 0; }
|
311
|
-
virtual void adjust_after_pushing(std::pair<
|
344
|
+
virtual void adjust_after_pushing(std::pair<Expression_Obj, Expression_Obj> p) { }
|
312
345
|
public:
|
313
|
-
Hashed(size_t s = 0) : elements_(ExpressionMap(s)), list_(std::vector<
|
346
|
+
Hashed(size_t s = 0) : elements_(ExpressionMap(s)), list_(std::vector<Expression_Obj>())
|
314
347
|
{ elements_.reserve(s); list_.reserve(s); reset_duplicate_key(); }
|
315
348
|
virtual ~Hashed();
|
316
349
|
size_t length() const { return list_.size(); }
|
317
350
|
bool empty() const { return list_.empty(); }
|
318
|
-
bool has(
|
319
|
-
|
351
|
+
bool has(Expression_Obj k) const { return elements_.count(k) == 1; }
|
352
|
+
Expression_Obj at(Expression_Obj k) const;
|
320
353
|
bool has_duplicate_key() const { return duplicate_key_ != 0; }
|
321
|
-
|
354
|
+
Expression_Obj get_duplicate_key() const { return duplicate_key_; }
|
322
355
|
const ExpressionMap elements() { return elements_; }
|
323
|
-
Hashed& operator<<(std::pair<
|
356
|
+
Hashed& operator<<(std::pair<Expression_Obj, Expression_Obj> p)
|
324
357
|
{
|
325
358
|
reset_hash();
|
326
359
|
|
@@ -348,12 +381,12 @@ namespace Sass {
|
|
348
381
|
return *this;
|
349
382
|
}
|
350
383
|
const ExpressionMap& pairs() const { return elements_; }
|
351
|
-
const std::vector<
|
384
|
+
const std::vector<Expression_Obj>& keys() const { return list_; }
|
352
385
|
|
353
|
-
std::unordered_map<
|
354
|
-
std::unordered_map<
|
355
|
-
std::unordered_map<
|
356
|
-
std::unordered_map<
|
386
|
+
// std::unordered_map<Expression_Obj, Expression_Obj>::iterator end() { return elements_.end(); }
|
387
|
+
// std::unordered_map<Expression_Obj, Expression_Obj>::iterator begin() { return elements_.begin(); }
|
388
|
+
// std::unordered_map<Expression_Obj, Expression_Obj>::const_iterator end() const { return elements_.end(); }
|
389
|
+
// std::unordered_map<Expression_Obj, Expression_Obj>::const_iterator begin() const { return elements_.begin(); }
|
357
390
|
|
358
391
|
};
|
359
392
|
inline Hashed::~Hashed() { }
|
@@ -392,19 +425,23 @@ namespace Sass {
|
|
392
425
|
IF
|
393
426
|
};
|
394
427
|
private:
|
395
|
-
ADD_PROPERTY(Block*, block)
|
396
428
|
ADD_PROPERTY(Statement_Type, statement_type)
|
397
429
|
ADD_PROPERTY(size_t, tabs)
|
398
430
|
ADD_PROPERTY(bool, group_end)
|
399
431
|
public:
|
400
432
|
Statement(ParserState pstate, Statement_Type st = NONE, size_t t = 0)
|
401
|
-
: AST_Node(pstate),
|
433
|
+
: AST_Node(pstate), statement_type_(st), tabs_(t), group_end_(false)
|
434
|
+
{ }
|
435
|
+
Statement(const Statement* ptr)
|
436
|
+
: AST_Node(ptr),
|
437
|
+
statement_type_(ptr->statement_type_),
|
438
|
+
tabs_(ptr->tabs_),
|
439
|
+
group_end_(ptr->group_end_)
|
402
440
|
{ }
|
403
441
|
virtual ~Statement() = 0;
|
404
442
|
// needed for rearranging nested rulesets during CSS emission
|
405
443
|
virtual bool is_invisible() const { return false; }
|
406
444
|
virtual bool bubbles() { return false; }
|
407
|
-
virtual Block* block() { return 0; }
|
408
445
|
virtual bool has_content()
|
409
446
|
{
|
410
447
|
return statement_type_ == CONTENT;
|
@@ -415,21 +452,27 @@ namespace Sass {
|
|
415
452
|
////////////////////////
|
416
453
|
// Blocks of statements.
|
417
454
|
////////////////////////
|
418
|
-
class Block : public Statement, public Vectorized<
|
455
|
+
class Block : public Statement, public Vectorized<Statement_Obj> {
|
419
456
|
ADD_PROPERTY(bool, is_root)
|
420
457
|
ADD_PROPERTY(bool, is_at_root);
|
421
458
|
// needed for properly formatted CSS emission
|
422
459
|
protected:
|
423
|
-
void adjust_after_pushing(
|
460
|
+
void adjust_after_pushing(Statement_Obj s)
|
424
461
|
{
|
425
462
|
}
|
426
463
|
public:
|
427
464
|
Block(ParserState pstate, size_t s = 0, bool r = false)
|
428
465
|
: Statement(pstate),
|
429
|
-
Vectorized<
|
466
|
+
Vectorized<Statement_Obj>(s),
|
430
467
|
is_root_(r),
|
431
468
|
is_at_root_(false)
|
432
469
|
{ }
|
470
|
+
Block(const Block* ptr)
|
471
|
+
: Statement(ptr),
|
472
|
+
Vectorized<Statement_Obj>(*ptr),
|
473
|
+
is_root_(ptr->is_root_),
|
474
|
+
is_at_root_(ptr->is_at_root_)
|
475
|
+
{ }
|
433
476
|
virtual bool has_content()
|
434
477
|
{
|
435
478
|
for (size_t i = 0, L = elements().size(); i < L; ++i) {
|
@@ -437,7 +480,7 @@ namespace Sass {
|
|
437
480
|
}
|
438
481
|
return Statement::has_content();
|
439
482
|
}
|
440
|
-
Block
|
483
|
+
ATTACH_AST_OPERATIONS(Block)
|
441
484
|
ATTACH_OPERATIONS()
|
442
485
|
};
|
443
486
|
|
@@ -445,11 +488,14 @@ namespace Sass {
|
|
445
488
|
// Abstract base class for statements that contain blocks of statements.
|
446
489
|
////////////////////////////////////////////////////////////////////////
|
447
490
|
class Has_Block : public Statement {
|
448
|
-
ADD_PROPERTY(
|
491
|
+
ADD_PROPERTY(Block_Obj, block)
|
449
492
|
public:
|
450
|
-
Has_Block(ParserState pstate,
|
493
|
+
Has_Block(ParserState pstate, Block_Obj b)
|
451
494
|
: Statement(pstate), block_(b)
|
452
495
|
{ }
|
496
|
+
Has_Block(const Has_Block* ptr)
|
497
|
+
: Statement(ptr), block_(ptr->block_)
|
498
|
+
{ }
|
453
499
|
virtual bool has_content()
|
454
500
|
{
|
455
501
|
return (block_ && block_->has_content()) || Statement::has_content();
|
@@ -463,14 +509,21 @@ namespace Sass {
|
|
463
509
|
// of style declarations.
|
464
510
|
/////////////////////////////////////////////////////////////////////////////
|
465
511
|
class Ruleset : public Has_Block {
|
466
|
-
ADD_PROPERTY(
|
512
|
+
ADD_PROPERTY(Selector_Obj, selector)
|
467
513
|
ADD_PROPERTY(bool, at_root);
|
468
514
|
ADD_PROPERTY(bool, is_root);
|
469
515
|
public:
|
470
|
-
Ruleset(ParserState pstate,
|
516
|
+
Ruleset(ParserState pstate, Selector_Obj s = 0, Block_Obj b = 0)
|
471
517
|
: Has_Block(pstate, b), selector_(s), at_root_(false), is_root_(false)
|
472
518
|
{ statement_type(RULESET); }
|
519
|
+
Ruleset(const Ruleset* ptr)
|
520
|
+
: Has_Block(ptr),
|
521
|
+
selector_(ptr->selector_),
|
522
|
+
at_root_(ptr->at_root_),
|
523
|
+
is_root_(ptr->is_root_)
|
524
|
+
{ statement_type(RULESET); }
|
473
525
|
bool is_invisible() const;
|
526
|
+
ATTACH_AST_OPERATIONS(Ruleset)
|
474
527
|
ATTACH_OPERATIONS()
|
475
528
|
};
|
476
529
|
|
@@ -478,13 +531,19 @@ namespace Sass {
|
|
478
531
|
// Bubble.
|
479
532
|
/////////////////
|
480
533
|
class Bubble : public Statement {
|
481
|
-
ADD_PROPERTY(
|
534
|
+
ADD_PROPERTY(Statement_Obj, node)
|
482
535
|
ADD_PROPERTY(bool, group_end)
|
483
536
|
public:
|
484
|
-
Bubble(ParserState pstate,
|
537
|
+
Bubble(ParserState pstate, Statement_Obj n, Statement_Obj g = 0, size_t t = 0)
|
485
538
|
: Statement(pstate, Statement::BUBBLE, t), node_(n), group_end_(g == 0)
|
486
539
|
{ }
|
540
|
+
Bubble(const Bubble* ptr)
|
541
|
+
: Statement(ptr),
|
542
|
+
node_(ptr->node_),
|
543
|
+
group_end_(ptr->group_end_)
|
544
|
+
{ }
|
487
545
|
bool bubbles() { return true; }
|
546
|
+
ATTACH_AST_OPERATIONS(Bubble)
|
488
547
|
ATTACH_OPERATIONS()
|
489
548
|
};
|
490
549
|
|
@@ -494,9 +553,14 @@ namespace Sass {
|
|
494
553
|
class Trace : public Has_Block {
|
495
554
|
ADD_PROPERTY(std::string, name)
|
496
555
|
public:
|
497
|
-
Trace(ParserState pstate, std::string n,
|
556
|
+
Trace(ParserState pstate, std::string n, Block_Obj b = 0)
|
498
557
|
: Has_Block(pstate, b), name_(n)
|
499
558
|
{ }
|
559
|
+
Trace(const Trace* ptr)
|
560
|
+
: Has_Block(ptr),
|
561
|
+
name_(ptr->name_)
|
562
|
+
{ }
|
563
|
+
ATTACH_AST_OPERATIONS(Trace)
|
500
564
|
ATTACH_OPERATIONS()
|
501
565
|
};
|
502
566
|
|
@@ -504,16 +568,20 @@ namespace Sass {
|
|
504
568
|
// Media queries.
|
505
569
|
/////////////////
|
506
570
|
class Media_Block : public Has_Block {
|
507
|
-
ADD_PROPERTY(
|
571
|
+
ADD_PROPERTY(List_Obj, media_queries)
|
508
572
|
public:
|
509
|
-
Media_Block(ParserState pstate,
|
573
|
+
Media_Block(ParserState pstate, List_Obj mqs, Block_Obj b)
|
510
574
|
: Has_Block(pstate, b), media_queries_(mqs)
|
511
575
|
{ statement_type(MEDIA); }
|
512
|
-
Media_Block(ParserState pstate,
|
576
|
+
Media_Block(ParserState pstate, List_Obj mqs, Block_Obj b, Selector_Obj s)
|
513
577
|
: Has_Block(pstate, b), media_queries_(mqs)
|
514
578
|
{ statement_type(MEDIA); }
|
579
|
+
Media_Block(const Media_Block* ptr)
|
580
|
+
: Has_Block(ptr), media_queries_(ptr->media_queries_)
|
581
|
+
{ statement_type(MEDIA); }
|
515
582
|
bool bubbles() { return true; }
|
516
583
|
bool is_invisible() const;
|
584
|
+
ATTACH_AST_OPERATIONS(Media_Block)
|
517
585
|
ATTACH_OPERATIONS()
|
518
586
|
};
|
519
587
|
|
@@ -523,12 +591,18 @@ namespace Sass {
|
|
523
591
|
///////////////////////////////////////////////////////////////////////
|
524
592
|
class Directive : public Has_Block {
|
525
593
|
ADD_PROPERTY(std::string, keyword)
|
526
|
-
ADD_PROPERTY(
|
527
|
-
ADD_PROPERTY(
|
594
|
+
ADD_PROPERTY(Selector_Obj, selector)
|
595
|
+
ADD_PROPERTY(Expression_Obj, value)
|
528
596
|
public:
|
529
|
-
Directive(ParserState pstate, std::string kwd,
|
597
|
+
Directive(ParserState pstate, std::string kwd, Selector_Obj sel = 0, Block_Obj b = 0, Expression_Obj val = 0)
|
530
598
|
: Has_Block(pstate, b), keyword_(kwd), selector_(sel), value_(val) // set value manually if needed
|
531
599
|
{ statement_type(DIRECTIVE); }
|
600
|
+
Directive(const Directive* ptr)
|
601
|
+
: Has_Block(ptr),
|
602
|
+
keyword_(ptr->keyword_),
|
603
|
+
selector_(ptr->selector_),
|
604
|
+
value_(ptr->value_) // set value manually if needed
|
605
|
+
{ statement_type(DIRECTIVE); }
|
532
606
|
bool bubbles() { return is_keyframes() || is_media(); }
|
533
607
|
bool is_media() {
|
534
608
|
return keyword_.compare("@-webkit-media") == 0 ||
|
@@ -542,6 +616,7 @@ namespace Sass {
|
|
542
616
|
keyword_.compare("@-o-keyframes") == 0 ||
|
543
617
|
keyword_.compare("@keyframes") == 0;
|
544
618
|
}
|
619
|
+
ATTACH_AST_OPERATIONS(Directive)
|
545
620
|
ATTACH_OPERATIONS()
|
546
621
|
};
|
547
622
|
|
@@ -549,11 +624,17 @@ namespace Sass {
|
|
549
624
|
// Keyframe-rules -- the child blocks of "@keyframes" nodes.
|
550
625
|
///////////////////////////////////////////////////////////////////////
|
551
626
|
class Keyframe_Rule : public Has_Block {
|
552
|
-
|
627
|
+
// according to css spec, this should be <keyframes-name>
|
628
|
+
// <keyframes-name> = <custom-ident> | <string>
|
629
|
+
ADD_PROPERTY(Selector_Obj, name)
|
553
630
|
public:
|
554
|
-
Keyframe_Rule(ParserState pstate,
|
555
|
-
: Has_Block(pstate, b),
|
631
|
+
Keyframe_Rule(ParserState pstate, Block_Obj b)
|
632
|
+
: Has_Block(pstate, b), name_()
|
633
|
+
{ statement_type(KEYFRAMERULE); }
|
634
|
+
Keyframe_Rule(const Keyframe_Rule* ptr)
|
635
|
+
: Has_Block(ptr), name_(ptr->name_)
|
556
636
|
{ statement_type(KEYFRAMERULE); }
|
637
|
+
ATTACH_AST_OPERATIONS(Keyframe_Rule)
|
557
638
|
ATTACH_OPERATIONS()
|
558
639
|
};
|
559
640
|
|
@@ -561,15 +642,23 @@ namespace Sass {
|
|
561
642
|
// Declarations -- style rules consisting of a property name and values.
|
562
643
|
////////////////////////////////////////////////////////////////////////
|
563
644
|
class Declaration : public Has_Block {
|
564
|
-
ADD_PROPERTY(
|
565
|
-
ADD_PROPERTY(
|
645
|
+
ADD_PROPERTY(String_Obj, property)
|
646
|
+
ADD_PROPERTY(Expression_Obj, value)
|
566
647
|
ADD_PROPERTY(bool, is_important)
|
567
648
|
ADD_PROPERTY(bool, is_indented)
|
568
649
|
public:
|
569
650
|
Declaration(ParserState pstate,
|
570
|
-
|
651
|
+
String_Obj prop, Expression_Obj val, bool i = false, Block_Obj b = 0)
|
571
652
|
: Has_Block(pstate, b), property_(prop), value_(val), is_important_(i), is_indented_(false)
|
572
653
|
{ statement_type(DECLARATION); }
|
654
|
+
Declaration(const Declaration* ptr)
|
655
|
+
: Has_Block(ptr),
|
656
|
+
property_(ptr->property_),
|
657
|
+
value_(ptr->value_),
|
658
|
+
is_important_(ptr->is_important_),
|
659
|
+
is_indented_(ptr->is_indented_)
|
660
|
+
{ statement_type(DECLARATION); }
|
661
|
+
ATTACH_AST_OPERATIONS(Declaration)
|
573
662
|
ATTACH_OPERATIONS()
|
574
663
|
};
|
575
664
|
|
@@ -578,16 +667,24 @@ namespace Sass {
|
|
578
667
|
/////////////////////////////////////
|
579
668
|
class Assignment : public Statement {
|
580
669
|
ADD_PROPERTY(std::string, variable)
|
581
|
-
ADD_PROPERTY(
|
670
|
+
ADD_PROPERTY(Expression_Obj, value)
|
582
671
|
ADD_PROPERTY(bool, is_default)
|
583
672
|
ADD_PROPERTY(bool, is_global)
|
584
673
|
public:
|
585
674
|
Assignment(ParserState pstate,
|
586
|
-
std::string var,
|
675
|
+
std::string var, Expression_Obj val,
|
587
676
|
bool is_default = false,
|
588
677
|
bool is_global = false)
|
589
678
|
: Statement(pstate), variable_(var), value_(val), is_default_(is_default), is_global_(is_global)
|
590
679
|
{ statement_type(ASSIGNMENT); }
|
680
|
+
Assignment(const Assignment* ptr)
|
681
|
+
: Statement(ptr),
|
682
|
+
variable_(ptr->variable_),
|
683
|
+
value_(ptr->value_),
|
684
|
+
is_default_(ptr->is_default_),
|
685
|
+
is_global_(ptr->is_global_)
|
686
|
+
{ statement_type(ASSIGNMENT); }
|
687
|
+
ATTACH_AST_OPERATIONS(Assignment)
|
591
688
|
ATTACH_OPERATIONS()
|
592
689
|
};
|
593
690
|
|
@@ -596,18 +693,25 @@ namespace Sass {
|
|
596
693
|
// necessary to store a list of each in an Import node.
|
597
694
|
////////////////////////////////////////////////////////////////////////////
|
598
695
|
class Import : public Statement {
|
599
|
-
std::vector<
|
696
|
+
std::vector<Expression_Obj> urls_;
|
600
697
|
std::vector<Include> incs_;
|
601
|
-
ADD_PROPERTY(
|
698
|
+
ADD_PROPERTY(List_Obj, import_queries);
|
602
699
|
public:
|
603
700
|
Import(ParserState pstate)
|
604
701
|
: Statement(pstate),
|
605
|
-
urls_(std::vector<
|
702
|
+
urls_(std::vector<Expression_Obj>()),
|
606
703
|
incs_(std::vector<Include>()),
|
607
|
-
|
704
|
+
import_queries_()
|
608
705
|
{ statement_type(IMPORT); }
|
609
|
-
|
706
|
+
Import(const Import* ptr)
|
707
|
+
: Statement(ptr),
|
708
|
+
urls_(ptr->urls_),
|
709
|
+
incs_(ptr->incs_),
|
710
|
+
import_queries_(ptr->import_queries_)
|
711
|
+
{ statement_type(IMPORT); }
|
712
|
+
std::vector<Expression_Obj>& urls() { return urls_; }
|
610
713
|
std::vector<Include>& incs() { return incs_; }
|
714
|
+
ATTACH_AST_OPERATIONS(Import)
|
611
715
|
ATTACH_OPERATIONS()
|
612
716
|
};
|
613
717
|
|
@@ -623,6 +727,10 @@ namespace Sass {
|
|
623
727
|
Import_Stub(ParserState pstate, Include res)
|
624
728
|
: Statement(pstate), resource_(res)
|
625
729
|
{ statement_type(IMPORT_STUB); }
|
730
|
+
Import_Stub(const Import_Stub* ptr)
|
731
|
+
: Statement(ptr), resource_(ptr->resource_)
|
732
|
+
{ statement_type(IMPORT_STUB); }
|
733
|
+
ATTACH_AST_OPERATIONS(Import_Stub)
|
626
734
|
ATTACH_OPERATIONS()
|
627
735
|
};
|
628
736
|
|
@@ -630,11 +738,15 @@ namespace Sass {
|
|
630
738
|
// The Sass `@warn` directive.
|
631
739
|
//////////////////////////////
|
632
740
|
class Warning : public Statement {
|
633
|
-
ADD_PROPERTY(
|
741
|
+
ADD_PROPERTY(Expression_Obj, message)
|
634
742
|
public:
|
635
|
-
Warning(ParserState pstate,
|
743
|
+
Warning(ParserState pstate, Expression_Obj msg)
|
636
744
|
: Statement(pstate), message_(msg)
|
637
745
|
{ statement_type(WARNING); }
|
746
|
+
Warning(const Warning* ptr)
|
747
|
+
: Statement(ptr), message_(ptr->message_)
|
748
|
+
{ statement_type(WARNING); }
|
749
|
+
ATTACH_AST_OPERATIONS(Warning)
|
638
750
|
ATTACH_OPERATIONS()
|
639
751
|
};
|
640
752
|
|
@@ -642,11 +754,15 @@ namespace Sass {
|
|
642
754
|
// The Sass `@error` directive.
|
643
755
|
///////////////////////////////
|
644
756
|
class Error : public Statement {
|
645
|
-
ADD_PROPERTY(
|
757
|
+
ADD_PROPERTY(Expression_Obj, message)
|
646
758
|
public:
|
647
|
-
Error(ParserState pstate,
|
759
|
+
Error(ParserState pstate, Expression_Obj msg)
|
648
760
|
: Statement(pstate), message_(msg)
|
649
761
|
{ statement_type(ERROR); }
|
762
|
+
Error(const Error* ptr)
|
763
|
+
: Statement(ptr), message_(ptr->message_)
|
764
|
+
{ statement_type(ERROR); }
|
765
|
+
ATTACH_AST_OPERATIONS(Error)
|
650
766
|
ATTACH_OPERATIONS()
|
651
767
|
};
|
652
768
|
|
@@ -654,11 +770,15 @@ namespace Sass {
|
|
654
770
|
// The Sass `@debug` directive.
|
655
771
|
///////////////////////////////
|
656
772
|
class Debug : public Statement {
|
657
|
-
ADD_PROPERTY(
|
773
|
+
ADD_PROPERTY(Expression_Obj, value)
|
658
774
|
public:
|
659
|
-
Debug(ParserState pstate,
|
775
|
+
Debug(ParserState pstate, Expression_Obj val)
|
660
776
|
: Statement(pstate), value_(val)
|
661
777
|
{ statement_type(DEBUGSTMT); }
|
778
|
+
Debug(const Debug* ptr)
|
779
|
+
: Statement(ptr), value_(ptr->value_)
|
780
|
+
{ statement_type(DEBUGSTMT); }
|
781
|
+
ATTACH_AST_OPERATIONS(Debug)
|
662
782
|
ATTACH_OPERATIONS()
|
663
783
|
};
|
664
784
|
|
@@ -666,14 +786,20 @@ namespace Sass {
|
|
666
786
|
// CSS comments. These may be interpolated.
|
667
787
|
///////////////////////////////////////////
|
668
788
|
class Comment : public Statement {
|
669
|
-
ADD_PROPERTY(
|
789
|
+
ADD_PROPERTY(String_Obj, text)
|
670
790
|
ADD_PROPERTY(bool, is_important)
|
671
791
|
public:
|
672
|
-
Comment(ParserState pstate,
|
792
|
+
Comment(ParserState pstate, String_Obj txt, bool is_important)
|
673
793
|
: Statement(pstate), text_(txt), is_important_(is_important)
|
674
794
|
{ statement_type(COMMENT); }
|
795
|
+
Comment(const Comment* ptr)
|
796
|
+
: Statement(ptr),
|
797
|
+
text_(ptr->text_),
|
798
|
+
is_important_(ptr->is_important_)
|
799
|
+
{ statement_type(COMMENT); }
|
675
800
|
virtual bool is_invisible() const
|
676
801
|
{ return /* is_important() == */ false; }
|
802
|
+
ATTACH_AST_OPERATIONS(Comment)
|
677
803
|
ATTACH_OPERATIONS()
|
678
804
|
};
|
679
805
|
|
@@ -681,16 +807,22 @@ namespace Sass {
|
|
681
807
|
// The Sass `@if` control directive.
|
682
808
|
////////////////////////////////////
|
683
809
|
class If : public Has_Block {
|
684
|
-
ADD_PROPERTY(
|
685
|
-
ADD_PROPERTY(
|
810
|
+
ADD_PROPERTY(Expression_Obj, predicate)
|
811
|
+
ADD_PROPERTY(Block_Obj, alternative)
|
686
812
|
public:
|
687
|
-
If(ParserState pstate,
|
688
|
-
: Has_Block(pstate, con), predicate_(pred), alternative_(alt)
|
813
|
+
If(ParserState pstate, Expression_Obj pred, Block_Obj con, Block_Obj alt = 0)
|
814
|
+
: Has_Block(pstate, &con), predicate_(pred), alternative_(alt)
|
815
|
+
{ statement_type(IF); }
|
816
|
+
If(const If* ptr)
|
817
|
+
: Has_Block(ptr),
|
818
|
+
predicate_(ptr->predicate_),
|
819
|
+
alternative_(ptr->alternative_)
|
689
820
|
{ statement_type(IF); }
|
690
821
|
virtual bool has_content()
|
691
822
|
{
|
692
823
|
return Has_Block::has_content() || (alternative_ && alternative_->has_content());
|
693
824
|
}
|
825
|
+
ATTACH_AST_OPERATIONS(If)
|
694
826
|
ATTACH_OPERATIONS()
|
695
827
|
};
|
696
828
|
|
@@ -699,15 +831,23 @@ namespace Sass {
|
|
699
831
|
/////////////////////////////////////
|
700
832
|
class For : public Has_Block {
|
701
833
|
ADD_PROPERTY(std::string, variable)
|
702
|
-
ADD_PROPERTY(
|
703
|
-
ADD_PROPERTY(
|
834
|
+
ADD_PROPERTY(Expression_Obj, lower_bound)
|
835
|
+
ADD_PROPERTY(Expression_Obj, upper_bound)
|
704
836
|
ADD_PROPERTY(bool, is_inclusive)
|
705
837
|
public:
|
706
838
|
For(ParserState pstate,
|
707
|
-
std::string var,
|
839
|
+
std::string var, Expression_Obj lo, Expression_Obj hi, Block_Obj b, bool inc)
|
708
840
|
: Has_Block(pstate, b),
|
709
841
|
variable_(var), lower_bound_(lo), upper_bound_(hi), is_inclusive_(inc)
|
710
842
|
{ statement_type(FOR); }
|
843
|
+
For(const For* ptr)
|
844
|
+
: Has_Block(ptr),
|
845
|
+
variable_(ptr->variable_),
|
846
|
+
lower_bound_(ptr->lower_bound_),
|
847
|
+
upper_bound_(ptr->upper_bound_),
|
848
|
+
is_inclusive_(ptr->is_inclusive_)
|
849
|
+
{ statement_type(FOR); }
|
850
|
+
ATTACH_AST_OPERATIONS(For)
|
711
851
|
ATTACH_OPERATIONS()
|
712
852
|
};
|
713
853
|
|
@@ -716,11 +856,15 @@ namespace Sass {
|
|
716
856
|
//////////////////////////////////////
|
717
857
|
class Each : public Has_Block {
|
718
858
|
ADD_PROPERTY(std::vector<std::string>, variables)
|
719
|
-
ADD_PROPERTY(
|
859
|
+
ADD_PROPERTY(Expression_Obj, list)
|
720
860
|
public:
|
721
|
-
Each(ParserState pstate, std::vector<std::string> vars,
|
861
|
+
Each(ParserState pstate, std::vector<std::string> vars, Expression_Obj lst, Block_Obj b)
|
722
862
|
: Has_Block(pstate, b), variables_(vars), list_(lst)
|
723
863
|
{ statement_type(EACH); }
|
864
|
+
Each(const Each* ptr)
|
865
|
+
: Has_Block(ptr), variables_(ptr->variables_), list_(ptr->list_)
|
866
|
+
{ statement_type(EACH); }
|
867
|
+
ATTACH_AST_OPERATIONS(Each)
|
724
868
|
ATTACH_OPERATIONS()
|
725
869
|
};
|
726
870
|
|
@@ -728,11 +872,15 @@ namespace Sass {
|
|
728
872
|
// The Sass `@while` control directive.
|
729
873
|
///////////////////////////////////////
|
730
874
|
class While : public Has_Block {
|
731
|
-
ADD_PROPERTY(
|
875
|
+
ADD_PROPERTY(Expression_Obj, predicate)
|
732
876
|
public:
|
733
|
-
While(ParserState pstate,
|
877
|
+
While(ParserState pstate, Expression_Obj pred, Block_Obj b)
|
734
878
|
: Has_Block(pstate, b), predicate_(pred)
|
735
879
|
{ statement_type(WHILE); }
|
880
|
+
While(const While* ptr)
|
881
|
+
: Has_Block(ptr), predicate_(ptr->predicate_)
|
882
|
+
{ statement_type(WHILE); }
|
883
|
+
ATTACH_AST_OPERATIONS(While)
|
736
884
|
ATTACH_OPERATIONS()
|
737
885
|
};
|
738
886
|
|
@@ -740,11 +888,15 @@ namespace Sass {
|
|
740
888
|
// The @return directive for use inside SassScript functions.
|
741
889
|
/////////////////////////////////////////////////////////////
|
742
890
|
class Return : public Statement {
|
743
|
-
ADD_PROPERTY(
|
891
|
+
ADD_PROPERTY(Expression_Obj, value)
|
744
892
|
public:
|
745
|
-
Return(ParserState pstate,
|
893
|
+
Return(ParserState pstate, Expression_Obj val)
|
746
894
|
: Statement(pstate), value_(val)
|
747
895
|
{ statement_type(RETURN); }
|
896
|
+
Return(const Return* ptr)
|
897
|
+
: Statement(ptr), value_(ptr->value_)
|
898
|
+
{ statement_type(RETURN); }
|
899
|
+
ATTACH_AST_OPERATIONS(Return)
|
748
900
|
ATTACH_OPERATIONS()
|
749
901
|
};
|
750
902
|
|
@@ -752,11 +904,15 @@ namespace Sass {
|
|
752
904
|
// The Sass `@extend` directive.
|
753
905
|
////////////////////////////////
|
754
906
|
class Extension : public Statement {
|
755
|
-
ADD_PROPERTY(
|
907
|
+
ADD_PROPERTY(Selector_Obj, selector)
|
756
908
|
public:
|
757
|
-
Extension(ParserState pstate,
|
909
|
+
Extension(ParserState pstate, Selector_Obj s)
|
758
910
|
: Statement(pstate), selector_(s)
|
759
911
|
{ statement_type(EXTEND); }
|
912
|
+
Extension(const Extension* ptr)
|
913
|
+
: Statement(ptr), selector_(ptr->selector_)
|
914
|
+
{ statement_type(EXTEND); }
|
915
|
+
ATTACH_AST_OPERATIONS(Extension)
|
760
916
|
ATTACH_OPERATIONS()
|
761
917
|
};
|
762
918
|
|
@@ -765,15 +921,14 @@ namespace Sass {
|
|
765
921
|
// by a type tag.
|
766
922
|
/////////////////////////////////////////////////////////////////////////////
|
767
923
|
struct Backtrace;
|
768
|
-
typedef Environment<
|
769
|
-
typedef const char* Signature;
|
770
|
-
typedef Expression* (*Native_Function)(Env&, Env&, Context&, Signature, ParserState, Backtrace*, std::vector<CommaSequence_Selector*>);
|
924
|
+
typedef Environment<AST_Node_Obj> Env;
|
771
925
|
typedef const char* Signature;
|
926
|
+
typedef Expression_Ptr (*Native_Function)(Env&, Env&, Context&, Signature, ParserState, Backtrace*, std::vector<Selector_List_Obj>);
|
772
927
|
class Definition : public Has_Block {
|
773
928
|
public:
|
774
929
|
enum Type { MIXIN, FUNCTION };
|
775
930
|
ADD_PROPERTY(std::string, name)
|
776
|
-
ADD_PROPERTY(
|
931
|
+
ADD_PROPERTY(Parameters_Obj, parameters)
|
777
932
|
ADD_PROPERTY(Env*, environment)
|
778
933
|
ADD_PROPERTY(Type, type)
|
779
934
|
ADD_PROPERTY(Native_Function, native_function)
|
@@ -782,10 +937,23 @@ namespace Sass {
|
|
782
937
|
ADD_PROPERTY(bool, is_overload_stub)
|
783
938
|
ADD_PROPERTY(Signature, signature)
|
784
939
|
public:
|
940
|
+
Definition(const Definition* ptr)
|
941
|
+
: Has_Block(ptr),
|
942
|
+
name_(ptr->name_),
|
943
|
+
parameters_(ptr->parameters_),
|
944
|
+
environment_(ptr->environment_),
|
945
|
+
type_(ptr->type_),
|
946
|
+
native_function_(ptr->native_function_),
|
947
|
+
c_function_(ptr->c_function_),
|
948
|
+
cookie_(ptr->cookie_),
|
949
|
+
is_overload_stub_(ptr->is_overload_stub_),
|
950
|
+
signature_(ptr->signature_)
|
951
|
+
{ }
|
952
|
+
|
785
953
|
Definition(ParserState pstate,
|
786
954
|
std::string n,
|
787
|
-
|
788
|
-
|
955
|
+
Parameters_Obj params,
|
956
|
+
Block_Obj b,
|
789
957
|
Type t)
|
790
958
|
: Has_Block(pstate, b),
|
791
959
|
name_(n),
|
@@ -801,7 +969,7 @@ namespace Sass {
|
|
801
969
|
Definition(ParserState pstate,
|
802
970
|
Signature sig,
|
803
971
|
std::string n,
|
804
|
-
|
972
|
+
Parameters_Obj params,
|
805
973
|
Native_Function func_ptr,
|
806
974
|
bool overload_stub = false)
|
807
975
|
: Has_Block(pstate, 0),
|
@@ -818,7 +986,7 @@ namespace Sass {
|
|
818
986
|
Definition(ParserState pstate,
|
819
987
|
Signature sig,
|
820
988
|
std::string n,
|
821
|
-
|
989
|
+
Parameters_Obj params,
|
822
990
|
Sass_Function_Entry c_func,
|
823
991
|
bool whatever,
|
824
992
|
bool whatever2)
|
@@ -833,6 +1001,7 @@ namespace Sass {
|
|
833
1001
|
is_overload_stub_(false),
|
834
1002
|
signature_(sig)
|
835
1003
|
{ }
|
1004
|
+
ATTACH_AST_OPERATIONS(Definition)
|
836
1005
|
ATTACH_OPERATIONS()
|
837
1006
|
};
|
838
1007
|
|
@@ -841,11 +1010,17 @@ namespace Sass {
|
|
841
1010
|
//////////////////////////////////////
|
842
1011
|
class Mixin_Call : public Has_Block {
|
843
1012
|
ADD_PROPERTY(std::string, name)
|
844
|
-
ADD_PROPERTY(
|
1013
|
+
ADD_PROPERTY(Arguments_Obj, arguments)
|
845
1014
|
public:
|
846
|
-
Mixin_Call(ParserState pstate, std::string n,
|
1015
|
+
Mixin_Call(ParserState pstate, std::string n, Arguments_Obj args, Block_Obj b = 0)
|
847
1016
|
: Has_Block(pstate, b), name_(n), arguments_(args)
|
848
1017
|
{ }
|
1018
|
+
Mixin_Call(const Mixin_Call* ptr)
|
1019
|
+
: Has_Block(ptr),
|
1020
|
+
name_(ptr->name_),
|
1021
|
+
arguments_(ptr->arguments_)
|
1022
|
+
{ }
|
1023
|
+
ATTACH_AST_OPERATIONS(Mixin_Call)
|
849
1024
|
ATTACH_OPERATIONS()
|
850
1025
|
};
|
851
1026
|
|
@@ -853,10 +1028,13 @@ namespace Sass {
|
|
853
1028
|
// The @content directive for mixin content blocks.
|
854
1029
|
///////////////////////////////////////////////////
|
855
1030
|
class Content : public Statement {
|
856
|
-
ADD_PROPERTY(
|
1031
|
+
ADD_PROPERTY(Media_Block_Obj, media_block)
|
857
1032
|
public:
|
858
1033
|
Content(ParserState pstate) : Statement(pstate)
|
859
1034
|
{ statement_type(CONTENT); }
|
1035
|
+
Content(const Content* ptr) : Statement(ptr)
|
1036
|
+
{ statement_type(CONTENT); }
|
1037
|
+
ATTACH_AST_OPERATIONS(Content)
|
860
1038
|
ATTACH_OPERATIONS()
|
861
1039
|
};
|
862
1040
|
|
@@ -864,8 +1042,8 @@ namespace Sass {
|
|
864
1042
|
// Lists of values, both comma- and space-separated (distinguished by a
|
865
1043
|
// type-tag.) Also used to represent variable-length argument lists.
|
866
1044
|
///////////////////////////////////////////////////////////////////////
|
867
|
-
class List : public Value, public Vectorized<
|
868
|
-
void adjust_after_pushing(
|
1045
|
+
class List : public Value, public Vectorized<Expression_Obj> {
|
1046
|
+
void adjust_after_pushing(Expression_Obj e) { is_expanded(false); }
|
869
1047
|
private:
|
870
1048
|
ADD_PROPERTY(enum Sass_Separator, separator)
|
871
1049
|
ADD_PROPERTY(bool, is_arglist)
|
@@ -874,11 +1052,18 @@ namespace Sass {
|
|
874
1052
|
List(ParserState pstate,
|
875
1053
|
size_t size = 0, enum Sass_Separator sep = SASS_SPACE, bool argl = false)
|
876
1054
|
: Value(pstate),
|
877
|
-
Vectorized<
|
1055
|
+
Vectorized<Expression_Obj>(size),
|
878
1056
|
separator_(sep),
|
879
1057
|
is_arglist_(argl),
|
880
1058
|
from_selector_(false)
|
881
1059
|
{ concrete_type(LIST); }
|
1060
|
+
List(const List* ptr)
|
1061
|
+
: Value(ptr),
|
1062
|
+
Vectorized<Expression_Obj>(*ptr),
|
1063
|
+
separator_(ptr->separator_),
|
1064
|
+
is_arglist_(ptr->is_arglist_),
|
1065
|
+
from_selector_(ptr->from_selector_)
|
1066
|
+
{ concrete_type(LIST); }
|
882
1067
|
std::string type() { return is_arglist_ ? "arglist" : "list"; }
|
883
1068
|
static std::string type_name() { return "list"; }
|
884
1069
|
const char* sep_string(bool compressed = false) const {
|
@@ -886,7 +1071,7 @@ namespace Sass {
|
|
886
1071
|
" " : (compressed ? "," : ", ");
|
887
1072
|
}
|
888
1073
|
bool is_invisible() const { return empty(); }
|
889
|
-
|
1074
|
+
Expression_Obj value_at_index(size_t i);
|
890
1075
|
|
891
1076
|
virtual size_t size() const;
|
892
1077
|
|
@@ -908,6 +1093,7 @@ namespace Sass {
|
|
908
1093
|
|
909
1094
|
virtual bool operator== (const Expression& rhs) const;
|
910
1095
|
|
1096
|
+
ATTACH_AST_OPERATIONS(List)
|
911
1097
|
ATTACH_OPERATIONS()
|
912
1098
|
};
|
913
1099
|
|
@@ -915,17 +1101,21 @@ namespace Sass {
|
|
915
1101
|
// Key value paris.
|
916
1102
|
///////////////////////////////////////////////////////////////////////
|
917
1103
|
class Map : public Value, public Hashed {
|
918
|
-
void adjust_after_pushing(std::pair<
|
1104
|
+
void adjust_after_pushing(std::pair<Expression_Obj, Expression_Obj> p) { is_expanded(false); }
|
919
1105
|
public:
|
920
1106
|
Map(ParserState pstate,
|
921
1107
|
size_t size = 0)
|
922
1108
|
: Value(pstate),
|
923
1109
|
Hashed(size)
|
924
1110
|
{ concrete_type(MAP); }
|
1111
|
+
Map(const Map* ptr)
|
1112
|
+
: Value(ptr),
|
1113
|
+
Hashed(*ptr)
|
1114
|
+
{ concrete_type(MAP); }
|
925
1115
|
std::string type() { return "map"; }
|
926
1116
|
static std::string type_name() { return "map"; }
|
927
1117
|
bool is_invisible() const { return empty(); }
|
928
|
-
|
1118
|
+
List_Obj to_list(Context& ctx, ParserState& pstate);
|
929
1119
|
|
930
1120
|
virtual size_t hash()
|
931
1121
|
{
|
@@ -941,6 +1131,7 @@ namespace Sass {
|
|
941
1131
|
|
942
1132
|
virtual bool operator== (const Expression& rhs) const;
|
943
1133
|
|
1134
|
+
ATTACH_AST_OPERATIONS(Map)
|
944
1135
|
ATTACH_OPERATIONS()
|
945
1136
|
};
|
946
1137
|
|
@@ -973,14 +1164,21 @@ namespace Sass {
|
|
973
1164
|
class Binary_Expression : public PreValue {
|
974
1165
|
private:
|
975
1166
|
ADD_HASHED(Operand, op)
|
976
|
-
ADD_HASHED(
|
977
|
-
ADD_HASHED(
|
1167
|
+
ADD_HASHED(Expression_Obj, left)
|
1168
|
+
ADD_HASHED(Expression_Obj, right)
|
978
1169
|
size_t hash_;
|
979
1170
|
public:
|
980
1171
|
Binary_Expression(ParserState pstate,
|
981
|
-
Operand op,
|
1172
|
+
Operand op, Expression_Obj lhs, Expression_Obj rhs)
|
982
1173
|
: PreValue(pstate), op_(op), left_(lhs), right_(rhs), hash_(0)
|
983
1174
|
{ }
|
1175
|
+
Binary_Expression(const Binary_Expression* ptr)
|
1176
|
+
: PreValue(ptr),
|
1177
|
+
op_(ptr->op_),
|
1178
|
+
left_(ptr->left_),
|
1179
|
+
right_(ptr->right_),
|
1180
|
+
hash_(ptr->hash_)
|
1181
|
+
{ }
|
984
1182
|
const std::string type_name() {
|
985
1183
|
switch (type()) {
|
986
1184
|
case AND: return "and"; break;
|
@@ -1038,7 +1236,7 @@ namespace Sass {
|
|
1038
1236
|
{
|
1039
1237
|
try
|
1040
1238
|
{
|
1041
|
-
|
1239
|
+
Binary_Expression_Ptr_Const m = dynamic_cast<Binary_Expression_Ptr_Const>(&rhs);
|
1042
1240
|
if (m == 0) return false;
|
1043
1241
|
return type() == m->type() &&
|
1044
1242
|
left() == m->left() &&
|
@@ -1060,6 +1258,7 @@ namespace Sass {
|
|
1060
1258
|
return hash_;
|
1061
1259
|
}
|
1062
1260
|
enum Sass_OP type() const { return op_.operand; }
|
1261
|
+
ATTACH_AST_OPERATIONS(Binary_Expression)
|
1063
1262
|
ATTACH_OPERATIONS()
|
1064
1263
|
};
|
1065
1264
|
|
@@ -1071,12 +1270,18 @@ namespace Sass {
|
|
1071
1270
|
enum Type { PLUS, MINUS, NOT };
|
1072
1271
|
private:
|
1073
1272
|
ADD_HASHED(Type, type)
|
1074
|
-
ADD_HASHED(
|
1273
|
+
ADD_HASHED(Expression_Obj, operand)
|
1075
1274
|
size_t hash_;
|
1076
1275
|
public:
|
1077
|
-
Unary_Expression(ParserState pstate, Type t,
|
1276
|
+
Unary_Expression(ParserState pstate, Type t, Expression_Obj o)
|
1078
1277
|
: Expression(pstate), type_(t), operand_(o), hash_(0)
|
1079
1278
|
{ }
|
1279
|
+
Unary_Expression(const Unary_Expression* ptr)
|
1280
|
+
: Expression(ptr),
|
1281
|
+
type_(ptr->type_),
|
1282
|
+
operand_(ptr->operand_),
|
1283
|
+
hash_(ptr->hash_)
|
1284
|
+
{ }
|
1080
1285
|
const std::string type_name() {
|
1081
1286
|
switch (type_) {
|
1082
1287
|
case PLUS: return "plus"; break;
|
@@ -1089,7 +1294,7 @@ namespace Sass {
|
|
1089
1294
|
{
|
1090
1295
|
try
|
1091
1296
|
{
|
1092
|
-
|
1297
|
+
Unary_Expression_Ptr_Const m = dynamic_cast<Unary_Expression_Ptr_Const>(&rhs);
|
1093
1298
|
if (m == 0) return false;
|
1094
1299
|
return type() == m->type() &&
|
1095
1300
|
operand() == m->operand();
|
@@ -1108,6 +1313,7 @@ namespace Sass {
|
|
1108
1313
|
};
|
1109
1314
|
return hash_;
|
1110
1315
|
}
|
1316
|
+
ATTACH_AST_OPERATIONS(Unary_Expression)
|
1111
1317
|
ATTACH_OPERATIONS()
|
1112
1318
|
};
|
1113
1319
|
|
@@ -1115,17 +1321,29 @@ namespace Sass {
|
|
1115
1321
|
// Individual argument objects for mixin and function calls.
|
1116
1322
|
////////////////////////////////////////////////////////////
|
1117
1323
|
class Argument : public Expression {
|
1118
|
-
ADD_HASHED(
|
1324
|
+
ADD_HASHED(Expression_Obj, value)
|
1119
1325
|
ADD_HASHED(std::string, name)
|
1120
1326
|
ADD_PROPERTY(bool, is_rest_argument)
|
1121
1327
|
ADD_PROPERTY(bool, is_keyword_argument)
|
1122
1328
|
size_t hash_;
|
1123
1329
|
public:
|
1124
|
-
Argument(ParserState pstate,
|
1330
|
+
Argument(ParserState pstate, Expression_Obj val, std::string n = "", bool rest = false, bool keyword = false)
|
1125
1331
|
: Expression(pstate), value_(val), name_(n), is_rest_argument_(rest), is_keyword_argument_(keyword), hash_(0)
|
1126
1332
|
{
|
1127
1333
|
if (!name_.empty() && is_rest_argument_) {
|
1128
|
-
error("variable-length argument may not be passed by name",
|
1334
|
+
error("variable-length argument may not be passed by name", pstate_);
|
1335
|
+
}
|
1336
|
+
}
|
1337
|
+
Argument(const Argument* ptr)
|
1338
|
+
: Expression(ptr),
|
1339
|
+
value_(ptr->value_),
|
1340
|
+
name_(ptr->name_),
|
1341
|
+
is_rest_argument_(ptr->is_rest_argument_),
|
1342
|
+
is_keyword_argument_(ptr->is_keyword_argument_),
|
1343
|
+
hash_(ptr->hash_)
|
1344
|
+
{
|
1345
|
+
if (!name_.empty() && is_rest_argument_) {
|
1346
|
+
error("variable-length argument may not be passed by name", pstate_);
|
1129
1347
|
}
|
1130
1348
|
}
|
1131
1349
|
|
@@ -1134,7 +1352,7 @@ namespace Sass {
|
|
1134
1352
|
{
|
1135
1353
|
try
|
1136
1354
|
{
|
1137
|
-
|
1355
|
+
Argument_Ptr_Const m = dynamic_cast<Argument_Ptr_Const>(&rhs);
|
1138
1356
|
if (!(m && name() == m->name())) return false;
|
1139
1357
|
return *value() == *m->value();
|
1140
1358
|
}
|
@@ -1154,6 +1372,7 @@ namespace Sass {
|
|
1154
1372
|
return hash_;
|
1155
1373
|
}
|
1156
1374
|
|
1375
|
+
ATTACH_AST_OPERATIONS(Argument)
|
1157
1376
|
ATTACH_OPERATIONS()
|
1158
1377
|
};
|
1159
1378
|
|
@@ -1162,26 +1381,34 @@ namespace Sass {
|
|
1162
1381
|
// error checking (e.g., ensuring that all ordinal arguments precede all
|
1163
1382
|
// named arguments).
|
1164
1383
|
////////////////////////////////////////////////////////////////////////
|
1165
|
-
class Arguments : public Expression, public Vectorized<
|
1384
|
+
class Arguments : public Expression, public Vectorized<Argument_Obj> {
|
1166
1385
|
ADD_PROPERTY(bool, has_named_arguments)
|
1167
1386
|
ADD_PROPERTY(bool, has_rest_argument)
|
1168
1387
|
ADD_PROPERTY(bool, has_keyword_argument)
|
1169
1388
|
protected:
|
1170
|
-
void adjust_after_pushing(
|
1389
|
+
void adjust_after_pushing(Argument_Obj a);
|
1171
1390
|
public:
|
1172
1391
|
Arguments(ParserState pstate)
|
1173
1392
|
: Expression(pstate),
|
1174
|
-
Vectorized<
|
1393
|
+
Vectorized<Argument_Obj>(),
|
1175
1394
|
has_named_arguments_(false),
|
1176
1395
|
has_rest_argument_(false),
|
1177
1396
|
has_keyword_argument_(false)
|
1178
1397
|
{ }
|
1398
|
+
Arguments(const Arguments* ptr)
|
1399
|
+
: Expression(ptr),
|
1400
|
+
Vectorized<Argument_Obj>(*ptr),
|
1401
|
+
has_named_arguments_(ptr->has_named_arguments_),
|
1402
|
+
has_rest_argument_(ptr->has_rest_argument_),
|
1403
|
+
has_keyword_argument_(ptr->has_keyword_argument_)
|
1404
|
+
{ }
|
1179
1405
|
|
1180
1406
|
virtual void set_delayed(bool delayed);
|
1181
1407
|
|
1182
|
-
|
1183
|
-
|
1408
|
+
Argument_Obj get_rest_argument();
|
1409
|
+
Argument_Obj get_keyword_argument();
|
1184
1410
|
|
1411
|
+
ATTACH_AST_OPERATIONS(Arguments)
|
1185
1412
|
ATTACH_OPERATIONS()
|
1186
1413
|
};
|
1187
1414
|
|
@@ -1190,22 +1417,31 @@ namespace Sass {
|
|
1190
1417
|
//////////////////
|
1191
1418
|
class Function_Call : public PreValue {
|
1192
1419
|
ADD_HASHED(std::string, name)
|
1193
|
-
ADD_HASHED(
|
1420
|
+
ADD_HASHED(Arguments_Obj, arguments)
|
1421
|
+
ADD_PROPERTY(bool, via_call)
|
1194
1422
|
ADD_PROPERTY(void*, cookie)
|
1195
1423
|
size_t hash_;
|
1196
1424
|
public:
|
1197
|
-
Function_Call(ParserState pstate, std::string n,
|
1198
|
-
: PreValue(pstate), name_(n), arguments_(args), cookie_(cookie), hash_(0)
|
1199
|
-
{ concrete_type(
|
1200
|
-
Function_Call(ParserState pstate, std::string n,
|
1201
|
-
: PreValue(pstate), name_(n), arguments_(args), cookie_(0), hash_(0)
|
1202
|
-
{ concrete_type(
|
1425
|
+
Function_Call(ParserState pstate, std::string n, Arguments_Obj args, void* cookie)
|
1426
|
+
: PreValue(pstate), name_(n), arguments_(args), via_call_(false), cookie_(cookie), hash_(0)
|
1427
|
+
{ concrete_type(FUNCTION); }
|
1428
|
+
Function_Call(ParserState pstate, std::string n, Arguments_Obj args)
|
1429
|
+
: PreValue(pstate), name_(n), arguments_(args), via_call_(false), cookie_(0), hash_(0)
|
1430
|
+
{ concrete_type(FUNCTION); }
|
1431
|
+
Function_Call(const Function_Call* ptr)
|
1432
|
+
: PreValue(ptr),
|
1433
|
+
name_(ptr->name_),
|
1434
|
+
arguments_(ptr->arguments_),
|
1435
|
+
via_call_(ptr->via_call_),
|
1436
|
+
cookie_(ptr->cookie_),
|
1437
|
+
hash_(ptr->hash_)
|
1438
|
+
{ concrete_type(FUNCTION); }
|
1203
1439
|
|
1204
1440
|
virtual bool operator==(const Expression& rhs) const
|
1205
1441
|
{
|
1206
1442
|
try
|
1207
1443
|
{
|
1208
|
-
|
1444
|
+
Function_Call_Ptr_Const m = dynamic_cast<Function_Call_Ptr_Const>(&rhs);
|
1209
1445
|
if (!(m && name() == m->name())) return false;
|
1210
1446
|
if (!(m && arguments()->length() == m->arguments()->length())) return false;
|
1211
1447
|
for (size_t i =0, L = arguments()->length(); i < L; ++i)
|
@@ -1228,7 +1464,7 @@ namespace Sass {
|
|
1228
1464
|
}
|
1229
1465
|
return hash_;
|
1230
1466
|
}
|
1231
|
-
|
1467
|
+
ATTACH_AST_OPERATIONS(Function_Call)
|
1232
1468
|
ATTACH_OPERATIONS()
|
1233
1469
|
};
|
1234
1470
|
|
@@ -1236,12 +1472,18 @@ namespace Sass {
|
|
1236
1472
|
// Function call schemas.
|
1237
1473
|
/////////////////////////
|
1238
1474
|
class Function_Call_Schema : public Expression {
|
1239
|
-
ADD_PROPERTY(
|
1240
|
-
ADD_PROPERTY(
|
1475
|
+
ADD_PROPERTY(String_Obj, name)
|
1476
|
+
ADD_PROPERTY(Arguments_Obj, arguments)
|
1241
1477
|
public:
|
1242
|
-
Function_Call_Schema(ParserState pstate,
|
1478
|
+
Function_Call_Schema(ParserState pstate, String_Obj n, Arguments_Obj args)
|
1243
1479
|
: Expression(pstate), name_(n), arguments_(args)
|
1244
1480
|
{ concrete_type(STRING); }
|
1481
|
+
Function_Call_Schema(const Function_Call_Schema* ptr)
|
1482
|
+
: Expression(ptr),
|
1483
|
+
name_(ptr->name_),
|
1484
|
+
arguments_(ptr->arguments_)
|
1485
|
+
{ concrete_type(STRING); }
|
1486
|
+
ATTACH_AST_OPERATIONS(Function_Call_Schema)
|
1245
1487
|
ATTACH_OPERATIONS()
|
1246
1488
|
};
|
1247
1489
|
|
@@ -1254,12 +1496,15 @@ namespace Sass {
|
|
1254
1496
|
Variable(ParserState pstate, std::string n)
|
1255
1497
|
: PreValue(pstate), name_(n)
|
1256
1498
|
{ }
|
1499
|
+
Variable(const Variable* ptr)
|
1500
|
+
: PreValue(ptr), name_(ptr->name_)
|
1501
|
+
{ }
|
1257
1502
|
|
1258
1503
|
virtual bool operator==(const Expression& rhs) const
|
1259
1504
|
{
|
1260
1505
|
try
|
1261
1506
|
{
|
1262
|
-
|
1507
|
+
Variable_Ptr_Const e = dynamic_cast<Variable_Ptr_Const>(&rhs);
|
1263
1508
|
return e && name() == e->name();
|
1264
1509
|
}
|
1265
1510
|
catch (std::bad_cast&)
|
@@ -1274,6 +1519,7 @@ namespace Sass {
|
|
1274
1519
|
return std::hash<std::string>()(name());
|
1275
1520
|
}
|
1276
1521
|
|
1522
|
+
ATTACH_AST_OPERATIONS(Variable)
|
1277
1523
|
ATTACH_OPERATIONS()
|
1278
1524
|
};
|
1279
1525
|
|
@@ -1293,12 +1539,18 @@ namespace Sass {
|
|
1293
1539
|
: Expression(pstate, DELAYED), type_(t), value_(val),
|
1294
1540
|
hash_(0)
|
1295
1541
|
{ }
|
1542
|
+
Textual(const Textual* ptr)
|
1543
|
+
: Expression(ptr),
|
1544
|
+
type_(ptr->type_),
|
1545
|
+
value_(ptr->value_),
|
1546
|
+
hash_(ptr->hash_)
|
1547
|
+
{ }
|
1296
1548
|
|
1297
1549
|
virtual bool operator==(const Expression& rhs) const
|
1298
1550
|
{
|
1299
1551
|
try
|
1300
1552
|
{
|
1301
|
-
|
1553
|
+
Textual_Ptr_Const e = dynamic_cast<Textual_Ptr_Const>(&rhs);
|
1302
1554
|
return e && value() == e->value() && type() == e->type();
|
1303
1555
|
}
|
1304
1556
|
catch (std::bad_cast&)
|
@@ -1317,6 +1569,7 @@ namespace Sass {
|
|
1317
1569
|
return hash_;
|
1318
1570
|
}
|
1319
1571
|
|
1572
|
+
ATTACH_AST_OPERATIONS(Textual)
|
1320
1573
|
ATTACH_OPERATIONS()
|
1321
1574
|
};
|
1322
1575
|
|
@@ -1331,6 +1584,15 @@ namespace Sass {
|
|
1331
1584
|
size_t hash_;
|
1332
1585
|
public:
|
1333
1586
|
Number(ParserState pstate, double val, std::string u = "", bool zero = true);
|
1587
|
+
|
1588
|
+
Number(const Number* ptr)
|
1589
|
+
: Value(ptr),
|
1590
|
+
value_(ptr->value_), zero_(ptr->zero_),
|
1591
|
+
numerator_units_(ptr->numerator_units_),
|
1592
|
+
denominator_units_(ptr->denominator_units_),
|
1593
|
+
hash_(ptr->hash_)
|
1594
|
+
{ concrete_type(NUMBER); }
|
1595
|
+
|
1334
1596
|
bool zero() { return zero_; }
|
1335
1597
|
bool is_valid_css_unit() const;
|
1336
1598
|
std::vector<std::string>& numerator_units() { return numerator_units_; }
|
@@ -1363,7 +1625,7 @@ namespace Sass {
|
|
1363
1625
|
virtual bool operator< (const Number& rhs) const;
|
1364
1626
|
virtual bool operator== (const Expression& rhs) const;
|
1365
1627
|
virtual bool eq(const Expression& rhs) const;
|
1366
|
-
|
1628
|
+
ATTACH_AST_OPERATIONS(Number)
|
1367
1629
|
ATTACH_OPERATIONS()
|
1368
1630
|
};
|
1369
1631
|
|
@@ -1382,6 +1644,15 @@ namespace Sass {
|
|
1382
1644
|
: Value(pstate), r_(r), g_(g), b_(b), a_(a), disp_(disp),
|
1383
1645
|
hash_(0)
|
1384
1646
|
{ concrete_type(COLOR); }
|
1647
|
+
Color(const Color* ptr)
|
1648
|
+
: Value(ptr),
|
1649
|
+
r_(ptr->r_),
|
1650
|
+
g_(ptr->g_),
|
1651
|
+
b_(ptr->b_),
|
1652
|
+
a_(ptr->a_),
|
1653
|
+
disp_(ptr->disp_),
|
1654
|
+
hash_(ptr->hash_)
|
1655
|
+
{ concrete_type(COLOR); }
|
1385
1656
|
std::string type() { return "color"; }
|
1386
1657
|
static std::string type_name() { return "color"; }
|
1387
1658
|
|
@@ -1398,6 +1669,7 @@ namespace Sass {
|
|
1398
1669
|
|
1399
1670
|
virtual bool operator== (const Expression& rhs) const;
|
1400
1671
|
|
1672
|
+
ATTACH_AST_OPERATIONS(Color)
|
1401
1673
|
ATTACH_OPERATIONS()
|
1402
1674
|
};
|
1403
1675
|
|
@@ -1410,7 +1682,11 @@ namespace Sass {
|
|
1410
1682
|
Custom_Error(ParserState pstate, std::string msg)
|
1411
1683
|
: Value(pstate), message_(msg)
|
1412
1684
|
{ concrete_type(C_ERROR); }
|
1685
|
+
Custom_Error(const Custom_Error* ptr)
|
1686
|
+
: Value(ptr), message_(ptr->message_)
|
1687
|
+
{ concrete_type(C_ERROR); }
|
1413
1688
|
virtual bool operator== (const Expression& rhs) const;
|
1689
|
+
ATTACH_AST_OPERATIONS(Custom_Error)
|
1414
1690
|
ATTACH_OPERATIONS()
|
1415
1691
|
};
|
1416
1692
|
|
@@ -1423,7 +1699,11 @@ namespace Sass {
|
|
1423
1699
|
Custom_Warning(ParserState pstate, std::string msg)
|
1424
1700
|
: Value(pstate), message_(msg)
|
1425
1701
|
{ concrete_type(C_WARNING); }
|
1702
|
+
Custom_Warning(const Custom_Warning* ptr)
|
1703
|
+
: Value(ptr), message_(ptr->message_)
|
1704
|
+
{ concrete_type(C_WARNING); }
|
1426
1705
|
virtual bool operator== (const Expression& rhs) const;
|
1706
|
+
ATTACH_AST_OPERATIONS(Custom_Warning)
|
1427
1707
|
ATTACH_OPERATIONS()
|
1428
1708
|
};
|
1429
1709
|
|
@@ -1438,6 +1718,11 @@ namespace Sass {
|
|
1438
1718
|
: Value(pstate), value_(val),
|
1439
1719
|
hash_(0)
|
1440
1720
|
{ concrete_type(BOOLEAN); }
|
1721
|
+
Boolean(const Boolean* ptr)
|
1722
|
+
: Value(ptr),
|
1723
|
+
value_(ptr->value_),
|
1724
|
+
hash_(ptr->hash_)
|
1725
|
+
{ concrete_type(BOOLEAN); }
|
1441
1726
|
virtual operator bool() { return value_; }
|
1442
1727
|
std::string type() { return "bool"; }
|
1443
1728
|
static std::string type_name() { return "bool"; }
|
@@ -1453,6 +1738,7 @@ namespace Sass {
|
|
1453
1738
|
|
1454
1739
|
virtual bool operator== (const Expression& rhs) const;
|
1455
1740
|
|
1741
|
+
ATTACH_AST_OPERATIONS(Boolean)
|
1456
1742
|
ATTACH_OPERATIONS()
|
1457
1743
|
};
|
1458
1744
|
|
@@ -1465,12 +1751,19 @@ namespace Sass {
|
|
1465
1751
|
String(ParserState pstate, bool delayed = false)
|
1466
1752
|
: Value(pstate, delayed)
|
1467
1753
|
{ concrete_type(STRING); }
|
1754
|
+
String(const String* ptr)
|
1755
|
+
: Value(ptr)
|
1756
|
+
{ concrete_type(STRING); }
|
1468
1757
|
static std::string type_name() { return "string"; }
|
1469
1758
|
virtual ~String() = 0;
|
1470
1759
|
virtual void rtrim() = 0;
|
1471
1760
|
virtual void ltrim() = 0;
|
1472
1761
|
virtual void trim() = 0;
|
1473
1762
|
virtual bool operator==(const Expression& rhs) const = 0;
|
1763
|
+
virtual bool operator<(const Expression& rhs) const {
|
1764
|
+
return this->to_string() < rhs.to_string();
|
1765
|
+
};
|
1766
|
+
ATTACH_VIRTUAL_AST_OPERATIONS(String);
|
1474
1767
|
ATTACH_OPERATIONS()
|
1475
1768
|
};
|
1476
1769
|
inline String::~String() { };
|
@@ -1479,13 +1772,19 @@ namespace Sass {
|
|
1479
1772
|
// Interpolated strings. Meant to be reduced to flat strings during the
|
1480
1773
|
// evaluation phase.
|
1481
1774
|
///////////////////////////////////////////////////////////////////////
|
1482
|
-
class String_Schema : public String, public Vectorized<
|
1775
|
+
class String_Schema : public String, public Vectorized<Expression_Obj> {
|
1483
1776
|
// ADD_PROPERTY(bool, has_interpolants)
|
1484
1777
|
size_t hash_;
|
1485
1778
|
public:
|
1486
1779
|
String_Schema(ParserState pstate, size_t size = 0, bool has_interpolants = false)
|
1487
|
-
: String(pstate), Vectorized<
|
1780
|
+
: String(pstate), Vectorized<Expression_Obj>(size), hash_(0)
|
1781
|
+
{ concrete_type(STRING); }
|
1782
|
+
String_Schema(const String_Schema* ptr)
|
1783
|
+
: String(ptr),
|
1784
|
+
Vectorized<Expression_Obj>(*ptr),
|
1785
|
+
hash_(ptr->hash_)
|
1488
1786
|
{ concrete_type(STRING); }
|
1787
|
+
|
1489
1788
|
std::string type() { return "string"; }
|
1490
1789
|
static std::string type_name() { return "string"; }
|
1491
1790
|
|
@@ -1516,7 +1815,7 @@ namespace Sass {
|
|
1516
1815
|
}
|
1517
1816
|
|
1518
1817
|
virtual bool operator==(const Expression& rhs) const;
|
1519
|
-
|
1818
|
+
ATTACH_AST_OPERATIONS(String_Schema)
|
1520
1819
|
ATTACH_OPERATIONS()
|
1521
1820
|
};
|
1522
1821
|
|
@@ -1530,6 +1829,13 @@ namespace Sass {
|
|
1530
1829
|
protected:
|
1531
1830
|
size_t hash_;
|
1532
1831
|
public:
|
1832
|
+
String_Constant(const String_Constant* ptr)
|
1833
|
+
: String(ptr),
|
1834
|
+
quote_mark_(ptr->quote_mark_),
|
1835
|
+
can_compress_whitespace_(ptr->can_compress_whitespace_),
|
1836
|
+
value_(ptr->value_),
|
1837
|
+
hash_(ptr->hash_)
|
1838
|
+
{ }
|
1533
1839
|
String_Constant(ParserState pstate, std::string val)
|
1534
1840
|
: String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(val)), hash_(0)
|
1535
1841
|
{ }
|
@@ -1564,6 +1870,7 @@ namespace Sass {
|
|
1564
1870
|
static char double_quote() { return '"'; }
|
1565
1871
|
static char single_quote() { return '\''; }
|
1566
1872
|
|
1873
|
+
ATTACH_AST_OPERATIONS(String_Constant)
|
1567
1874
|
ATTACH_OPERATIONS()
|
1568
1875
|
};
|
1569
1876
|
|
@@ -1573,8 +1880,8 @@ namespace Sass {
|
|
1573
1880
|
class String_Quoted : public String_Constant {
|
1574
1881
|
public:
|
1575
1882
|
String_Quoted(ParserState pstate, std::string val, char q = 0,
|
1576
|
-
|
1577
|
-
|
1883
|
+
bool keep_utf8_escapes = false, bool skip_unquoting = false,
|
1884
|
+
bool strict_unquoting = true)
|
1578
1885
|
: String_Constant(pstate, val)
|
1579
1886
|
{
|
1580
1887
|
if (skip_unquoting == false) {
|
@@ -1582,8 +1889,12 @@ namespace Sass {
|
|
1582
1889
|
}
|
1583
1890
|
if (q && quote_mark_) quote_mark_ = q;
|
1584
1891
|
}
|
1892
|
+
String_Quoted(const String_Quoted* ptr)
|
1893
|
+
: String_Constant(ptr)
|
1894
|
+
{ }
|
1585
1895
|
virtual bool operator==(const Expression& rhs) const;
|
1586
1896
|
virtual std::string inspect() const; // quotes are forced on inspection
|
1897
|
+
ATTACH_AST_OPERATIONS(String_Quoted)
|
1587
1898
|
ATTACH_OPERATIONS()
|
1588
1899
|
};
|
1589
1900
|
|
@@ -1591,16 +1902,24 @@ namespace Sass {
|
|
1591
1902
|
// Media queries.
|
1592
1903
|
/////////////////
|
1593
1904
|
class Media_Query : public Expression,
|
1594
|
-
public Vectorized<
|
1595
|
-
ADD_PROPERTY(
|
1905
|
+
public Vectorized<Media_Query_Expression_Obj> {
|
1906
|
+
ADD_PROPERTY(String_Obj, media_type)
|
1596
1907
|
ADD_PROPERTY(bool, is_negated)
|
1597
1908
|
ADD_PROPERTY(bool, is_restricted)
|
1598
1909
|
public:
|
1599
1910
|
Media_Query(ParserState pstate,
|
1600
|
-
|
1601
|
-
: Expression(pstate), Vectorized<
|
1911
|
+
String_Obj t = 0, size_t s = 0, bool n = false, bool r = false)
|
1912
|
+
: Expression(pstate), Vectorized<Media_Query_Expression_Obj>(s),
|
1602
1913
|
media_type_(t), is_negated_(n), is_restricted_(r)
|
1603
1914
|
{ }
|
1915
|
+
Media_Query(const Media_Query* ptr)
|
1916
|
+
: Expression(ptr),
|
1917
|
+
Vectorized<Media_Query_Expression_Obj>(*ptr),
|
1918
|
+
media_type_(ptr->media_type_),
|
1919
|
+
is_negated_(ptr->is_negated_),
|
1920
|
+
is_restricted_(ptr->is_restricted_)
|
1921
|
+
{ }
|
1922
|
+
ATTACH_AST_OPERATIONS(Media_Query)
|
1604
1923
|
ATTACH_OPERATIONS()
|
1605
1924
|
};
|
1606
1925
|
|
@@ -1608,14 +1927,21 @@ namespace Sass {
|
|
1608
1927
|
// Media expressions (for use inside media queries).
|
1609
1928
|
////////////////////////////////////////////////////
|
1610
1929
|
class Media_Query_Expression : public Expression {
|
1611
|
-
ADD_PROPERTY(
|
1612
|
-
ADD_PROPERTY(
|
1930
|
+
ADD_PROPERTY(Expression_Obj, feature)
|
1931
|
+
ADD_PROPERTY(Expression_Obj, value)
|
1613
1932
|
ADD_PROPERTY(bool, is_interpolated)
|
1614
1933
|
public:
|
1615
1934
|
Media_Query_Expression(ParserState pstate,
|
1616
|
-
|
1935
|
+
Expression_Obj f, Expression_Obj v, bool i = false)
|
1617
1936
|
: Expression(pstate), feature_(f), value_(v), is_interpolated_(i)
|
1618
1937
|
{ }
|
1938
|
+
Media_Query_Expression(const Media_Query_Expression* ptr)
|
1939
|
+
: Expression(ptr),
|
1940
|
+
feature_(ptr->feature_),
|
1941
|
+
value_(ptr->value_),
|
1942
|
+
is_interpolated_(ptr->is_interpolated_)
|
1943
|
+
{ }
|
1944
|
+
ATTACH_AST_OPERATIONS(Media_Query_Expression)
|
1619
1945
|
ATTACH_OPERATIONS()
|
1620
1946
|
};
|
1621
1947
|
|
@@ -1623,12 +1949,16 @@ namespace Sass {
|
|
1623
1949
|
// `@supports` rule.
|
1624
1950
|
////////////////////
|
1625
1951
|
class Supports_Block : public Has_Block {
|
1626
|
-
ADD_PROPERTY(
|
1952
|
+
ADD_PROPERTY(Supports_Condition_Obj, condition)
|
1627
1953
|
public:
|
1628
|
-
Supports_Block(ParserState pstate,
|
1954
|
+
Supports_Block(ParserState pstate, Supports_Condition_Obj condition, Block_Obj block = 0)
|
1629
1955
|
: Has_Block(pstate, block), condition_(condition)
|
1630
1956
|
{ statement_type(SUPPORTS); }
|
1957
|
+
Supports_Block(const Supports_Block* ptr)
|
1958
|
+
: Has_Block(ptr), condition_(ptr->condition_)
|
1959
|
+
{ statement_type(SUPPORTS); }
|
1631
1960
|
bool bubbles() { return true; }
|
1961
|
+
ATTACH_AST_OPERATIONS(Supports_Block)
|
1632
1962
|
ATTACH_OPERATIONS()
|
1633
1963
|
};
|
1634
1964
|
|
@@ -1640,7 +1970,11 @@ namespace Sass {
|
|
1640
1970
|
Supports_Condition(ParserState pstate)
|
1641
1971
|
: Expression(pstate)
|
1642
1972
|
{ }
|
1643
|
-
|
1973
|
+
Supports_Condition(const Supports_Condition* ptr)
|
1974
|
+
: Expression(ptr)
|
1975
|
+
{ }
|
1976
|
+
virtual bool needs_parens(Supports_Condition_Obj cond) const { return false; }
|
1977
|
+
ATTACH_AST_OPERATIONS(Supports_Condition)
|
1644
1978
|
ATTACH_OPERATIONS()
|
1645
1979
|
};
|
1646
1980
|
|
@@ -1651,14 +1985,21 @@ namespace Sass {
|
|
1651
1985
|
public:
|
1652
1986
|
enum Operand { AND, OR };
|
1653
1987
|
private:
|
1654
|
-
ADD_PROPERTY(
|
1655
|
-
ADD_PROPERTY(
|
1988
|
+
ADD_PROPERTY(Supports_Condition_Obj, left);
|
1989
|
+
ADD_PROPERTY(Supports_Condition_Obj, right);
|
1656
1990
|
ADD_PROPERTY(Operand, operand);
|
1657
1991
|
public:
|
1658
|
-
Supports_Operator(ParserState pstate,
|
1992
|
+
Supports_Operator(ParserState pstate, Supports_Condition_Obj l, Supports_Condition_Obj r, Operand o)
|
1659
1993
|
: Supports_Condition(pstate), left_(l), right_(r), operand_(o)
|
1660
1994
|
{ }
|
1661
|
-
|
1995
|
+
Supports_Operator(const Supports_Operator* ptr)
|
1996
|
+
: Supports_Condition(ptr),
|
1997
|
+
left_(ptr->left_),
|
1998
|
+
right_(ptr->right_),
|
1999
|
+
operand_(ptr->operand_)
|
2000
|
+
{ }
|
2001
|
+
virtual bool needs_parens(Supports_Condition_Obj cond) const;
|
2002
|
+
ATTACH_AST_OPERATIONS(Supports_Operator)
|
1662
2003
|
ATTACH_OPERATIONS()
|
1663
2004
|
};
|
1664
2005
|
|
@@ -1667,12 +2008,16 @@ namespace Sass {
|
|
1667
2008
|
//////////////////////////////////////////
|
1668
2009
|
class Supports_Negation : public Supports_Condition {
|
1669
2010
|
private:
|
1670
|
-
ADD_PROPERTY(
|
2011
|
+
ADD_PROPERTY(Supports_Condition_Obj, condition);
|
1671
2012
|
public:
|
1672
|
-
Supports_Negation(ParserState pstate,
|
2013
|
+
Supports_Negation(ParserState pstate, Supports_Condition_Obj c)
|
1673
2014
|
: Supports_Condition(pstate), condition_(c)
|
1674
2015
|
{ }
|
1675
|
-
|
2016
|
+
Supports_Negation(const Supports_Negation* ptr)
|
2017
|
+
: Supports_Condition(ptr), condition_(ptr->condition_)
|
2018
|
+
{ }
|
2019
|
+
virtual bool needs_parens(Supports_Condition_Obj cond) const;
|
2020
|
+
ATTACH_AST_OPERATIONS(Supports_Negation)
|
1676
2021
|
ATTACH_OPERATIONS()
|
1677
2022
|
};
|
1678
2023
|
|
@@ -1681,13 +2026,19 @@ namespace Sass {
|
|
1681
2026
|
/////////////////////////////////////////////////////
|
1682
2027
|
class Supports_Declaration : public Supports_Condition {
|
1683
2028
|
private:
|
1684
|
-
ADD_PROPERTY(
|
1685
|
-
ADD_PROPERTY(
|
2029
|
+
ADD_PROPERTY(Expression_Obj, feature);
|
2030
|
+
ADD_PROPERTY(Expression_Obj, value);
|
1686
2031
|
public:
|
1687
|
-
Supports_Declaration(ParserState pstate,
|
2032
|
+
Supports_Declaration(ParserState pstate, Expression_Obj f, Expression_Obj v)
|
1688
2033
|
: Supports_Condition(pstate), feature_(f), value_(v)
|
1689
2034
|
{ }
|
1690
|
-
|
2035
|
+
Supports_Declaration(const Supports_Declaration* ptr)
|
2036
|
+
: Supports_Condition(ptr),
|
2037
|
+
feature_(ptr->feature_),
|
2038
|
+
value_(ptr->value_)
|
2039
|
+
{ }
|
2040
|
+
virtual bool needs_parens(Supports_Condition_Obj cond) const { return false; }
|
2041
|
+
ATTACH_AST_OPERATIONS(Supports_Declaration)
|
1691
2042
|
ATTACH_OPERATIONS()
|
1692
2043
|
};
|
1693
2044
|
|
@@ -1696,12 +2047,17 @@ namespace Sass {
|
|
1696
2047
|
///////////////////////////////////////////////
|
1697
2048
|
class Supports_Interpolation : public Supports_Condition {
|
1698
2049
|
private:
|
1699
|
-
ADD_PROPERTY(
|
2050
|
+
ADD_PROPERTY(Expression_Obj, value);
|
1700
2051
|
public:
|
1701
|
-
Supports_Interpolation(ParserState pstate,
|
2052
|
+
Supports_Interpolation(ParserState pstate, Expression_Obj v)
|
1702
2053
|
: Supports_Condition(pstate), value_(v)
|
1703
2054
|
{ }
|
1704
|
-
|
2055
|
+
Supports_Interpolation(const Supports_Interpolation* ptr)
|
2056
|
+
: Supports_Condition(ptr),
|
2057
|
+
value_(ptr->value_)
|
2058
|
+
{ }
|
2059
|
+
virtual bool needs_parens(Supports_Condition_Obj cond) const { return false; }
|
2060
|
+
ATTACH_AST_OPERATIONS(Supports_Interpolation)
|
1705
2061
|
ATTACH_OPERATIONS()
|
1706
2062
|
};
|
1707
2063
|
|
@@ -1710,13 +2066,19 @@ namespace Sass {
|
|
1710
2066
|
/////////////////////////////////////////////////
|
1711
2067
|
class At_Root_Query : public Expression {
|
1712
2068
|
private:
|
1713
|
-
ADD_PROPERTY(
|
1714
|
-
ADD_PROPERTY(
|
2069
|
+
ADD_PROPERTY(Expression_Obj, feature)
|
2070
|
+
ADD_PROPERTY(Expression_Obj, value)
|
1715
2071
|
public:
|
1716
|
-
At_Root_Query(ParserState pstate,
|
2072
|
+
At_Root_Query(ParserState pstate, Expression_Obj f = 0, Expression_Obj v = 0, bool i = false)
|
1717
2073
|
: Expression(pstate), feature_(f), value_(v)
|
1718
2074
|
{ }
|
2075
|
+
At_Root_Query(const At_Root_Query* ptr)
|
2076
|
+
: Expression(ptr),
|
2077
|
+
feature_(ptr->feature_),
|
2078
|
+
value_(ptr->value_)
|
2079
|
+
{ }
|
1719
2080
|
bool exclude(std::string str);
|
2081
|
+
ATTACH_AST_OPERATIONS(At_Root_Query)
|
1720
2082
|
ATTACH_OPERATIONS()
|
1721
2083
|
};
|
1722
2084
|
|
@@ -1724,13 +2086,16 @@ namespace Sass {
|
|
1724
2086
|
// At-root.
|
1725
2087
|
///////////
|
1726
2088
|
class At_Root_Block : public Has_Block {
|
1727
|
-
ADD_PROPERTY(
|
2089
|
+
ADD_PROPERTY(At_Root_Query_Obj, expression)
|
1728
2090
|
public:
|
1729
|
-
At_Root_Block(ParserState pstate,
|
2091
|
+
At_Root_Block(ParserState pstate, Block_Obj b = 0, At_Root_Query_Obj e = 0)
|
1730
2092
|
: Has_Block(pstate, b), expression_(e)
|
1731
2093
|
{ statement_type(ATROOT); }
|
2094
|
+
At_Root_Block(const At_Root_Block* ptr)
|
2095
|
+
: Has_Block(ptr), expression_(ptr->expression_)
|
2096
|
+
{ statement_type(ATROOT); }
|
1732
2097
|
bool bubbles() { return true; }
|
1733
|
-
bool exclude_node(
|
2098
|
+
bool exclude_node(Statement_Obj s) {
|
1734
2099
|
if (expression() == 0)
|
1735
2100
|
{
|
1736
2101
|
return s->statement_type() == Statement::RULESET;
|
@@ -1738,7 +2103,7 @@ namespace Sass {
|
|
1738
2103
|
|
1739
2104
|
if (s->statement_type() == Statement::DIRECTIVE)
|
1740
2105
|
{
|
1741
|
-
if (
|
2106
|
+
if (Directive_Obj dir = SASS_MEMORY_CAST(Directive, s))
|
1742
2107
|
{
|
1743
2108
|
std::string keyword(dir->keyword());
|
1744
2109
|
if (keyword.length() > 0) keyword.erase(0, 1);
|
@@ -1757,12 +2122,13 @@ namespace Sass {
|
|
1757
2122
|
{
|
1758
2123
|
return expression()->exclude("supports");
|
1759
2124
|
}
|
1760
|
-
if (
|
2125
|
+
if (Directive_Obj dir = SASS_MEMORY_CAST(Directive, s))
|
1761
2126
|
{
|
1762
2127
|
if (dir->is_keyframes()) return expression()->exclude("keyframes");
|
1763
2128
|
}
|
1764
2129
|
return false;
|
1765
2130
|
}
|
2131
|
+
ATTACH_AST_OPERATIONS(At_Root_Block)
|
1766
2132
|
ATTACH_OPERATIONS()
|
1767
2133
|
};
|
1768
2134
|
|
@@ -1772,6 +2138,7 @@ namespace Sass {
|
|
1772
2138
|
class Null : public Value {
|
1773
2139
|
public:
|
1774
2140
|
Null(ParserState pstate) : Value(pstate) { concrete_type(NULL_VAL); }
|
2141
|
+
Null(const Null* ptr) : Value(ptr) { concrete_type(NULL_VAL); }
|
1775
2142
|
std::string type() { return "null"; }
|
1776
2143
|
static std::string type_name() { return "null"; }
|
1777
2144
|
bool is_invisible() const { return true; }
|
@@ -1785,6 +2152,7 @@ namespace Sass {
|
|
1785
2152
|
|
1786
2153
|
virtual bool operator== (const Expression& rhs) const;
|
1787
2154
|
|
2155
|
+
ATTACH_AST_OPERATIONS(Null)
|
1788
2156
|
ATTACH_OPERATIONS()
|
1789
2157
|
};
|
1790
2158
|
|
@@ -1792,10 +2160,10 @@ namespace Sass {
|
|
1792
2160
|
// Thunks for delayed evaluation.
|
1793
2161
|
/////////////////////////////////
|
1794
2162
|
class Thunk : public Expression {
|
1795
|
-
ADD_PROPERTY(
|
2163
|
+
ADD_PROPERTY(Expression_Obj, expression)
|
1796
2164
|
ADD_PROPERTY(Env*, environment)
|
1797
2165
|
public:
|
1798
|
-
Thunk(ParserState pstate,
|
2166
|
+
Thunk(ParserState pstate, Expression_Obj exp, Env* env = 0)
|
1799
2167
|
: Expression(pstate), expression_(exp), environment_(env)
|
1800
2168
|
{ }
|
1801
2169
|
};
|
@@ -1805,17 +2173,28 @@ namespace Sass {
|
|
1805
2173
|
/////////////////////////////////////////////////////////
|
1806
2174
|
class Parameter : public AST_Node {
|
1807
2175
|
ADD_PROPERTY(std::string, name)
|
1808
|
-
ADD_PROPERTY(
|
2176
|
+
ADD_PROPERTY(Expression_Obj, default_value)
|
1809
2177
|
ADD_PROPERTY(bool, is_rest_parameter)
|
1810
2178
|
public:
|
1811
2179
|
Parameter(ParserState pstate,
|
1812
|
-
std::string n,
|
2180
|
+
std::string n, Expression_Obj def = 0, bool rest = false)
|
1813
2181
|
: AST_Node(pstate), name_(n), default_value_(def), is_rest_parameter_(rest)
|
1814
2182
|
{
|
1815
2183
|
if (default_value_ && is_rest_parameter_) {
|
1816
|
-
error("variable-length parameter may not have a default value",
|
2184
|
+
error("variable-length parameter may not have a default value", pstate_);
|
1817
2185
|
}
|
1818
2186
|
}
|
2187
|
+
Parameter(const Parameter* ptr)
|
2188
|
+
: AST_Node(ptr),
|
2189
|
+
name_(ptr->name_),
|
2190
|
+
default_value_(ptr->default_value_),
|
2191
|
+
is_rest_parameter_(ptr->is_rest_parameter_)
|
2192
|
+
{
|
2193
|
+
if (default_value_ && is_rest_parameter_) {
|
2194
|
+
error("variable-length parameter may not have a default value", pstate_);
|
2195
|
+
}
|
2196
|
+
}
|
2197
|
+
ATTACH_AST_OPERATIONS(Parameter)
|
1819
2198
|
ATTACH_OPERATIONS()
|
1820
2199
|
};
|
1821
2200
|
|
@@ -1824,11 +2203,11 @@ namespace Sass {
|
|
1824
2203
|
// error checking (e.g., ensuring that all optional parameters follow all
|
1825
2204
|
// required parameters).
|
1826
2205
|
/////////////////////////////////////////////////////////////////////////
|
1827
|
-
class Parameters : public AST_Node, public Vectorized<
|
2206
|
+
class Parameters : public AST_Node, public Vectorized<Parameter_Obj> {
|
1828
2207
|
ADD_PROPERTY(bool, has_optional_parameters)
|
1829
2208
|
ADD_PROPERTY(bool, has_rest_parameter)
|
1830
2209
|
protected:
|
1831
|
-
void adjust_after_pushing(
|
2210
|
+
void adjust_after_pushing(Parameter_Obj p)
|
1832
2211
|
{
|
1833
2212
|
if (p->default_value()) {
|
1834
2213
|
if (has_rest_parameter_) {
|
@@ -1854,10 +2233,17 @@ namespace Sass {
|
|
1854
2233
|
public:
|
1855
2234
|
Parameters(ParserState pstate)
|
1856
2235
|
: AST_Node(pstate),
|
1857
|
-
Vectorized<
|
2236
|
+
Vectorized<Parameter_Obj>(),
|
1858
2237
|
has_optional_parameters_(false),
|
1859
2238
|
has_rest_parameter_(false)
|
1860
2239
|
{ }
|
2240
|
+
Parameters(const Parameters* ptr)
|
2241
|
+
: AST_Node(ptr),
|
2242
|
+
Vectorized<Parameter_Obj>(*ptr),
|
2243
|
+
has_optional_parameters_(ptr->has_optional_parameters_),
|
2244
|
+
has_rest_parameter_(ptr->has_rest_parameter_)
|
2245
|
+
{ }
|
2246
|
+
ATTACH_AST_OPERATIONS(Parameters)
|
1861
2247
|
ATTACH_OPERATIONS()
|
1862
2248
|
};
|
1863
2249
|
|
@@ -1873,7 +2259,10 @@ namespace Sass {
|
|
1873
2259
|
// maybe we have optional flag
|
1874
2260
|
ADD_PROPERTY(bool, is_optional)
|
1875
2261
|
// parent block pointers
|
1876
|
-
|
2262
|
+
|
2263
|
+
// must not be a reference counted object
|
2264
|
+
// otherwise we create circular references
|
2265
|
+
ADD_PROPERTY(Media_Block_Ptr, media_block)
|
1877
2266
|
protected:
|
1878
2267
|
size_t hash_;
|
1879
2268
|
public:
|
@@ -1886,26 +2275,33 @@ namespace Sass {
|
|
1886
2275
|
media_block_(0),
|
1887
2276
|
hash_(0)
|
1888
2277
|
{ concrete_type(SELECTOR); }
|
2278
|
+
Selector(const Selector* ptr)
|
2279
|
+
: Expression(ptr),
|
2280
|
+
// has_reference_(ptr->has_reference_),
|
2281
|
+
has_line_feed_(ptr->has_line_feed_),
|
2282
|
+
has_line_break_(ptr->has_line_break_),
|
2283
|
+
is_optional_(ptr->is_optional_),
|
2284
|
+
media_block_(ptr->media_block_),
|
2285
|
+
hash_(ptr->hash_)
|
2286
|
+
{ concrete_type(SELECTOR); }
|
1889
2287
|
virtual ~Selector() = 0;
|
1890
2288
|
virtual size_t hash() = 0;
|
1891
2289
|
virtual unsigned long specificity() {
|
1892
2290
|
return 0;
|
1893
2291
|
}
|
1894
|
-
virtual void set_media_block(
|
2292
|
+
virtual void set_media_block(Media_Block_Ptr mb) {
|
1895
2293
|
media_block(mb);
|
1896
2294
|
}
|
1897
|
-
virtual bool has_wrapped_selector() {
|
1898
|
-
return false;
|
1899
|
-
}
|
1900
|
-
virtual bool has_placeholder() {
|
1901
|
-
return false;
|
1902
|
-
}
|
1903
2295
|
virtual bool has_parent_ref() {
|
1904
2296
|
return false;
|
1905
2297
|
}
|
1906
2298
|
virtual bool has_real_parent_ref() {
|
1907
2299
|
return false;
|
1908
2300
|
}
|
2301
|
+
// dispatch to correct handlers
|
2302
|
+
virtual bool operator<(const Selector& rhs) const;
|
2303
|
+
virtual bool operator==(const Selector& rhs) const;
|
2304
|
+
ATTACH_VIRTUAL_AST_OPERATIONS(Selector);
|
1909
2305
|
};
|
1910
2306
|
inline Selector::~Selector() { }
|
1911
2307
|
|
@@ -1914,12 +2310,17 @@ namespace Sass {
|
|
1914
2310
|
// re-parsed into a normal selector class.
|
1915
2311
|
/////////////////////////////////////////////////////////////////////////
|
1916
2312
|
class Selector_Schema : public Selector {
|
1917
|
-
ADD_PROPERTY(
|
2313
|
+
ADD_PROPERTY(String_Obj, contents)
|
1918
2314
|
ADD_PROPERTY(bool, at_root);
|
1919
2315
|
public:
|
1920
|
-
Selector_Schema(ParserState pstate,
|
2316
|
+
Selector_Schema(ParserState pstate, String_Obj c)
|
1921
2317
|
: Selector(pstate), contents_(c), at_root_(false)
|
1922
2318
|
{ }
|
2319
|
+
Selector_Schema(const Selector_Schema* ptr)
|
2320
|
+
: Selector(ptr),
|
2321
|
+
contents_(ptr->contents_),
|
2322
|
+
at_root_(ptr->at_root_)
|
2323
|
+
{ }
|
1923
2324
|
virtual bool has_parent_ref();
|
1924
2325
|
virtual bool has_real_parent_ref();
|
1925
2326
|
virtual size_t hash() {
|
@@ -1928,6 +2329,7 @@ namespace Sass {
|
|
1928
2329
|
}
|
1929
2330
|
return hash_;
|
1930
2331
|
}
|
2332
|
+
ATTACH_AST_OPERATIONS(Selector_Schema)
|
1931
2333
|
ATTACH_OPERATIONS()
|
1932
2334
|
};
|
1933
2335
|
|
@@ -1935,13 +2337,15 @@ namespace Sass {
|
|
1935
2337
|
// Abstract base class for simple selectors.
|
1936
2338
|
////////////////////////////////////////////
|
1937
2339
|
class Simple_Selector : public Selector {
|
1938
|
-
ADD_PROPERTY(std::string, ns)
|
2340
|
+
ADD_PROPERTY(std::string, ns)
|
1939
2341
|
ADD_PROPERTY(std::string, name)
|
2342
|
+
ADD_PROPERTY(Simple_Type, simple_type)
|
1940
2343
|
ADD_PROPERTY(bool, has_ns)
|
1941
2344
|
public:
|
1942
2345
|
Simple_Selector(ParserState pstate, std::string n = "")
|
1943
2346
|
: Selector(pstate), ns_(""), name_(n), has_ns_(false)
|
1944
2347
|
{
|
2348
|
+
simple_type(SIMPLE);
|
1945
2349
|
size_t pos = n.find('|');
|
1946
2350
|
// found some namespace
|
1947
2351
|
if (pos != std::string::npos) {
|
@@ -1950,6 +2354,12 @@ namespace Sass {
|
|
1950
2354
|
name_ = n.substr(pos + 1);
|
1951
2355
|
}
|
1952
2356
|
}
|
2357
|
+
Simple_Selector(const Simple_Selector* ptr)
|
2358
|
+
: Selector(ptr),
|
2359
|
+
ns_(ptr->ns_),
|
2360
|
+
name_(ptr->name_),
|
2361
|
+
has_ns_(ptr->has_ns_)
|
2362
|
+
{ simple_type(SIMPLE); }
|
1953
2363
|
virtual bool unique() const
|
1954
2364
|
{
|
1955
2365
|
return false;
|
@@ -1997,20 +2407,27 @@ namespace Sass {
|
|
1997
2407
|
return name_ == "*";
|
1998
2408
|
}
|
1999
2409
|
|
2410
|
+
virtual bool has_placeholder() {
|
2411
|
+
return false;
|
2412
|
+
}
|
2413
|
+
|
2000
2414
|
virtual ~Simple_Selector() = 0;
|
2001
|
-
virtual
|
2415
|
+
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr, Context&);
|
2002
2416
|
virtual bool has_parent_ref() { return false; };
|
2003
2417
|
virtual bool has_real_parent_ref() { return false; };
|
2004
2418
|
virtual bool is_pseudo_element() { return false; }
|
2005
2419
|
virtual bool is_pseudo_class() { return false; }
|
2006
2420
|
|
2007
|
-
virtual bool is_superselector_of(
|
2421
|
+
virtual bool is_superselector_of(Compound_Selector_Obj sub) { return false; }
|
2008
2422
|
|
2009
|
-
bool operator==(const
|
2423
|
+
virtual bool operator==(const Selector& rhs) const;
|
2424
|
+
virtual bool operator==(const Simple_Selector& rhs) const;
|
2010
2425
|
inline bool operator!=(const Simple_Selector& rhs) const { return !(*this == rhs); }
|
2011
2426
|
|
2427
|
+
bool operator<(const Selector& rhs) const;
|
2012
2428
|
bool operator<(const Simple_Selector& rhs) const;
|
2013
2429
|
// default implementation should work for most of the simple selectors (otherwise overload)
|
2430
|
+
ATTACH_VIRTUAL_AST_OPERATIONS(Simple_Selector);
|
2014
2431
|
ATTACH_OPERATIONS();
|
2015
2432
|
};
|
2016
2433
|
inline Simple_Selector::~Simple_Selector() { }
|
@@ -2020,7 +2437,7 @@ namespace Sass {
|
|
2020
2437
|
// The Parent Selector Expression.
|
2021
2438
|
//////////////////////////////////
|
2022
2439
|
// parent selectors can occur in selectors but also
|
2023
|
-
// inside strings in declarations (
|
2440
|
+
// inside strings in declarations (Compound_Selector).
|
2024
2441
|
// only one simple parent selector means the first case.
|
2025
2442
|
class Parent_Selector : public Simple_Selector {
|
2026
2443
|
ADD_PROPERTY(bool, real)
|
@@ -2028,6 +2445,9 @@ namespace Sass {
|
|
2028
2445
|
Parent_Selector(ParserState pstate, bool r = true)
|
2029
2446
|
: Simple_Selector(pstate, "&"), real_(r)
|
2030
2447
|
{ /* has_reference(true); */ }
|
2448
|
+
Parent_Selector(const Parent_Selector* ptr)
|
2449
|
+
: Simple_Selector(ptr), real_(ptr->real_)
|
2450
|
+
{ /* has_reference(true); */ }
|
2031
2451
|
bool is_real_parent_ref() { return real(); };
|
2032
2452
|
virtual bool has_parent_ref() { return true; };
|
2033
2453
|
virtual bool has_real_parent_ref() { return is_real_parent_ref(); };
|
@@ -2037,6 +2457,7 @@ namespace Sass {
|
|
2037
2457
|
}
|
2038
2458
|
std::string type() { return "selector"; }
|
2039
2459
|
static std::string type_name() { return "selector"; }
|
2460
|
+
ATTACH_AST_OPERATIONS(Parent_Selector)
|
2040
2461
|
ATTACH_OPERATIONS()
|
2041
2462
|
};
|
2042
2463
|
|
@@ -2048,6 +2469,9 @@ namespace Sass {
|
|
2048
2469
|
Placeholder_Selector(ParserState pstate, std::string n)
|
2049
2470
|
: Simple_Selector(pstate, n)
|
2050
2471
|
{ }
|
2472
|
+
Placeholder_Selector(const Placeholder_Selector* ptr)
|
2473
|
+
: Simple_Selector(ptr)
|
2474
|
+
{ }
|
2051
2475
|
virtual unsigned long specificity()
|
2052
2476
|
{
|
2053
2477
|
return Constants::Specificity_Base;
|
@@ -2055,8 +2479,8 @@ namespace Sass {
|
|
2055
2479
|
virtual bool has_placeholder() {
|
2056
2480
|
return true;
|
2057
2481
|
}
|
2058
|
-
// virtual Placeholder_Selector* find_placeholder();
|
2059
2482
|
virtual ~Placeholder_Selector() {};
|
2483
|
+
ATTACH_AST_OPERATIONS(Placeholder_Selector)
|
2060
2484
|
ATTACH_OPERATIONS()
|
2061
2485
|
};
|
2062
2486
|
|
@@ -2068,13 +2492,17 @@ namespace Sass {
|
|
2068
2492
|
Element_Selector(ParserState pstate, std::string n)
|
2069
2493
|
: Simple_Selector(pstate, n)
|
2070
2494
|
{ }
|
2495
|
+
Element_Selector(const Element_Selector* ptr)
|
2496
|
+
: Simple_Selector(ptr)
|
2497
|
+
{ }
|
2071
2498
|
virtual unsigned long specificity()
|
2072
2499
|
{
|
2073
2500
|
if (name() == "*") return 0;
|
2074
2501
|
else return Constants::Specificity_Element;
|
2075
2502
|
}
|
2076
|
-
virtual
|
2077
|
-
virtual
|
2503
|
+
virtual Simple_Selector_Ptr unify_with(Simple_Selector_Ptr, Context&);
|
2504
|
+
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr, Context&);
|
2505
|
+
ATTACH_AST_OPERATIONS(Element_Selector)
|
2078
2506
|
ATTACH_OPERATIONS()
|
2079
2507
|
};
|
2080
2508
|
|
@@ -2086,6 +2514,9 @@ namespace Sass {
|
|
2086
2514
|
Class_Selector(ParserState pstate, std::string n)
|
2087
2515
|
: Simple_Selector(pstate, n)
|
2088
2516
|
{ }
|
2517
|
+
Class_Selector(const Class_Selector* ptr)
|
2518
|
+
: Simple_Selector(ptr)
|
2519
|
+
{ }
|
2089
2520
|
virtual bool unique() const
|
2090
2521
|
{
|
2091
2522
|
return false;
|
@@ -2094,7 +2525,8 @@ namespace Sass {
|
|
2094
2525
|
{
|
2095
2526
|
return Constants::Specificity_Class;
|
2096
2527
|
}
|
2097
|
-
virtual
|
2528
|
+
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr, Context&);
|
2529
|
+
ATTACH_AST_OPERATIONS(Class_Selector)
|
2098
2530
|
ATTACH_OPERATIONS()
|
2099
2531
|
};
|
2100
2532
|
|
@@ -2106,6 +2538,9 @@ namespace Sass {
|
|
2106
2538
|
Id_Selector(ParserState pstate, std::string n)
|
2107
2539
|
: Simple_Selector(pstate, n)
|
2108
2540
|
{ }
|
2541
|
+
Id_Selector(const Id_Selector* ptr)
|
2542
|
+
: Simple_Selector(ptr)
|
2543
|
+
{ }
|
2109
2544
|
virtual bool unique() const
|
2110
2545
|
{
|
2111
2546
|
return true;
|
@@ -2114,7 +2549,8 @@ namespace Sass {
|
|
2114
2549
|
{
|
2115
2550
|
return Constants::Specificity_ID;
|
2116
2551
|
}
|
2117
|
-
virtual
|
2552
|
+
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr, Context&);
|
2553
|
+
ATTACH_AST_OPERATIONS(Id_Selector)
|
2118
2554
|
ATTACH_OPERATIONS()
|
2119
2555
|
};
|
2120
2556
|
|
@@ -2123,11 +2559,17 @@ namespace Sass {
|
|
2123
2559
|
///////////////////////////////////////////////////
|
2124
2560
|
class Attribute_Selector : public Simple_Selector {
|
2125
2561
|
ADD_PROPERTY(std::string, matcher)
|
2126
|
-
|
2562
|
+
// this cannot be changed to obj atm!!!!!!????!!!!!!!
|
2563
|
+
ADD_PROPERTY(String_Obj, value) // might be interpolated
|
2127
2564
|
public:
|
2128
|
-
Attribute_Selector(ParserState pstate, std::string n, std::string m,
|
2565
|
+
Attribute_Selector(ParserState pstate, std::string n, std::string m, String_Obj v)
|
2129
2566
|
: Simple_Selector(pstate, n), matcher_(m), value_(v)
|
2130
|
-
{ }
|
2567
|
+
{ simple_type(ATTR_SEL); }
|
2568
|
+
Attribute_Selector(const Attribute_Selector* ptr)
|
2569
|
+
: Simple_Selector(ptr),
|
2570
|
+
matcher_(ptr->matcher_),
|
2571
|
+
value_(ptr->value_)
|
2572
|
+
{ simple_type(ATTR_SEL); }
|
2131
2573
|
virtual size_t hash()
|
2132
2574
|
{
|
2133
2575
|
if (hash_ == 0) {
|
@@ -2141,10 +2583,11 @@ namespace Sass {
|
|
2141
2583
|
{
|
2142
2584
|
return Constants::Specificity_Attr;
|
2143
2585
|
}
|
2144
|
-
bool operator==(const Simple_Selector& rhs) const;
|
2145
|
-
bool operator==(const Attribute_Selector& rhs) const;
|
2146
|
-
bool operator<(const Simple_Selector& rhs) const;
|
2147
|
-
bool operator<(const Attribute_Selector& rhs) const;
|
2586
|
+
virtual bool operator==(const Simple_Selector& rhs) const;
|
2587
|
+
virtual bool operator==(const Attribute_Selector& rhs) const;
|
2588
|
+
virtual bool operator<(const Simple_Selector& rhs) const;
|
2589
|
+
virtual bool operator<(const Attribute_Selector& rhs) const;
|
2590
|
+
ATTACH_AST_OPERATIONS(Attribute_Selector)
|
2148
2591
|
ATTACH_OPERATIONS()
|
2149
2592
|
};
|
2150
2593
|
|
@@ -2165,11 +2608,14 @@ namespace Sass {
|
|
2165
2608
|
|
2166
2609
|
// Pseudo Selector cannot have any namespace?
|
2167
2610
|
class Pseudo_Selector : public Simple_Selector {
|
2168
|
-
ADD_PROPERTY(
|
2611
|
+
ADD_PROPERTY(String_Obj, expression)
|
2169
2612
|
public:
|
2170
|
-
Pseudo_Selector(ParserState pstate, std::string n,
|
2613
|
+
Pseudo_Selector(ParserState pstate, std::string n, String_Obj expr = 0)
|
2171
2614
|
: Simple_Selector(pstate, n), expression_(expr)
|
2172
|
-
{ }
|
2615
|
+
{ simple_type(PSEUDO_SEL); }
|
2616
|
+
Pseudo_Selector(const Pseudo_Selector* ptr)
|
2617
|
+
: Simple_Selector(ptr), expression_(ptr->expression_)
|
2618
|
+
{ simple_type(PSEUDO_SEL); }
|
2173
2619
|
|
2174
2620
|
// A pseudo-class always consists of a "colon" (:) followed by the name
|
2175
2621
|
// of the pseudo-class and optionally by a value between parentheses.
|
@@ -2206,11 +2652,12 @@ namespace Sass {
|
|
2206
2652
|
return Constants::Specificity_Element;
|
2207
2653
|
return Constants::Specificity_Pseudo;
|
2208
2654
|
}
|
2209
|
-
bool operator==(const Simple_Selector& rhs) const;
|
2210
|
-
bool operator==(const Pseudo_Selector& rhs) const;
|
2211
|
-
bool operator<(const Simple_Selector& rhs) const;
|
2212
|
-
bool operator<(const Pseudo_Selector& rhs) const;
|
2213
|
-
virtual
|
2655
|
+
virtual bool operator==(const Simple_Selector& rhs) const;
|
2656
|
+
virtual bool operator==(const Pseudo_Selector& rhs) const;
|
2657
|
+
virtual bool operator<(const Simple_Selector& rhs) const;
|
2658
|
+
virtual bool operator<(const Pseudo_Selector& rhs) const;
|
2659
|
+
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr, Context&);
|
2660
|
+
ATTACH_AST_OPERATIONS(Pseudo_Selector)
|
2214
2661
|
ATTACH_OPERATIONS()
|
2215
2662
|
};
|
2216
2663
|
|
@@ -2218,12 +2665,15 @@ namespace Sass {
|
|
2218
2665
|
// Wrapped selector -- pseudo selector that takes a list of selectors as argument(s) e.g., :not(:first-of-type), :-moz-any(ol p.blah, ul, menu, dir)
|
2219
2666
|
/////////////////////////////////////////////////
|
2220
2667
|
class Wrapped_Selector : public Simple_Selector {
|
2221
|
-
ADD_PROPERTY(
|
2668
|
+
ADD_PROPERTY(Selector_Obj, selector)
|
2222
2669
|
public:
|
2223
|
-
Wrapped_Selector(ParserState pstate, std::string n,
|
2670
|
+
Wrapped_Selector(ParserState pstate, std::string n, Selector_Obj sel)
|
2224
2671
|
: Simple_Selector(pstate, n), selector_(sel)
|
2225
|
-
{ }
|
2226
|
-
|
2672
|
+
{ simple_type(WRAPPED_SEL); }
|
2673
|
+
Wrapped_Selector(const Wrapped_Selector* ptr)
|
2674
|
+
: Simple_Selector(ptr), selector_(ptr->selector_)
|
2675
|
+
{ simple_type(WRAPPED_SEL); }
|
2676
|
+
virtual bool is_superselector_of(Wrapped_Selector_Obj sub);
|
2227
2677
|
// Selectors inside the negation pseudo-class are counted like any
|
2228
2678
|
// other, but the negation itself does not count as a pseudo-class.
|
2229
2679
|
virtual size_t hash()
|
@@ -2244,48 +2694,52 @@ namespace Sass {
|
|
2244
2694
|
if (!selector()) return false;
|
2245
2695
|
return selector()->has_real_parent_ref();
|
2246
2696
|
}
|
2247
|
-
virtual bool has_wrapped_selector()
|
2248
|
-
{
|
2249
|
-
return true;
|
2250
|
-
}
|
2251
2697
|
virtual unsigned long specificity()
|
2252
2698
|
{
|
2253
2699
|
return selector_ ? selector_->specificity() : 0;
|
2254
2700
|
}
|
2255
|
-
bool operator==(const Simple_Selector& rhs) const;
|
2256
|
-
bool operator==(const Wrapped_Selector& rhs) const;
|
2257
|
-
bool operator<(const Simple_Selector& rhs) const;
|
2258
|
-
bool operator<(const Wrapped_Selector& rhs) const;
|
2701
|
+
virtual bool operator==(const Simple_Selector& rhs) const;
|
2702
|
+
virtual bool operator==(const Wrapped_Selector& rhs) const;
|
2703
|
+
virtual bool operator<(const Simple_Selector& rhs) const;
|
2704
|
+
virtual bool operator<(const Wrapped_Selector& rhs) const;
|
2705
|
+
virtual void cloneChildren();
|
2706
|
+
ATTACH_AST_OPERATIONS(Wrapped_Selector)
|
2259
2707
|
ATTACH_OPERATIONS()
|
2260
2708
|
};
|
2261
2709
|
|
2262
|
-
struct
|
2263
|
-
bool operator() (const
|
2710
|
+
struct Complex_Selector_Pointer_Compare {
|
2711
|
+
bool operator() (const Complex_Selector_Obj& pLeft, const Complex_Selector_Obj& pRight) const;
|
2264
2712
|
};
|
2265
2713
|
|
2266
2714
|
////////////////////////////////////////////////////////////////////////////
|
2267
2715
|
// Simple selector sequences. Maintains flags indicating whether it contains
|
2268
2716
|
// any parent references or placeholders, to simplify expansion.
|
2269
2717
|
////////////////////////////////////////////////////////////////////////////
|
2270
|
-
typedef std::set<
|
2271
|
-
class
|
2718
|
+
typedef std::set<Complex_Selector_Obj, Complex_Selector_Pointer_Compare> SourcesSet;
|
2719
|
+
class Compound_Selector : public Selector, public Vectorized<Simple_Selector_Obj> {
|
2272
2720
|
private:
|
2273
2721
|
SourcesSet sources_;
|
2274
2722
|
ADD_PROPERTY(bool, extended);
|
2275
2723
|
ADD_PROPERTY(bool, has_parent_reference);
|
2276
2724
|
protected:
|
2277
|
-
void adjust_after_pushing(
|
2725
|
+
void adjust_after_pushing(Simple_Selector_Obj s)
|
2278
2726
|
{
|
2279
2727
|
// if (s->has_reference()) has_reference(true);
|
2280
2728
|
// if (s->has_placeholder()) has_placeholder(true);
|
2281
2729
|
}
|
2282
2730
|
public:
|
2283
|
-
|
2731
|
+
Compound_Selector(ParserState pstate, size_t s = 0)
|
2284
2732
|
: Selector(pstate),
|
2285
|
-
Vectorized<
|
2733
|
+
Vectorized<Simple_Selector_Obj>(s),
|
2286
2734
|
extended_(false),
|
2287
2735
|
has_parent_reference_(false)
|
2288
2736
|
{ }
|
2737
|
+
Compound_Selector(const Compound_Selector* ptr)
|
2738
|
+
: Selector(ptr),
|
2739
|
+
Vectorized<Simple_Selector_Obj>(*ptr),
|
2740
|
+
extended_(ptr->extended_),
|
2741
|
+
has_parent_reference_(ptr->has_parent_reference_)
|
2742
|
+
{ }
|
2289
2743
|
bool contains_placeholder() {
|
2290
2744
|
for (size_t i = 0, L = length(); i < L; ++i) {
|
2291
2745
|
if ((*this)[i]->has_placeholder()) return true;
|
@@ -2293,33 +2747,33 @@ namespace Sass {
|
|
2293
2747
|
return false;
|
2294
2748
|
};
|
2295
2749
|
|
2296
|
-
|
2750
|
+
void append(Simple_Selector_Ptr element);
|
2297
2751
|
|
2298
2752
|
bool is_universal() const
|
2299
2753
|
{
|
2300
2754
|
return length() == 1 && (*this)[0]->is_universal();
|
2301
2755
|
}
|
2302
2756
|
|
2303
|
-
|
2304
|
-
|
2305
|
-
// virtual
|
2757
|
+
Complex_Selector_Obj to_complex();
|
2758
|
+
Compound_Selector_Ptr unify_with(Compound_Selector_Ptr rhs, Context& ctx);
|
2759
|
+
// virtual Placeholder_Selector_Ptr find_placeholder();
|
2306
2760
|
virtual bool has_parent_ref();
|
2307
2761
|
virtual bool has_real_parent_ref();
|
2308
|
-
|
2762
|
+
Simple_Selector_Ptr base()
|
2309
2763
|
{
|
2310
2764
|
// Implement non-const in terms of const. Safe to const_cast since this method is non-const
|
2311
|
-
return const_cast<
|
2765
|
+
return const_cast<Simple_Selector_Ptr>(static_cast<Compound_Selector_Ptr_Const>(this)->base());
|
2312
2766
|
}
|
2313
|
-
|
2767
|
+
Simple_Selector_Ptr_Const base() const {
|
2314
2768
|
if (length() == 0) return 0;
|
2315
2769
|
// ToDo: why is this needed?
|
2316
|
-
if (
|
2317
|
-
return (*this)[0];
|
2770
|
+
if (SASS_MEMORY_CAST(Element_Selector, (*this)[0]))
|
2771
|
+
return &(*this)[0];
|
2318
2772
|
return 0;
|
2319
2773
|
}
|
2320
|
-
virtual bool is_superselector_of(
|
2321
|
-
virtual bool is_superselector_of(
|
2322
|
-
virtual bool is_superselector_of(
|
2774
|
+
virtual bool is_superselector_of(Compound_Selector_Obj sub, std::string wrapped = "");
|
2775
|
+
virtual bool is_superselector_of(Complex_Selector_Obj sub, std::string wrapped = "");
|
2776
|
+
virtual bool is_superselector_of(Selector_List_Obj sub, std::string wrapped = "");
|
2323
2777
|
virtual size_t hash()
|
2324
2778
|
{
|
2325
2779
|
if (Selector::hash_ == 0) {
|
@@ -2336,19 +2790,10 @@ namespace Sass {
|
|
2336
2790
|
return sum;
|
2337
2791
|
}
|
2338
2792
|
|
2339
|
-
virtual bool has_wrapped_selector()
|
2340
|
-
{
|
2341
|
-
if (length() == 0) return false;
|
2342
|
-
if (Simple_Selector* ss = elements().front()) {
|
2343
|
-
if (ss->has_wrapped_selector()) return true;
|
2344
|
-
}
|
2345
|
-
return false;
|
2346
|
-
}
|
2347
|
-
|
2348
2793
|
virtual bool has_placeholder()
|
2349
2794
|
{
|
2350
2795
|
if (length() == 0) return false;
|
2351
|
-
if (
|
2796
|
+
if (Simple_Selector_Obj ss = elements().front()) {
|
2352
2797
|
if (ss->has_placeholder()) return true;
|
2353
2798
|
}
|
2354
2799
|
return false;
|
@@ -2357,22 +2802,21 @@ namespace Sass {
|
|
2357
2802
|
bool is_empty_reference()
|
2358
2803
|
{
|
2359
2804
|
return length() == 1 &&
|
2360
|
-
|
2805
|
+
SASS_MEMORY_CAST(Parent_Selector, (*this)[0]);
|
2361
2806
|
}
|
2362
|
-
std::vector<
|
2807
|
+
std::vector<Subset_Map_Key> to_str_vec(); // sometimes need to convert to a flat "by-value" data structure
|
2363
2808
|
|
2364
|
-
bool operator<(const
|
2365
|
-
|
2366
|
-
bool operator
|
2367
|
-
inline bool operator!=(const SimpleSequence_Selector& rhs) const { return !(*this == rhs); }
|
2809
|
+
virtual bool operator<(const Compound_Selector& rhs) const;
|
2810
|
+
virtual bool operator==(const Compound_Selector& rhs) const;
|
2811
|
+
inline bool operator!=(const Compound_Selector& rhs) const { return !(*this == rhs); }
|
2368
2812
|
|
2369
2813
|
SourcesSet& sources() { return sources_; }
|
2370
2814
|
void clearSources() { sources_.clear(); }
|
2371
2815
|
void mergeSources(SourcesSet& sources, Context& ctx);
|
2372
2816
|
|
2373
|
-
|
2374
|
-
|
2375
|
-
|
2817
|
+
Compound_Selector_Ptr minus(Compound_Selector_Ptr rhs, Context& ctx);
|
2818
|
+
virtual void cloneChildren();
|
2819
|
+
ATTACH_AST_OPERATIONS(Compound_Selector)
|
2376
2820
|
ATTACH_OPERATIONS()
|
2377
2821
|
};
|
2378
2822
|
|
@@ -2381,37 +2825,40 @@ namespace Sass {
|
|
2381
2825
|
// CSS selector combinators (">", "+", "~", and whitespace). Essentially a
|
2382
2826
|
// linked list.
|
2383
2827
|
////////////////////////////////////////////////////////////////////////////
|
2384
|
-
class
|
2828
|
+
class Complex_Selector : public Selector {
|
2385
2829
|
public:
|
2386
2830
|
enum Combinator { ANCESTOR_OF, PARENT_OF, PRECEDES, ADJACENT_TO, REFERENCE };
|
2387
2831
|
private:
|
2388
2832
|
ADD_PROPERTY(Combinator, combinator)
|
2389
|
-
ADD_PROPERTY(
|
2390
|
-
ADD_PROPERTY(
|
2391
|
-
ADD_PROPERTY(
|
2833
|
+
ADD_PROPERTY(Compound_Selector_Obj, head)
|
2834
|
+
ADD_PROPERTY(Complex_Selector_Obj, tail)
|
2835
|
+
ADD_PROPERTY(String_Obj, reference);
|
2392
2836
|
public:
|
2393
2837
|
bool contains_placeholder() {
|
2394
2838
|
if (head() && head()->contains_placeholder()) return true;
|
2395
2839
|
if (tail() && tail()->contains_placeholder()) return true;
|
2396
2840
|
return false;
|
2397
2841
|
};
|
2398
|
-
|
2842
|
+
Complex_Selector(ParserState pstate,
|
2399
2843
|
Combinator c = ANCESTOR_OF,
|
2400
|
-
|
2401
|
-
|
2402
|
-
|
2844
|
+
Compound_Selector_Obj h = 0,
|
2845
|
+
Complex_Selector_Obj t = 0,
|
2846
|
+
String_Obj r = 0)
|
2403
2847
|
: Selector(pstate),
|
2404
2848
|
combinator_(c),
|
2405
2849
|
head_(h), tail_(t),
|
2406
2850
|
reference_(r)
|
2407
|
-
{
|
2408
|
-
|
2409
|
-
|
2410
|
-
|
2851
|
+
{}
|
2852
|
+
Complex_Selector(const Complex_Selector* ptr)
|
2853
|
+
: Selector(ptr),
|
2854
|
+
combinator_(ptr->combinator_),
|
2855
|
+
head_(ptr->head_), tail_(ptr->tail_),
|
2856
|
+
reference_(ptr->reference_)
|
2857
|
+
{};
|
2411
2858
|
virtual bool has_parent_ref();
|
2412
2859
|
virtual bool has_real_parent_ref();
|
2413
2860
|
|
2414
|
-
|
2861
|
+
Complex_Selector_Obj skip_empty_reference()
|
2415
2862
|
{
|
2416
2863
|
if ((!head_ || !head_->length() || head_->is_empty_reference()) &&
|
2417
2864
|
combinator() == Combinator::ANCESTOR_OF)
|
@@ -2431,36 +2878,29 @@ namespace Sass {
|
|
2431
2878
|
combinator() == Combinator::ANCESTOR_OF;
|
2432
2879
|
}
|
2433
2880
|
|
2434
|
-
|
2881
|
+
Complex_Selector_Obj context(Context&);
|
2435
2882
|
|
2436
2883
|
|
2884
|
+
Selector_List_Ptr tails(Context& ctx, Selector_List_Ptr tails);
|
2885
|
+
|
2437
2886
|
// front returns the first real tail
|
2438
2887
|
// skips over parent and empty ones
|
2439
|
-
|
2440
|
-
|
2888
|
+
Complex_Selector_Obj first();
|
2441
2889
|
// last returns the last real tail
|
2442
|
-
|
2443
|
-
|
2444
|
-
CommaSequence_Selector* tails(Context& ctx, CommaSequence_Selector* tails);
|
2445
|
-
|
2446
|
-
// unconstant accessors
|
2447
|
-
Sequence_Selector* first();
|
2448
|
-
Sequence_Selector* last();
|
2890
|
+
Complex_Selector_Obj last();
|
2449
2891
|
|
2450
2892
|
// some shortcuts that should be removed
|
2451
|
-
|
2452
|
-
Sequence_Selector* innermost() { return last(); };
|
2893
|
+
Complex_Selector_Obj innermost() { return last(); };
|
2453
2894
|
|
2454
2895
|
size_t length() const;
|
2455
|
-
|
2456
|
-
virtual bool is_superselector_of(
|
2457
|
-
virtual bool is_superselector_of(
|
2458
|
-
virtual bool is_superselector_of(
|
2459
|
-
|
2460
|
-
CommaSequence_Selector* unify_with(Sequence_Selector* rhs, Context& ctx);
|
2896
|
+
Selector_List_Ptr resolve_parent_refs(Context& ctx, std::vector<Selector_List_Obj>& pstack, bool implicit_parent = true);
|
2897
|
+
virtual bool is_superselector_of(Compound_Selector_Obj sub, std::string wrapping = "");
|
2898
|
+
virtual bool is_superselector_of(Complex_Selector_Obj sub, std::string wrapping = "");
|
2899
|
+
virtual bool is_superselector_of(Selector_List_Obj sub, std::string wrapping = "");
|
2900
|
+
Selector_List_Ptr unify_with(Complex_Selector_Ptr rhs, Context& ctx);
|
2461
2901
|
Combinator clear_innermost();
|
2462
|
-
void append(Context&,
|
2463
|
-
void set_innermost(
|
2902
|
+
void append(Context&, Complex_Selector_Obj);
|
2903
|
+
void set_innermost(Complex_Selector_Obj, Combinator);
|
2464
2904
|
virtual size_t hash()
|
2465
2905
|
{
|
2466
2906
|
if (hash_ == 0) {
|
@@ -2478,24 +2918,19 @@ namespace Sass {
|
|
2478
2918
|
if (tail()) sum += tail()->specificity();
|
2479
2919
|
return sum;
|
2480
2920
|
}
|
2481
|
-
virtual void set_media_block(
|
2921
|
+
virtual void set_media_block(Media_Block_Ptr mb) {
|
2482
2922
|
media_block(mb);
|
2483
2923
|
if (tail_) tail_->set_media_block(mb);
|
2484
2924
|
if (head_) head_->set_media_block(mb);
|
2485
2925
|
}
|
2486
|
-
virtual bool has_wrapped_selector() {
|
2487
|
-
if (head_ && head_->has_wrapped_selector()) return true;
|
2488
|
-
if (tail_ && tail_->has_wrapped_selector()) return true;
|
2489
|
-
return false;
|
2490
|
-
}
|
2491
2926
|
virtual bool has_placeholder() {
|
2492
2927
|
if (head_ && head_->has_placeholder()) return true;
|
2493
2928
|
if (tail_ && tail_->has_placeholder()) return true;
|
2494
2929
|
return false;
|
2495
2930
|
}
|
2496
|
-
bool operator<(const
|
2497
|
-
bool operator==(const
|
2498
|
-
inline bool operator!=(const
|
2931
|
+
virtual bool operator<(const Complex_Selector& rhs) const;
|
2932
|
+
virtual bool operator==(const Complex_Selector& rhs) const;
|
2933
|
+
inline bool operator!=(const Complex_Selector& rhs) const { return !(*this == rhs); }
|
2499
2934
|
SourcesSet sources()
|
2500
2935
|
{
|
2501
2936
|
//s = Set.new
|
@@ -2504,8 +2939,8 @@ namespace Sass {
|
|
2504
2939
|
|
2505
2940
|
SourcesSet srcs;
|
2506
2941
|
|
2507
|
-
|
2508
|
-
|
2942
|
+
Compound_Selector_Obj pHead = head();
|
2943
|
+
Complex_Selector_Obj pTail = tail();
|
2509
2944
|
|
2510
2945
|
if (pHead) {
|
2511
2946
|
SourcesSet& headSources = pHead->sources();
|
@@ -2521,48 +2956,52 @@ namespace Sass {
|
|
2521
2956
|
}
|
2522
2957
|
void addSources(SourcesSet& sources, Context& ctx) {
|
2523
2958
|
// members.map! {|m| m.is_a?(SimpleSequence) ? m.with_more_sources(sources) : m}
|
2524
|
-
|
2959
|
+
Complex_Selector_Ptr pIter = this;
|
2525
2960
|
while (pIter) {
|
2526
|
-
|
2961
|
+
Compound_Selector_Ptr pHead = &pIter->head();
|
2527
2962
|
|
2528
2963
|
if (pHead) {
|
2529
2964
|
pHead->mergeSources(sources, ctx);
|
2530
2965
|
}
|
2531
2966
|
|
2532
|
-
pIter = pIter->tail();
|
2967
|
+
pIter = &pIter->tail();
|
2533
2968
|
}
|
2534
2969
|
}
|
2535
2970
|
void clearSources() {
|
2536
|
-
|
2971
|
+
Complex_Selector_Ptr pIter = this;
|
2537
2972
|
while (pIter) {
|
2538
|
-
|
2973
|
+
Compound_Selector_Ptr pHead = &pIter->head();
|
2539
2974
|
|
2540
2975
|
if (pHead) {
|
2541
2976
|
pHead->clearSources();
|
2542
2977
|
}
|
2543
2978
|
|
2544
|
-
pIter = pIter->tail();
|
2979
|
+
pIter = &pIter->tail();
|
2545
2980
|
}
|
2546
2981
|
}
|
2547
|
-
|
2548
|
-
|
2549
|
-
|
2982
|
+
|
2983
|
+
virtual void cloneChildren();
|
2984
|
+
ATTACH_AST_OPERATIONS(Complex_Selector)
|
2550
2985
|
ATTACH_OPERATIONS()
|
2551
2986
|
};
|
2552
2987
|
|
2553
|
-
typedef std::deque<
|
2554
|
-
typedef Subset_Map<std::string, std::pair<Sequence_Selector*, SimpleSequence_Selector*> > ExtensionSubsetMap;
|
2988
|
+
typedef std::deque<Complex_Selector_Obj> ComplexSelectorDeque;
|
2555
2989
|
|
2556
2990
|
///////////////////////////////////
|
2557
2991
|
// Comma-separated selector groups.
|
2558
2992
|
///////////////////////////////////
|
2559
|
-
class
|
2993
|
+
class Selector_List : public Selector, public Vectorized<Complex_Selector_Obj> {
|
2560
2994
|
ADD_PROPERTY(std::vector<std::string>, wspace)
|
2561
2995
|
protected:
|
2562
|
-
void adjust_after_pushing(
|
2996
|
+
void adjust_after_pushing(Complex_Selector_Obj c);
|
2563
2997
|
public:
|
2564
|
-
|
2565
|
-
: Selector(pstate), Vectorized<
|
2998
|
+
Selector_List(ParserState pstate, size_t s = 0)
|
2999
|
+
: Selector(pstate), Vectorized<Complex_Selector_Obj>(s), wspace_(0)
|
3000
|
+
{ }
|
3001
|
+
Selector_List(const Selector_List* ptr)
|
3002
|
+
: Selector(ptr),
|
3003
|
+
Vectorized<Complex_Selector_Obj>(*ptr),
|
3004
|
+
wspace_(ptr->wspace_)
|
2566
3005
|
{ }
|
2567
3006
|
std::string type() { return "list"; }
|
2568
3007
|
// remove parent selector references
|
@@ -2570,13 +3009,12 @@ namespace Sass {
|
|
2570
3009
|
virtual bool has_parent_ref();
|
2571
3010
|
virtual bool has_real_parent_ref();
|
2572
3011
|
void remove_parent_selectors();
|
2573
|
-
|
2574
|
-
|
2575
|
-
virtual bool is_superselector_of(
|
2576
|
-
virtual bool is_superselector_of(
|
2577
|
-
|
2578
|
-
|
2579
|
-
void populate_extends(CommaSequence_Selector*, Context&, ExtensionSubsetMap&);
|
3012
|
+
Selector_List_Ptr resolve_parent_refs(Context& ctx, std::vector<Selector_List_Obj>& pstack, bool implicit_parent = true);
|
3013
|
+
virtual bool is_superselector_of(Compound_Selector_Obj sub, std::string wrapping = "");
|
3014
|
+
virtual bool is_superselector_of(Complex_Selector_Obj sub, std::string wrapping = "");
|
3015
|
+
virtual bool is_superselector_of(Selector_List_Obj sub, std::string wrapping = "");
|
3016
|
+
Selector_List_Ptr unify_with(Selector_List_Ptr, Context&);
|
3017
|
+
void populate_extends(Selector_List_Obj, Context&, Subset_Map&);
|
2580
3018
|
virtual size_t hash()
|
2581
3019
|
{
|
2582
3020
|
if (Selector::hash_ == 0) {
|
@@ -2596,30 +3034,26 @@ namespace Sass {
|
|
2596
3034
|
}
|
2597
3035
|
return sum;
|
2598
3036
|
}
|
2599
|
-
virtual void set_media_block(
|
3037
|
+
virtual void set_media_block(Media_Block_Ptr mb) {
|
2600
3038
|
media_block(mb);
|
2601
|
-
for (
|
3039
|
+
for (Complex_Selector_Obj cs : elements()) {
|
2602
3040
|
cs->set_media_block(mb);
|
2603
3041
|
}
|
2604
3042
|
}
|
2605
|
-
virtual bool has_wrapped_selector() {
|
2606
|
-
for (Sequence_Selector* cs : elements()) {
|
2607
|
-
if (cs->has_wrapped_selector()) return true;
|
2608
|
-
}
|
2609
|
-
return false;
|
2610
|
-
}
|
2611
3043
|
virtual bool has_placeholder() {
|
2612
|
-
for (
|
3044
|
+
for (Complex_Selector_Obj cs : elements()) {
|
2613
3045
|
if (cs->has_placeholder()) return true;
|
2614
3046
|
}
|
2615
3047
|
return false;
|
2616
3048
|
}
|
2617
|
-
|
2618
|
-
CommaSequence_Selector* cloneFully(Context&) const; // clones SimpleSequence_Selector*s
|
3049
|
+
virtual bool operator<(const Selector& rhs) const;
|
2619
3050
|
virtual bool operator==(const Selector& rhs) const;
|
2620
|
-
virtual bool operator
|
3051
|
+
virtual bool operator<(const Selector_List& rhs) const;
|
3052
|
+
virtual bool operator==(const Selector_List& rhs) const;
|
2621
3053
|
// Selector Lists can be compared to comma lists
|
2622
3054
|
virtual bool operator==(const Expression& rhs) const;
|
3055
|
+
virtual void cloneChildren();
|
3056
|
+
ATTACH_AST_OPERATIONS(Selector_List)
|
2623
3057
|
ATTACH_OPERATIONS()
|
2624
3058
|
};
|
2625
3059
|
|
@@ -2630,10 +3064,10 @@ namespace Sass {
|
|
2630
3064
|
// is required for proper stl collection ordering) is implemented using string comparision. This gives stable sorting
|
2631
3065
|
// behavior, and can be used to determine if the selectors would have exactly idential output. operator== matches the
|
2632
3066
|
// ruby sass implementations for eql, which sometimes perform order independent comparisions (like set comparisons of the
|
2633
|
-
// members of a SimpleSequence (
|
3067
|
+
// members of a SimpleSequence (Compound_Selector)).
|
2634
3068
|
//
|
2635
3069
|
// Due to the reliance on operator== and operater< behavior, this templated method is currently only intended for
|
2636
|
-
// use with
|
3070
|
+
// use with Compound_Selector and Complex_Selector objects.
|
2637
3071
|
if (simpleSelectorOrderDependent) {
|
2638
3072
|
return !(one < two) && !(two < one);
|
2639
3073
|
} else {
|
@@ -2642,9 +3076,9 @@ namespace Sass {
|
|
2642
3076
|
}
|
2643
3077
|
|
2644
3078
|
// compare function for sorting and probably other other uses
|
2645
|
-
struct cmp_complex_selector { inline bool operator() (const
|
2646
|
-
struct cmp_compound_selector { inline bool operator() (const
|
2647
|
-
struct cmp_simple_selector { inline bool operator() (const
|
3079
|
+
struct cmp_complex_selector { inline bool operator() (const Complex_Selector_Obj l, const Complex_Selector_Obj r) { return (*l < *r); } };
|
3080
|
+
struct cmp_compound_selector { inline bool operator() (const Compound_Selector_Obj l, const Compound_Selector_Obj r) { return (*l < *r); } };
|
3081
|
+
struct cmp_simple_selector { inline bool operator() (const Simple_Selector_Obj l, const Simple_Selector_Obj r) { return (*l < *r); } };
|
2648
3082
|
|
2649
3083
|
}
|
2650
3084
|
|