sassc 1.8.3 → 1.8.4
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/README.md +3 -1
- data/ext/libsass/.editorconfig +1 -1
- data/ext/libsass/.gitignore +1 -0
- data/ext/libsass/LICENSE +1 -1
- data/ext/libsass/Makefile +20 -14
- data/ext/libsass/Makefile.conf +0 -1
- data/ext/libsass/Readme.md +3 -1
- data/ext/libsass/appveyor.yml +19 -11
- data/ext/libsass/docs/api-importer-example.md +2 -1235
- data/ext/libsass/docs/build-with-autotools.md +10 -0
- data/ext/libsass/docs/build-with-makefiles.md +18 -0
- data/ext/libsass/include/sass/base.h +4 -1
- data/ext/libsass/include/sass/values.h +2 -1
- data/ext/libsass/src/ast.cpp +279 -346
- data/ext/libsass/src/ast.hpp +234 -60
- data/ext/libsass/src/base64vlq.cpp +1 -0
- data/ext/libsass/src/bind.cpp +35 -45
- data/ext/libsass/src/bind.hpp +1 -0
- data/ext/libsass/src/color_maps.cpp +1 -0
- data/ext/libsass/src/constants.cpp +4 -1
- data/ext/libsass/src/constants.hpp +2 -1
- data/ext/libsass/src/context.cpp +41 -31
- data/ext/libsass/src/context.hpp +10 -10
- data/ext/libsass/src/cssize.cpp +7 -4
- data/ext/libsass/src/cssize.hpp +1 -3
- data/ext/libsass/src/debugger.hpp +73 -14
- data/ext/libsass/src/emitter.cpp +37 -25
- data/ext/libsass/src/emitter.hpp +10 -9
- data/ext/libsass/src/environment.cpp +16 -5
- data/ext/libsass/src/environment.hpp +5 -3
- data/ext/libsass/src/error_handling.cpp +91 -14
- data/ext/libsass/src/error_handling.hpp +105 -4
- data/ext/libsass/src/eval.cpp +519 -330
- data/ext/libsass/src/eval.hpp +12 -13
- data/ext/libsass/src/expand.cpp +92 -56
- data/ext/libsass/src/expand.hpp +5 -3
- data/ext/libsass/src/extend.cpp +60 -51
- data/ext/libsass/src/extend.hpp +1 -3
- data/ext/libsass/src/file.cpp +37 -27
- data/ext/libsass/src/functions.cpp +78 -62
- data/ext/libsass/src/functions.hpp +1 -0
- data/ext/libsass/src/inspect.cpp +293 -64
- data/ext/libsass/src/inspect.hpp +2 -0
- data/ext/libsass/src/lexer.cpp +1 -0
- data/ext/libsass/src/listize.cpp +14 -15
- data/ext/libsass/src/listize.hpp +3 -5
- data/ext/libsass/src/memory_manager.cpp +1 -0
- data/ext/libsass/src/node.cpp +2 -3
- data/ext/libsass/src/operation.hpp +70 -71
- data/ext/libsass/src/output.cpp +28 -32
- data/ext/libsass/src/output.hpp +1 -2
- data/ext/libsass/src/parser.cpp +402 -183
- data/ext/libsass/src/parser.hpp +19 -9
- data/ext/libsass/src/plugins.cpp +1 -0
- data/ext/libsass/src/position.cpp +1 -0
- data/ext/libsass/src/prelexer.cpp +134 -56
- data/ext/libsass/src/prelexer.hpp +51 -3
- data/ext/libsass/src/remove_placeholders.cpp +35 -9
- data/ext/libsass/src/remove_placeholders.hpp +4 -3
- data/ext/libsass/src/sass.cpp +1 -0
- data/ext/libsass/src/sass.hpp +129 -0
- data/ext/libsass/src/sass_context.cpp +31 -14
- data/ext/libsass/src/sass_context.hpp +2 -31
- data/ext/libsass/src/sass_functions.cpp +1 -0
- data/ext/libsass/src/sass_interface.cpp +5 -6
- data/ext/libsass/src/sass_util.cpp +1 -2
- data/ext/libsass/src/sass_util.hpp +5 -5
- data/ext/libsass/src/sass_values.cpp +13 -10
- data/ext/libsass/src/source_map.cpp +4 -3
- data/ext/libsass/src/source_map.hpp +2 -2
- data/ext/libsass/src/subset_map.hpp +0 -1
- data/ext/libsass/src/to_c.cpp +1 -0
- data/ext/libsass/src/to_c.hpp +1 -3
- data/ext/libsass/src/to_value.cpp +3 -5
- data/ext/libsass/src/to_value.hpp +1 -1
- data/ext/libsass/src/units.cpp +96 -59
- data/ext/libsass/src/units.hpp +10 -8
- data/ext/libsass/src/utf8_string.cpp +5 -0
- data/ext/libsass/src/util.cpp +23 -156
- data/ext/libsass/src/util.hpp +10 -14
- data/ext/libsass/src/values.cpp +1 -0
- data/ext/libsass/test/test_node.cpp +2 -6
- data/ext/libsass/test/test_selector_difference.cpp +1 -3
- data/ext/libsass/test/test_specificity.cpp +0 -2
- data/ext/libsass/test/test_superselector.cpp +0 -2
- data/ext/libsass/test/test_unification.cpp +1 -3
- data/ext/libsass/win/libsass.targets +18 -5
- data/ext/libsass/win/libsass.vcxproj +9 -7
- data/ext/libsass/win/libsass.vcxproj.filters +148 -106
- data/lib/sassc/version.rb +1 -1
- data/test/engine_test.rb +12 -0
- data/test/native_test.rb +1 -1
- metadata +3 -4
- data/ext/libsass/src/to_string.cpp +0 -48
- data/ext/libsass/src/to_string.hpp +0 -38
data/ext/libsass/src/ast.hpp
CHANGED
|
@@ -44,15 +44,29 @@
|
|
|
44
44
|
#include "error_handling.hpp"
|
|
45
45
|
#include "ast_def_macros.hpp"
|
|
46
46
|
#include "ast_fwd_decl.hpp"
|
|
47
|
-
#include "to_string.hpp"
|
|
48
47
|
#include "source_map.hpp"
|
|
49
48
|
|
|
50
49
|
#include "sass.h"
|
|
51
50
|
|
|
52
51
|
namespace Sass {
|
|
53
52
|
|
|
53
|
+
// ToDo: should this really be hardcoded
|
|
54
|
+
// Note: most methods follow precision option
|
|
54
55
|
const double NUMBER_EPSILON = 0.00000000000001;
|
|
55
56
|
|
|
57
|
+
// ToDo: where does this fit best?
|
|
58
|
+
// We don't share this with C-API?
|
|
59
|
+
class Operand {
|
|
60
|
+
public:
|
|
61
|
+
Operand(Sass_OP operand, bool ws_before = false, bool ws_after = false)
|
|
62
|
+
: operand(operand), ws_before(ws_before), ws_after(ws_after)
|
|
63
|
+
{ }
|
|
64
|
+
public:
|
|
65
|
+
enum Sass_OP operand;
|
|
66
|
+
bool ws_before;
|
|
67
|
+
bool ws_after;
|
|
68
|
+
};
|
|
69
|
+
|
|
56
70
|
// from boost (functional/hash):
|
|
57
71
|
// http://www.boost.org/doc/libs/1_35_0/doc/html/hash/combine.html
|
|
58
72
|
// Boost Software License - Version 1.0
|
|
@@ -74,6 +88,11 @@ namespace Sass {
|
|
|
74
88
|
: pstate_(pstate)
|
|
75
89
|
{ }
|
|
76
90
|
virtual ~AST_Node() = 0;
|
|
91
|
+
virtual size_t hash() { return 0; }
|
|
92
|
+
virtual std::string inspect() const { return to_string({ INSPECT, 5 }); }
|
|
93
|
+
virtual std::string to_sass() const { return to_string({ TO_SASS, 5 }); }
|
|
94
|
+
virtual std::string to_string(Sass_Inspect_Options opt) const;
|
|
95
|
+
virtual std::string to_string() const;
|
|
77
96
|
// virtual Block* block() { return 0; }
|
|
78
97
|
public:
|
|
79
98
|
void update_pstate(const ParserState& pstate);
|
|
@@ -129,9 +148,26 @@ namespace Sass {
|
|
|
129
148
|
virtual bool is_false() { return false; }
|
|
130
149
|
virtual bool operator== (const Expression& rhs) const { return false; }
|
|
131
150
|
virtual void set_delayed(bool delayed) { is_delayed(delayed); }
|
|
151
|
+
virtual bool has_interpolant() const { return is_interpolant(); }
|
|
152
|
+
virtual bool is_left_interpolant() const { return is_interpolant(); }
|
|
153
|
+
virtual bool is_right_interpolant() const { return is_interpolant(); }
|
|
154
|
+
virtual std::string inspect() const { return to_string({ INSPECT, 5 }); }
|
|
155
|
+
virtual std::string to_sass() const { return to_string({ TO_SASS, 5 }); }
|
|
132
156
|
virtual size_t hash() { return 0; }
|
|
133
157
|
};
|
|
134
158
|
|
|
159
|
+
//////////////////////////////////////////////////////////////////////
|
|
160
|
+
// Still just an expression, but with a to_string method
|
|
161
|
+
//////////////////////////////////////////////////////////////////////
|
|
162
|
+
class PreValue : public Expression {
|
|
163
|
+
public:
|
|
164
|
+
PreValue(ParserState pstate,
|
|
165
|
+
bool d = false, bool e = false, bool i = false, Concrete_Type ct = NONE)
|
|
166
|
+
: Expression(pstate, d, e, i, ct)
|
|
167
|
+
{ }
|
|
168
|
+
virtual ~PreValue() { }
|
|
169
|
+
};
|
|
170
|
+
|
|
135
171
|
//////////////////////////////////////////////////////////////////////
|
|
136
172
|
// base class for values that support operations
|
|
137
173
|
//////////////////////////////////////////////////////////////////////
|
|
@@ -142,7 +178,6 @@ namespace Sass {
|
|
|
142
178
|
: Expression(pstate, d, e, i, ct)
|
|
143
179
|
{ }
|
|
144
180
|
virtual bool operator== (const Expression& rhs) const = 0;
|
|
145
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const = 0;
|
|
146
181
|
};
|
|
147
182
|
}
|
|
148
183
|
|
|
@@ -189,8 +224,8 @@ namespace Sass {
|
|
|
189
224
|
virtual ~Vectorized() = 0;
|
|
190
225
|
size_t length() const { return elements_.size(); }
|
|
191
226
|
bool empty() const { return elements_.empty(); }
|
|
192
|
-
T last()
|
|
193
|
-
T first()
|
|
227
|
+
T last() const { return elements_.back(); }
|
|
228
|
+
T first() const { return elements_.front(); }
|
|
194
229
|
T& operator[](size_t i) { return elements_[i]; }
|
|
195
230
|
virtual const T& at(size_t i) const { return elements_.at(i); }
|
|
196
231
|
const T& operator[](size_t i) const { return elements_[i]; }
|
|
@@ -216,6 +251,16 @@ namespace Sass {
|
|
|
216
251
|
const std::vector<T>& elements() const { return elements_; }
|
|
217
252
|
std::vector<T>& elements(std::vector<T>& e) { elements_ = e; return elements_; }
|
|
218
253
|
|
|
254
|
+
virtual size_t hash()
|
|
255
|
+
{
|
|
256
|
+
if (hash_ == 0) {
|
|
257
|
+
for (T& el : elements_) {
|
|
258
|
+
hash_combine(hash_, el->hash());
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return hash_;
|
|
262
|
+
}
|
|
263
|
+
|
|
219
264
|
typename std::vector<T>::iterator end() { return elements_.end(); }
|
|
220
265
|
typename std::vector<T>::iterator begin() { return elements_.begin(); }
|
|
221
266
|
typename std::vector<T>::const_iterator end() const { return elements_.end(); }
|
|
@@ -820,8 +865,8 @@ namespace Sass {
|
|
|
820
865
|
std::string type() { return is_arglist_ ? "arglist" : "list"; }
|
|
821
866
|
static std::string type_name() { return "list"; }
|
|
822
867
|
const char* sep_string(bool compressed = false) const {
|
|
823
|
-
return separator() ==
|
|
824
|
-
(compressed ? "," : ", ")
|
|
868
|
+
return separator() == SASS_SPACE ?
|
|
869
|
+
" " : (compressed ? "," : ", ");
|
|
825
870
|
}
|
|
826
871
|
bool is_invisible() const { return empty(); }
|
|
827
872
|
Expression* value_at_index(size_t i);
|
|
@@ -846,7 +891,6 @@ namespace Sass {
|
|
|
846
891
|
}
|
|
847
892
|
|
|
848
893
|
virtual bool operator== (const Expression& rhs) const;
|
|
849
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
850
894
|
|
|
851
895
|
ATTACH_OPERATIONS()
|
|
852
896
|
};
|
|
@@ -879,29 +923,49 @@ namespace Sass {
|
|
|
879
923
|
}
|
|
880
924
|
|
|
881
925
|
virtual bool operator== (const Expression& rhs) const;
|
|
882
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
883
926
|
|
|
884
927
|
ATTACH_OPERATIONS()
|
|
885
928
|
};
|
|
886
929
|
|
|
930
|
+
inline static const std::string sass_op_to_name(enum Sass_OP op) {
|
|
931
|
+
switch (op) {
|
|
932
|
+
case AND: return "and"; break;
|
|
933
|
+
case OR: return "or"; break;
|
|
934
|
+
case EQ: return "eq"; break;
|
|
935
|
+
case NEQ: return "neq"; break;
|
|
936
|
+
case GT: return "gt"; break;
|
|
937
|
+
case GTE: return "gte"; break;
|
|
938
|
+
case LT: return "lt"; break;
|
|
939
|
+
case LTE: return "lte"; break;
|
|
940
|
+
case ADD: return "plus"; break;
|
|
941
|
+
case SUB: return "sub"; break;
|
|
942
|
+
case MUL: return "times"; break;
|
|
943
|
+
case DIV: return "div"; break;
|
|
944
|
+
case MOD: return "mod"; break;
|
|
945
|
+
// this is only used internally!
|
|
946
|
+
case NUM_OPS: return "[OPS]"; break;
|
|
947
|
+
default: return "invalid"; break;
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
|
|
887
951
|
//////////////////////////////////////////////////////////////////////////
|
|
888
952
|
// Binary expressions. Represents logical, relational, and arithmetic
|
|
889
953
|
// operations. Templatized to avoid large switch statements and repetitive
|
|
890
954
|
// subclassing.
|
|
891
955
|
//////////////////////////////////////////////////////////////////////////
|
|
892
|
-
class Binary_Expression : public
|
|
956
|
+
class Binary_Expression : public PreValue {
|
|
893
957
|
private:
|
|
894
|
-
ADD_HASHED(
|
|
958
|
+
ADD_HASHED(Operand, op)
|
|
895
959
|
ADD_HASHED(Expression*, left)
|
|
896
960
|
ADD_HASHED(Expression*, right)
|
|
897
961
|
size_t hash_;
|
|
898
962
|
public:
|
|
899
963
|
Binary_Expression(ParserState pstate,
|
|
900
|
-
|
|
901
|
-
:
|
|
964
|
+
Operand op, Expression* lhs, Expression* rhs)
|
|
965
|
+
: PreValue(pstate), op_(op), left_(lhs), right_(rhs), hash_(0)
|
|
902
966
|
{ }
|
|
903
967
|
const std::string type_name() {
|
|
904
|
-
switch (
|
|
968
|
+
switch (type()) {
|
|
905
969
|
case AND: return "and"; break;
|
|
906
970
|
case OR: return "or"; break;
|
|
907
971
|
case EQ: return "eq"; break;
|
|
@@ -915,10 +979,38 @@ namespace Sass {
|
|
|
915
979
|
case MUL: return "mul"; break;
|
|
916
980
|
case DIV: return "div"; break;
|
|
917
981
|
case MOD: return "mod"; break;
|
|
918
|
-
|
|
982
|
+
// this is only used internally!
|
|
983
|
+
case NUM_OPS: return "[OPS]"; break;
|
|
984
|
+
default: return "invalid"; break;
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
const std::string separator() {
|
|
988
|
+
switch (type()) {
|
|
989
|
+
case AND: return "&&"; break;
|
|
990
|
+
case OR: return "||"; break;
|
|
991
|
+
case EQ: return "=="; break;
|
|
992
|
+
case NEQ: return "!="; break;
|
|
993
|
+
case GT: return ">"; break;
|
|
994
|
+
case GTE: return ">="; break;
|
|
995
|
+
case LT: return "<"; break;
|
|
996
|
+
case LTE: return "<="; break;
|
|
997
|
+
case ADD: return "+"; break;
|
|
998
|
+
case SUB: return "-"; break;
|
|
999
|
+
case MUL: return "*"; break;
|
|
1000
|
+
case DIV: return "/"; break;
|
|
1001
|
+
case MOD: return "%"; break;
|
|
1002
|
+
// this is only used internally!
|
|
1003
|
+
case NUM_OPS: return "[OPS]"; break;
|
|
919
1004
|
default: return "invalid"; break;
|
|
920
1005
|
}
|
|
921
1006
|
}
|
|
1007
|
+
bool is_left_interpolant(void) const;
|
|
1008
|
+
bool is_right_interpolant(void) const;
|
|
1009
|
+
bool has_interpolant() const
|
|
1010
|
+
{
|
|
1011
|
+
return is_left_interpolant() ||
|
|
1012
|
+
is_right_interpolant();
|
|
1013
|
+
}
|
|
922
1014
|
virtual void set_delayed(bool delayed)
|
|
923
1015
|
{
|
|
924
1016
|
right()->set_delayed(delayed);
|
|
@@ -944,12 +1036,13 @@ namespace Sass {
|
|
|
944
1036
|
virtual size_t hash()
|
|
945
1037
|
{
|
|
946
1038
|
if (hash_ == 0) {
|
|
947
|
-
hash_ = std::hash<size_t>()(
|
|
1039
|
+
hash_ = std::hash<size_t>()(type());
|
|
948
1040
|
hash_combine(hash_, left()->hash());
|
|
949
1041
|
hash_combine(hash_, right()->hash());
|
|
950
1042
|
}
|
|
951
1043
|
return hash_;
|
|
952
1044
|
}
|
|
1045
|
+
enum Sass_OP type() const { return op_.operand; }
|
|
953
1046
|
ATTACH_OPERATIONS()
|
|
954
1047
|
};
|
|
955
1048
|
|
|
@@ -1065,23 +1158,27 @@ namespace Sass {
|
|
|
1065
1158
|
has_rest_argument_(false),
|
|
1066
1159
|
has_keyword_argument_(false)
|
|
1067
1160
|
{ }
|
|
1161
|
+
|
|
1162
|
+
Argument* get_rest_argument();
|
|
1163
|
+
Argument* get_keyword_argument();
|
|
1164
|
+
|
|
1068
1165
|
ATTACH_OPERATIONS()
|
|
1069
1166
|
};
|
|
1070
1167
|
|
|
1071
1168
|
//////////////////
|
|
1072
1169
|
// Function calls.
|
|
1073
1170
|
//////////////////
|
|
1074
|
-
class Function_Call : public
|
|
1171
|
+
class Function_Call : public PreValue {
|
|
1075
1172
|
ADD_HASHED(std::string, name)
|
|
1076
1173
|
ADD_HASHED(Arguments*, arguments)
|
|
1077
1174
|
ADD_PROPERTY(void*, cookie)
|
|
1078
1175
|
size_t hash_;
|
|
1079
1176
|
public:
|
|
1080
1177
|
Function_Call(ParserState pstate, std::string n, Arguments* args, void* cookie)
|
|
1081
|
-
:
|
|
1178
|
+
: PreValue(pstate), name_(n), arguments_(args), cookie_(cookie), hash_(0)
|
|
1082
1179
|
{ concrete_type(STRING); }
|
|
1083
1180
|
Function_Call(ParserState pstate, std::string n, Arguments* args)
|
|
1084
|
-
:
|
|
1181
|
+
: PreValue(pstate), name_(n), arguments_(args), cookie_(0), hash_(0)
|
|
1085
1182
|
{ concrete_type(STRING); }
|
|
1086
1183
|
|
|
1087
1184
|
virtual bool operator==(const Expression& rhs) const
|
|
@@ -1131,11 +1228,11 @@ namespace Sass {
|
|
|
1131
1228
|
///////////////////////
|
|
1132
1229
|
// Variable references.
|
|
1133
1230
|
///////////////////////
|
|
1134
|
-
class Variable : public
|
|
1231
|
+
class Variable : public PreValue {
|
|
1135
1232
|
ADD_PROPERTY(std::string, name)
|
|
1136
1233
|
public:
|
|
1137
1234
|
Variable(ParserState pstate, std::string n)
|
|
1138
|
-
:
|
|
1235
|
+
: PreValue(pstate), name_(n)
|
|
1139
1236
|
{ }
|
|
1140
1237
|
|
|
1141
1238
|
virtual bool operator==(const Expression& rhs) const
|
|
@@ -1214,7 +1311,8 @@ namespace Sass {
|
|
|
1214
1311
|
size_t hash_;
|
|
1215
1312
|
public:
|
|
1216
1313
|
Number(ParserState pstate, double val, std::string u = "", bool zero = true);
|
|
1217
|
-
bool
|
|
1314
|
+
bool zero() { return zero_; }
|
|
1315
|
+
bool is_valid_css_unit() const;
|
|
1218
1316
|
std::vector<std::string>& numerator_units() { return numerator_units_; }
|
|
1219
1317
|
std::vector<std::string>& denominator_units() { return denominator_units_; }
|
|
1220
1318
|
const std::vector<std::string>& numerator_units() const { return numerator_units_; }
|
|
@@ -1223,8 +1321,9 @@ namespace Sass {
|
|
|
1223
1321
|
static std::string type_name() { return "number"; }
|
|
1224
1322
|
std::string unit() const;
|
|
1225
1323
|
|
|
1226
|
-
bool is_unitless();
|
|
1227
|
-
|
|
1324
|
+
bool is_unitless() const;
|
|
1325
|
+
double convert_factor(const Number&) const;
|
|
1326
|
+
bool convert(const std::string& unit = "", bool strict = false);
|
|
1228
1327
|
void normalize(const std::string& unit = "", bool strict = false);
|
|
1229
1328
|
// useful for making one number compatible with another
|
|
1230
1329
|
std::string find_convertible_unit() const;
|
|
@@ -1243,7 +1342,6 @@ namespace Sass {
|
|
|
1243
1342
|
|
|
1244
1343
|
virtual bool operator< (const Number& rhs) const;
|
|
1245
1344
|
virtual bool operator== (const Expression& rhs) const;
|
|
1246
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
1247
1345
|
|
|
1248
1346
|
ATTACH_OPERATIONS()
|
|
1249
1347
|
};
|
|
@@ -1256,12 +1354,11 @@ namespace Sass {
|
|
|
1256
1354
|
ADD_HASHED(double, g)
|
|
1257
1355
|
ADD_HASHED(double, b)
|
|
1258
1356
|
ADD_HASHED(double, a)
|
|
1259
|
-
ADD_PROPERTY(bool, sixtuplet)
|
|
1260
1357
|
ADD_PROPERTY(std::string, disp)
|
|
1261
1358
|
size_t hash_;
|
|
1262
1359
|
public:
|
|
1263
|
-
Color(ParserState pstate, double r, double g, double b, double a = 1,
|
|
1264
|
-
: Value(pstate), r_(r), g_(g), b_(b), a_(a),
|
|
1360
|
+
Color(ParserState pstate, double r, double g, double b, double a = 1, const std::string disp = "")
|
|
1361
|
+
: Value(pstate), r_(r), g_(g), b_(b), a_(a), disp_(disp),
|
|
1265
1362
|
hash_(0)
|
|
1266
1363
|
{ concrete_type(COLOR); }
|
|
1267
1364
|
std::string type() { return "color"; }
|
|
@@ -1279,7 +1376,6 @@ namespace Sass {
|
|
|
1279
1376
|
}
|
|
1280
1377
|
|
|
1281
1378
|
virtual bool operator== (const Expression& rhs) const;
|
|
1282
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
1283
1379
|
|
|
1284
1380
|
ATTACH_OPERATIONS()
|
|
1285
1381
|
};
|
|
@@ -1294,7 +1390,6 @@ namespace Sass {
|
|
|
1294
1390
|
: Value(pstate), message_(msg)
|
|
1295
1391
|
{ concrete_type(C_ERROR); }
|
|
1296
1392
|
virtual bool operator== (const Expression& rhs) const;
|
|
1297
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
1298
1393
|
ATTACH_OPERATIONS()
|
|
1299
1394
|
};
|
|
1300
1395
|
|
|
@@ -1308,7 +1403,6 @@ namespace Sass {
|
|
|
1308
1403
|
: Value(pstate), message_(msg)
|
|
1309
1404
|
{ concrete_type(C_WARNING); }
|
|
1310
1405
|
virtual bool operator== (const Expression& rhs) const;
|
|
1311
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
1312
1406
|
ATTACH_OPERATIONS()
|
|
1313
1407
|
};
|
|
1314
1408
|
|
|
@@ -1337,7 +1431,6 @@ namespace Sass {
|
|
|
1337
1431
|
}
|
|
1338
1432
|
|
|
1339
1433
|
virtual bool operator== (const Expression& rhs) const;
|
|
1340
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
1341
1434
|
|
|
1342
1435
|
ATTACH_OPERATIONS()
|
|
1343
1436
|
};
|
|
@@ -1355,7 +1448,6 @@ namespace Sass {
|
|
|
1355
1448
|
static std::string type_name() { return "string"; }
|
|
1356
1449
|
virtual ~String() = 0;
|
|
1357
1450
|
virtual bool operator==(const Expression& rhs) const = 0;
|
|
1358
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const = 0;
|
|
1359
1451
|
ATTACH_OPERATIONS()
|
|
1360
1452
|
};
|
|
1361
1453
|
inline String::~String() { };
|
|
@@ -1365,15 +1457,25 @@ namespace Sass {
|
|
|
1365
1457
|
// evaluation phase.
|
|
1366
1458
|
///////////////////////////////////////////////////////////////////////
|
|
1367
1459
|
class String_Schema : public String, public Vectorized<Expression*> {
|
|
1368
|
-
ADD_PROPERTY(bool, has_interpolants)
|
|
1460
|
+
// ADD_PROPERTY(bool, has_interpolants)
|
|
1369
1461
|
size_t hash_;
|
|
1370
1462
|
public:
|
|
1371
1463
|
String_Schema(ParserState pstate, size_t size = 0, bool has_interpolants = false)
|
|
1372
|
-
: String(pstate), Vectorized<Expression*>(size),
|
|
1464
|
+
: String(pstate), Vectorized<Expression*>(size), hash_(0)
|
|
1373
1465
|
{ concrete_type(STRING); }
|
|
1374
1466
|
std::string type() { return "string"; }
|
|
1375
1467
|
static std::string type_name() { return "string"; }
|
|
1376
1468
|
|
|
1469
|
+
bool is_left_interpolant(void) const;
|
|
1470
|
+
bool is_right_interpolant(void) const;
|
|
1471
|
+
// void has_interpolants(bool tc) { }
|
|
1472
|
+
bool has_interpolants() {
|
|
1473
|
+
for (auto el : elements()) {
|
|
1474
|
+
if (el->is_interpolant()) return true;
|
|
1475
|
+
}
|
|
1476
|
+
return false;
|
|
1477
|
+
}
|
|
1478
|
+
|
|
1377
1479
|
virtual size_t hash()
|
|
1378
1480
|
{
|
|
1379
1481
|
if (hash_ == 0) {
|
|
@@ -1384,7 +1486,6 @@ namespace Sass {
|
|
|
1384
1486
|
}
|
|
1385
1487
|
|
|
1386
1488
|
virtual bool operator==(const Expression& rhs) const;
|
|
1387
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
1388
1489
|
|
|
1389
1490
|
ATTACH_OPERATIONS()
|
|
1390
1491
|
};
|
|
@@ -1423,7 +1524,7 @@ namespace Sass {
|
|
|
1423
1524
|
}
|
|
1424
1525
|
|
|
1425
1526
|
virtual bool operator==(const Expression& rhs) const;
|
|
1426
|
-
virtual std::string
|
|
1527
|
+
virtual std::string inspect() const; // quotes are forced on inspection
|
|
1427
1528
|
|
|
1428
1529
|
// static char auto_quote() { return '*'; }
|
|
1429
1530
|
static char double_quote() { return '"'; }
|
|
@@ -1444,7 +1545,7 @@ namespace Sass {
|
|
|
1444
1545
|
if (q && quote_mark_) quote_mark_ = q;
|
|
1445
1546
|
}
|
|
1446
1547
|
virtual bool operator==(const Expression& rhs) const;
|
|
1447
|
-
virtual std::string
|
|
1548
|
+
virtual std::string inspect() const; // quotes are forced on inspection
|
|
1448
1549
|
ATTACH_OPERATIONS()
|
|
1449
1550
|
};
|
|
1450
1551
|
|
|
@@ -1581,8 +1682,7 @@ namespace Sass {
|
|
|
1581
1682
|
{ }
|
|
1582
1683
|
bool exclude(std::string str)
|
|
1583
1684
|
{
|
|
1584
|
-
|
|
1585
|
-
bool with = feature() && unquote(feature()->perform(&to_string)).compare("with") == 0;
|
|
1685
|
+
bool with = feature() && unquote(feature()->to_string()).compare("with") == 0;
|
|
1586
1686
|
List* l = static_cast<List*>(value());
|
|
1587
1687
|
std::string v;
|
|
1588
1688
|
|
|
@@ -1591,7 +1691,7 @@ namespace Sass {
|
|
|
1591
1691
|
if (!l || l->length() == 0) return str.compare("rule") != 0;
|
|
1592
1692
|
for (size_t i = 0, L = l->length(); i < L; ++i)
|
|
1593
1693
|
{
|
|
1594
|
-
v = unquote((*l)[i]->
|
|
1694
|
+
v = unquote((*l)[i]->to_string());
|
|
1595
1695
|
if (v.compare("all") == 0 || v == str) return false;
|
|
1596
1696
|
}
|
|
1597
1697
|
return true;
|
|
@@ -1601,7 +1701,7 @@ namespace Sass {
|
|
|
1601
1701
|
if (!l || !l->length()) return str.compare("rule") == 0;
|
|
1602
1702
|
for (size_t i = 0, L = l->length(); i < L; ++i)
|
|
1603
1703
|
{
|
|
1604
|
-
v = unquote((*l)[i]->
|
|
1704
|
+
v = unquote((*l)[i]->to_string());
|
|
1605
1705
|
if (v.compare("all") == 0 || v == str) return true;
|
|
1606
1706
|
}
|
|
1607
1707
|
return false;
|
|
@@ -1665,7 +1765,6 @@ namespace Sass {
|
|
|
1665
1765
|
}
|
|
1666
1766
|
|
|
1667
1767
|
virtual bool operator== (const Expression& rhs) const;
|
|
1668
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
1669
1768
|
|
|
1670
1769
|
ATTACH_OPERATIONS()
|
|
1671
1770
|
};
|
|
@@ -1747,7 +1846,7 @@ namespace Sass {
|
|
|
1747
1846
|
// Abstract base class for CSS selectors.
|
|
1748
1847
|
/////////////////////////////////////////
|
|
1749
1848
|
class Selector : public Expression {
|
|
1750
|
-
ADD_PROPERTY(bool, has_reference)
|
|
1849
|
+
// ADD_PROPERTY(bool, has_reference)
|
|
1751
1850
|
ADD_PROPERTY(bool, has_placeholder)
|
|
1752
1851
|
// line break before list separator
|
|
1753
1852
|
ADD_PROPERTY(bool, has_line_feed)
|
|
@@ -1757,21 +1856,27 @@ namespace Sass {
|
|
|
1757
1856
|
ADD_PROPERTY(bool, is_optional)
|
|
1758
1857
|
// parent block pointers
|
|
1759
1858
|
ADD_PROPERTY(Media_Block*, media_block)
|
|
1859
|
+
protected:
|
|
1860
|
+
size_t hash_;
|
|
1760
1861
|
public:
|
|
1761
1862
|
Selector(ParserState pstate, bool r = false, bool h = false)
|
|
1762
1863
|
: Expression(pstate),
|
|
1763
|
-
has_reference_(r),
|
|
1864
|
+
// has_reference_(r),
|
|
1764
1865
|
has_placeholder_(h),
|
|
1765
1866
|
has_line_feed_(false),
|
|
1766
1867
|
has_line_break_(false),
|
|
1767
1868
|
is_optional_(false),
|
|
1768
|
-
media_block_(0)
|
|
1869
|
+
media_block_(0),
|
|
1870
|
+
hash_(0)
|
|
1769
1871
|
{ concrete_type(SELECTOR); }
|
|
1770
1872
|
virtual ~Selector() = 0;
|
|
1873
|
+
virtual size_t hash() = 0;
|
|
1874
|
+
virtual bool has_parent_ref() {
|
|
1875
|
+
return false;
|
|
1876
|
+
}
|
|
1771
1877
|
virtual unsigned long specificity() {
|
|
1772
1878
|
return Constants::Specificity_Universal;
|
|
1773
1879
|
}
|
|
1774
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const = 0;
|
|
1775
1880
|
};
|
|
1776
1881
|
inline Selector::~Selector() { }
|
|
1777
1882
|
|
|
@@ -1786,7 +1891,12 @@ namespace Sass {
|
|
|
1786
1891
|
Selector_Schema(ParserState pstate, String* c)
|
|
1787
1892
|
: Selector(pstate), contents_(c), at_root_(false)
|
|
1788
1893
|
{ }
|
|
1789
|
-
virtual
|
|
1894
|
+
virtual size_t hash() {
|
|
1895
|
+
if (hash_ == 0) {
|
|
1896
|
+
hash_combine(hash_, contents_->hash());
|
|
1897
|
+
}
|
|
1898
|
+
return hash_;
|
|
1899
|
+
}
|
|
1790
1900
|
ATTACH_OPERATIONS()
|
|
1791
1901
|
};
|
|
1792
1902
|
|
|
@@ -1816,6 +1926,15 @@ namespace Sass {
|
|
|
1816
1926
|
name += ns_ + "|";
|
|
1817
1927
|
return name + name_;
|
|
1818
1928
|
}
|
|
1929
|
+
virtual size_t hash()
|
|
1930
|
+
{
|
|
1931
|
+
if (hash_ == 0) {
|
|
1932
|
+
hash_combine(hash_, std::hash<int>()(SELECTOR));
|
|
1933
|
+
hash_combine(hash_, std::hash<std::string>()(ns()));
|
|
1934
|
+
hash_combine(hash_, std::hash<std::string>()(name()));
|
|
1935
|
+
}
|
|
1936
|
+
return hash_;
|
|
1937
|
+
}
|
|
1819
1938
|
// namespace query functions
|
|
1820
1939
|
bool is_universal_ns() const
|
|
1821
1940
|
{
|
|
@@ -1856,7 +1975,6 @@ namespace Sass {
|
|
|
1856
1975
|
|
|
1857
1976
|
bool operator<(const Simple_Selector& rhs) const;
|
|
1858
1977
|
// default implementation should work for most of the simple selectors (otherwise overload)
|
|
1859
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const { return this->ns_name(); };
|
|
1860
1978
|
ATTACH_OPERATIONS();
|
|
1861
1979
|
};
|
|
1862
1980
|
inline Simple_Selector::~Simple_Selector() { }
|
|
@@ -1872,7 +1990,7 @@ namespace Sass {
|
|
|
1872
1990
|
public:
|
|
1873
1991
|
Parent_Selector(ParserState pstate)
|
|
1874
1992
|
: Simple_Selector(pstate, "&")
|
|
1875
|
-
{ has_reference(true); }
|
|
1993
|
+
{ /* has_reference(true); */ }
|
|
1876
1994
|
virtual bool has_parent_ref() { return true; };
|
|
1877
1995
|
virtual unsigned long specificity()
|
|
1878
1996
|
{
|
|
@@ -1880,7 +1998,6 @@ namespace Sass {
|
|
|
1880
1998
|
}
|
|
1881
1999
|
std::string type() { return "selector"; }
|
|
1882
2000
|
static std::string type_name() { return "selector"; }
|
|
1883
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
1884
2001
|
ATTACH_OPERATIONS()
|
|
1885
2002
|
};
|
|
1886
2003
|
|
|
@@ -1944,6 +2061,15 @@ namespace Sass {
|
|
|
1944
2061
|
Attribute_Selector(ParserState pstate, std::string n, std::string m, String* v)
|
|
1945
2062
|
: Simple_Selector(pstate, n), matcher_(m), value_(v)
|
|
1946
2063
|
{ }
|
|
2064
|
+
virtual size_t hash()
|
|
2065
|
+
{
|
|
2066
|
+
if (hash_ == 0) {
|
|
2067
|
+
hash_combine(hash_, Simple_Selector::hash());
|
|
2068
|
+
hash_combine(hash_, std::hash<std::string>()(matcher()));
|
|
2069
|
+
if (value_) hash_combine(hash_, value_->hash());
|
|
2070
|
+
}
|
|
2071
|
+
return hash_;
|
|
2072
|
+
}
|
|
1947
2073
|
virtual unsigned long specificity()
|
|
1948
2074
|
{
|
|
1949
2075
|
return Constants::Specificity_Attr;
|
|
@@ -1952,7 +2078,6 @@ namespace Sass {
|
|
|
1952
2078
|
bool operator==(const Attribute_Selector& rhs) const;
|
|
1953
2079
|
bool operator<(const Simple_Selector& rhs) const;
|
|
1954
2080
|
bool operator<(const Attribute_Selector& rhs) const;
|
|
1955
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
1956
2081
|
ATTACH_OPERATIONS()
|
|
1957
2082
|
};
|
|
1958
2083
|
|
|
@@ -1971,6 +2096,7 @@ namespace Sass {
|
|
|
1971
2096
|
name == ":first-letter";
|
|
1972
2097
|
}
|
|
1973
2098
|
|
|
2099
|
+
// Pseudo Selector cannot have any namespace?
|
|
1974
2100
|
class Pseudo_Selector : public Simple_Selector {
|
|
1975
2101
|
ADD_PROPERTY(String*, expression)
|
|
1976
2102
|
public:
|
|
@@ -1999,6 +2125,14 @@ namespace Sass {
|
|
|
1999
2125
|
return (name_[0] == ':' && name_[1] == ':')
|
|
2000
2126
|
|| is_pseudo_class_element(name_);
|
|
2001
2127
|
}
|
|
2128
|
+
virtual size_t hash()
|
|
2129
|
+
{
|
|
2130
|
+
if (hash_ == 0) {
|
|
2131
|
+
hash_combine(hash_, Simple_Selector::hash());
|
|
2132
|
+
if (expression_) hash_combine(hash_, expression_->hash());
|
|
2133
|
+
}
|
|
2134
|
+
return hash_;
|
|
2135
|
+
}
|
|
2002
2136
|
virtual unsigned long specificity()
|
|
2003
2137
|
{
|
|
2004
2138
|
if (is_pseudo_element())
|
|
@@ -2018,16 +2152,30 @@ namespace Sass {
|
|
|
2018
2152
|
Wrapped_Selector(ParserState pstate, std::string n, Selector* sel)
|
|
2019
2153
|
: Simple_Selector(pstate, n), selector_(sel)
|
|
2020
2154
|
{ }
|
|
2155
|
+
virtual bool has_parent_ref() {
|
|
2156
|
+
// if (has_reference()) return true;
|
|
2157
|
+
if (!selector()) return false;
|
|
2158
|
+
return selector()->has_parent_ref();
|
|
2159
|
+
}
|
|
2021
2160
|
virtual bool is_superselector_of(Wrapped_Selector* sub);
|
|
2022
2161
|
// Selectors inside the negation pseudo-class are counted like any
|
|
2023
2162
|
// other, but the negation itself does not count as a pseudo-class.
|
|
2163
|
+
virtual size_t hash()
|
|
2164
|
+
{
|
|
2165
|
+
if (hash_ == 0) {
|
|
2166
|
+
hash_combine(hash_, Simple_Selector::hash());
|
|
2167
|
+
if (selector_) hash_combine(hash_, selector_->hash());
|
|
2168
|
+
}
|
|
2169
|
+
return hash_;
|
|
2170
|
+
}
|
|
2024
2171
|
virtual unsigned long specificity()
|
|
2025
2172
|
{
|
|
2026
2173
|
return selector_ ? selector_->specificity() : 0;
|
|
2027
2174
|
}
|
|
2028
2175
|
bool operator==(const Simple_Selector& rhs) const;
|
|
2029
2176
|
bool operator==(const Wrapped_Selector& rhs) const;
|
|
2030
|
-
|
|
2177
|
+
bool operator<(const Simple_Selector& rhs) const;
|
|
2178
|
+
bool operator<(const Wrapped_Selector& rhs) const;
|
|
2031
2179
|
ATTACH_OPERATIONS()
|
|
2032
2180
|
};
|
|
2033
2181
|
|
|
@@ -2043,17 +2191,19 @@ namespace Sass {
|
|
|
2043
2191
|
class Compound_Selector : public Selector, public Vectorized<Simple_Selector*> {
|
|
2044
2192
|
private:
|
|
2045
2193
|
SourcesSet sources_;
|
|
2194
|
+
ADD_PROPERTY(bool, extended);
|
|
2046
2195
|
ADD_PROPERTY(bool, has_parent_reference);
|
|
2047
2196
|
protected:
|
|
2048
2197
|
void adjust_after_pushing(Simple_Selector* s)
|
|
2049
2198
|
{
|
|
2050
|
-
if (s->has_reference()) has_reference(true);
|
|
2199
|
+
// if (s->has_reference()) has_reference(true);
|
|
2051
2200
|
if (s->has_placeholder()) has_placeholder(true);
|
|
2052
2201
|
}
|
|
2053
2202
|
public:
|
|
2054
2203
|
Compound_Selector(ParserState pstate, size_t s = 0)
|
|
2055
2204
|
: Selector(pstate),
|
|
2056
2205
|
Vectorized<Simple_Selector*>(s),
|
|
2206
|
+
extended_(false),
|
|
2057
2207
|
has_parent_reference_(false)
|
|
2058
2208
|
{ }
|
|
2059
2209
|
bool contains_placeholder() {
|
|
@@ -2079,14 +2229,22 @@ namespace Sass {
|
|
|
2079
2229
|
}
|
|
2080
2230
|
const Simple_Selector* base() const {
|
|
2081
2231
|
if (length() == 0) return 0;
|
|
2082
|
-
|
|
2232
|
+
// ToDo: why is this needed?
|
|
2233
|
+
if (dynamic_cast<Type_Selector*>((*this)[0]))
|
|
2083
2234
|
return (*this)[0];
|
|
2084
|
-
// else cerr << "SERIOUSELY " << "\n";
|
|
2085
2235
|
return 0;
|
|
2086
2236
|
}
|
|
2087
2237
|
virtual bool is_superselector_of(Compound_Selector* sub, std::string wrapped = "");
|
|
2088
2238
|
virtual bool is_superselector_of(Complex_Selector* sub, std::string wrapped = "");
|
|
2089
2239
|
virtual bool is_superselector_of(Selector_List* sub, std::string wrapped = "");
|
|
2240
|
+
virtual size_t hash()
|
|
2241
|
+
{
|
|
2242
|
+
if (Selector::hash_ == 0) {
|
|
2243
|
+
hash_combine(Selector::hash_, std::hash<int>()(SELECTOR));
|
|
2244
|
+
if (length()) hash_combine(Selector::hash_, Vectorized::hash());
|
|
2245
|
+
}
|
|
2246
|
+
return Selector::hash_;
|
|
2247
|
+
}
|
|
2090
2248
|
virtual unsigned long specificity()
|
|
2091
2249
|
{
|
|
2092
2250
|
int sum = 0;
|
|
@@ -2098,7 +2256,7 @@ namespace Sass {
|
|
|
2098
2256
|
bool is_empty_reference()
|
|
2099
2257
|
{
|
|
2100
2258
|
return length() == 1 &&
|
|
2101
|
-
|
|
2259
|
+
dynamic_cast<Parent_Selector*>((*this)[0]);
|
|
2102
2260
|
}
|
|
2103
2261
|
std::vector<std::string> to_str_vec(); // sometimes need to convert to a flat "by-value" data structure
|
|
2104
2262
|
|
|
@@ -2114,7 +2272,6 @@ namespace Sass {
|
|
|
2114
2272
|
Compound_Selector* clone(Context&) const; // does not clone the Simple_Selector*s
|
|
2115
2273
|
|
|
2116
2274
|
Compound_Selector* minus(Compound_Selector* rhs, Context& ctx);
|
|
2117
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
2118
2275
|
ATTACH_OPERATIONS()
|
|
2119
2276
|
};
|
|
2120
2277
|
|
|
@@ -2147,7 +2304,7 @@ namespace Sass {
|
|
|
2147
2304
|
head_(h), tail_(t),
|
|
2148
2305
|
reference_(r)
|
|
2149
2306
|
{
|
|
2150
|
-
if ((h && h->has_reference()) || (t && t->has_reference())) has_reference(true);
|
|
2307
|
+
// if ((h && h->has_reference()) || (t && t->has_reference())) has_reference(true);
|
|
2151
2308
|
if ((h && h->has_placeholder()) || (t && t->has_placeholder())) has_placeholder(true);
|
|
2152
2309
|
}
|
|
2153
2310
|
virtual bool has_parent_ref();
|
|
@@ -2202,6 +2359,16 @@ namespace Sass {
|
|
|
2202
2359
|
Combinator clear_innermost();
|
|
2203
2360
|
void append(Context&, Complex_Selector*);
|
|
2204
2361
|
void set_innermost(Complex_Selector*, Combinator);
|
|
2362
|
+
virtual size_t hash()
|
|
2363
|
+
{
|
|
2364
|
+
if (hash_ == 0) {
|
|
2365
|
+
hash_combine(hash_, std::hash<int>()(SELECTOR));
|
|
2366
|
+
hash_combine(hash_, std::hash<int>()(combinator_));
|
|
2367
|
+
if (head_) hash_combine(hash_, head_->hash());
|
|
2368
|
+
if (tail_) hash_combine(hash_, tail_->hash());
|
|
2369
|
+
}
|
|
2370
|
+
return hash_;
|
|
2371
|
+
}
|
|
2205
2372
|
virtual unsigned long specificity() const
|
|
2206
2373
|
{
|
|
2207
2374
|
int sum = 0;
|
|
@@ -2263,7 +2430,6 @@ namespace Sass {
|
|
|
2263
2430
|
Complex_Selector* clone(Context&) const; // does not clone Compound_Selector*s
|
|
2264
2431
|
Complex_Selector* cloneFully(Context&) const; // clones Compound_Selector*s
|
|
2265
2432
|
// std::vector<Compound_Selector*> to_vector();
|
|
2266
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
2267
2433
|
ATTACH_OPERATIONS()
|
|
2268
2434
|
};
|
|
2269
2435
|
|
|
@@ -2284,6 +2450,7 @@ namespace Sass {
|
|
|
2284
2450
|
std::string type() { return "list"; }
|
|
2285
2451
|
// remove parent selector references
|
|
2286
2452
|
// basically unwraps parsed selectors
|
|
2453
|
+
virtual bool has_parent_ref();
|
|
2287
2454
|
void remove_parent_selectors();
|
|
2288
2455
|
// virtual Selector_Placeholder* find_placeholder();
|
|
2289
2456
|
Selector_List* parentize(Selector_List* parents, Context& ctx);
|
|
@@ -2292,6 +2459,14 @@ namespace Sass {
|
|
|
2292
2459
|
virtual bool is_superselector_of(Selector_List* sub, std::string wrapping = "");
|
|
2293
2460
|
Selector_List* unify_with(Selector_List*, Context&);
|
|
2294
2461
|
void populate_extends(Selector_List*, Context&, ExtensionSubsetMap&);
|
|
2462
|
+
virtual size_t hash()
|
|
2463
|
+
{
|
|
2464
|
+
if (Selector::hash_ == 0) {
|
|
2465
|
+
hash_combine(Selector::hash_, std::hash<int>()(SELECTOR));
|
|
2466
|
+
hash_combine(Selector::hash_, Vectorized::hash());
|
|
2467
|
+
}
|
|
2468
|
+
return Selector::hash_;
|
|
2469
|
+
}
|
|
2295
2470
|
virtual unsigned long specificity()
|
|
2296
2471
|
{
|
|
2297
2472
|
unsigned long sum = 0;
|
|
@@ -2309,7 +2484,6 @@ namespace Sass {
|
|
|
2309
2484
|
virtual bool operator==(const Selector_List& rhs) const;
|
|
2310
2485
|
// Selector Lists can be compared to comma lists
|
|
2311
2486
|
virtual bool operator==(const Expression& rhs) const;
|
|
2312
|
-
virtual std::string to_string(bool compressed = false, int precision = 5) const;
|
|
2313
2487
|
ATTACH_OPERATIONS()
|
|
2314
2488
|
};
|
|
2315
2489
|
|