sassc 2.2.1 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/CHANGELOG.md +18 -0
- data/Rakefile +1 -3
- data/ext/extconf.rb +13 -5
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/base.h +2 -1
- data/ext/libsass/include/sass/context.h +4 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +158 -168
- data/ext/libsass/src/ast.hpp +389 -230
- data/ext/libsass/src/ast_def_macros.hpp +18 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +4 -3
- data/ext/libsass/src/ast_fwd_decl.hpp +98 -165
- data/ext/libsass/src/ast_helpers.hpp +292 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +219 -732
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +207 -212
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +594 -1026
- data/ext/libsass/src/ast_selectors.hpp +339 -385
- data/ext/libsass/src/ast_supports.cpp +36 -52
- data/ext/libsass/src/ast_supports.hpp +29 -29
- data/ext/libsass/src/ast_values.cpp +271 -84
- data/ext/libsass/src/ast_values.hpp +116 -107
- data/ext/libsass/src/backtrace.cpp +9 -9
- data/ext/libsass/src/backtrace.hpp +5 -5
- data/ext/libsass/src/base64vlq.cpp +2 -2
- data/ext/libsass/src/base64vlq.hpp +1 -1
- data/ext/libsass/src/bind.cpp +18 -18
- data/ext/libsass/src/bind.hpp +1 -1
- data/ext/libsass/src/c2ast.cpp +3 -3
- data/ext/libsass/src/c2ast.hpp +1 -1
- data/ext/libsass/src/cencode.c +4 -6
- data/ext/libsass/src/check_nesting.cpp +40 -41
- data/ext/libsass/src/check_nesting.hpp +6 -2
- data/ext/libsass/src/color_maps.cpp +14 -13
- data/ext/libsass/src/color_maps.hpp +1 -9
- data/ext/libsass/src/constants.cpp +5 -0
- data/ext/libsass/src/constants.hpp +6 -0
- data/ext/libsass/src/context.cpp +92 -119
- data/ext/libsass/src/context.hpp +41 -53
- data/ext/libsass/src/cssize.cpp +66 -149
- data/ext/libsass/src/cssize.hpp +17 -23
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debugger.hpp +451 -295
- data/ext/libsass/src/emitter.cpp +15 -16
- data/ext/libsass/src/emitter.hpp +10 -12
- data/ext/libsass/src/environment.cpp +27 -27
- data/ext/libsass/src/environment.hpp +29 -24
- data/ext/libsass/src/error_handling.cpp +62 -41
- data/ext/libsass/src/error_handling.hpp +61 -51
- data/ext/libsass/src/eval.cpp +167 -281
- data/ext/libsass/src/eval.hpp +27 -29
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +275 -222
- data/ext/libsass/src/expand.hpp +36 -16
- data/ext/libsass/src/extender.cpp +1188 -0
- data/ext/libsass/src/extender.hpp +399 -0
- data/ext/libsass/src/extension.cpp +43 -0
- data/ext/libsass/src/extension.hpp +89 -0
- data/ext/libsass/src/file.cpp +81 -72
- data/ext/libsass/src/file.hpp +28 -37
- data/ext/libsass/src/fn_colors.cpp +20 -18
- data/ext/libsass/src/fn_lists.cpp +30 -29
- data/ext/libsass/src/fn_maps.cpp +3 -3
- data/ext/libsass/src/fn_miscs.cpp +34 -46
- data/ext/libsass/src/fn_numbers.cpp +20 -13
- data/ext/libsass/src/fn_selectors.cpp +98 -128
- data/ext/libsass/src/fn_strings.cpp +47 -33
- data/ext/libsass/src/fn_utils.cpp +31 -29
- data/ext/libsass/src/fn_utils.hpp +17 -11
- data/ext/libsass/src/inspect.cpp +186 -148
- data/ext/libsass/src/inspect.hpp +31 -29
- data/ext/libsass/src/lexer.cpp +20 -82
- data/ext/libsass/src/lexer.hpp +5 -16
- data/ext/libsass/src/listize.cpp +23 -37
- data/ext/libsass/src/listize.hpp +8 -9
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
- data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/operation.hpp +71 -61
- data/ext/libsass/src/operators.cpp +19 -18
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +45 -64
- data/ext/libsass/src/output.hpp +6 -6
- data/ext/libsass/src/parser.cpp +512 -700
- data/ext/libsass/src/parser.hpp +89 -97
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +7 -7
- data/ext/libsass/src/plugins.hpp +8 -8
- data/ext/libsass/src/position.cpp +7 -26
- data/ext/libsass/src/position.hpp +44 -21
- data/ext/libsass/src/prelexer.cpp +6 -6
- data/ext/libsass/src/remove_placeholders.cpp +55 -56
- data/ext/libsass/src/remove_placeholders.hpp +21 -18
- data/ext/libsass/src/sass.cpp +16 -15
- data/ext/libsass/src/sass.hpp +10 -5
- data/ext/libsass/src/sass2scss.cpp +4 -4
- data/ext/libsass/src/sass_context.cpp +91 -122
- data/ext/libsass/src/sass_context.hpp +2 -2
- data/ext/libsass/src/sass_functions.cpp +1 -1
- data/ext/libsass/src/sass_values.cpp +8 -11
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +22 -18
- data/ext/libsass/src/source_map.hpp +12 -9
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +2 -2
- data/ext/libsass/src/to_value.hpp +1 -1
- data/ext/libsass/src/units.cpp +24 -22
- data/ext/libsass/src/units.hpp +8 -8
- data/ext/libsass/src/utf8_string.cpp +9 -10
- data/ext/libsass/src/utf8_string.hpp +7 -6
- data/ext/libsass/src/util.cpp +48 -50
- data/ext/libsass/src/util.hpp +20 -21
- data/ext/libsass/src/util_string.cpp +111 -61
- data/ext/libsass/src/util_string.hpp +62 -8
- data/ext/libsass/src/values.cpp +12 -12
- data/lib/sassc/engine.rb +5 -3
- data/lib/sassc/functions_handler.rb +8 -8
- data/lib/sassc/native.rb +4 -6
- data/lib/sassc/script.rb +4 -4
- data/lib/sassc/version.rb +1 -1
- data/test/functions_test.rb +18 -1
- data/test/native_test.rb +4 -4
- metadata +29 -15
- data/ext/libsass/src/extend.cpp +0 -2132
- data/ext/libsass/src/extend.hpp +0 -86
- data/ext/libsass/src/node.cpp +0 -322
- data/ext/libsass/src/node.hpp +0 -118
- data/ext/libsass/src/paths.hpp +0 -71
- data/ext/libsass/src/sass_util.cpp +0 -152
- data/ext/libsass/src/sass_util.hpp +0 -256
- data/ext/libsass/src/subset_map.cpp +0 -58
- data/ext/libsass/src/subset_map.hpp +0 -76
- data/lib/sassc/native/lib_c.rb +0 -21
data/ext/libsass/src/bind.cpp
CHANGED
@@ -11,11 +11,11 @@
|
|
11
11
|
|
12
12
|
namespace Sass {
|
13
13
|
|
14
|
-
void bind(
|
14
|
+
void bind(sass::string type, sass::string name, Parameters_Obj ps, Arguments_Obj as, Env* env, Eval* eval, Backtraces& traces)
|
15
15
|
{
|
16
|
-
|
16
|
+
sass::string callee(type + " " + name);
|
17
17
|
|
18
|
-
std::map<
|
18
|
+
std::map<sass::string, Parameter_Obj> param_map;
|
19
19
|
List_Obj varargs = SASS_MEMORY_NEW(List, as->pstate());
|
20
20
|
varargs->is_arglist(true); // enable keyword size handling
|
21
21
|
|
@@ -52,7 +52,7 @@ namespace Sass {
|
|
52
52
|
}
|
53
53
|
}
|
54
54
|
}
|
55
|
-
|
55
|
+
sass::ostream msg;
|
56
56
|
msg << "wrong number of arguments (" << LA << " for " << LP << ")";
|
57
57
|
msg << " for `" << name << "'";
|
58
58
|
return error(msg.str(), as->pstate(), traces);
|
@@ -73,7 +73,7 @@ namespace Sass {
|
|
73
73
|
rest->separator(),
|
74
74
|
true);
|
75
75
|
// wrap each item from list as an argument
|
76
|
-
for (
|
76
|
+
for (ExpressionObj item : rest->elements()) {
|
77
77
|
if (Argument_Obj arg = Cast<Argument>(item)) {
|
78
78
|
arglist->append(SASS_MEMORY_COPY(arg)); // copy
|
79
79
|
} else {
|
@@ -100,7 +100,7 @@ namespace Sass {
|
|
100
100
|
Map_Obj argmap = Cast<Map>(a->value());
|
101
101
|
for (auto key : argmap->keys()) {
|
102
102
|
if (String_Constant_Obj str = Cast<String_Constant>(key)) {
|
103
|
-
|
103
|
+
sass::string param = unquote(str->value());
|
104
104
|
arglist->append(SASS_MEMORY_NEW(Argument,
|
105
105
|
key->pstate(),
|
106
106
|
argmap->at(key),
|
@@ -130,7 +130,7 @@ namespace Sass {
|
|
130
130
|
// skip any list completely if empty
|
131
131
|
if (ls && ls->empty() && a->is_rest_argument()) continue;
|
132
132
|
|
133
|
-
|
133
|
+
ExpressionObj value = a->value();
|
134
134
|
if (Argument_Obj arg = Cast<Argument>(value)) {
|
135
135
|
arglist->append(arg);
|
136
136
|
}
|
@@ -141,7 +141,7 @@ namespace Sass {
|
|
141
141
|
arglist->separator(rest->separator());
|
142
142
|
|
143
143
|
for (size_t i = 0, L = rest->length(); i < L; ++i) {
|
144
|
-
|
144
|
+
ExpressionObj obj = rest->value_at_index(i);
|
145
145
|
arglist->append(SASS_MEMORY_NEW(Argument,
|
146
146
|
obj->pstate(),
|
147
147
|
obj,
|
@@ -168,7 +168,7 @@ namespace Sass {
|
|
168
168
|
}
|
169
169
|
// consumed parameter
|
170
170
|
++ip;
|
171
|
-
// no more
|
171
|
+
// no more parameters
|
172
172
|
break;
|
173
173
|
}
|
174
174
|
|
@@ -177,7 +177,7 @@ namespace Sass {
|
|
177
177
|
// normal param and rest arg
|
178
178
|
List_Obj arglist = Cast<List>(a->value());
|
179
179
|
if (!arglist) {
|
180
|
-
if (
|
180
|
+
if (ExpressionObj arg = Cast<Expression>(a->value())) {
|
181
181
|
arglist = SASS_MEMORY_NEW(List, a->pstate(), 1);
|
182
182
|
arglist->append(arg);
|
183
183
|
}
|
@@ -189,7 +189,7 @@ namespace Sass {
|
|
189
189
|
} else {
|
190
190
|
if (arglist->length() > LP - ip && !ps->has_rest_parameter()) {
|
191
191
|
size_t arg_count = (arglist->length() + LA - 1);
|
192
|
-
|
192
|
+
sass::ostream msg;
|
193
193
|
msg << callee << " takes " << LP;
|
194
194
|
msg << (LP == 1 ? " argument" : " arguments");
|
195
195
|
msg << " but " << arg_count;
|
@@ -202,7 +202,7 @@ namespace Sass {
|
|
202
202
|
}
|
203
203
|
}
|
204
204
|
// otherwise move one of the rest args into the param, converting to argument if necessary
|
205
|
-
|
205
|
+
ExpressionObj obj = arglist->at(0);
|
206
206
|
if (!(a = Cast<Argument>(obj))) {
|
207
207
|
Expression* a_to_convert = obj;
|
208
208
|
a = SASS_MEMORY_NEW(Argument,
|
@@ -226,10 +226,10 @@ namespace Sass {
|
|
226
226
|
traces.push_back(Backtrace(key->pstate()));
|
227
227
|
throw Exception::InvalidVarKwdType(key->pstate(), traces, key->inspect(), a);
|
228
228
|
}
|
229
|
-
|
229
|
+
sass::string param = "$" + unquote(val->value());
|
230
230
|
|
231
231
|
if (!param_map.count(param)) {
|
232
|
-
|
232
|
+
sass::ostream msg;
|
233
233
|
msg << callee << " has no parameter named " << param;
|
234
234
|
error(msg.str(), a->pstate(), traces);
|
235
235
|
}
|
@@ -243,7 +243,7 @@ namespace Sass {
|
|
243
243
|
|
244
244
|
if (a->name().empty()) {
|
245
245
|
if (env->has_local(p->name())) {
|
246
|
-
|
246
|
+
sass::ostream msg;
|
247
247
|
msg << "parameter " << p->name()
|
248
248
|
<< " provided more than once in call to " << callee;
|
249
249
|
error(msg.str(), a->pstate(), traces);
|
@@ -258,21 +258,21 @@ namespace Sass {
|
|
258
258
|
if (ps->has_rest_parameter()) {
|
259
259
|
varargs->append(a);
|
260
260
|
} else {
|
261
|
-
|
261
|
+
sass::ostream msg;
|
262
262
|
msg << callee << " has no parameter named " << a->name();
|
263
263
|
error(msg.str(), a->pstate(), traces);
|
264
264
|
}
|
265
265
|
}
|
266
266
|
if (param_map[a->name()]) {
|
267
267
|
if (param_map[a->name()]->is_rest_parameter()) {
|
268
|
-
|
268
|
+
sass::ostream msg;
|
269
269
|
msg << "argument " << a->name() << " of " << callee
|
270
270
|
<< "cannot be used as named argument";
|
271
271
|
error(msg.str(), a->pstate(), traces);
|
272
272
|
}
|
273
273
|
}
|
274
274
|
if (env->has_local(a->name())) {
|
275
|
-
|
275
|
+
sass::ostream msg;
|
276
276
|
msg << "parameter " << p->name()
|
277
277
|
<< "provided more than once in call to " << callee;
|
278
278
|
error(msg.str(), a->pstate(), traces);
|
data/ext/libsass/src/bind.hpp
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
namespace Sass {
|
10
10
|
|
11
|
-
void bind(
|
11
|
+
void bind(sass::string type, sass::string name, Parameters_Obj, Arguments_Obj, Env*, Eval*, Backtraces& traces);
|
12
12
|
|
13
13
|
}
|
14
14
|
|
data/ext/libsass/src/c2ast.cpp
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
namespace Sass {
|
10
10
|
|
11
|
-
Value* c2ast(union Sass_Value* v, Backtraces traces,
|
11
|
+
Value* c2ast(union Sass_Value* v, Backtraces traces, SourceSpan pstate)
|
12
12
|
{
|
13
13
|
using std::strlen;
|
14
14
|
using std::strcpy;
|
@@ -51,10 +51,10 @@ namespace Sass {
|
|
51
51
|
e = SASS_MEMORY_NEW(Null, pstate);
|
52
52
|
} break;
|
53
53
|
case SASS_ERROR: {
|
54
|
-
error("Error in C function: " +
|
54
|
+
error("Error in C function: " + sass::string(sass_error_get_message(v)), pstate, traces);
|
55
55
|
} break;
|
56
56
|
case SASS_WARNING: {
|
57
|
-
error("Warning in C function: " +
|
57
|
+
error("Warning in C function: " + sass::string(sass_warning_get_message(v)), pstate, traces);
|
58
58
|
} break;
|
59
59
|
default: break;
|
60
60
|
}
|
data/ext/libsass/src/c2ast.hpp
CHANGED
data/ext/libsass/src/cencode.c
CHANGED
@@ -46,9 +46,8 @@ int base64_encode_block(const char* plaintext_in, int length_in, char* code_out,
|
|
46
46
|
result = (fragment & 0x0fc) >> 2;
|
47
47
|
*codechar++ = base64_encode_value(result);
|
48
48
|
result = (fragment & 0x003) << 4;
|
49
|
-
|
50
|
-
|
51
|
-
#endif
|
49
|
+
/* fall through */
|
50
|
+
|
52
51
|
case step_B:
|
53
52
|
if (plainchar == plaintextend)
|
54
53
|
{
|
@@ -60,9 +59,8 @@ int base64_encode_block(const char* plaintext_in, int length_in, char* code_out,
|
|
60
59
|
result |= (fragment & 0x0f0) >> 4;
|
61
60
|
*codechar++ = base64_encode_value(result);
|
62
61
|
result = (fragment & 0x00f) << 2;
|
63
|
-
|
64
|
-
|
65
|
-
#endif
|
62
|
+
/* fall through */
|
63
|
+
|
66
64
|
case step_C:
|
67
65
|
if (plainchar == plaintextend)
|
68
66
|
{
|
@@ -1,20 +1,18 @@
|
|
1
1
|
// sass.hpp must go before all system headers to get the
|
2
2
|
// __EXTENSIONS__ fix on Solaris.
|
3
3
|
#include "sass.hpp"
|
4
|
-
|
5
|
-
#include <vector>
|
6
|
-
|
4
|
+
#include "ast.hpp"
|
7
5
|
#include "check_nesting.hpp"
|
8
6
|
|
9
7
|
namespace Sass {
|
10
8
|
|
11
9
|
CheckNesting::CheckNesting()
|
12
|
-
: parents(
|
13
|
-
traces(
|
10
|
+
: parents(sass::vector<Statement*>()),
|
11
|
+
traces(sass::vector<Backtrace>()),
|
14
12
|
parent(0), current_mixin_definition(0)
|
15
13
|
{ }
|
16
14
|
|
17
|
-
void error(AST_Node* node, Backtraces traces,
|
15
|
+
void error(AST_Node* node, Backtraces traces, sass::string msg) {
|
18
16
|
traces.push_back(Backtrace(node->pstate()));
|
19
17
|
throw Exception::InvalidSass(node->pstate(), traces, msg);
|
20
18
|
}
|
@@ -23,9 +21,9 @@ namespace Sass {
|
|
23
21
|
{
|
24
22
|
Statement* old_parent = this->parent;
|
25
23
|
|
26
|
-
if (
|
27
|
-
|
28
|
-
|
24
|
+
if (AtRootRule* root = Cast<AtRootRule>(parent)) {
|
25
|
+
sass::vector<Statement*> old_parents = this->parents;
|
26
|
+
sass::vector<Statement*> new_parents;
|
29
27
|
|
30
28
|
for (size_t i = 0, L = this->parents.size(); i < L; i++) {
|
31
29
|
Statement* p = this->parents.at(i);
|
@@ -47,7 +45,7 @@ namespace Sass {
|
|
47
45
|
}
|
48
46
|
}
|
49
47
|
|
50
|
-
|
48
|
+
AtRootRule* ar = Cast<AtRootRule>(parent);
|
51
49
|
Block* ret = ar->block();
|
52
50
|
|
53
51
|
if (ret != NULL) {
|
@@ -77,7 +75,7 @@ namespace Sass {
|
|
77
75
|
}
|
78
76
|
|
79
77
|
if (!b) {
|
80
|
-
if (
|
78
|
+
if (ParentStatement* bb = Cast<ParentStatement>(parent)) {
|
81
79
|
b = bb->block();
|
82
80
|
}
|
83
81
|
}
|
@@ -145,7 +143,7 @@ namespace Sass {
|
|
145
143
|
if (is_charset(node))
|
146
144
|
{ this->invalid_charset_parent(this->parent, node); }
|
147
145
|
|
148
|
-
if (Cast<
|
146
|
+
if (Cast<ExtendRule>(node))
|
149
147
|
{ this->invalid_extend_parent(this->parent, node); }
|
150
148
|
|
151
149
|
// if (Cast<Import>(node))
|
@@ -194,7 +192,7 @@ namespace Sass {
|
|
194
192
|
void CheckNesting::invalid_extend_parent(Statement* parent, AST_Node* node)
|
195
193
|
{
|
196
194
|
if (!(
|
197
|
-
Cast<
|
195
|
+
Cast<StyleRule>(parent) ||
|
198
196
|
Cast<Mixin_Call>(parent) ||
|
199
197
|
is_mixin(parent)
|
200
198
|
)) {
|
@@ -206,10 +204,10 @@ namespace Sass {
|
|
206
204
|
// {
|
207
205
|
// for (auto pp : this->parents) {
|
208
206
|
// if (
|
209
|
-
// Cast<
|
210
|
-
// Cast<
|
207
|
+
// Cast<EachRule>(pp) ||
|
208
|
+
// Cast<ForRule>(pp) ||
|
211
209
|
// Cast<If>(pp) ||
|
212
|
-
// Cast<
|
210
|
+
// Cast<WhileRule>(pp) ||
|
213
211
|
// Cast<Trace>(pp) ||
|
214
212
|
// Cast<Mixin_Call>(pp) ||
|
215
213
|
// is_mixin(pp)
|
@@ -231,10 +229,10 @@ namespace Sass {
|
|
231
229
|
{
|
232
230
|
for (Statement* pp : this->parents) {
|
233
231
|
if (
|
234
|
-
Cast<
|
235
|
-
Cast<
|
232
|
+
Cast<EachRule>(pp) ||
|
233
|
+
Cast<ForRule>(pp) ||
|
236
234
|
Cast<If>(pp) ||
|
237
|
-
Cast<
|
235
|
+
Cast<WhileRule>(pp) ||
|
238
236
|
Cast<Trace>(pp) ||
|
239
237
|
Cast<Mixin_Call>(pp) ||
|
240
238
|
is_mixin(pp)
|
@@ -248,10 +246,10 @@ namespace Sass {
|
|
248
246
|
{
|
249
247
|
for (Statement* pp : this->parents) {
|
250
248
|
if (
|
251
|
-
Cast<
|
252
|
-
Cast<
|
249
|
+
Cast<EachRule>(pp) ||
|
250
|
+
Cast<ForRule>(pp) ||
|
253
251
|
Cast<If>(pp) ||
|
254
|
-
Cast<
|
252
|
+
Cast<WhileRule>(pp) ||
|
255
253
|
Cast<Trace>(pp) ||
|
256
254
|
Cast<Mixin_Call>(pp) ||
|
257
255
|
is_mixin(pp)
|
@@ -264,19 +262,19 @@ namespace Sass {
|
|
264
262
|
void CheckNesting::invalid_function_child(Statement* child)
|
265
263
|
{
|
266
264
|
if (!(
|
267
|
-
Cast<
|
268
|
-
Cast<
|
265
|
+
Cast<EachRule>(child) ||
|
266
|
+
Cast<ForRule>(child) ||
|
269
267
|
Cast<If>(child) ||
|
270
|
-
Cast<
|
268
|
+
Cast<WhileRule>(child) ||
|
271
269
|
Cast<Trace>(child) ||
|
272
270
|
Cast<Comment>(child) ||
|
273
|
-
Cast<
|
271
|
+
Cast<DebugRule>(child) ||
|
274
272
|
Cast<Return>(child) ||
|
275
273
|
Cast<Variable>(child) ||
|
276
274
|
// Ruby Sass doesn't distinguish variables and assignments
|
277
275
|
Cast<Assignment>(child) ||
|
278
|
-
Cast<
|
279
|
-
Cast<
|
276
|
+
Cast<WarningRule>(child) ||
|
277
|
+
Cast<ErrorRule>(child)
|
280
278
|
)) {
|
281
279
|
error(child, traces, "Functions can only contain variable declarations and control directives.");
|
282
280
|
}
|
@@ -285,10 +283,10 @@ namespace Sass {
|
|
285
283
|
void CheckNesting::invalid_prop_child(Statement* child)
|
286
284
|
{
|
287
285
|
if (!(
|
288
|
-
Cast<
|
289
|
-
Cast<
|
286
|
+
Cast<EachRule>(child) ||
|
287
|
+
Cast<ForRule>(child) ||
|
290
288
|
Cast<If>(child) ||
|
291
|
-
Cast<
|
289
|
+
Cast<WhileRule>(child) ||
|
292
290
|
Cast<Trace>(child) ||
|
293
291
|
Cast<Comment>(child) ||
|
294
292
|
Cast<Declaration>(child) ||
|
@@ -303,7 +301,7 @@ namespace Sass {
|
|
303
301
|
if (!(
|
304
302
|
is_mixin(parent) ||
|
305
303
|
is_directive_node(parent) ||
|
306
|
-
Cast<
|
304
|
+
Cast<StyleRule>(parent) ||
|
307
305
|
Cast<Keyframe_Rule>(parent) ||
|
308
306
|
Cast<Declaration>(parent) ||
|
309
307
|
Cast<Mixin_Call>(parent)
|
@@ -345,17 +343,17 @@ namespace Sass {
|
|
345
343
|
!is_at_root_node(grandparent);
|
346
344
|
|
347
345
|
return Cast<Import>(parent) ||
|
348
|
-
Cast<
|
349
|
-
Cast<
|
346
|
+
Cast<EachRule>(parent) ||
|
347
|
+
Cast<ForRule>(parent) ||
|
350
348
|
Cast<If>(parent) ||
|
351
|
-
Cast<
|
349
|
+
Cast<WhileRule>(parent) ||
|
352
350
|
Cast<Trace>(parent) ||
|
353
351
|
valid_bubble_node;
|
354
352
|
}
|
355
353
|
|
356
354
|
bool CheckNesting::is_charset(Statement* n)
|
357
355
|
{
|
358
|
-
|
356
|
+
AtRule* d = Cast<AtRule>(n);
|
359
357
|
return d && d->keyword() == "charset";
|
360
358
|
}
|
361
359
|
|
@@ -373,7 +371,7 @@ namespace Sass {
|
|
373
371
|
|
374
372
|
bool CheckNesting::is_root_node(Statement* n)
|
375
373
|
{
|
376
|
-
if (Cast<
|
374
|
+
if (Cast<StyleRule>(n)) return false;
|
377
375
|
|
378
376
|
Block* b = Cast<Block>(n);
|
379
377
|
return b && b->is_root();
|
@@ -381,14 +379,15 @@ namespace Sass {
|
|
381
379
|
|
382
380
|
bool CheckNesting::is_at_root_node(Statement* n)
|
383
381
|
{
|
384
|
-
return Cast<
|
382
|
+
return Cast<AtRootRule>(n) != NULL;
|
385
383
|
}
|
386
384
|
|
387
385
|
bool CheckNesting::is_directive_node(Statement* n)
|
388
386
|
{
|
389
|
-
return Cast<
|
387
|
+
return Cast<AtRule>(n) ||
|
390
388
|
Cast<Import>(n) ||
|
391
|
-
|
392
|
-
|
389
|
+
Cast<MediaRule>(n) ||
|
390
|
+
Cast<CssMediaRule>(n) ||
|
391
|
+
Cast<SupportsRule>(n);
|
393
392
|
}
|
394
393
|
}
|
@@ -1,14 +1,18 @@
|
|
1
1
|
#ifndef SASS_CHECK_NESTING_H
|
2
2
|
#define SASS_CHECK_NESTING_H
|
3
3
|
|
4
|
+
// sass.hpp must go before all system headers to get the
|
5
|
+
// __EXTENSIONS__ fix on Solaris.
|
6
|
+
#include "sass.hpp"
|
4
7
|
#include "ast.hpp"
|
5
8
|
#include "operation.hpp"
|
9
|
+
#include <vector>
|
6
10
|
|
7
11
|
namespace Sass {
|
8
12
|
|
9
13
|
class CheckNesting : public Operation_CRTP<Statement*, CheckNesting> {
|
10
14
|
|
11
|
-
|
15
|
+
sass::vector<Statement*> parents;
|
12
16
|
Backtraces traces;
|
13
17
|
Statement* parent;
|
14
18
|
Definition* current_mixin_definition;
|
@@ -29,7 +33,7 @@ namespace Sass {
|
|
29
33
|
Statement* s = Cast<Statement>(x);
|
30
34
|
if (s && this->should_visit(s)) {
|
31
35
|
Block* b1 = Cast<Block>(s);
|
32
|
-
|
36
|
+
ParentStatement* b2 = Cast<ParentStatement>(s);
|
33
37
|
if (b1 || b2) return visit_children(s);
|
34
38
|
}
|
35
39
|
return s;
|
@@ -4,6 +4,7 @@
|
|
4
4
|
|
5
5
|
#include "ast.hpp"
|
6
6
|
#include "color_maps.hpp"
|
7
|
+
#include "util_string.hpp"
|
7
8
|
|
8
9
|
namespace Sass {
|
9
10
|
|
@@ -161,7 +162,7 @@ namespace Sass {
|
|
161
162
|
}
|
162
163
|
|
163
164
|
namespace Colors {
|
164
|
-
const
|
165
|
+
const SourceSpan color_table("[COLOR TABLE]");
|
165
166
|
const Color_RGBA aliceblue(color_table, 240, 248, 255, 1);
|
166
167
|
const Color_RGBA antiquewhite(color_table, 250, 235, 215, 1);
|
167
168
|
const Color_RGBA cyan(color_table, 0, 255, 255, 1);
|
@@ -313,7 +314,7 @@ namespace Sass {
|
|
313
314
|
const Color_RGBA transparent(color_table, 0, 0, 0, 0);
|
314
315
|
}
|
315
316
|
|
316
|
-
const std::
|
317
|
+
static const auto* const colors_to_names = new std::unordered_map<int, const char*> {
|
317
318
|
{ 240 * 0x10000 + 248 * 0x100 + 255, ColorNames::aliceblue },
|
318
319
|
{ 250 * 0x10000 + 235 * 0x100 + 215, ColorNames::antiquewhite },
|
319
320
|
{ 0 * 0x10000 + 255 * 0x100 + 255, ColorNames::cyan },
|
@@ -455,7 +456,7 @@ namespace Sass {
|
|
455
456
|
{ 102 * 0x10000 + 51 * 0x100 + 153, ColorNames::rebeccapurple }
|
456
457
|
};
|
457
458
|
|
458
|
-
const std::
|
459
|
+
static const auto *const names_to_colors = new std::unordered_map<sass::string, const Color_RGBA*>
|
459
460
|
{
|
460
461
|
{ ColorNames::aliceblue, &Colors::aliceblue },
|
461
462
|
{ ColorNames::antiquewhite, &Colors::antiquewhite },
|
@@ -610,29 +611,29 @@ namespace Sass {
|
|
610
611
|
|
611
612
|
const Color_RGBA* name_to_color(const char* key)
|
612
613
|
{
|
613
|
-
return name_to_color(
|
614
|
+
return name_to_color(sass::string(key));
|
614
615
|
}
|
615
616
|
|
616
|
-
const Color_RGBA* name_to_color(const
|
617
|
+
const Color_RGBA* name_to_color(const sass::string& key)
|
617
618
|
{
|
618
619
|
// case insensitive lookup. See #2462
|
619
|
-
|
620
|
-
|
620
|
+
sass::string lower = key;
|
621
|
+
Util::ascii_str_tolower(&lower);
|
621
622
|
|
622
|
-
auto p = names_to_colors
|
623
|
-
if (p != names_to_colors
|
623
|
+
auto p = names_to_colors->find(lower);
|
624
|
+
if (p != names_to_colors->end()) {
|
624
625
|
return p->second;
|
625
626
|
}
|
626
|
-
return
|
627
|
+
return nullptr;
|
627
628
|
}
|
628
629
|
|
629
630
|
const char* color_to_name(const int key)
|
630
631
|
{
|
631
|
-
auto p = colors_to_names
|
632
|
-
if (p != colors_to_names
|
632
|
+
auto p = colors_to_names->find(key);
|
633
|
+
if (p != colors_to_names->end()) {
|
633
634
|
return p->second;
|
634
635
|
}
|
635
|
-
return
|
636
|
+
return nullptr;
|
636
637
|
}
|
637
638
|
|
638
639
|
const char* color_to_name(const double key)
|
@@ -7,14 +7,6 @@
|
|
7
7
|
|
8
8
|
namespace Sass {
|
9
9
|
|
10
|
-
struct map_cmp_str
|
11
|
-
{
|
12
|
-
bool operator()(char const *a, char const *b) const
|
13
|
-
{
|
14
|
-
return std::strcmp(a, b) < 0;
|
15
|
-
}
|
16
|
-
};
|
17
|
-
|
18
10
|
namespace ColorNames
|
19
11
|
{
|
20
12
|
extern const char aliceblue[];
|
@@ -321,7 +313,7 @@ namespace Sass {
|
|
321
313
|
}
|
322
314
|
|
323
315
|
const Color_RGBA* name_to_color(const char*);
|
324
|
-
const Color_RGBA* name_to_color(const
|
316
|
+
const Color_RGBA* name_to_color(const sass::string&);
|
325
317
|
const char* color_to_name(const int);
|
326
318
|
const char* color_to_name(const Color_RGBA&);
|
327
319
|
const char* color_to_name(const double);
|
@@ -45,6 +45,7 @@ namespace Sass {
|
|
45
45
|
extern const char for_kwd[] = "@for";
|
46
46
|
extern const char from_kwd[] = "from";
|
47
47
|
extern const char to_kwd[] = "to";
|
48
|
+
extern const char of_kwd[] = "of";
|
48
49
|
extern const char through_kwd[] = "through";
|
49
50
|
extern const char each_kwd[] = "@each";
|
50
51
|
extern const char in_kwd[] = "in";
|
@@ -161,6 +162,10 @@ namespace Sass {
|
|
161
162
|
extern const char uri_chars[] = ":;/?!%&#@|[]{}'`^\"*+-.,_=~";
|
162
163
|
extern const char real_uri_chars[] = "#%&";
|
163
164
|
|
165
|
+
extern const char selector_combinator_child[] = ">";
|
166
|
+
extern const char selector_combinator_general[] = "~";
|
167
|
+
extern const char selector_combinator_adjacent[] = "+";
|
168
|
+
|
164
169
|
// some specific constant character classes
|
165
170
|
// they must be static to be useable by lexer
|
166
171
|
extern const char static_ops[] = "*/%";
|
@@ -43,6 +43,7 @@ namespace Sass {
|
|
43
43
|
extern const char for_kwd[];
|
44
44
|
extern const char from_kwd[];
|
45
45
|
extern const char to_kwd[];
|
46
|
+
extern const char of_kwd[];
|
46
47
|
extern const char through_kwd[];
|
47
48
|
extern const char each_kwd[];
|
48
49
|
extern const char in_kwd[];
|
@@ -161,6 +162,11 @@ namespace Sass {
|
|
161
162
|
extern const char uri_chars[];
|
162
163
|
extern const char real_uri_chars[];
|
163
164
|
|
165
|
+
// constants for selector combinators
|
166
|
+
extern const char selector_combinator_child[];
|
167
|
+
extern const char selector_combinator_general[];
|
168
|
+
extern const char selector_combinator_adjacent[];
|
169
|
+
|
164
170
|
// some specific constant character classes
|
165
171
|
// they must be static to be useable by lexer
|
166
172
|
extern const char static_ops[];
|