sassc 1.11.1 → 1.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +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
|
|