sassc 1.11.4 → 1.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +2 -2
- data/CODE_OF_CONDUCT.md +10 -0
- data/README.md +4 -1
- data/ext/libsass/.editorconfig +1 -1
- data/ext/libsass/.github/CONTRIBUTING.md +7 -7
- data/ext/libsass/.github/ISSUE_TEMPLATE.md +31 -6
- data/ext/libsass/.gitignore +3 -0
- data/ext/libsass/.travis.yml +37 -18
- data/ext/libsass/GNUmakefile.am +23 -37
- data/ext/libsass/Makefile +10 -6
- data/ext/libsass/Makefile.conf +3 -0
- data/ext/libsass/Readme.md +68 -63
- data/ext/libsass/appveyor.yml +7 -3
- data/ext/libsass/configure.ac +10 -14
- data/ext/libsass/docs/api-context-internal.md +29 -21
- data/ext/libsass/docs/api-context.md +26 -6
- data/ext/libsass/docs/api-doc.md +49 -16
- data/ext/libsass/docs/api-function-example.md +1 -1
- data/ext/libsass/docs/api-function.md +31 -7
- data/ext/libsass/docs/api-importer.md +19 -19
- data/ext/libsass/docs/api-value.md +4 -2
- data/ext/libsass/docs/build-on-windows.md +4 -4
- data/ext/libsass/docs/build-with-mingw.md +3 -3
- data/ext/libsass/docs/build.md +9 -9
- data/ext/libsass/docs/custom-functions-internal.md +10 -8
- data/ext/libsass/docs/implementations.md +20 -8
- data/ext/libsass/docs/unicode.md +16 -10
- data/ext/libsass/include/sass/base.h +0 -3
- data/ext/libsass/include/sass/context.h +20 -2
- data/ext/libsass/include/sass/functions.h +31 -0
- data/ext/libsass/include/sass/values.h +3 -1
- data/ext/libsass/include/sass/version.h +1 -1
- data/ext/libsass/include/sass/version.h.in +1 -1
- data/ext/libsass/include/sass2scss.h +1 -1
- data/ext/libsass/res/resource.rc +6 -6
- data/ext/libsass/script/ci-build-libsass +10 -5
- data/ext/libsass/script/ci-build-plugin +62 -0
- data/ext/libsass/script/ci-install-compiler +1 -1
- data/ext/libsass/script/ci-install-deps +4 -7
- data/ext/libsass/script/ci-report-coverage +13 -3
- data/ext/libsass/script/tap-driver +1 -1
- data/ext/libsass/script/tap-runner +1 -1
- data/ext/libsass/src/GNUmakefile.am +1 -1
- data/ext/libsass/src/ast.cpp +537 -762
- data/ext/libsass/src/ast.hpp +377 -419
- data/ext/libsass/src/ast_def_macros.hpp +26 -1
- data/ext/libsass/src/ast_fwd_decl.cpp +29 -0
- data/ext/libsass/src/ast_fwd_decl.hpp +94 -21
- data/ext/libsass/src/b64/encode.h +3 -1
- data/ext/libsass/src/backtrace.cpp +46 -0
- data/ext/libsass/src/backtrace.hpp +7 -54
- data/ext/libsass/src/bind.cpp +72 -50
- data/ext/libsass/src/bind.hpp +0 -1
- data/ext/libsass/src/cencode.c +6 -0
- data/ext/libsass/src/check_nesting.cpp +157 -135
- data/ext/libsass/src/check_nesting.hpp +11 -10
- data/ext/libsass/src/color_maps.cpp +10 -6
- data/ext/libsass/src/color_maps.hpp +6 -8
- data/ext/libsass/src/constants.cpp +4 -3
- data/ext/libsass/src/constants.hpp +4 -3
- data/ext/libsass/src/context.cpp +110 -47
- data/ext/libsass/src/context.hpp +11 -1
- data/ext/libsass/src/cssize.cpp +105 -94
- data/ext/libsass/src/cssize.hpp +4 -5
- data/ext/libsass/src/debugger.hpp +247 -244
- data/ext/libsass/src/emitter.cpp +30 -6
- data/ext/libsass/src/emitter.hpp +7 -0
- data/ext/libsass/src/environment.cpp +67 -16
- data/ext/libsass/src/environment.hpp +28 -7
- data/ext/libsass/src/error_handling.cpp +92 -64
- data/ext/libsass/src/error_handling.hpp +64 -43
- data/ext/libsass/src/eval.cpp +494 -544
- data/ext/libsass/src/eval.hpp +17 -23
- data/ext/libsass/src/expand.cpp +182 -154
- data/ext/libsass/src/expand.hpp +4 -5
- data/ext/libsass/src/extend.cpp +299 -291
- data/ext/libsass/src/extend.hpp +46 -11
- data/ext/libsass/src/file.cpp +103 -36
- data/ext/libsass/src/file.hpp +21 -4
- data/ext/libsass/src/functions.cpp +561 -312
- data/ext/libsass/src/functions.hpp +8 -5
- data/ext/libsass/src/inspect.cpp +108 -53
- data/ext/libsass/src/inspect.hpp +5 -2
- data/ext/libsass/src/lexer.cpp +15 -7
- data/ext/libsass/src/lexer.hpp +13 -4
- data/ext/libsass/src/listize.cpp +3 -2
- data/ext/libsass/src/listize.hpp +0 -1
- data/ext/libsass/src/memory/SharedPtr.cpp +16 -18
- data/ext/libsass/src/memory/SharedPtr.hpp +47 -43
- data/ext/libsass/src/node.cpp +34 -38
- data/ext/libsass/src/node.hpp +6 -8
- data/ext/libsass/src/operation.hpp +2 -2
- data/ext/libsass/src/operators.cpp +240 -0
- data/ext/libsass/src/operators.hpp +30 -0
- data/ext/libsass/src/output.cpp +22 -20
- data/ext/libsass/src/parser.cpp +719 -358
- data/ext/libsass/src/parser.hpp +57 -22
- data/ext/libsass/src/plugins.cpp +28 -10
- data/ext/libsass/src/position.cpp +21 -3
- data/ext/libsass/src/position.hpp +2 -1
- data/ext/libsass/src/prelexer.cpp +104 -19
- data/ext/libsass/src/prelexer.hpp +10 -3
- data/ext/libsass/src/remove_placeholders.cpp +9 -10
- data/ext/libsass/src/remove_placeholders.hpp +1 -5
- data/ext/libsass/src/sass.cpp +62 -4
- data/ext/libsass/src/sass.hpp +5 -2
- data/ext/libsass/src/sass_context.cpp +96 -58
- data/ext/libsass/src/sass_context.hpp +7 -5
- data/ext/libsass/src/sass_functions.cpp +63 -1
- data/ext/libsass/src/sass_functions.hpp +19 -1
- data/ext/libsass/src/sass_util.cpp +3 -3
- data/ext/libsass/src/sass_util.hpp +4 -4
- data/ext/libsass/src/sass_values.cpp +42 -39
- data/ext/libsass/src/sass_values.hpp +2 -1
- data/ext/libsass/src/source_map.cpp +16 -18
- data/ext/libsass/src/subset_map.cpp +6 -8
- data/ext/libsass/src/subset_map.hpp +6 -6
- data/ext/libsass/src/to_c.cpp +2 -2
- data/ext/libsass/src/to_value.cpp +8 -3
- data/ext/libsass/src/to_value.hpp +1 -0
- data/ext/libsass/src/units.cpp +349 -45
- data/ext/libsass/src/units.hpp +39 -22
- data/ext/libsass/src/utf8/checked.h +7 -0
- data/ext/libsass/src/utf8/unchecked.h +7 -0
- data/ext/libsass/src/utf8_string.cpp +1 -1
- data/ext/libsass/src/util.cpp +139 -45
- data/ext/libsass/src/util.hpp +4 -7
- data/ext/libsass/src/values.cpp +15 -23
- data/ext/libsass/win/libsass.sln +13 -2
- data/ext/libsass/win/libsass.sln.DotSettings +9 -0
- data/ext/libsass/win/libsass.targets +3 -0
- data/ext/libsass/win/libsass.vcxproj.filters +9 -0
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +1 -1
- data/test/native_test.rb +1 -1
- metadata +11 -4
data/ext/libsass/src/ast.hpp
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#ifndef SASS_AST_H
|
2
2
|
#define SASS_AST_H
|
3
3
|
|
4
|
+
#include "sass.hpp"
|
4
5
|
#include <set>
|
5
6
|
#include <deque>
|
6
7
|
#include <vector>
|
@@ -74,6 +75,9 @@ namespace Sass {
|
|
74
75
|
// Note: most methods follow precision option
|
75
76
|
const double NUMBER_EPSILON = 0.00000000000001;
|
76
77
|
|
78
|
+
// macro to test if numbers are equal within a small error margin
|
79
|
+
#define NEAR_EQUAL(lhs, rhs) std::fabs(lhs - rhs) < NUMBER_EPSILON
|
80
|
+
|
77
81
|
// ToDo: where does this fit best?
|
78
82
|
// We don't share this with C-API?
|
79
83
|
class Operand {
|
@@ -120,12 +124,14 @@ namespace Sass {
|
|
120
124
|
ATTACH_VIRTUAL_AST_OPERATIONS(AST_Node);
|
121
125
|
virtual std::string inspect() const { return to_string({ INSPECT, 5 }); }
|
122
126
|
virtual std::string to_sass() const { return to_string({ TO_SASS, 5 }); }
|
123
|
-
virtual std::string to_string(Sass_Inspect_Options opt) const;
|
124
|
-
virtual std::string to_string() const;
|
127
|
+
virtual const std::string to_string(Sass_Inspect_Options opt) const;
|
128
|
+
virtual const std::string to_string() const;
|
125
129
|
virtual void cloneChildren() {};
|
130
|
+
// generic find function (not fully implemented yet)
|
131
|
+
// ToDo: add specific implementions to all children
|
132
|
+
virtual bool find ( bool (*f)(AST_Node_Obj) ) { return f(this); };
|
126
133
|
public:
|
127
134
|
void update_pstate(const ParserState& pstate);
|
128
|
-
void set_pstate_offset(const Offset& offset);
|
129
135
|
public:
|
130
136
|
Offset off() { return pstate(); }
|
131
137
|
Position pos() { return pstate(); }
|
@@ -133,6 +139,21 @@ namespace Sass {
|
|
133
139
|
};
|
134
140
|
inline AST_Node::~AST_Node() { }
|
135
141
|
|
142
|
+
//////////////////////////////////////////////////////////////////////
|
143
|
+
// define cast template now (need complete type)
|
144
|
+
//////////////////////////////////////////////////////////////////////
|
145
|
+
|
146
|
+
template<class T>
|
147
|
+
T* Cast(AST_Node* ptr) {
|
148
|
+
return ptr && typeid(T) == typeid(*ptr) ?
|
149
|
+
static_cast<T*>(ptr) : NULL;
|
150
|
+
};
|
151
|
+
|
152
|
+
template<class T>
|
153
|
+
const T* Cast(const AST_Node* ptr) {
|
154
|
+
return ptr && typeid(T) == typeid(*ptr) ?
|
155
|
+
static_cast<const T*>(ptr) : NULL;
|
156
|
+
};
|
136
157
|
|
137
158
|
//////////////////////////////////////////////////////////////////////
|
138
159
|
// Abstract base class for expressions. This side of the AST hierarchy
|
@@ -151,9 +172,11 @@ namespace Sass {
|
|
151
172
|
MAP,
|
152
173
|
SELECTOR,
|
153
174
|
NULL_VAL,
|
175
|
+
FUNCTION_VAL,
|
154
176
|
C_WARNING,
|
155
177
|
C_ERROR,
|
156
178
|
FUNCTION,
|
179
|
+
VARIABLE,
|
157
180
|
NUM_TYPES
|
158
181
|
};
|
159
182
|
enum Simple_Type {
|
@@ -186,7 +209,7 @@ namespace Sass {
|
|
186
209
|
{ }
|
187
210
|
virtual operator bool() { return true; }
|
188
211
|
virtual ~Expression() { }
|
189
|
-
virtual std::string type() { return ""; /* TODO: raise an error? */ }
|
212
|
+
virtual std::string type() const { return ""; /* TODO: raise an error? */ }
|
190
213
|
virtual bool is_invisible() const { return false; }
|
191
214
|
static std::string type_name() { return ""; }
|
192
215
|
virtual bool is_false() { return false; }
|
@@ -343,8 +366,11 @@ namespace Sass {
|
|
343
366
|
void reset_duplicate_key() { duplicate_key_ = 0; }
|
344
367
|
virtual void adjust_after_pushing(std::pair<Expression_Obj, Expression_Obj> p) { }
|
345
368
|
public:
|
346
|
-
Hashed(size_t s = 0)
|
347
|
-
|
369
|
+
Hashed(size_t s = 0)
|
370
|
+
: elements_(ExpressionMap(s)),
|
371
|
+
list_(std::vector<Expression_Obj>()),
|
372
|
+
hash_(0), duplicate_key_(NULL)
|
373
|
+
{ elements_.reserve(s); list_.reserve(s); }
|
348
374
|
virtual ~Hashed();
|
349
375
|
size_t length() const { return list_.size(); }
|
350
376
|
bool empty() const { return list_.empty(); }
|
@@ -454,7 +480,6 @@ namespace Sass {
|
|
454
480
|
////////////////////////
|
455
481
|
class Block : public Statement, public Vectorized<Statement_Obj> {
|
456
482
|
ADD_PROPERTY(bool, is_root)
|
457
|
-
ADD_PROPERTY(bool, is_at_root);
|
458
483
|
// needed for properly formatted CSS emission
|
459
484
|
protected:
|
460
485
|
void adjust_after_pushing(Statement_Obj s)
|
@@ -464,14 +489,12 @@ namespace Sass {
|
|
464
489
|
Block(ParserState pstate, size_t s = 0, bool r = false)
|
465
490
|
: Statement(pstate),
|
466
491
|
Vectorized<Statement_Obj>(s),
|
467
|
-
is_root_(r)
|
468
|
-
is_at_root_(false)
|
492
|
+
is_root_(r)
|
469
493
|
{ }
|
470
494
|
Block(const Block* ptr)
|
471
495
|
: Statement(ptr),
|
472
496
|
Vectorized<Statement_Obj>(*ptr),
|
473
|
-
is_root_(ptr->is_root_)
|
474
|
-
is_at_root_(ptr->is_at_root_)
|
497
|
+
is_root_(ptr->is_root_)
|
475
498
|
{ }
|
476
499
|
virtual bool has_content()
|
477
500
|
{
|
@@ -509,17 +532,15 @@ namespace Sass {
|
|
509
532
|
// of style declarations.
|
510
533
|
/////////////////////////////////////////////////////////////////////////////
|
511
534
|
class Ruleset : public Has_Block {
|
512
|
-
ADD_PROPERTY(
|
513
|
-
ADD_PROPERTY(bool, at_root);
|
535
|
+
ADD_PROPERTY(Selector_List_Obj, selector)
|
514
536
|
ADD_PROPERTY(bool, is_root);
|
515
537
|
public:
|
516
|
-
Ruleset(ParserState pstate,
|
517
|
-
: Has_Block(pstate, b), selector_(s),
|
538
|
+
Ruleset(ParserState pstate, Selector_List_Obj s = 0, Block_Obj b = 0)
|
539
|
+
: Has_Block(pstate, b), selector_(s), is_root_(false)
|
518
540
|
{ statement_type(RULESET); }
|
519
541
|
Ruleset(const Ruleset* ptr)
|
520
542
|
: Has_Block(ptr),
|
521
543
|
selector_(ptr->selector_),
|
522
|
-
at_root_(ptr->at_root_),
|
523
544
|
is_root_(ptr->is_root_)
|
524
545
|
{ statement_type(RULESET); }
|
525
546
|
bool is_invisible() const;
|
@@ -551,13 +572,15 @@ namespace Sass {
|
|
551
572
|
// Trace.
|
552
573
|
/////////////////
|
553
574
|
class Trace : public Has_Block {
|
554
|
-
|
575
|
+
ADD_CONSTREF(char, type)
|
576
|
+
ADD_CONSTREF(std::string, name)
|
555
577
|
public:
|
556
|
-
Trace(ParserState pstate, std::string n, Block_Obj b = 0)
|
557
|
-
: Has_Block(pstate, b), name_(n)
|
578
|
+
Trace(ParserState pstate, std::string n, Block_Obj b = 0, char type = 'm')
|
579
|
+
: Has_Block(pstate, b), type_(type), name_(n)
|
558
580
|
{ }
|
559
581
|
Trace(const Trace* ptr)
|
560
582
|
: Has_Block(ptr),
|
583
|
+
type_(ptr->type_),
|
561
584
|
name_(ptr->name_)
|
562
585
|
{ }
|
563
586
|
ATTACH_AST_OPERATIONS(Trace)
|
@@ -573,9 +596,6 @@ namespace Sass {
|
|
573
596
|
Media_Block(ParserState pstate, List_Obj mqs, Block_Obj b)
|
574
597
|
: Has_Block(pstate, b), media_queries_(mqs)
|
575
598
|
{ statement_type(MEDIA); }
|
576
|
-
Media_Block(ParserState pstate, List_Obj mqs, Block_Obj b, Selector_Obj s)
|
577
|
-
: Has_Block(pstate, b), media_queries_(mqs)
|
578
|
-
{ statement_type(MEDIA); }
|
579
599
|
Media_Block(const Media_Block* ptr)
|
580
600
|
: Has_Block(ptr), media_queries_(ptr->media_queries_)
|
581
601
|
{ statement_type(MEDIA); }
|
@@ -590,11 +610,11 @@ namespace Sass {
|
|
590
610
|
// optional statement block.
|
591
611
|
///////////////////////////////////////////////////////////////////////
|
592
612
|
class Directive : public Has_Block {
|
593
|
-
|
594
|
-
ADD_PROPERTY(
|
613
|
+
ADD_CONSTREF(std::string, keyword)
|
614
|
+
ADD_PROPERTY(Selector_List_Obj, selector)
|
595
615
|
ADD_PROPERTY(Expression_Obj, value)
|
596
616
|
public:
|
597
|
-
Directive(ParserState pstate, std::string kwd,
|
617
|
+
Directive(ParserState pstate, std::string kwd, Selector_List_Obj sel = 0, Block_Obj b = 0, Expression_Obj val = 0)
|
598
618
|
: Has_Block(pstate, b), keyword_(kwd), selector_(sel), value_(val) // set value manually if needed
|
599
619
|
{ statement_type(DIRECTIVE); }
|
600
620
|
Directive(const Directive* ptr)
|
@@ -626,7 +646,7 @@ namespace Sass {
|
|
626
646
|
class Keyframe_Rule : public Has_Block {
|
627
647
|
// according to css spec, this should be <keyframes-name>
|
628
648
|
// <keyframes-name> = <custom-ident> | <string>
|
629
|
-
ADD_PROPERTY(
|
649
|
+
ADD_PROPERTY(Selector_List_Obj, name)
|
630
650
|
public:
|
631
651
|
Keyframe_Rule(ParserState pstate, Block_Obj b)
|
632
652
|
: Has_Block(pstate, b), name_()
|
@@ -645,19 +665,22 @@ namespace Sass {
|
|
645
665
|
ADD_PROPERTY(String_Obj, property)
|
646
666
|
ADD_PROPERTY(Expression_Obj, value)
|
647
667
|
ADD_PROPERTY(bool, is_important)
|
668
|
+
ADD_PROPERTY(bool, is_custom_property)
|
648
669
|
ADD_PROPERTY(bool, is_indented)
|
649
670
|
public:
|
650
671
|
Declaration(ParserState pstate,
|
651
|
-
String_Obj prop, Expression_Obj val, bool i = false, Block_Obj b = 0)
|
652
|
-
: Has_Block(pstate, b), property_(prop), value_(val), is_important_(i), is_indented_(false)
|
672
|
+
String_Obj prop, Expression_Obj val, bool i = false, bool c = false, Block_Obj b = 0)
|
673
|
+
: Has_Block(pstate, b), property_(prop), value_(val), is_important_(i), is_custom_property_(c), is_indented_(false)
|
653
674
|
{ statement_type(DECLARATION); }
|
654
675
|
Declaration(const Declaration* ptr)
|
655
676
|
: Has_Block(ptr),
|
656
677
|
property_(ptr->property_),
|
657
678
|
value_(ptr->value_),
|
658
679
|
is_important_(ptr->is_important_),
|
680
|
+
is_custom_property_(ptr->is_custom_property_),
|
659
681
|
is_indented_(ptr->is_indented_)
|
660
682
|
{ statement_type(DECLARATION); }
|
683
|
+
virtual bool is_invisible() const;
|
661
684
|
ATTACH_AST_OPERATIONS(Declaration)
|
662
685
|
ATTACH_OPERATIONS()
|
663
686
|
};
|
@@ -666,7 +689,7 @@ namespace Sass {
|
|
666
689
|
// Assignments -- variable and value.
|
667
690
|
/////////////////////////////////////
|
668
691
|
class Assignment : public Statement {
|
669
|
-
|
692
|
+
ADD_CONSTREF(std::string, variable)
|
670
693
|
ADD_PROPERTY(Expression_Obj, value)
|
671
694
|
ADD_PROPERTY(bool, is_default)
|
672
695
|
ADD_PROPERTY(bool, is_global)
|
@@ -811,7 +834,7 @@ namespace Sass {
|
|
811
834
|
ADD_PROPERTY(Block_Obj, alternative)
|
812
835
|
public:
|
813
836
|
If(ParserState pstate, Expression_Obj pred, Block_Obj con, Block_Obj alt = 0)
|
814
|
-
: Has_Block(pstate,
|
837
|
+
: Has_Block(pstate, con), predicate_(pred), alternative_(alt)
|
815
838
|
{ statement_type(IF); }
|
816
839
|
If(const If* ptr)
|
817
840
|
: Has_Block(ptr),
|
@@ -830,7 +853,7 @@ namespace Sass {
|
|
830
853
|
// The Sass `@for` control directive.
|
831
854
|
/////////////////////////////////////
|
832
855
|
class For : public Has_Block {
|
833
|
-
|
856
|
+
ADD_CONSTREF(std::string, variable)
|
834
857
|
ADD_PROPERTY(Expression_Obj, lower_bound)
|
835
858
|
ADD_PROPERTY(Expression_Obj, upper_bound)
|
836
859
|
ADD_PROPERTY(bool, is_inclusive)
|
@@ -904,9 +927,9 @@ namespace Sass {
|
|
904
927
|
// The Sass `@extend` directive.
|
905
928
|
////////////////////////////////
|
906
929
|
class Extension : public Statement {
|
907
|
-
ADD_PROPERTY(
|
930
|
+
ADD_PROPERTY(Selector_List_Obj, selector)
|
908
931
|
public:
|
909
|
-
Extension(ParserState pstate,
|
932
|
+
Extension(ParserState pstate, Selector_List_Obj s)
|
910
933
|
: Statement(pstate), selector_(s)
|
911
934
|
{ statement_type(EXTEND); }
|
912
935
|
Extension(const Extension* ptr)
|
@@ -921,13 +944,12 @@ namespace Sass {
|
|
921
944
|
// by a type tag.
|
922
945
|
/////////////////////////////////////////////////////////////////////////////
|
923
946
|
struct Backtrace;
|
924
|
-
typedef Environment<AST_Node_Obj> Env;
|
925
947
|
typedef const char* Signature;
|
926
|
-
typedef Expression_Ptr (*Native_Function)(Env&, Env&, Context&, Signature, ParserState,
|
948
|
+
typedef Expression_Ptr (*Native_Function)(Env&, Env&, Context&, Signature, ParserState, Backtraces, std::vector<Selector_List_Obj>);
|
927
949
|
class Definition : public Has_Block {
|
928
950
|
public:
|
929
951
|
enum Type { MIXIN, FUNCTION };
|
930
|
-
|
952
|
+
ADD_CONSTREF(std::string, name)
|
931
953
|
ADD_PROPERTY(Parameters_Obj, parameters)
|
932
954
|
ADD_PROPERTY(Env*, environment)
|
933
955
|
ADD_PROPERTY(Type, type)
|
@@ -1009,7 +1031,7 @@ namespace Sass {
|
|
1009
1031
|
// Mixin calls (i.e., `@include ...`).
|
1010
1032
|
//////////////////////////////////////
|
1011
1033
|
class Mixin_Call : public Has_Block {
|
1012
|
-
|
1034
|
+
ADD_CONSTREF(std::string, name)
|
1013
1035
|
ADD_PROPERTY(Arguments_Obj, arguments)
|
1014
1036
|
public:
|
1015
1037
|
Mixin_Call(ParserState pstate, std::string n, Arguments_Obj args, Block_Obj b = 0)
|
@@ -1028,11 +1050,15 @@ namespace Sass {
|
|
1028
1050
|
// The @content directive for mixin content blocks.
|
1029
1051
|
///////////////////////////////////////////////////
|
1030
1052
|
class Content : public Statement {
|
1031
|
-
ADD_PROPERTY(
|
1053
|
+
ADD_PROPERTY(Media_Block_Ptr, media_block)
|
1032
1054
|
public:
|
1033
|
-
Content(ParserState pstate)
|
1055
|
+
Content(ParserState pstate)
|
1056
|
+
: Statement(pstate),
|
1057
|
+
media_block_(NULL)
|
1034
1058
|
{ statement_type(CONTENT); }
|
1035
|
-
Content(const Content* ptr)
|
1059
|
+
Content(const Content* ptr)
|
1060
|
+
: Statement(ptr),
|
1061
|
+
media_block_(ptr->media_block_)
|
1036
1062
|
{ statement_type(CONTENT); }
|
1037
1063
|
ATTACH_AST_OPERATIONS(Content)
|
1038
1064
|
ATTACH_OPERATIONS()
|
@@ -1047,14 +1073,16 @@ namespace Sass {
|
|
1047
1073
|
private:
|
1048
1074
|
ADD_PROPERTY(enum Sass_Separator, separator)
|
1049
1075
|
ADD_PROPERTY(bool, is_arglist)
|
1076
|
+
ADD_PROPERTY(bool, is_bracketed)
|
1050
1077
|
ADD_PROPERTY(bool, from_selector)
|
1051
1078
|
public:
|
1052
1079
|
List(ParserState pstate,
|
1053
|
-
size_t size = 0, enum Sass_Separator sep = SASS_SPACE, bool argl = false)
|
1080
|
+
size_t size = 0, enum Sass_Separator sep = SASS_SPACE, bool argl = false, bool bracket = false)
|
1054
1081
|
: Value(pstate),
|
1055
1082
|
Vectorized<Expression_Obj>(size),
|
1056
1083
|
separator_(sep),
|
1057
1084
|
is_arglist_(argl),
|
1085
|
+
is_bracketed_(bracket),
|
1058
1086
|
from_selector_(false)
|
1059
1087
|
{ concrete_type(LIST); }
|
1060
1088
|
List(const List* ptr)
|
@@ -1062,15 +1090,16 @@ namespace Sass {
|
|
1062
1090
|
Vectorized<Expression_Obj>(*ptr),
|
1063
1091
|
separator_(ptr->separator_),
|
1064
1092
|
is_arglist_(ptr->is_arglist_),
|
1093
|
+
is_bracketed_(ptr->is_bracketed_),
|
1065
1094
|
from_selector_(ptr->from_selector_)
|
1066
1095
|
{ concrete_type(LIST); }
|
1067
|
-
std::string type() { return is_arglist_ ? "arglist" : "list"; }
|
1096
|
+
std::string type() const { return is_arglist_ ? "arglist" : "list"; }
|
1068
1097
|
static std::string type_name() { return "list"; }
|
1069
1098
|
const char* sep_string(bool compressed = false) const {
|
1070
1099
|
return separator() == SASS_SPACE ?
|
1071
1100
|
" " : (compressed ? "," : ", ");
|
1072
1101
|
}
|
1073
|
-
bool is_invisible() const { return empty(); }
|
1102
|
+
bool is_invisible() const { return empty() && !is_bracketed(); }
|
1074
1103
|
Expression_Obj value_at_index(size_t i);
|
1075
1104
|
|
1076
1105
|
virtual size_t size() const;
|
@@ -1079,6 +1108,7 @@ namespace Sass {
|
|
1079
1108
|
{
|
1080
1109
|
if (hash_ == 0) {
|
1081
1110
|
hash_ = std::hash<std::string>()(sep_string());
|
1111
|
+
hash_combine(hash_, std::hash<bool>()(is_bracketed()));
|
1082
1112
|
for (size_t i = 0, L = length(); i < L; ++i)
|
1083
1113
|
hash_combine(hash_, (elements()[i])->hash());
|
1084
1114
|
}
|
@@ -1112,10 +1142,10 @@ namespace Sass {
|
|
1112
1142
|
: Value(ptr),
|
1113
1143
|
Hashed(*ptr)
|
1114
1144
|
{ concrete_type(MAP); }
|
1115
|
-
std::string type() { return "map"; }
|
1145
|
+
std::string type() const { return "map"; }
|
1116
1146
|
static std::string type_name() { return "map"; }
|
1117
1147
|
bool is_invisible() const { return empty(); }
|
1118
|
-
List_Obj to_list(
|
1148
|
+
List_Obj to_list(ParserState& pstate);
|
1119
1149
|
|
1120
1150
|
virtual size_t hash()
|
1121
1151
|
{
|
@@ -1137,22 +1167,43 @@ namespace Sass {
|
|
1137
1167
|
|
1138
1168
|
inline static const std::string sass_op_to_name(enum Sass_OP op) {
|
1139
1169
|
switch (op) {
|
1140
|
-
case AND: return "and";
|
1141
|
-
case OR: return "or";
|
1142
|
-
case EQ: return "eq";
|
1143
|
-
case NEQ: return "neq";
|
1144
|
-
case GT: return "gt";
|
1145
|
-
case GTE: return "gte";
|
1146
|
-
case LT: return "lt";
|
1147
|
-
case LTE: return "lte";
|
1148
|
-
case ADD: return "plus";
|
1149
|
-
case SUB: return "sub";
|
1150
|
-
case MUL: return "times";
|
1151
|
-
case DIV: return "div";
|
1152
|
-
case MOD: return "mod";
|
1170
|
+
case AND: return "and";
|
1171
|
+
case OR: return "or";
|
1172
|
+
case EQ: return "eq";
|
1173
|
+
case NEQ: return "neq";
|
1174
|
+
case GT: return "gt";
|
1175
|
+
case GTE: return "gte";
|
1176
|
+
case LT: return "lt";
|
1177
|
+
case LTE: return "lte";
|
1178
|
+
case ADD: return "plus";
|
1179
|
+
case SUB: return "sub";
|
1180
|
+
case MUL: return "times";
|
1181
|
+
case DIV: return "div";
|
1182
|
+
case MOD: return "mod";
|
1183
|
+
// this is only used internally!
|
1184
|
+
case NUM_OPS: return "[OPS]";
|
1185
|
+
default: return "invalid";
|
1186
|
+
}
|
1187
|
+
}
|
1188
|
+
|
1189
|
+
inline static const std::string sass_op_separator(enum Sass_OP op) {
|
1190
|
+
switch (op) {
|
1191
|
+
case AND: return "&&";
|
1192
|
+
case OR: return "||";
|
1193
|
+
case EQ: return "==";
|
1194
|
+
case NEQ: return "!=";
|
1195
|
+
case GT: return ">";
|
1196
|
+
case GTE: return ">=";
|
1197
|
+
case LT: return "<";
|
1198
|
+
case LTE: return "<=";
|
1199
|
+
case ADD: return "+";
|
1200
|
+
case SUB: return "-";
|
1201
|
+
case MUL: return "*";
|
1202
|
+
case DIV: return "/";
|
1203
|
+
case MOD: return "%";
|
1153
1204
|
// this is only used internally!
|
1154
|
-
case NUM_OPS: return "[OPS]";
|
1155
|
-
default: return "invalid";
|
1205
|
+
case NUM_OPS: return "[OPS]";
|
1206
|
+
default: return "invalid";
|
1156
1207
|
}
|
1157
1208
|
}
|
1158
1209
|
|
@@ -1163,9 +1214,9 @@ namespace Sass {
|
|
1163
1214
|
//////////////////////////////////////////////////////////////////////////
|
1164
1215
|
class Binary_Expression : public PreValue {
|
1165
1216
|
private:
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1217
|
+
HASH_PROPERTY(Operand, op)
|
1218
|
+
HASH_PROPERTY(Expression_Obj, left)
|
1219
|
+
HASH_PROPERTY(Expression_Obj, right)
|
1169
1220
|
size_t hash_;
|
1170
1221
|
public:
|
1171
1222
|
Binary_Expression(ParserState pstate,
|
@@ -1180,44 +1231,10 @@ namespace Sass {
|
|
1180
1231
|
hash_(ptr->hash_)
|
1181
1232
|
{ }
|
1182
1233
|
const std::string type_name() {
|
1183
|
-
|
1184
|
-
case AND: return "and"; break;
|
1185
|
-
case OR: return "or"; break;
|
1186
|
-
case EQ: return "eq"; break;
|
1187
|
-
case NEQ: return "neq"; break;
|
1188
|
-
case GT: return "gt"; break;
|
1189
|
-
case GTE: return "gte"; break;
|
1190
|
-
case LT: return "lt"; break;
|
1191
|
-
case LTE: return "lte"; break;
|
1192
|
-
case ADD: return "add"; break;
|
1193
|
-
case SUB: return "sub"; break;
|
1194
|
-
case MUL: return "mul"; break;
|
1195
|
-
case DIV: return "div"; break;
|
1196
|
-
case MOD: return "mod"; break;
|
1197
|
-
// this is only used internally!
|
1198
|
-
case NUM_OPS: return "[OPS]"; break;
|
1199
|
-
default: return "invalid"; break;
|
1200
|
-
}
|
1234
|
+
return sass_op_to_name(optype());
|
1201
1235
|
}
|
1202
1236
|
const std::string separator() {
|
1203
|
-
|
1204
|
-
case AND: return "&&"; break;
|
1205
|
-
case OR: return "||"; break;
|
1206
|
-
case EQ: return "=="; break;
|
1207
|
-
case NEQ: return "!="; break;
|
1208
|
-
case GT: return ">"; break;
|
1209
|
-
case GTE: return ">="; break;
|
1210
|
-
case LT: return "<"; break;
|
1211
|
-
case LTE: return "<="; break;
|
1212
|
-
case ADD: return "+"; break;
|
1213
|
-
case SUB: return "-"; break;
|
1214
|
-
case MUL: return "*"; break;
|
1215
|
-
case DIV: return "/"; break;
|
1216
|
-
case MOD: return "%"; break;
|
1217
|
-
// this is only used internally!
|
1218
|
-
case NUM_OPS: return "[OPS]"; break;
|
1219
|
-
default: return "invalid"; break;
|
1220
|
-
}
|
1237
|
+
return sass_op_separator(optype());
|
1221
1238
|
}
|
1222
1239
|
bool is_left_interpolant(void) const;
|
1223
1240
|
bool is_right_interpolant(void) const;
|
@@ -1236,11 +1253,11 @@ namespace Sass {
|
|
1236
1253
|
{
|
1237
1254
|
try
|
1238
1255
|
{
|
1239
|
-
Binary_Expression_Ptr_Const m =
|
1256
|
+
Binary_Expression_Ptr_Const m = Cast<Binary_Expression>(&rhs);
|
1240
1257
|
if (m == 0) return false;
|
1241
1258
|
return type() == m->type() &&
|
1242
|
-
left() == m->left() &&
|
1243
|
-
right() == m->right();
|
1259
|
+
*left() == *m->left() &&
|
1260
|
+
*right() == *m->right();
|
1244
1261
|
}
|
1245
1262
|
catch (std::bad_cast&)
|
1246
1263
|
{
|
@@ -1251,13 +1268,13 @@ namespace Sass {
|
|
1251
1268
|
virtual size_t hash()
|
1252
1269
|
{
|
1253
1270
|
if (hash_ == 0) {
|
1254
|
-
hash_ = std::hash<size_t>()(
|
1271
|
+
hash_ = std::hash<size_t>()(optype());
|
1255
1272
|
hash_combine(hash_, left()->hash());
|
1256
1273
|
hash_combine(hash_, right()->hash());
|
1257
1274
|
}
|
1258
1275
|
return hash_;
|
1259
1276
|
}
|
1260
|
-
enum Sass_OP
|
1277
|
+
enum Sass_OP optype() const { return op_.operand; }
|
1261
1278
|
ATTACH_AST_OPERATIONS(Binary_Expression)
|
1262
1279
|
ATTACH_OPERATIONS()
|
1263
1280
|
};
|
@@ -1267,37 +1284,38 @@ namespace Sass {
|
|
1267
1284
|
////////////////////////////////////////////////////////////////////////////
|
1268
1285
|
class Unary_Expression : public Expression {
|
1269
1286
|
public:
|
1270
|
-
enum Type { PLUS, MINUS, NOT };
|
1287
|
+
enum Type { PLUS, MINUS, NOT, SLASH };
|
1271
1288
|
private:
|
1272
|
-
|
1273
|
-
|
1289
|
+
HASH_PROPERTY(Type, optype)
|
1290
|
+
HASH_PROPERTY(Expression_Obj, operand)
|
1274
1291
|
size_t hash_;
|
1275
1292
|
public:
|
1276
1293
|
Unary_Expression(ParserState pstate, Type t, Expression_Obj o)
|
1277
|
-
: Expression(pstate),
|
1294
|
+
: Expression(pstate), optype_(t), operand_(o), hash_(0)
|
1278
1295
|
{ }
|
1279
1296
|
Unary_Expression(const Unary_Expression* ptr)
|
1280
1297
|
: Expression(ptr),
|
1281
|
-
|
1298
|
+
optype_(ptr->optype_),
|
1282
1299
|
operand_(ptr->operand_),
|
1283
1300
|
hash_(ptr->hash_)
|
1284
1301
|
{ }
|
1285
1302
|
const std::string type_name() {
|
1286
|
-
switch (
|
1287
|
-
case PLUS: return "plus";
|
1288
|
-
case MINUS: return "minus";
|
1289
|
-
case
|
1290
|
-
|
1303
|
+
switch (optype_) {
|
1304
|
+
case PLUS: return "plus";
|
1305
|
+
case MINUS: return "minus";
|
1306
|
+
case SLASH: return "slash";
|
1307
|
+
case NOT: return "not";
|
1308
|
+
default: return "invalid";
|
1291
1309
|
}
|
1292
1310
|
}
|
1293
1311
|
virtual bool operator==(const Expression& rhs) const
|
1294
1312
|
{
|
1295
1313
|
try
|
1296
1314
|
{
|
1297
|
-
Unary_Expression_Ptr_Const m =
|
1315
|
+
Unary_Expression_Ptr_Const m = Cast<Unary_Expression>(&rhs);
|
1298
1316
|
if (m == 0) return false;
|
1299
1317
|
return type() == m->type() &&
|
1300
|
-
operand() == m->operand();
|
1318
|
+
*operand() == *m->operand();
|
1301
1319
|
}
|
1302
1320
|
catch (std::bad_cast&)
|
1303
1321
|
{
|
@@ -1308,7 +1326,7 @@ namespace Sass {
|
|
1308
1326
|
virtual size_t hash()
|
1309
1327
|
{
|
1310
1328
|
if (hash_ == 0) {
|
1311
|
-
hash_ = std::hash<size_t>()(
|
1329
|
+
hash_ = std::hash<size_t>()(optype_);
|
1312
1330
|
hash_combine(hash_, operand()->hash());
|
1313
1331
|
};
|
1314
1332
|
return hash_;
|
@@ -1321,8 +1339,8 @@ namespace Sass {
|
|
1321
1339
|
// Individual argument objects for mixin and function calls.
|
1322
1340
|
////////////////////////////////////////////////////////////
|
1323
1341
|
class Argument : public Expression {
|
1324
|
-
|
1325
|
-
|
1342
|
+
HASH_PROPERTY(Expression_Obj, value)
|
1343
|
+
HASH_CONSTREF(std::string, name)
|
1326
1344
|
ADD_PROPERTY(bool, is_rest_argument)
|
1327
1345
|
ADD_PROPERTY(bool, is_keyword_argument)
|
1328
1346
|
size_t hash_;
|
@@ -1331,7 +1349,7 @@ namespace Sass {
|
|
1331
1349
|
: Expression(pstate), value_(val), name_(n), is_rest_argument_(rest), is_keyword_argument_(keyword), hash_(0)
|
1332
1350
|
{
|
1333
1351
|
if (!name_.empty() && is_rest_argument_) {
|
1334
|
-
|
1352
|
+
coreError("variable-length argument may not be passed by name", pstate_);
|
1335
1353
|
}
|
1336
1354
|
}
|
1337
1355
|
Argument(const Argument* ptr)
|
@@ -1343,7 +1361,7 @@ namespace Sass {
|
|
1343
1361
|
hash_(ptr->hash_)
|
1344
1362
|
{
|
1345
1363
|
if (!name_.empty() && is_rest_argument_) {
|
1346
|
-
|
1364
|
+
coreError("variable-length argument may not be passed by name", pstate_);
|
1347
1365
|
}
|
1348
1366
|
}
|
1349
1367
|
|
@@ -1352,7 +1370,7 @@ namespace Sass {
|
|
1352
1370
|
{
|
1353
1371
|
try
|
1354
1372
|
{
|
1355
|
-
Argument_Ptr_Const m =
|
1373
|
+
Argument_Ptr_Const m = Cast<Argument>(&rhs);
|
1356
1374
|
if (!(m && name() == m->name())) return false;
|
1357
1375
|
return *value() == *m->value();
|
1358
1376
|
}
|
@@ -1412,18 +1430,54 @@ namespace Sass {
|
|
1412
1430
|
ATTACH_OPERATIONS()
|
1413
1431
|
};
|
1414
1432
|
|
1433
|
+
////////////////////////////////////////////////////
|
1434
|
+
// Function reference.
|
1435
|
+
////////////////////////////////////////////////////
|
1436
|
+
class Function : public Value {
|
1437
|
+
public:
|
1438
|
+
ADD_PROPERTY(Definition_Obj, definition)
|
1439
|
+
ADD_PROPERTY(bool, is_css)
|
1440
|
+
public:
|
1441
|
+
Function(ParserState pstate, Definition_Obj def, bool css)
|
1442
|
+
: Value(pstate), definition_(def), is_css_(css)
|
1443
|
+
{ concrete_type(FUNCTION_VAL); }
|
1444
|
+
Function(const Function* ptr)
|
1445
|
+
: Value(ptr), definition_(ptr->definition_), is_css_(ptr->is_css_)
|
1446
|
+
{ concrete_type(FUNCTION_VAL); }
|
1447
|
+
|
1448
|
+
std::string type() const { return "function"; }
|
1449
|
+
static std::string type_name() { return "function"; }
|
1450
|
+
bool is_invisible() const { return true; }
|
1451
|
+
|
1452
|
+
std::string name() {
|
1453
|
+
if (definition_) {
|
1454
|
+
return definition_->name();
|
1455
|
+
}
|
1456
|
+
return "";
|
1457
|
+
}
|
1458
|
+
|
1459
|
+
virtual bool operator== (const Expression& rhs) const;
|
1460
|
+
|
1461
|
+
ATTACH_AST_OPERATIONS(Function)
|
1462
|
+
ATTACH_OPERATIONS()
|
1463
|
+
};
|
1464
|
+
|
1415
1465
|
//////////////////
|
1416
1466
|
// Function calls.
|
1417
1467
|
//////////////////
|
1418
1468
|
class Function_Call : public PreValue {
|
1419
|
-
|
1420
|
-
|
1469
|
+
HASH_CONSTREF(std::string, name)
|
1470
|
+
HASH_PROPERTY(Arguments_Obj, arguments)
|
1471
|
+
HASH_PROPERTY(Function_Obj, func)
|
1421
1472
|
ADD_PROPERTY(bool, via_call)
|
1422
1473
|
ADD_PROPERTY(void*, cookie)
|
1423
1474
|
size_t hash_;
|
1424
1475
|
public:
|
1425
1476
|
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)
|
1477
|
+
: PreValue(pstate), name_(n), arguments_(args), func_(0), via_call_(false), cookie_(cookie), hash_(0)
|
1478
|
+
{ concrete_type(FUNCTION); }
|
1479
|
+
Function_Call(ParserState pstate, std::string n, Arguments_Obj args, Function_Obj func)
|
1480
|
+
: PreValue(pstate), name_(n), arguments_(args), func_(func), via_call_(false), cookie_(0), hash_(0)
|
1427
1481
|
{ concrete_type(FUNCTION); }
|
1428
1482
|
Function_Call(ParserState pstate, std::string n, Arguments_Obj args)
|
1429
1483
|
: PreValue(pstate), name_(n), arguments_(args), via_call_(false), cookie_(0), hash_(0)
|
@@ -1432,20 +1486,26 @@ namespace Sass {
|
|
1432
1486
|
: PreValue(ptr),
|
1433
1487
|
name_(ptr->name_),
|
1434
1488
|
arguments_(ptr->arguments_),
|
1489
|
+
func_(ptr->func_),
|
1435
1490
|
via_call_(ptr->via_call_),
|
1436
1491
|
cookie_(ptr->cookie_),
|
1437
1492
|
hash_(ptr->hash_)
|
1438
1493
|
{ concrete_type(FUNCTION); }
|
1439
1494
|
|
1495
|
+
bool is_css() {
|
1496
|
+
if (func_) return func_->is_css();
|
1497
|
+
return false;
|
1498
|
+
}
|
1499
|
+
|
1440
1500
|
virtual bool operator==(const Expression& rhs) const
|
1441
1501
|
{
|
1442
1502
|
try
|
1443
1503
|
{
|
1444
|
-
Function_Call_Ptr_Const m =
|
1504
|
+
Function_Call_Ptr_Const m = Cast<Function_Call>(&rhs);
|
1445
1505
|
if (!(m && name() == m->name())) return false;
|
1446
1506
|
if (!(m && arguments()->length() == m->arguments()->length())) return false;
|
1447
1507
|
for (size_t i =0, L = arguments()->length(); i < L; ++i)
|
1448
|
-
if (!((*arguments())[i] == (*m->arguments())[i])) return false;
|
1508
|
+
if (!(*(*arguments())[i] == *(*m->arguments())[i])) return false;
|
1449
1509
|
return true;
|
1450
1510
|
}
|
1451
1511
|
catch (std::bad_cast&)
|
@@ -1491,20 +1551,20 @@ namespace Sass {
|
|
1491
1551
|
// Variable references.
|
1492
1552
|
///////////////////////
|
1493
1553
|
class Variable : public PreValue {
|
1494
|
-
|
1554
|
+
ADD_CONSTREF(std::string, name)
|
1495
1555
|
public:
|
1496
1556
|
Variable(ParserState pstate, std::string n)
|
1497
1557
|
: PreValue(pstate), name_(n)
|
1498
|
-
{ }
|
1558
|
+
{ concrete_type(VARIABLE); }
|
1499
1559
|
Variable(const Variable* ptr)
|
1500
1560
|
: PreValue(ptr), name_(ptr->name_)
|
1501
|
-
{ }
|
1561
|
+
{ concrete_type(VARIABLE); }
|
1502
1562
|
|
1503
1563
|
virtual bool operator==(const Expression& rhs) const
|
1504
1564
|
{
|
1505
1565
|
try
|
1506
1566
|
{
|
1507
|
-
Variable_Ptr_Const e =
|
1567
|
+
Variable_Ptr_Const e = Cast<Variable>(&rhs);
|
1508
1568
|
return e && name() == e->name();
|
1509
1569
|
}
|
1510
1570
|
catch (std::bad_cast&)
|
@@ -1523,108 +1583,45 @@ namespace Sass {
|
|
1523
1583
|
ATTACH_OPERATIONS()
|
1524
1584
|
};
|
1525
1585
|
|
1526
|
-
////////////////////////////////////////////////////////////////////////////
|
1527
|
-
// Textual (i.e., unevaluated) numeric data. Variants are distinguished with
|
1528
|
-
// a type tag.
|
1529
|
-
////////////////////////////////////////////////////////////////////////////
|
1530
|
-
class Textual : public Expression {
|
1531
|
-
public:
|
1532
|
-
enum Type { NUMBER, PERCENTAGE, DIMENSION, HEX };
|
1533
|
-
private:
|
1534
|
-
ADD_HASHED(Type, type)
|
1535
|
-
ADD_HASHED(std::string, value)
|
1536
|
-
size_t hash_;
|
1537
|
-
public:
|
1538
|
-
Textual(ParserState pstate, Type t, std::string val)
|
1539
|
-
: Expression(pstate, DELAYED), type_(t), value_(val),
|
1540
|
-
hash_(0)
|
1541
|
-
{ }
|
1542
|
-
Textual(const Textual* ptr)
|
1543
|
-
: Expression(ptr),
|
1544
|
-
type_(ptr->type_),
|
1545
|
-
value_(ptr->value_),
|
1546
|
-
hash_(ptr->hash_)
|
1547
|
-
{ }
|
1548
|
-
|
1549
|
-
virtual bool operator==(const Expression& rhs) const
|
1550
|
-
{
|
1551
|
-
try
|
1552
|
-
{
|
1553
|
-
Textual_Ptr_Const e = dynamic_cast<Textual_Ptr_Const>(&rhs);
|
1554
|
-
return e && value() == e->value() && type() == e->type();
|
1555
|
-
}
|
1556
|
-
catch (std::bad_cast&)
|
1557
|
-
{
|
1558
|
-
return false;
|
1559
|
-
}
|
1560
|
-
catch (...) { throw; }
|
1561
|
-
}
|
1562
|
-
|
1563
|
-
virtual size_t hash()
|
1564
|
-
{
|
1565
|
-
if (hash_ == 0) {
|
1566
|
-
hash_ = std::hash<std::string>()(value_);
|
1567
|
-
hash_combine(hash_, std::hash<int>()(type_));
|
1568
|
-
}
|
1569
|
-
return hash_;
|
1570
|
-
}
|
1571
|
-
|
1572
|
-
ATTACH_AST_OPERATIONS(Textual)
|
1573
|
-
ATTACH_OPERATIONS()
|
1574
|
-
};
|
1575
|
-
|
1576
1586
|
////////////////////////////////////////////////
|
1577
1587
|
// Numbers, percentages, dimensions, and colors.
|
1578
1588
|
////////////////////////////////////////////////
|
1579
|
-
class Number : public Value {
|
1580
|
-
|
1589
|
+
class Number : public Value, public Units {
|
1590
|
+
HASH_PROPERTY(double, value)
|
1581
1591
|
ADD_PROPERTY(bool, zero)
|
1582
|
-
std::vector<std::string> numerator_units_;
|
1583
|
-
std::vector<std::string> denominator_units_;
|
1584
1592
|
size_t hash_;
|
1585
1593
|
public:
|
1586
1594
|
Number(ParserState pstate, double val, std::string u = "", bool zero = true);
|
1587
1595
|
|
1588
1596
|
Number(const Number* ptr)
|
1589
1597
|
: Value(ptr),
|
1598
|
+
Units(ptr),
|
1590
1599
|
value_(ptr->value_), zero_(ptr->zero_),
|
1591
|
-
numerator_units_(ptr->numerator_units_),
|
1592
|
-
denominator_units_(ptr->denominator_units_),
|
1593
1600
|
hash_(ptr->hash_)
|
1594
1601
|
{ concrete_type(NUMBER); }
|
1595
1602
|
|
1596
1603
|
bool zero() { return zero_; }
|
1597
|
-
|
1598
|
-
std::vector<std::string>& numerator_units() { return numerator_units_; }
|
1599
|
-
std::vector<std::string>& denominator_units() { return denominator_units_; }
|
1600
|
-
const std::vector<std::string>& numerator_units() const { return numerator_units_; }
|
1601
|
-
const std::vector<std::string>& denominator_units() const { return denominator_units_; }
|
1602
|
-
std::string type() { return "number"; }
|
1604
|
+
std::string type() const { return "number"; }
|
1603
1605
|
static std::string type_name() { return "number"; }
|
1604
|
-
std::string unit() const;
|
1605
1606
|
|
1606
|
-
|
1607
|
-
|
1608
|
-
bool convert(const std::string& unit = "", bool strict = false);
|
1609
|
-
void normalize(const std::string& unit = "", bool strict = false);
|
1610
|
-
// useful for making one number compatible with another
|
1611
|
-
std::string find_convertible_unit() const;
|
1607
|
+
void reduce();
|
1608
|
+
void normalize();
|
1612
1609
|
|
1613
1610
|
virtual size_t hash()
|
1614
1611
|
{
|
1615
1612
|
if (hash_ == 0) {
|
1616
1613
|
hash_ = std::hash<double>()(value_);
|
1617
|
-
for (const auto numerator :
|
1614
|
+
for (const auto numerator : numerators)
|
1618
1615
|
hash_combine(hash_, std::hash<std::string>()(numerator));
|
1619
|
-
for (const auto denominator :
|
1616
|
+
for (const auto denominator : denominators)
|
1620
1617
|
hash_combine(hash_, std::hash<std::string>()(denominator));
|
1621
1618
|
}
|
1622
1619
|
return hash_;
|
1623
1620
|
}
|
1624
1621
|
|
1625
1622
|
virtual bool operator< (const Number& rhs) const;
|
1623
|
+
virtual bool operator== (const Number& rhs) const;
|
1626
1624
|
virtual bool operator== (const Expression& rhs) const;
|
1627
|
-
virtual bool eq(const Expression& rhs) const;
|
1628
1625
|
ATTACH_AST_OPERATIONS(Number)
|
1629
1626
|
ATTACH_OPERATIONS()
|
1630
1627
|
};
|
@@ -1633,11 +1630,11 @@ namespace Sass {
|
|
1633
1630
|
// Colors.
|
1634
1631
|
//////////
|
1635
1632
|
class Color : public Value {
|
1636
|
-
|
1637
|
-
|
1638
|
-
|
1639
|
-
|
1640
|
-
|
1633
|
+
HASH_PROPERTY(double, r)
|
1634
|
+
HASH_PROPERTY(double, g)
|
1635
|
+
HASH_PROPERTY(double, b)
|
1636
|
+
HASH_PROPERTY(double, a)
|
1637
|
+
ADD_CONSTREF(std::string, disp)
|
1641
1638
|
size_t hash_;
|
1642
1639
|
public:
|
1643
1640
|
Color(ParserState pstate, double r, double g, double b, double a = 1, const std::string disp = "")
|
@@ -1653,7 +1650,7 @@ namespace Sass {
|
|
1653
1650
|
disp_(ptr->disp_),
|
1654
1651
|
hash_(ptr->hash_)
|
1655
1652
|
{ concrete_type(COLOR); }
|
1656
|
-
std::string type() { return "color"; }
|
1653
|
+
std::string type() const { return "color"; }
|
1657
1654
|
static std::string type_name() { return "color"; }
|
1658
1655
|
|
1659
1656
|
virtual size_t hash()
|
@@ -1677,7 +1674,7 @@ namespace Sass {
|
|
1677
1674
|
// Errors from Sass_Values.
|
1678
1675
|
//////////////////////////////
|
1679
1676
|
class Custom_Error : public Value {
|
1680
|
-
|
1677
|
+
ADD_CONSTREF(std::string, message)
|
1681
1678
|
public:
|
1682
1679
|
Custom_Error(ParserState pstate, std::string msg)
|
1683
1680
|
: Value(pstate), message_(msg)
|
@@ -1694,7 +1691,7 @@ namespace Sass {
|
|
1694
1691
|
// Warnings from Sass_Values.
|
1695
1692
|
//////////////////////////////
|
1696
1693
|
class Custom_Warning : public Value {
|
1697
|
-
|
1694
|
+
ADD_CONSTREF(std::string, message)
|
1698
1695
|
public:
|
1699
1696
|
Custom_Warning(ParserState pstate, std::string msg)
|
1700
1697
|
: Value(pstate), message_(msg)
|
@@ -1711,7 +1708,7 @@ namespace Sass {
|
|
1711
1708
|
// Booleans.
|
1712
1709
|
////////////
|
1713
1710
|
class Boolean : public Value {
|
1714
|
-
|
1711
|
+
HASH_PROPERTY(bool, value)
|
1715
1712
|
size_t hash_;
|
1716
1713
|
public:
|
1717
1714
|
Boolean(ParserState pstate, bool val)
|
@@ -1724,7 +1721,7 @@ namespace Sass {
|
|
1724
1721
|
hash_(ptr->hash_)
|
1725
1722
|
{ concrete_type(BOOLEAN); }
|
1726
1723
|
virtual operator bool() { return value_; }
|
1727
|
-
std::string type() { return "bool"; }
|
1724
|
+
std::string type() const { return "bool"; }
|
1728
1725
|
static std::string type_name() { return "bool"; }
|
1729
1726
|
virtual bool is_false() { return !value_; }
|
1730
1727
|
|
@@ -1757,8 +1754,6 @@ namespace Sass {
|
|
1757
1754
|
static std::string type_name() { return "string"; }
|
1758
1755
|
virtual ~String() = 0;
|
1759
1756
|
virtual void rtrim() = 0;
|
1760
|
-
virtual void ltrim() = 0;
|
1761
|
-
virtual void trim() = 0;
|
1762
1757
|
virtual bool operator==(const Expression& rhs) const = 0;
|
1763
1758
|
virtual bool operator<(const Expression& rhs) const {
|
1764
1759
|
return this->to_string() < rhs.to_string();
|
@@ -1773,19 +1768,20 @@ namespace Sass {
|
|
1773
1768
|
// evaluation phase.
|
1774
1769
|
///////////////////////////////////////////////////////////////////////
|
1775
1770
|
class String_Schema : public String, public Vectorized<Expression_Obj> {
|
1776
|
-
|
1771
|
+
ADD_PROPERTY(bool, css)
|
1777
1772
|
size_t hash_;
|
1778
1773
|
public:
|
1779
|
-
String_Schema(ParserState pstate, size_t size = 0, bool
|
1780
|
-
: String(pstate), Vectorized<Expression_Obj>(size), hash_(0)
|
1774
|
+
String_Schema(ParserState pstate, size_t size = 0, bool css = true)
|
1775
|
+
: String(pstate), Vectorized<Expression_Obj>(size), css_(css), hash_(0)
|
1781
1776
|
{ concrete_type(STRING); }
|
1782
1777
|
String_Schema(const String_Schema* ptr)
|
1783
1778
|
: String(ptr),
|
1784
1779
|
Vectorized<Expression_Obj>(*ptr),
|
1780
|
+
css_(ptr->css_),
|
1785
1781
|
hash_(ptr->hash_)
|
1786
1782
|
{ concrete_type(STRING); }
|
1787
1783
|
|
1788
|
-
std::string type() { return "string"; }
|
1784
|
+
std::string type() const { return "string"; }
|
1789
1785
|
static std::string type_name() { return "string"; }
|
1790
1786
|
|
1791
1787
|
bool is_left_interpolant(void) const;
|
@@ -1798,8 +1794,6 @@ namespace Sass {
|
|
1798
1794
|
return false;
|
1799
1795
|
}
|
1800
1796
|
virtual void rtrim();
|
1801
|
-
virtual void ltrim();
|
1802
|
-
virtual void trim();
|
1803
1797
|
|
1804
1798
|
virtual size_t hash()
|
1805
1799
|
{
|
@@ -1825,7 +1819,7 @@ namespace Sass {
|
|
1825
1819
|
class String_Constant : public String {
|
1826
1820
|
ADD_PROPERTY(char, quote_mark)
|
1827
1821
|
ADD_PROPERTY(bool, can_compress_whitespace)
|
1828
|
-
|
1822
|
+
HASH_CONSTREF(std::string, value)
|
1829
1823
|
protected:
|
1830
1824
|
size_t hash_;
|
1831
1825
|
public:
|
@@ -1836,24 +1830,22 @@ namespace Sass {
|
|
1836
1830
|
value_(ptr->value_),
|
1837
1831
|
hash_(ptr->hash_)
|
1838
1832
|
{ }
|
1839
|
-
String_Constant(ParserState pstate, std::string val)
|
1840
|
-
: String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(val)), hash_(0)
|
1833
|
+
String_Constant(ParserState pstate, std::string val, bool css = true)
|
1834
|
+
: String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(val, css)), hash_(0)
|
1841
1835
|
{ }
|
1842
|
-
String_Constant(ParserState pstate, const char* beg)
|
1843
|
-
: String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(std::string(beg))), hash_(0)
|
1836
|
+
String_Constant(ParserState pstate, const char* beg, bool css = true)
|
1837
|
+
: String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(std::string(beg), css)), hash_(0)
|
1844
1838
|
{ }
|
1845
|
-
String_Constant(ParserState pstate, const char* beg, const char* end)
|
1846
|
-
: String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(std::string(beg, end-beg))), hash_(0)
|
1839
|
+
String_Constant(ParserState pstate, const char* beg, const char* end, bool css = true)
|
1840
|
+
: String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(std::string(beg, end-beg), css)), hash_(0)
|
1847
1841
|
{ }
|
1848
|
-
String_Constant(ParserState pstate, const Token& tok)
|
1849
|
-
: String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(std::string(tok.begin, tok.end))), hash_(0)
|
1842
|
+
String_Constant(ParserState pstate, const Token& tok, bool css = true)
|
1843
|
+
: String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(std::string(tok.begin, tok.end), css)), hash_(0)
|
1850
1844
|
{ }
|
1851
|
-
std::string type() { return "string"; }
|
1845
|
+
std::string type() const { return "string"; }
|
1852
1846
|
static std::string type_name() { return "string"; }
|
1853
1847
|
virtual bool is_invisible() const;
|
1854
1848
|
virtual void rtrim();
|
1855
|
-
virtual void ltrim();
|
1856
|
-
virtual void trim();
|
1857
1849
|
|
1858
1850
|
virtual size_t hash()
|
1859
1851
|
{
|
@@ -1881,8 +1873,8 @@ namespace Sass {
|
|
1881
1873
|
public:
|
1882
1874
|
String_Quoted(ParserState pstate, std::string val, char q = 0,
|
1883
1875
|
bool keep_utf8_escapes = false, bool skip_unquoting = false,
|
1884
|
-
bool strict_unquoting = true)
|
1885
|
-
: String_Constant(pstate, val)
|
1876
|
+
bool strict_unquoting = true, bool css = true)
|
1877
|
+
: String_Constant(pstate, val, css)
|
1886
1878
|
{
|
1887
1879
|
if (skip_unquoting == false) {
|
1888
1880
|
value_ = unquote(value_, "e_mark_, keep_utf8_escapes, strict_unquoting);
|
@@ -2103,7 +2095,7 @@ namespace Sass {
|
|
2103
2095
|
|
2104
2096
|
if (s->statement_type() == Statement::DIRECTIVE)
|
2105
2097
|
{
|
2106
|
-
if (Directive_Obj dir =
|
2098
|
+
if (Directive_Obj dir = Cast<Directive>(s))
|
2107
2099
|
{
|
2108
2100
|
std::string keyword(dir->keyword());
|
2109
2101
|
if (keyword.length() > 0) keyword.erase(0, 1);
|
@@ -2122,7 +2114,7 @@ namespace Sass {
|
|
2122
2114
|
{
|
2123
2115
|
return expression()->exclude("supports");
|
2124
2116
|
}
|
2125
|
-
if (Directive_Obj dir =
|
2117
|
+
if (Directive_Obj dir = Cast<Directive>(s))
|
2126
2118
|
{
|
2127
2119
|
if (dir->is_keyframes()) return expression()->exclude("keyframes");
|
2128
2120
|
}
|
@@ -2139,7 +2131,7 @@ namespace Sass {
|
|
2139
2131
|
public:
|
2140
2132
|
Null(ParserState pstate) : Value(pstate) { concrete_type(NULL_VAL); }
|
2141
2133
|
Null(const Null* ptr) : Value(ptr) { concrete_type(NULL_VAL); }
|
2142
|
-
std::string type() { return "null"; }
|
2134
|
+
std::string type() const { return "null"; }
|
2143
2135
|
static std::string type_name() { return "null"; }
|
2144
2136
|
bool is_invisible() const { return true; }
|
2145
2137
|
operator bool() { return false; }
|
@@ -2172,7 +2164,7 @@ namespace Sass {
|
|
2172
2164
|
// Individual parameter objects for mixins and functions.
|
2173
2165
|
/////////////////////////////////////////////////////////
|
2174
2166
|
class Parameter : public AST_Node {
|
2175
|
-
|
2167
|
+
ADD_CONSTREF(std::string, name)
|
2176
2168
|
ADD_PROPERTY(Expression_Obj, default_value)
|
2177
2169
|
ADD_PROPERTY(bool, is_rest_parameter)
|
2178
2170
|
public:
|
@@ -2180,9 +2172,11 @@ namespace Sass {
|
|
2180
2172
|
std::string n, Expression_Obj def = 0, bool rest = false)
|
2181
2173
|
: AST_Node(pstate), name_(n), default_value_(def), is_rest_parameter_(rest)
|
2182
2174
|
{
|
2183
|
-
|
2184
|
-
|
2185
|
-
|
2175
|
+
// tried to come up with a spec test for this, but it does no longer
|
2176
|
+
// get past the parser (it error out earlier). A spec test was added!
|
2177
|
+
// if (default_value_ && is_rest_parameter_) {
|
2178
|
+
// error("variable-length parameter may not have a default value", pstate_);
|
2179
|
+
// }
|
2186
2180
|
}
|
2187
2181
|
Parameter(const Parameter* ptr)
|
2188
2182
|
: AST_Node(ptr),
|
@@ -2190,9 +2184,11 @@ namespace Sass {
|
|
2190
2184
|
default_value_(ptr->default_value_),
|
2191
2185
|
is_rest_parameter_(ptr->is_rest_parameter_)
|
2192
2186
|
{
|
2193
|
-
|
2194
|
-
|
2195
|
-
|
2187
|
+
// tried to come up with a spec test for this, but it does no longer
|
2188
|
+
// get past the parser (it error out earlier). A spec test was added!
|
2189
|
+
// if (default_value_ && is_rest_parameter_) {
|
2190
|
+
// error("variable-length parameter may not have a default value", pstate_);
|
2191
|
+
// }
|
2196
2192
|
}
|
2197
2193
|
ATTACH_AST_OPERATIONS(Parameter)
|
2198
2194
|
ATTACH_OPERATIONS()
|
@@ -2210,23 +2206,23 @@ namespace Sass {
|
|
2210
2206
|
void adjust_after_pushing(Parameter_Obj p)
|
2211
2207
|
{
|
2212
2208
|
if (p->default_value()) {
|
2213
|
-
if (
|
2214
|
-
|
2209
|
+
if (has_rest_parameter()) {
|
2210
|
+
coreError("optional parameters may not be combined with variable-length parameters", p->pstate());
|
2215
2211
|
}
|
2216
|
-
|
2212
|
+
has_optional_parameters(true);
|
2217
2213
|
}
|
2218
2214
|
else if (p->is_rest_parameter()) {
|
2219
|
-
if (
|
2220
|
-
|
2215
|
+
if (has_rest_parameter()) {
|
2216
|
+
coreError("functions and mixins cannot have more than one variable-length parameter", p->pstate());
|
2221
2217
|
}
|
2222
|
-
|
2218
|
+
has_rest_parameter(true);
|
2223
2219
|
}
|
2224
2220
|
else {
|
2225
|
-
if (
|
2226
|
-
|
2221
|
+
if (has_rest_parameter()) {
|
2222
|
+
coreError("required parameters must precede variable-length parameters", p->pstate());
|
2227
2223
|
}
|
2228
|
-
if (
|
2229
|
-
|
2224
|
+
if (has_optional_parameters()) {
|
2225
|
+
coreError("required parameters must precede optional parameters", p->pstate());
|
2230
2226
|
}
|
2231
2227
|
}
|
2232
2228
|
}
|
@@ -2266,9 +2262,8 @@ namespace Sass {
|
|
2266
2262
|
protected:
|
2267
2263
|
size_t hash_;
|
2268
2264
|
public:
|
2269
|
-
Selector(ParserState pstate
|
2265
|
+
Selector(ParserState pstate)
|
2270
2266
|
: Expression(pstate),
|
2271
|
-
// has_reference_(r),
|
2272
2267
|
has_line_feed_(false),
|
2273
2268
|
has_line_break_(false),
|
2274
2269
|
is_optional_(false),
|
@@ -2286,21 +2281,19 @@ namespace Sass {
|
|
2286
2281
|
{ concrete_type(SELECTOR); }
|
2287
2282
|
virtual ~Selector() = 0;
|
2288
2283
|
virtual size_t hash() = 0;
|
2289
|
-
virtual unsigned long specificity()
|
2290
|
-
return 0;
|
2291
|
-
}
|
2284
|
+
virtual unsigned long specificity() const = 0;
|
2292
2285
|
virtual void set_media_block(Media_Block_Ptr mb) {
|
2293
2286
|
media_block(mb);
|
2294
2287
|
}
|
2295
|
-
virtual bool has_parent_ref() {
|
2288
|
+
virtual bool has_parent_ref() const {
|
2296
2289
|
return false;
|
2297
2290
|
}
|
2298
|
-
virtual bool has_real_parent_ref() {
|
2291
|
+
virtual bool has_real_parent_ref() const {
|
2299
2292
|
return false;
|
2300
2293
|
}
|
2301
2294
|
// dispatch to correct handlers
|
2302
|
-
virtual bool operator<(const Selector& rhs) const;
|
2303
|
-
virtual bool operator==(const Selector& rhs) const;
|
2295
|
+
virtual bool operator<(const Selector& rhs) const = 0;
|
2296
|
+
virtual bool operator==(const Selector& rhs) const = 0;
|
2304
2297
|
ATTACH_VIRTUAL_AST_OPERATIONS(Selector);
|
2305
2298
|
};
|
2306
2299
|
inline Selector::~Selector() { }
|
@@ -2309,20 +2302,36 @@ namespace Sass {
|
|
2309
2302
|
// Interpolated selectors -- the interpolated String will be expanded and
|
2310
2303
|
// re-parsed into a normal selector class.
|
2311
2304
|
/////////////////////////////////////////////////////////////////////////
|
2312
|
-
class Selector_Schema : public
|
2305
|
+
class Selector_Schema : public AST_Node {
|
2313
2306
|
ADD_PROPERTY(String_Obj, contents)
|
2314
|
-
ADD_PROPERTY(bool,
|
2307
|
+
ADD_PROPERTY(bool, connect_parent);
|
2308
|
+
// must not be a reference counted object
|
2309
|
+
// otherwise we create circular references
|
2310
|
+
ADD_PROPERTY(Media_Block_Ptr, media_block)
|
2311
|
+
// store computed hash
|
2312
|
+
size_t hash_;
|
2315
2313
|
public:
|
2316
2314
|
Selector_Schema(ParserState pstate, String_Obj c)
|
2317
|
-
:
|
2315
|
+
: AST_Node(pstate),
|
2316
|
+
contents_(c),
|
2317
|
+
connect_parent_(true),
|
2318
|
+
media_block_(NULL),
|
2319
|
+
hash_(0)
|
2318
2320
|
{ }
|
2319
2321
|
Selector_Schema(const Selector_Schema* ptr)
|
2320
|
-
:
|
2322
|
+
: AST_Node(ptr),
|
2321
2323
|
contents_(ptr->contents_),
|
2322
|
-
|
2324
|
+
connect_parent_(ptr->connect_parent_),
|
2325
|
+
media_block_(ptr->media_block_),
|
2326
|
+
hash_(ptr->hash_)
|
2323
2327
|
{ }
|
2324
|
-
virtual bool has_parent_ref();
|
2325
|
-
virtual bool has_real_parent_ref();
|
2328
|
+
virtual bool has_parent_ref() const;
|
2329
|
+
virtual bool has_real_parent_ref() const;
|
2330
|
+
virtual bool operator<(const Selector& rhs) const;
|
2331
|
+
virtual bool operator==(const Selector& rhs) const;
|
2332
|
+
// selector schema is not yet a final selector, so we do not
|
2333
|
+
// have a specificity for it yet. We need to
|
2334
|
+
virtual unsigned long specificity() const { return 0; }
|
2326
2335
|
virtual size_t hash() {
|
2327
2336
|
if (hash_ == 0) {
|
2328
2337
|
hash_combine(hash_, contents_->hash());
|
@@ -2337,8 +2346,8 @@ namespace Sass {
|
|
2337
2346
|
// Abstract base class for simple selectors.
|
2338
2347
|
////////////////////////////////////////////
|
2339
2348
|
class Simple_Selector : public Selector {
|
2340
|
-
|
2341
|
-
|
2349
|
+
ADD_CONSTREF(std::string, ns)
|
2350
|
+
ADD_CONSTREF(std::string, name)
|
2342
2351
|
ADD_PROPERTY(Simple_Type, simple_type)
|
2343
2352
|
ADD_PROPERTY(bool, has_ns)
|
2344
2353
|
public:
|
@@ -2360,10 +2369,6 @@ namespace Sass {
|
|
2360
2369
|
name_(ptr->name_),
|
2361
2370
|
has_ns_(ptr->has_ns_)
|
2362
2371
|
{ simple_type(SIMPLE); }
|
2363
|
-
virtual bool unique() const
|
2364
|
-
{
|
2365
|
-
return false;
|
2366
|
-
}
|
2367
2372
|
virtual std::string ns_name() const
|
2368
2373
|
{
|
2369
2374
|
std::string name("");
|
@@ -2380,6 +2385,8 @@ namespace Sass {
|
|
2380
2385
|
}
|
2381
2386
|
return hash_;
|
2382
2387
|
}
|
2388
|
+
// namespace compare functions
|
2389
|
+
bool is_ns_eq(const Simple_Selector& r) const;
|
2383
2390
|
// namespace query functions
|
2384
2391
|
bool is_universal_ns() const
|
2385
2392
|
{
|
@@ -2412,11 +2419,10 @@ namespace Sass {
|
|
2412
2419
|
}
|
2413
2420
|
|
2414
2421
|
virtual ~Simple_Selector() = 0;
|
2415
|
-
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr
|
2416
|
-
virtual bool has_parent_ref() { return false; };
|
2417
|
-
virtual bool has_real_parent_ref() { return false; };
|
2418
|
-
virtual bool is_pseudo_element() { return false; }
|
2419
|
-
virtual bool is_pseudo_class() { return false; }
|
2422
|
+
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr);
|
2423
|
+
virtual bool has_parent_ref() const { return false; };
|
2424
|
+
virtual bool has_real_parent_ref() const { return false; };
|
2425
|
+
virtual bool is_pseudo_element() const { return false; }
|
2420
2426
|
|
2421
2427
|
virtual bool is_superselector_of(Compound_Selector_Obj sub) { return false; }
|
2422
2428
|
|
@@ -2448,14 +2454,14 @@ namespace Sass {
|
|
2448
2454
|
Parent_Selector(const Parent_Selector* ptr)
|
2449
2455
|
: Simple_Selector(ptr), real_(ptr->real_)
|
2450
2456
|
{ /* has_reference(true); */ }
|
2451
|
-
bool is_real_parent_ref() { return real(); };
|
2452
|
-
virtual bool has_parent_ref() { return true; };
|
2453
|
-
virtual bool has_real_parent_ref() { return is_real_parent_ref(); };
|
2454
|
-
virtual unsigned long specificity()
|
2457
|
+
bool is_real_parent_ref() const { return real(); };
|
2458
|
+
virtual bool has_parent_ref() const { return true; };
|
2459
|
+
virtual bool has_real_parent_ref() const { return is_real_parent_ref(); };
|
2460
|
+
virtual unsigned long specificity() const
|
2455
2461
|
{
|
2456
2462
|
return 0;
|
2457
2463
|
}
|
2458
|
-
std::string type() { return "selector"; }
|
2464
|
+
std::string type() const { return "selector"; }
|
2459
2465
|
static std::string type_name() { return "selector"; }
|
2460
2466
|
ATTACH_AST_OPERATIONS(Parent_Selector)
|
2461
2467
|
ATTACH_OPERATIONS()
|
@@ -2472,7 +2478,7 @@ namespace Sass {
|
|
2472
2478
|
Placeholder_Selector(const Placeholder_Selector* ptr)
|
2473
2479
|
: Simple_Selector(ptr)
|
2474
2480
|
{ }
|
2475
|
-
virtual unsigned long specificity()
|
2481
|
+
virtual unsigned long specificity() const
|
2476
2482
|
{
|
2477
2483
|
return Constants::Specificity_Base;
|
2478
2484
|
}
|
@@ -2495,13 +2501,17 @@ namespace Sass {
|
|
2495
2501
|
Element_Selector(const Element_Selector* ptr)
|
2496
2502
|
: Simple_Selector(ptr)
|
2497
2503
|
{ }
|
2498
|
-
virtual unsigned long specificity()
|
2504
|
+
virtual unsigned long specificity() const
|
2499
2505
|
{
|
2500
2506
|
if (name() == "*") return 0;
|
2501
2507
|
else return Constants::Specificity_Element;
|
2502
2508
|
}
|
2503
|
-
virtual Simple_Selector_Ptr unify_with(Simple_Selector_Ptr
|
2504
|
-
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr
|
2509
|
+
virtual Simple_Selector_Ptr unify_with(Simple_Selector_Ptr);
|
2510
|
+
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr);
|
2511
|
+
virtual bool operator==(const Simple_Selector& rhs) const;
|
2512
|
+
virtual bool operator==(const Element_Selector& rhs) const;
|
2513
|
+
virtual bool operator<(const Simple_Selector& rhs) const;
|
2514
|
+
virtual bool operator<(const Element_Selector& rhs) const;
|
2505
2515
|
ATTACH_AST_OPERATIONS(Element_Selector)
|
2506
2516
|
ATTACH_OPERATIONS()
|
2507
2517
|
};
|
@@ -2517,15 +2527,11 @@ namespace Sass {
|
|
2517
2527
|
Class_Selector(const Class_Selector* ptr)
|
2518
2528
|
: Simple_Selector(ptr)
|
2519
2529
|
{ }
|
2520
|
-
virtual
|
2521
|
-
{
|
2522
|
-
return false;
|
2523
|
-
}
|
2524
|
-
virtual unsigned long specificity()
|
2530
|
+
virtual unsigned long specificity() const
|
2525
2531
|
{
|
2526
2532
|
return Constants::Specificity_Class;
|
2527
2533
|
}
|
2528
|
-
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr
|
2534
|
+
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr);
|
2529
2535
|
ATTACH_AST_OPERATIONS(Class_Selector)
|
2530
2536
|
ATTACH_OPERATIONS()
|
2531
2537
|
};
|
@@ -2541,15 +2547,11 @@ namespace Sass {
|
|
2541
2547
|
Id_Selector(const Id_Selector* ptr)
|
2542
2548
|
: Simple_Selector(ptr)
|
2543
2549
|
{ }
|
2544
|
-
virtual
|
2545
|
-
{
|
2546
|
-
return true;
|
2547
|
-
}
|
2548
|
-
virtual unsigned long specificity()
|
2550
|
+
virtual unsigned long specificity() const
|
2549
2551
|
{
|
2550
2552
|
return Constants::Specificity_ID;
|
2551
2553
|
}
|
2552
|
-
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr
|
2554
|
+
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr);
|
2553
2555
|
ATTACH_AST_OPERATIONS(Id_Selector)
|
2554
2556
|
ATTACH_OPERATIONS()
|
2555
2557
|
};
|
@@ -2558,17 +2560,19 @@ namespace Sass {
|
|
2558
2560
|
// Attribute selectors -- e.g., [src*=".jpg"], etc.
|
2559
2561
|
///////////////////////////////////////////////////
|
2560
2562
|
class Attribute_Selector : public Simple_Selector {
|
2561
|
-
|
2563
|
+
ADD_CONSTREF(std::string, matcher)
|
2562
2564
|
// this cannot be changed to obj atm!!!!!!????!!!!!!!
|
2563
2565
|
ADD_PROPERTY(String_Obj, value) // might be interpolated
|
2566
|
+
ADD_PROPERTY(char, modifier);
|
2564
2567
|
public:
|
2565
|
-
Attribute_Selector(ParserState pstate, std::string n, std::string m, String_Obj v)
|
2566
|
-
: Simple_Selector(pstate, n), matcher_(m), value_(v)
|
2568
|
+
Attribute_Selector(ParserState pstate, std::string n, std::string m, String_Obj v, char o = 0)
|
2569
|
+
: Simple_Selector(pstate, n), matcher_(m), value_(v), modifier_(o)
|
2567
2570
|
{ simple_type(ATTR_SEL); }
|
2568
2571
|
Attribute_Selector(const Attribute_Selector* ptr)
|
2569
2572
|
: Simple_Selector(ptr),
|
2570
2573
|
matcher_(ptr->matcher_),
|
2571
|
-
value_(ptr->value_)
|
2574
|
+
value_(ptr->value_),
|
2575
|
+
modifier_(ptr->modifier_)
|
2572
2576
|
{ simple_type(ATTR_SEL); }
|
2573
2577
|
virtual size_t hash()
|
2574
2578
|
{
|
@@ -2579,7 +2583,7 @@ namespace Sass {
|
|
2579
2583
|
}
|
2580
2584
|
return hash_;
|
2581
2585
|
}
|
2582
|
-
virtual unsigned long specificity()
|
2586
|
+
virtual unsigned long specificity() const
|
2583
2587
|
{
|
2584
2588
|
return Constants::Specificity_Attr;
|
2585
2589
|
}
|
@@ -2617,14 +2621,6 @@ namespace Sass {
|
|
2617
2621
|
: Simple_Selector(ptr), expression_(ptr->expression_)
|
2618
2622
|
{ simple_type(PSEUDO_SEL); }
|
2619
2623
|
|
2620
|
-
// A pseudo-class always consists of a "colon" (:) followed by the name
|
2621
|
-
// of the pseudo-class and optionally by a value between parentheses.
|
2622
|
-
virtual bool is_pseudo_class()
|
2623
|
-
{
|
2624
|
-
return (name_[0] == ':' && name_[1] != ':')
|
2625
|
-
&& ! is_pseudo_class_element(name_);
|
2626
|
-
}
|
2627
|
-
|
2628
2624
|
// A pseudo-element is made of two colons (::) followed by the name.
|
2629
2625
|
// The `::` notation is introduced by the current document in order to
|
2630
2626
|
// establish a discrimination between pseudo-classes and pseudo-elements.
|
@@ -2633,7 +2629,7 @@ namespace Sass {
|
|
2633
2629
|
// in CSS levels 1 and 2 (namely, :first-line, :first-letter, :before and
|
2634
2630
|
// :after). This compatibility is not allowed for the new pseudo-elements
|
2635
2631
|
// introduced in this specification.
|
2636
|
-
virtual bool is_pseudo_element()
|
2632
|
+
virtual bool is_pseudo_element() const
|
2637
2633
|
{
|
2638
2634
|
return (name_[0] == ':' && name_[1] == ':')
|
2639
2635
|
|| is_pseudo_class_element(name_);
|
@@ -2646,7 +2642,7 @@ namespace Sass {
|
|
2646
2642
|
}
|
2647
2643
|
return hash_;
|
2648
2644
|
}
|
2649
|
-
virtual unsigned long specificity()
|
2645
|
+
virtual unsigned long specificity() const
|
2650
2646
|
{
|
2651
2647
|
if (is_pseudo_element())
|
2652
2648
|
return Constants::Specificity_Element;
|
@@ -2656,7 +2652,7 @@ namespace Sass {
|
|
2656
2652
|
virtual bool operator==(const Pseudo_Selector& rhs) const;
|
2657
2653
|
virtual bool operator<(const Simple_Selector& rhs) const;
|
2658
2654
|
virtual bool operator<(const Pseudo_Selector& rhs) const;
|
2659
|
-
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr
|
2655
|
+
virtual Compound_Selector_Ptr unify_with(Compound_Selector_Ptr);
|
2660
2656
|
ATTACH_AST_OPERATIONS(Pseudo_Selector)
|
2661
2657
|
ATTACH_OPERATIONS()
|
2662
2658
|
};
|
@@ -2665,9 +2661,9 @@ namespace Sass {
|
|
2665
2661
|
// 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)
|
2666
2662
|
/////////////////////////////////////////////////
|
2667
2663
|
class Wrapped_Selector : public Simple_Selector {
|
2668
|
-
ADD_PROPERTY(
|
2664
|
+
ADD_PROPERTY(Selector_List_Obj, selector)
|
2669
2665
|
public:
|
2670
|
-
Wrapped_Selector(ParserState pstate, std::string n,
|
2666
|
+
Wrapped_Selector(ParserState pstate, std::string n, Selector_List_Obj sel)
|
2671
2667
|
: Simple_Selector(pstate, n), selector_(sel)
|
2672
2668
|
{ simple_type(WRAPPED_SEL); }
|
2673
2669
|
Wrapped_Selector(const Wrapped_Selector* ptr)
|
@@ -2676,28 +2672,11 @@ namespace Sass {
|
|
2676
2672
|
virtual bool is_superselector_of(Wrapped_Selector_Obj sub);
|
2677
2673
|
// Selectors inside the negation pseudo-class are counted like any
|
2678
2674
|
// other, but the negation itself does not count as a pseudo-class.
|
2679
|
-
virtual size_t hash()
|
2680
|
-
|
2681
|
-
|
2682
|
-
|
2683
|
-
|
2684
|
-
}
|
2685
|
-
return hash_;
|
2686
|
-
}
|
2687
|
-
virtual bool has_parent_ref() {
|
2688
|
-
// if (has_reference()) return true;
|
2689
|
-
if (!selector()) return false;
|
2690
|
-
return selector()->has_parent_ref();
|
2691
|
-
}
|
2692
|
-
virtual bool has_real_parent_ref() {
|
2693
|
-
// if (has_reference()) return true;
|
2694
|
-
if (!selector()) return false;
|
2695
|
-
return selector()->has_real_parent_ref();
|
2696
|
-
}
|
2697
|
-
virtual unsigned long specificity()
|
2698
|
-
{
|
2699
|
-
return selector_ ? selector_->specificity() : 0;
|
2700
|
-
}
|
2675
|
+
virtual size_t hash();
|
2676
|
+
virtual bool has_parent_ref() const;
|
2677
|
+
virtual bool has_real_parent_ref() const;
|
2678
|
+
virtual unsigned long specificity() const;
|
2679
|
+
virtual bool find ( bool (*f)(AST_Node_Obj) );
|
2701
2680
|
virtual bool operator==(const Simple_Selector& rhs) const;
|
2702
2681
|
virtual bool operator==(const Wrapped_Selector& rhs) const;
|
2703
2682
|
virtual bool operator<(const Simple_Selector& rhs) const;
|
@@ -2707,18 +2686,13 @@ namespace Sass {
|
|
2707
2686
|
ATTACH_OPERATIONS()
|
2708
2687
|
};
|
2709
2688
|
|
2710
|
-
struct Complex_Selector_Pointer_Compare {
|
2711
|
-
bool operator() (const Complex_Selector_Obj& pLeft, const Complex_Selector_Obj& pRight) const;
|
2712
|
-
};
|
2713
|
-
|
2714
2689
|
////////////////////////////////////////////////////////////////////////////
|
2715
2690
|
// Simple selector sequences. Maintains flags indicating whether it contains
|
2716
2691
|
// any parent references or placeholders, to simplify expansion.
|
2717
2692
|
////////////////////////////////////////////////////////////////////////////
|
2718
|
-
typedef std::set<Complex_Selector_Obj, Complex_Selector_Pointer_Compare> SourcesSet;
|
2719
2693
|
class Compound_Selector : public Selector, public Vectorized<Simple_Selector_Obj> {
|
2720
2694
|
private:
|
2721
|
-
|
2695
|
+
ComplexSelectorSet sources_;
|
2722
2696
|
ADD_PROPERTY(bool, extended);
|
2723
2697
|
ADD_PROPERTY(bool, has_parent_reference);
|
2724
2698
|
protected:
|
@@ -2755,20 +2729,15 @@ namespace Sass {
|
|
2755
2729
|
}
|
2756
2730
|
|
2757
2731
|
Complex_Selector_Obj to_complex();
|
2758
|
-
Compound_Selector_Ptr unify_with(Compound_Selector_Ptr rhs
|
2732
|
+
Compound_Selector_Ptr unify_with(Compound_Selector_Ptr rhs);
|
2759
2733
|
// virtual Placeholder_Selector_Ptr find_placeholder();
|
2760
|
-
virtual bool has_parent_ref();
|
2761
|
-
virtual bool has_real_parent_ref();
|
2762
|
-
Simple_Selector_Ptr base()
|
2763
|
-
{
|
2764
|
-
// Implement non-const in terms of const. Safe to const_cast since this method is non-const
|
2765
|
-
return const_cast<Simple_Selector_Ptr>(static_cast<Compound_Selector_Ptr_Const>(this)->base());
|
2766
|
-
}
|
2767
|
-
Simple_Selector_Ptr_Const base() const {
|
2734
|
+
virtual bool has_parent_ref() const;
|
2735
|
+
virtual bool has_real_parent_ref() const;
|
2736
|
+
Simple_Selector_Ptr base() const {
|
2768
2737
|
if (length() == 0) return 0;
|
2769
2738
|
// ToDo: why is this needed?
|
2770
|
-
if (
|
2771
|
-
return
|
2739
|
+
if (Cast<Element_Selector>((*this)[0]))
|
2740
|
+
return (*this)[0];
|
2772
2741
|
return 0;
|
2773
2742
|
}
|
2774
2743
|
virtual bool is_superselector_of(Compound_Selector_Obj sub, std::string wrapped = "");
|
@@ -2782,7 +2751,7 @@ namespace Sass {
|
|
2782
2751
|
}
|
2783
2752
|
return Selector::hash_;
|
2784
2753
|
}
|
2785
|
-
virtual unsigned long specificity()
|
2754
|
+
virtual unsigned long specificity() const
|
2786
2755
|
{
|
2787
2756
|
int sum = 0;
|
2788
2757
|
for (size_t i = 0, L = length(); i < L; ++i)
|
@@ -2802,19 +2771,21 @@ namespace Sass {
|
|
2802
2771
|
bool is_empty_reference()
|
2803
2772
|
{
|
2804
2773
|
return length() == 1 &&
|
2805
|
-
|
2774
|
+
Cast<Parent_Selector>((*this)[0]);
|
2806
2775
|
}
|
2807
|
-
std::vector<Subset_Map_Key> to_str_vec(); // sometimes need to convert to a flat "by-value" data structure
|
2808
2776
|
|
2777
|
+
virtual bool find ( bool (*f)(AST_Node_Obj) );
|
2778
|
+
virtual bool operator<(const Selector& rhs) const;
|
2779
|
+
virtual bool operator==(const Selector& rhs) const;
|
2809
2780
|
virtual bool operator<(const Compound_Selector& rhs) const;
|
2810
2781
|
virtual bool operator==(const Compound_Selector& rhs) const;
|
2811
2782
|
inline bool operator!=(const Compound_Selector& rhs) const { return !(*this == rhs); }
|
2812
2783
|
|
2813
|
-
|
2784
|
+
ComplexSelectorSet& sources() { return sources_; }
|
2814
2785
|
void clearSources() { sources_.clear(); }
|
2815
|
-
void mergeSources(
|
2786
|
+
void mergeSources(ComplexSelectorSet& sources);
|
2816
2787
|
|
2817
|
-
Compound_Selector_Ptr minus(Compound_Selector_Ptr rhs
|
2788
|
+
Compound_Selector_Ptr minus(Compound_Selector_Ptr rhs);
|
2818
2789
|
virtual void cloneChildren();
|
2819
2790
|
ATTACH_AST_OPERATIONS(Compound_Selector)
|
2820
2791
|
ATTACH_OPERATIONS()
|
@@ -2829,10 +2800,10 @@ namespace Sass {
|
|
2829
2800
|
public:
|
2830
2801
|
enum Combinator { ANCESTOR_OF, PARENT_OF, PRECEDES, ADJACENT_TO, REFERENCE };
|
2831
2802
|
private:
|
2832
|
-
|
2833
|
-
|
2834
|
-
|
2835
|
-
|
2803
|
+
HASH_CONSTREF(Combinator, combinator)
|
2804
|
+
HASH_PROPERTY(Compound_Selector_Obj, head)
|
2805
|
+
HASH_PROPERTY(Complex_Selector_Obj, tail)
|
2806
|
+
HASH_PROPERTY(String_Obj, reference);
|
2836
2807
|
public:
|
2837
2808
|
bool contains_placeholder() {
|
2838
2809
|
if (head() && head()->contains_placeholder()) return true;
|
@@ -2855,8 +2826,8 @@ namespace Sass {
|
|
2855
2826
|
head_(ptr->head_), tail_(ptr->tail_),
|
2856
2827
|
reference_(ptr->reference_)
|
2857
2828
|
{};
|
2858
|
-
virtual bool has_parent_ref();
|
2859
|
-
virtual bool has_real_parent_ref();
|
2829
|
+
virtual bool has_parent_ref() const;
|
2830
|
+
virtual bool has_real_parent_ref() const;
|
2860
2831
|
|
2861
2832
|
Complex_Selector_Obj skip_empty_reference()
|
2862
2833
|
{
|
@@ -2878,10 +2849,7 @@ namespace Sass {
|
|
2878
2849
|
combinator() == Combinator::ANCESTOR_OF;
|
2879
2850
|
}
|
2880
2851
|
|
2881
|
-
|
2882
|
-
|
2883
|
-
|
2884
|
-
Selector_List_Ptr tails(Context& ctx, Selector_List_Ptr tails);
|
2852
|
+
Selector_List_Ptr tails(Selector_List_Ptr tails);
|
2885
2853
|
|
2886
2854
|
// front returns the first real tail
|
2887
2855
|
// skips over parent and empty ones
|
@@ -2893,13 +2861,13 @@ namespace Sass {
|
|
2893
2861
|
Complex_Selector_Obj innermost() { return last(); };
|
2894
2862
|
|
2895
2863
|
size_t length() const;
|
2896
|
-
Selector_List_Ptr resolve_parent_refs(
|
2864
|
+
Selector_List_Ptr resolve_parent_refs(std::vector<Selector_List_Obj>& pstack, Backtraces& traces, bool implicit_parent = true);
|
2897
2865
|
virtual bool is_superselector_of(Compound_Selector_Obj sub, std::string wrapping = "");
|
2898
2866
|
virtual bool is_superselector_of(Complex_Selector_Obj sub, std::string wrapping = "");
|
2899
2867
|
virtual bool is_superselector_of(Selector_List_Obj sub, std::string wrapping = "");
|
2900
|
-
Selector_List_Ptr unify_with(Complex_Selector_Ptr rhs
|
2868
|
+
Selector_List_Ptr unify_with(Complex_Selector_Ptr rhs);
|
2901
2869
|
Combinator clear_innermost();
|
2902
|
-
void append(
|
2870
|
+
void append(Complex_Selector_Obj, Backtraces& traces);
|
2903
2871
|
void set_innermost(Complex_Selector_Obj, Combinator);
|
2904
2872
|
virtual size_t hash()
|
2905
2873
|
{
|
@@ -2928,55 +2896,58 @@ namespace Sass {
|
|
2928
2896
|
if (tail_ && tail_->has_placeholder()) return true;
|
2929
2897
|
return false;
|
2930
2898
|
}
|
2899
|
+
virtual bool find ( bool (*f)(AST_Node_Obj) );
|
2900
|
+
virtual bool operator<(const Selector& rhs) const;
|
2901
|
+
virtual bool operator==(const Selector& rhs) const;
|
2931
2902
|
virtual bool operator<(const Complex_Selector& rhs) const;
|
2932
2903
|
virtual bool operator==(const Complex_Selector& rhs) const;
|
2933
2904
|
inline bool operator!=(const Complex_Selector& rhs) const { return !(*this == rhs); }
|
2934
|
-
|
2905
|
+
const ComplexSelectorSet sources()
|
2935
2906
|
{
|
2936
2907
|
//s = Set.new
|
2937
2908
|
//seq.map {|sseq_or_op| s.merge sseq_or_op.sources if sseq_or_op.is_a?(SimpleSequence)}
|
2938
2909
|
//s
|
2939
2910
|
|
2940
|
-
|
2911
|
+
ComplexSelectorSet srcs;
|
2941
2912
|
|
2942
2913
|
Compound_Selector_Obj pHead = head();
|
2943
2914
|
Complex_Selector_Obj pTail = tail();
|
2944
2915
|
|
2945
2916
|
if (pHead) {
|
2946
|
-
|
2917
|
+
const ComplexSelectorSet& headSources = pHead->sources();
|
2947
2918
|
srcs.insert(headSources.begin(), headSources.end());
|
2948
2919
|
}
|
2949
2920
|
|
2950
2921
|
if (pTail) {
|
2951
|
-
|
2922
|
+
const ComplexSelectorSet& tailSources = pTail->sources();
|
2952
2923
|
srcs.insert(tailSources.begin(), tailSources.end());
|
2953
2924
|
}
|
2954
2925
|
|
2955
2926
|
return srcs;
|
2956
2927
|
}
|
2957
|
-
void addSources(
|
2928
|
+
void addSources(ComplexSelectorSet& sources) {
|
2958
2929
|
// members.map! {|m| m.is_a?(SimpleSequence) ? m.with_more_sources(sources) : m}
|
2959
2930
|
Complex_Selector_Ptr pIter = this;
|
2960
2931
|
while (pIter) {
|
2961
|
-
Compound_Selector_Ptr pHead =
|
2932
|
+
Compound_Selector_Ptr pHead = pIter->head();
|
2962
2933
|
|
2963
2934
|
if (pHead) {
|
2964
|
-
pHead->mergeSources(sources
|
2935
|
+
pHead->mergeSources(sources);
|
2965
2936
|
}
|
2966
2937
|
|
2967
|
-
pIter =
|
2938
|
+
pIter = pIter->tail();
|
2968
2939
|
}
|
2969
2940
|
}
|
2970
2941
|
void clearSources() {
|
2971
2942
|
Complex_Selector_Ptr pIter = this;
|
2972
2943
|
while (pIter) {
|
2973
|
-
Compound_Selector_Ptr pHead =
|
2944
|
+
Compound_Selector_Ptr pHead = pIter->head();
|
2974
2945
|
|
2975
2946
|
if (pHead) {
|
2976
2947
|
pHead->clearSources();
|
2977
2948
|
}
|
2978
2949
|
|
2979
|
-
pIter =
|
2950
|
+
pIter = pIter->tail();
|
2980
2951
|
}
|
2981
2952
|
}
|
2982
2953
|
|
@@ -2985,36 +2956,40 @@ namespace Sass {
|
|
2985
2956
|
ATTACH_OPERATIONS()
|
2986
2957
|
};
|
2987
2958
|
|
2988
|
-
typedef std::deque<Complex_Selector_Obj> ComplexSelectorDeque;
|
2989
|
-
|
2990
2959
|
///////////////////////////////////
|
2991
2960
|
// Comma-separated selector groups.
|
2992
2961
|
///////////////////////////////////
|
2993
2962
|
class Selector_List : public Selector, public Vectorized<Complex_Selector_Obj> {
|
2994
|
-
ADD_PROPERTY(
|
2963
|
+
ADD_PROPERTY(Selector_Schema_Obj, schema)
|
2964
|
+
ADD_CONSTREF(std::vector<std::string>, wspace)
|
2995
2965
|
protected:
|
2996
2966
|
void adjust_after_pushing(Complex_Selector_Obj c);
|
2997
2967
|
public:
|
2998
2968
|
Selector_List(ParserState pstate, size_t s = 0)
|
2999
|
-
: Selector(pstate),
|
2969
|
+
: Selector(pstate),
|
2970
|
+
Vectorized<Complex_Selector_Obj>(s),
|
2971
|
+
schema_(NULL),
|
2972
|
+
wspace_(0)
|
3000
2973
|
{ }
|
3001
2974
|
Selector_List(const Selector_List* ptr)
|
3002
2975
|
: Selector(ptr),
|
3003
2976
|
Vectorized<Complex_Selector_Obj>(*ptr),
|
2977
|
+
schema_(ptr->schema_),
|
3004
2978
|
wspace_(ptr->wspace_)
|
3005
2979
|
{ }
|
3006
|
-
std::string type() { return "list"; }
|
2980
|
+
std::string type() const { return "list"; }
|
3007
2981
|
// remove parent selector references
|
3008
2982
|
// basically unwraps parsed selectors
|
3009
|
-
virtual bool has_parent_ref();
|
3010
|
-
virtual bool has_real_parent_ref();
|
2983
|
+
virtual bool has_parent_ref() const;
|
2984
|
+
virtual bool has_real_parent_ref() const;
|
3011
2985
|
void remove_parent_selectors();
|
3012
|
-
Selector_List_Ptr resolve_parent_refs(
|
2986
|
+
Selector_List_Ptr resolve_parent_refs(std::vector<Selector_List_Obj>& pstack, Backtraces& traces, bool implicit_parent = true);
|
3013
2987
|
virtual bool is_superselector_of(Compound_Selector_Obj sub, std::string wrapping = "");
|
3014
2988
|
virtual bool is_superselector_of(Complex_Selector_Obj sub, std::string wrapping = "");
|
3015
2989
|
virtual bool is_superselector_of(Selector_List_Obj sub, std::string wrapping = "");
|
3016
|
-
Selector_List_Ptr unify_with(Selector_List_Ptr
|
3017
|
-
void populate_extends(Selector_List_Obj,
|
2990
|
+
Selector_List_Ptr unify_with(Selector_List_Ptr);
|
2991
|
+
void populate_extends(Selector_List_Obj, Subset_Map&);
|
2992
|
+
Selector_List_Obj eval(Eval& eval);
|
3018
2993
|
virtual size_t hash()
|
3019
2994
|
{
|
3020
2995
|
if (Selector::hash_ == 0) {
|
@@ -3023,10 +2998,10 @@ namespace Sass {
|
|
3023
2998
|
}
|
3024
2999
|
return Selector::hash_;
|
3025
3000
|
}
|
3026
|
-
virtual unsigned long specificity()
|
3001
|
+
virtual unsigned long specificity() const
|
3027
3002
|
{
|
3028
3003
|
unsigned long sum = 0;
|
3029
|
-
unsigned long specificity
|
3004
|
+
unsigned long specificity;
|
3030
3005
|
for (size_t i = 0, L = length(); i < L; ++i)
|
3031
3006
|
{
|
3032
3007
|
specificity = (*this)[i]->specificity();
|
@@ -3046,6 +3021,7 @@ namespace Sass {
|
|
3046
3021
|
}
|
3047
3022
|
return false;
|
3048
3023
|
}
|
3024
|
+
virtual bool find ( bool (*f)(AST_Node_Obj) );
|
3049
3025
|
virtual bool operator<(const Selector& rhs) const;
|
3050
3026
|
virtual bool operator==(const Selector& rhs) const;
|
3051
3027
|
virtual bool operator<(const Selector_List& rhs) const;
|
@@ -3057,24 +3033,6 @@ namespace Sass {
|
|
3057
3033
|
ATTACH_OPERATIONS()
|
3058
3034
|
};
|
3059
3035
|
|
3060
|
-
template<typename SelectorType>
|
3061
|
-
bool selectors_equal(const SelectorType& one, const SelectorType& two, bool simpleSelectorOrderDependent) {
|
3062
|
-
// Test for equality among selectors while differentiating between checks that demand the underlying Simple_Selector
|
3063
|
-
// ordering to be the same or not. This works because operator< (which doesn't make a whole lot of sense for selectors, but
|
3064
|
-
// is required for proper stl collection ordering) is implemented using string comparision. This gives stable sorting
|
3065
|
-
// behavior, and can be used to determine if the selectors would have exactly idential output. operator== matches the
|
3066
|
-
// ruby sass implementations for eql, which sometimes perform order independent comparisions (like set comparisons of the
|
3067
|
-
// members of a SimpleSequence (Compound_Selector)).
|
3068
|
-
//
|
3069
|
-
// Due to the reliance on operator== and operater< behavior, this templated method is currently only intended for
|
3070
|
-
// use with Compound_Selector and Complex_Selector objects.
|
3071
|
-
if (simpleSelectorOrderDependent) {
|
3072
|
-
return !(one < two) && !(two < one);
|
3073
|
-
} else {
|
3074
|
-
return one == two;
|
3075
|
-
}
|
3076
|
-
}
|
3077
|
-
|
3078
3036
|
// compare function for sorting and probably other other uses
|
3079
3037
|
struct cmp_complex_selector { inline bool operator() (const Complex_Selector_Obj l, const Complex_Selector_Obj r) { return (*l < *r); } };
|
3080
3038
|
struct cmp_compound_selector { inline bool operator() (const Compound_Selector_Obj l, const Compound_Selector_Obj r) { return (*l < *r); } };
|