sassc 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +5 -0
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/context.h +3 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +117 -117
- data/ext/libsass/src/ast.hpp +160 -162
- data/ext/libsass/src/ast_def_macros.hpp +10 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +2 -2
- data/ext/libsass/src/ast_fwd_decl.hpp +61 -52
- data/ext/libsass/src/ast_helpers.hpp +5 -5
- data/ext/libsass/src/ast_sel_cmp.cpp +18 -18
- data/ext/libsass/src/ast_sel_super.cpp +52 -52
- data/ext/libsass/src/ast_sel_unify.cpp +16 -16
- data/ext/libsass/src/ast_sel_weave.cpp +62 -62
- data/ext/libsass/src/ast_selectors.cpp +87 -77
- data/ext/libsass/src/ast_selectors.hpp +72 -62
- data/ext/libsass/src/ast_supports.cpp +35 -35
- data/ext/libsass/src/ast_supports.hpp +29 -29
- data/ext/libsass/src/ast_values.cpp +58 -58
- data/ext/libsass/src/ast_values.hpp +75 -75
- 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 +17 -17
- 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/check_nesting.cpp +36 -36
- data/ext/libsass/src/check_nesting.hpp +2 -2
- data/ext/libsass/src/color_maps.cpp +5 -5
- data/ext/libsass/src/color_maps.hpp +1 -1
- data/ext/libsass/src/context.cpp +63 -60
- data/ext/libsass/src/context.hpp +33 -33
- data/ext/libsass/src/cssize.cpp +30 -29
- data/ext/libsass/src/cssize.hpp +13 -13
- data/ext/libsass/src/dart_helpers.hpp +5 -5
- data/ext/libsass/src/debugger.hpp +127 -128
- data/ext/libsass/src/emitter.cpp +12 -12
- data/ext/libsass/src/emitter.hpp +10 -10
- data/ext/libsass/src/environment.cpp +27 -27
- data/ext/libsass/src/environment.hpp +24 -24
- data/ext/libsass/src/error_handling.cpp +42 -42
- data/ext/libsass/src/error_handling.hpp +38 -50
- data/ext/libsass/src/eval.cpp +138 -132
- data/ext/libsass/src/eval.hpp +17 -17
- data/ext/libsass/src/eval_selectors.cpp +3 -3
- data/ext/libsass/src/expand.cpp +70 -64
- data/ext/libsass/src/expand.hpp +12 -12
- data/ext/libsass/src/extender.cpp +55 -53
- data/ext/libsass/src/extender.hpp +14 -14
- data/ext/libsass/src/file.cpp +66 -58
- data/ext/libsass/src/file.hpp +23 -25
- data/ext/libsass/src/fn_colors.cpp +9 -9
- data/ext/libsass/src/fn_lists.cpp +18 -18
- data/ext/libsass/src/fn_maps.cpp +3 -3
- data/ext/libsass/src/fn_miscs.cpp +15 -15
- data/ext/libsass/src/fn_numbers.cpp +7 -7
- data/ext/libsass/src/fn_selectors.cpp +8 -8
- data/ext/libsass/src/fn_strings.cpp +34 -22
- data/ext/libsass/src/fn_utils.cpp +29 -26
- data/ext/libsass/src/fn_utils.hpp +10 -10
- data/ext/libsass/src/inspect.cpp +35 -34
- data/ext/libsass/src/inspect.hpp +21 -21
- data/ext/libsass/src/lexer.cpp +3 -1
- data/ext/libsass/src/listize.cpp +2 -2
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory.hpp +12 -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} +18 -6
- data/ext/libsass/src/operation.hpp +44 -44
- data/ext/libsass/src/operators.cpp +18 -18
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +18 -18
- data/ext/libsass/src/output.cpp +16 -16
- data/ext/libsass/src/output.hpp +5 -5
- data/ext/libsass/src/parser.cpp +327 -345
- data/ext/libsass/src/parser.hpp +77 -87
- data/ext/libsass/src/parser_selectors.cpp +6 -6
- data/ext/libsass/src/permutate.hpp +39 -15
- 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/remove_placeholders.cpp +4 -4
- data/ext/libsass/src/remove_placeholders.hpp +3 -3
- data/ext/libsass/src/sass.cpp +16 -15
- data/ext/libsass/src/sass.hpp +9 -5
- data/ext/libsass/src/sass_context.cpp +52 -34
- data/ext/libsass/src/sass_values.cpp +8 -10
- 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/units.cpp +19 -19
- 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 +38 -38
- data/ext/libsass/src/util.hpp +18 -18
- data/ext/libsass/src/util_string.cpp +13 -13
- data/ext/libsass/src/util_string.hpp +9 -8
- data/ext/libsass/src/values.cpp +12 -12
- data/lib/sassc/native.rb +3 -5
- data/lib/sassc/version.rb +1 -1
- data/test/native_test.rb +4 -4
- metadata +14 -5
- data/lib/sassc/native/lib_c.rb +0 -21
data/ext/libsass/src/eval.hpp
CHANGED
@@ -34,7 +34,7 @@ namespace Sass {
|
|
34
34
|
|
35
35
|
Env* environment();
|
36
36
|
EnvStack& env_stack();
|
37
|
-
const
|
37
|
+
const sass::string cwd();
|
38
38
|
CalleeStack& callee_stack();
|
39
39
|
struct Sass_Inspect_Options& options();
|
40
40
|
struct Sass_Compiler* compiler();
|
@@ -43,13 +43,13 @@ namespace Sass {
|
|
43
43
|
Expression* operator()(Block*);
|
44
44
|
Expression* operator()(Assignment*);
|
45
45
|
Expression* operator()(If*);
|
46
|
-
Expression* operator()(
|
47
|
-
Expression* operator()(
|
48
|
-
Expression* operator()(
|
46
|
+
Expression* operator()(ForRule*);
|
47
|
+
Expression* operator()(EachRule*);
|
48
|
+
Expression* operator()(WhileRule*);
|
49
49
|
Expression* operator()(Return*);
|
50
|
-
Expression* operator()(
|
51
|
-
Expression* operator()(
|
52
|
-
Expression* operator()(
|
50
|
+
Expression* operator()(WarningRule*);
|
51
|
+
Expression* operator()(ErrorRule*);
|
52
|
+
Expression* operator()(DebugRule*);
|
53
53
|
|
54
54
|
Expression* operator()(List*);
|
55
55
|
Expression* operator()(Map*);
|
@@ -67,9 +67,9 @@ namespace Sass {
|
|
67
67
|
Media_Query* operator()(Media_Query*);
|
68
68
|
Expression* operator()(Media_Query_Expression*);
|
69
69
|
Expression* operator()(At_Root_Query*);
|
70
|
-
Expression* operator()(
|
71
|
-
Expression* operator()(
|
72
|
-
Expression* operator()(
|
70
|
+
Expression* operator()(SupportsOperation*);
|
71
|
+
Expression* operator()(SupportsNegation*);
|
72
|
+
Expression* operator()(SupportsDeclaration*);
|
73
73
|
Expression* operator()(Supports_Interpolation*);
|
74
74
|
Expression* operator()(Null*);
|
75
75
|
Expression* operator()(Argument*);
|
@@ -82,14 +82,14 @@ namespace Sass {
|
|
82
82
|
CompoundSelector* operator()(CompoundSelector*);
|
83
83
|
SelectorComponent* operator()(SelectorComponent*);
|
84
84
|
SimpleSelector* operator()(SimpleSelector* s);
|
85
|
-
|
85
|
+
PseudoSelector* operator()(PseudoSelector* s);
|
86
86
|
|
87
87
|
// they don't have any specific implementation (yet)
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
88
|
+
IDSelector* operator()(IDSelector* s) { return s; };
|
89
|
+
ClassSelector* operator()(ClassSelector* s) { return s; };
|
90
|
+
TypeSelector* operator()(TypeSelector* s) { return s; };
|
91
|
+
AttributeSelector* operator()(AttributeSelector* s) { return s; };
|
92
|
+
PlaceholderSelector* operator()(PlaceholderSelector* s) { return s; };
|
93
93
|
|
94
94
|
// actual evaluated selectors
|
95
95
|
SelectorList* operator()(Selector_Schema*);
|
@@ -101,7 +101,7 @@ namespace Sass {
|
|
101
101
|
{ return Cast<Expression>(x); }
|
102
102
|
|
103
103
|
private:
|
104
|
-
void interpolation(Context& ctx,
|
104
|
+
void interpolation(Context& ctx, sass::string& res, ExpressionObj ex, bool into_quotes, bool was_itpl = false);
|
105
105
|
|
106
106
|
};
|
107
107
|
|
@@ -10,7 +10,7 @@ namespace Sass {
|
|
10
10
|
|
11
11
|
SelectorList* Eval::operator()(SelectorList* s)
|
12
12
|
{
|
13
|
-
|
13
|
+
sass::vector<SelectorListObj> rv;
|
14
14
|
SelectorListObj sl = SASS_MEMORY_NEW(SelectorList, s->pstate());
|
15
15
|
for (size_t i = 0, iL = s->length(); i < iL; ++i) {
|
16
16
|
rv.push_back(operator()(s->get(i)));
|
@@ -19,7 +19,7 @@ namespace Sass {
|
|
19
19
|
// we should actually permutate parent first
|
20
20
|
// but here we have permutated the selector first
|
21
21
|
size_t round = 0;
|
22
|
-
while (round !=
|
22
|
+
while (round != sass::string::npos) {
|
23
23
|
bool abort = true;
|
24
24
|
for (size_t i = 0, iL = rv.size(); i < iL; ++i) {
|
25
25
|
if (rv[i]->length() > round) {
|
@@ -28,7 +28,7 @@ namespace Sass {
|
|
28
28
|
}
|
29
29
|
}
|
30
30
|
if (abort) {
|
31
|
-
round =
|
31
|
+
round = sass::string::npos;
|
32
32
|
}
|
33
33
|
else {
|
34
34
|
++round;
|
data/ext/libsass/src/expand.cpp
CHANGED
@@ -13,6 +13,7 @@
|
|
13
13
|
#include "context.hpp"
|
14
14
|
#include "parser.hpp"
|
15
15
|
#include "sass_functions.hpp"
|
16
|
+
#include "error_handling.hpp"
|
16
17
|
|
17
18
|
namespace Sass {
|
18
19
|
|
@@ -162,7 +163,7 @@ namespace Sass {
|
|
162
163
|
return bb.detach();
|
163
164
|
}
|
164
165
|
|
165
|
-
Statement* Expand::operator()(
|
166
|
+
Statement* Expand::operator()(StyleRule* r)
|
166
167
|
{
|
167
168
|
LOCAL_FLAG(old_at_root_without_rule, at_root_without_rule);
|
168
169
|
|
@@ -188,9 +189,9 @@ namespace Sass {
|
|
188
189
|
if (r->schema()) {
|
189
190
|
SelectorListObj sel = eval(r->schema());
|
190
191
|
r->selector(sel);
|
191
|
-
bool chroot = sel->has_real_parent_ref();
|
192
192
|
for (auto complex : sel->elements()) {
|
193
|
-
|
193
|
+
// ToDo: maybe we can get rid of chroots?
|
194
|
+
complex->chroots(complex->has_real_parent_ref());
|
194
195
|
}
|
195
196
|
|
196
197
|
}
|
@@ -213,7 +214,7 @@ namespace Sass {
|
|
213
214
|
if (r->block()) blk = operator()(r->block());
|
214
215
|
popFromOriginalStack();
|
215
216
|
popFromSelectorStack();
|
216
|
-
|
217
|
+
StyleRule* rr = SASS_MEMORY_NEW(StyleRule,
|
217
218
|
r->pstate(),
|
218
219
|
evaled,
|
219
220
|
blk);
|
@@ -228,21 +229,21 @@ namespace Sass {
|
|
228
229
|
return rr;
|
229
230
|
}
|
230
231
|
|
231
|
-
Statement* Expand::operator()(
|
232
|
+
Statement* Expand::operator()(SupportsRule* f)
|
232
233
|
{
|
233
|
-
|
234
|
-
|
234
|
+
ExpressionObj condition = f->condition()->perform(&eval);
|
235
|
+
SupportsRuleObj ff = SASS_MEMORY_NEW(SupportsRule,
|
235
236
|
f->pstate(),
|
236
|
-
Cast<
|
237
|
+
Cast<SupportsCondition>(condition),
|
237
238
|
operator()(f->block()));
|
238
239
|
return ff.detach();
|
239
240
|
}
|
240
241
|
|
241
|
-
|
242
|
-
const
|
243
|
-
const
|
242
|
+
sass::vector<CssMediaQuery_Obj> Expand::mergeMediaQueries(
|
243
|
+
const sass::vector<CssMediaQuery_Obj>& lhs,
|
244
|
+
const sass::vector<CssMediaQuery_Obj>& rhs)
|
244
245
|
{
|
245
|
-
|
246
|
+
sass::vector<CssMediaQuery_Obj> queries;
|
246
247
|
for (CssMediaQuery_Obj query1 : lhs) {
|
247
248
|
for (CssMediaQuery_Obj query2 : rhs) {
|
248
249
|
CssMediaQuery_Obj result = query1->merge(query2);
|
@@ -256,14 +257,14 @@ namespace Sass {
|
|
256
257
|
|
257
258
|
Statement* Expand::operator()(MediaRule* m)
|
258
259
|
{
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
Parser parser(
|
260
|
+
ExpressionObj mq = eval(m->schema());
|
261
|
+
sass::string str_mq(mq->to_css(ctx.c_options));
|
262
|
+
ItplFile* source = SASS_MEMORY_NEW(ItplFile,
|
263
|
+
str_mq.c_str(), m->pstate());
|
264
|
+
Parser parser(source, ctx, traces);
|
264
265
|
// Create a new CSS only representation of the media rule
|
265
266
|
CssMediaRuleObj css = SASS_MEMORY_NEW(CssMediaRule, m->pstate(), m->block());
|
266
|
-
|
267
|
+
sass::vector<CssMediaQuery_Obj> parsed = parser.parseCssMediaQueries();
|
267
268
|
if (mediaStack.size() && mediaStack.back()) {
|
268
269
|
auto& parent = mediaStack.back()->elements();
|
269
270
|
css->concat(mergeMediaQueries(parent, parsed));
|
@@ -278,10 +279,10 @@ namespace Sass {
|
|
278
279
|
|
279
280
|
}
|
280
281
|
|
281
|
-
Statement* Expand::operator()(
|
282
|
+
Statement* Expand::operator()(AtRootRule* a)
|
282
283
|
{
|
283
284
|
Block_Obj ab = a->block();
|
284
|
-
|
285
|
+
ExpressionObj ae = a->expression();
|
285
286
|
|
286
287
|
if (ae) ae = ae->perform(&eval);
|
287
288
|
else ae = SASS_MEMORY_NEW(At_Root_Query, a->pstate());
|
@@ -292,14 +293,14 @@ namespace Sass {
|
|
292
293
|
;
|
293
294
|
|
294
295
|
Block_Obj bb = ab ? operator()(ab) : NULL;
|
295
|
-
|
296
|
+
AtRootRuleObj aa = SASS_MEMORY_NEW(AtRootRule,
|
296
297
|
a->pstate(),
|
297
298
|
bb,
|
298
299
|
Cast<At_Root_Query>(ae));
|
299
300
|
return aa.detach();
|
300
301
|
}
|
301
302
|
|
302
|
-
Statement* Expand::operator()(
|
303
|
+
Statement* Expand::operator()(AtRule* a)
|
303
304
|
{
|
304
305
|
LOCAL_FLAG(in_keyframes, a->is_keyframes());
|
305
306
|
Block* ab = a->block();
|
@@ -310,7 +311,7 @@ namespace Sass {
|
|
310
311
|
if (as) as = eval(as);
|
311
312
|
popNullSelector();
|
312
313
|
Block* bb = ab ? operator()(ab) : NULL;
|
313
|
-
|
314
|
+
AtRule* aa = SASS_MEMORY_NEW(AtRule,
|
314
315
|
a->pstate(),
|
315
316
|
a->keyword(),
|
316
317
|
as,
|
@@ -323,14 +324,14 @@ namespace Sass {
|
|
323
324
|
{
|
324
325
|
Block_Obj ab = d->block();
|
325
326
|
String_Obj old_p = d->property();
|
326
|
-
|
327
|
+
ExpressionObj prop = old_p->perform(&eval);
|
327
328
|
String_Obj new_p = Cast<String>(prop);
|
328
329
|
// we might get a color back
|
329
330
|
if (!new_p) {
|
330
|
-
|
331
|
+
sass::string str(prop->to_string(ctx.c_options));
|
331
332
|
new_p = SASS_MEMORY_NEW(String_Constant, old_p->pstate(), str);
|
332
333
|
}
|
333
|
-
|
334
|
+
ExpressionObj value = d->value();
|
334
335
|
if (value) value = value->perform(&eval);
|
335
336
|
Block_Obj bb = ab ? operator()(ab) : NULL;
|
336
337
|
if (!bb) {
|
@@ -356,11 +357,17 @@ namespace Sass {
|
|
356
357
|
Statement* Expand::operator()(Assignment* a)
|
357
358
|
{
|
358
359
|
Env* env = environment();
|
359
|
-
const
|
360
|
+
const sass::string& var(a->variable());
|
360
361
|
if (a->is_global()) {
|
362
|
+
if (!env->has_global(var)) {
|
363
|
+
deprecated(
|
364
|
+
"!global assignments won't be able to declare new variables in future versions.",
|
365
|
+
"Consider adding `" + var + ": null` at the top level.",
|
366
|
+
true, a->pstate());
|
367
|
+
}
|
361
368
|
if (a->is_default()) {
|
362
369
|
if (env->has_global(var)) {
|
363
|
-
|
370
|
+
ExpressionObj e = Cast<Expression>(env->get_global(var));
|
364
371
|
if (!e || e->concrete_type() == Expression::NULL_VAL) {
|
365
372
|
env->set_global(var, a->value()->perform(&eval));
|
366
373
|
}
|
@@ -379,7 +386,7 @@ namespace Sass {
|
|
379
386
|
while (cur && cur->is_lexical()) {
|
380
387
|
if (cur->has_local(var)) {
|
381
388
|
if (AST_Node_Obj node = cur->get_local(var)) {
|
382
|
-
|
389
|
+
ExpressionObj e = Cast<Expression>(node);
|
383
390
|
if (!e || e->concrete_type() == Expression::NULL_VAL) {
|
384
391
|
cur->set_local(var, a->value()->perform(&eval));
|
385
392
|
}
|
@@ -395,7 +402,7 @@ namespace Sass {
|
|
395
402
|
}
|
396
403
|
else if (env->has_global(var)) {
|
397
404
|
if (AST_Node_Obj node = env->get_global(var)) {
|
398
|
-
|
405
|
+
ExpressionObj e = Cast<Expression>(node);
|
399
406
|
if (!e || e->concrete_type() == Expression::NULL_VAL) {
|
400
407
|
env->set_global(var, a->value()->perform(&eval));
|
401
408
|
}
|
@@ -418,7 +425,7 @@ namespace Sass {
|
|
418
425
|
{
|
419
426
|
Import_Obj result = SASS_MEMORY_NEW(Import, imp->pstate());
|
420
427
|
if (imp->import_queries() && imp->import_queries()->size()) {
|
421
|
-
|
428
|
+
ExpressionObj ex = imp->import_queries()->perform(&eval);
|
422
429
|
result->import_queries(Cast<List>(ex));
|
423
430
|
}
|
424
431
|
for ( size_t i = 0, S = imp->urls().size(); i < S; ++i) {
|
@@ -450,7 +457,7 @@ namespace Sass {
|
|
450
457
|
block_stack.back()->append(trace);
|
451
458
|
block_stack.push_back(trace_block);
|
452
459
|
|
453
|
-
const
|
460
|
+
const sass::string& abs_path(i->resource().abs_path);
|
454
461
|
append_block(ctx.sheets.at(abs_path).root);
|
455
462
|
sass_delete_import(ctx.import_stack.back());
|
456
463
|
ctx.import_stack.pop_back();
|
@@ -459,21 +466,21 @@ namespace Sass {
|
|
459
466
|
return 0;
|
460
467
|
}
|
461
468
|
|
462
|
-
Statement* Expand::operator()(
|
469
|
+
Statement* Expand::operator()(WarningRule* w)
|
463
470
|
{
|
464
471
|
// eval handles this too, because warnings may occur in functions
|
465
472
|
w->perform(&eval);
|
466
473
|
return 0;
|
467
474
|
}
|
468
475
|
|
469
|
-
Statement* Expand::operator()(
|
476
|
+
Statement* Expand::operator()(ErrorRule* e)
|
470
477
|
{
|
471
478
|
// eval handles this too, because errors may occur in functions
|
472
479
|
e->perform(&eval);
|
473
480
|
return 0;
|
474
481
|
}
|
475
482
|
|
476
|
-
Statement* Expand::operator()(
|
483
|
+
Statement* Expand::operator()(DebugRule* d)
|
477
484
|
{
|
478
485
|
// eval handles this too, because warnings may occur in functions
|
479
486
|
d->perform(&eval);
|
@@ -499,7 +506,7 @@ namespace Sass {
|
|
499
506
|
Env env(environment(), true);
|
500
507
|
env_stack.push_back(&env);
|
501
508
|
call_stack.push_back(i);
|
502
|
-
|
509
|
+
ExpressionObj rv = i->predicate()->perform(&eval);
|
503
510
|
if (*rv) {
|
504
511
|
append_block(i->block());
|
505
512
|
}
|
@@ -514,15 +521,15 @@ namespace Sass {
|
|
514
521
|
|
515
522
|
// For does not create a new env scope
|
516
523
|
// But iteration vars are reset afterwards
|
517
|
-
Statement* Expand::operator()(
|
524
|
+
Statement* Expand::operator()(ForRule* f)
|
518
525
|
{
|
519
|
-
|
520
|
-
|
526
|
+
sass::string variable(f->variable());
|
527
|
+
ExpressionObj low = f->lower_bound()->perform(&eval);
|
521
528
|
if (low->concrete_type() != Expression::NUMBER) {
|
522
529
|
traces.push_back(Backtrace(low->pstate()));
|
523
530
|
throw Exception::TypeMismatch(traces, *low, "integer");
|
524
531
|
}
|
525
|
-
|
532
|
+
ExpressionObj high = f->upper_bound()->perform(&eval);
|
526
533
|
if (high->concrete_type() != Expression::NUMBER) {
|
527
534
|
traces.push_back(Backtrace(high->pstate()));
|
528
535
|
throw Exception::TypeMismatch(traces, *high, "integer");
|
@@ -531,7 +538,7 @@ namespace Sass {
|
|
531
538
|
Number_Obj sass_end = Cast<Number>(high);
|
532
539
|
// check if units are valid for sequence
|
533
540
|
if (sass_start->unit() != sass_end->unit()) {
|
534
|
-
|
541
|
+
sass::ostream msg; msg << "Incompatible units: '"
|
535
542
|
<< sass_start->unit() << "' and '"
|
536
543
|
<< sass_end->unit() << "'.";
|
537
544
|
error(msg.str(), low->pstate(), traces);
|
@@ -569,17 +576,17 @@ namespace Sass {
|
|
569
576
|
|
570
577
|
// Eval does not create a new env scope
|
571
578
|
// But iteration vars are reset afterwards
|
572
|
-
Statement* Expand::operator()(
|
579
|
+
Statement* Expand::operator()(EachRule* e)
|
573
580
|
{
|
574
|
-
|
575
|
-
|
581
|
+
sass::vector<sass::string> variables(e->variables());
|
582
|
+
ExpressionObj expr = e->list()->perform(&eval);
|
576
583
|
List_Obj list;
|
577
584
|
Map_Obj map;
|
578
585
|
if (expr->concrete_type() == Expression::MAP) {
|
579
586
|
map = Cast<Map>(expr);
|
580
587
|
}
|
581
588
|
else if (SelectorList * ls = Cast<SelectorList>(expr)) {
|
582
|
-
|
589
|
+
ExpressionObj rv = Listize::perform(ls);
|
583
590
|
list = Cast<List>(rv);
|
584
591
|
}
|
585
592
|
else if (expr->concrete_type() != Expression::LIST) {
|
@@ -597,8 +604,8 @@ namespace Sass {
|
|
597
604
|
|
598
605
|
if (map) {
|
599
606
|
for (auto key : map->keys()) {
|
600
|
-
|
601
|
-
|
607
|
+
ExpressionObj k = key->perform(&eval);
|
608
|
+
ExpressionObj v = map->at(key)->perform(&eval);
|
602
609
|
|
603
610
|
if (variables.size() == 1) {
|
604
611
|
List_Obj variable = SASS_MEMORY_NEW(List, map->pstate(), 2, SASS_SPACE);
|
@@ -618,7 +625,7 @@ namespace Sass {
|
|
618
625
|
list = Cast<List>(list);
|
619
626
|
}
|
620
627
|
for (size_t i = 0, L = list->length(); i < L; ++i) {
|
621
|
-
|
628
|
+
ExpressionObj item = list->at(i);
|
622
629
|
// unwrap value if the expression is an argument
|
623
630
|
if (Argument_Obj arg = Cast<Argument>(item)) item = arg->value();
|
624
631
|
// check if we got passed a list of args (investigate)
|
@@ -629,17 +636,16 @@ namespace Sass {
|
|
629
636
|
env.set_local(variables[0], var);
|
630
637
|
} else {
|
631
638
|
for (size_t j = 0, K = variables.size(); j < K; ++j) {
|
632
|
-
|
639
|
+
env.set_local(variables[j], j >= scalars->length()
|
633
640
|
? SASS_MEMORY_NEW(Null, expr->pstate())
|
634
|
-
: (*scalars)[j]->perform(&eval);
|
635
|
-
env.set_local(variables[j], res);
|
641
|
+
: (*scalars)[j]->perform(&eval));
|
636
642
|
}
|
637
643
|
}
|
638
644
|
} else {
|
639
645
|
if (variables.size() > 0) {
|
640
646
|
env.set_local(variables.at(0), item);
|
641
647
|
for (size_t j = 1, K = variables.size(); j < K; ++j) {
|
642
|
-
|
648
|
+
ExpressionObj res = SASS_MEMORY_NEW(Null, expr->pstate());
|
643
649
|
env.set_local(variables[j], res);
|
644
650
|
}
|
645
651
|
}
|
@@ -652,14 +658,14 @@ namespace Sass {
|
|
652
658
|
return 0;
|
653
659
|
}
|
654
660
|
|
655
|
-
Statement* Expand::operator()(
|
661
|
+
Statement* Expand::operator()(WhileRule* w)
|
656
662
|
{
|
657
|
-
|
663
|
+
ExpressionObj pred = w->predicate();
|
658
664
|
Block* body = w->block();
|
659
665
|
Env env(environment(), true);
|
660
666
|
env_stack.push_back(&env);
|
661
667
|
call_stack.push_back(w);
|
662
|
-
|
668
|
+
ExpressionObj cond = pred->perform(&eval);
|
663
669
|
while (!cond->is_false()) {
|
664
670
|
append_block(body);
|
665
671
|
cond = pred->perform(&eval);
|
@@ -698,7 +704,7 @@ namespace Sass {
|
|
698
704
|
|
699
705
|
if (compound->length() != 1) {
|
700
706
|
|
701
|
-
|
707
|
+
sass::ostream sels; bool addComma = false;
|
702
708
|
sels << "Compound selectors may no longer be extended.\n";
|
703
709
|
sels << "Consider `@extend ";
|
704
710
|
for (auto sel : compound->elements()) {
|
@@ -769,7 +775,7 @@ namespace Sass {
|
|
769
775
|
recursions ++;
|
770
776
|
|
771
777
|
Env* env = environment();
|
772
|
-
|
778
|
+
sass::string full_name(c->name() + "[m]");
|
773
779
|
if (!env->has(full_name)) {
|
774
780
|
error("no mixin named " + c->name(), c->pstate(), traces);
|
775
781
|
}
|
@@ -780,15 +786,15 @@ namespace Sass {
|
|
780
786
|
if (c->block() && c->name() != "@content" && !body->has_content()) {
|
781
787
|
error("Mixin \"" + c->name() + "\" does not accept a content block.", c->pstate(), traces);
|
782
788
|
}
|
783
|
-
|
789
|
+
ExpressionObj rv = c->arguments()->perform(&eval);
|
784
790
|
Arguments_Obj args = Cast<Arguments>(rv);
|
785
|
-
|
791
|
+
sass::string msg(", in mixin `" + c->name() + "`");
|
786
792
|
traces.push_back(Backtrace(c->pstate(), msg));
|
787
793
|
ctx.callee_stack.push_back({
|
788
794
|
c->name().c_str(),
|
789
|
-
c->pstate().
|
790
|
-
c->pstate().
|
791
|
-
c->pstate().
|
795
|
+
c->pstate().getPath(),
|
796
|
+
c->pstate().getLine(),
|
797
|
+
c->pstate().getColumn(),
|
792
798
|
SASS_CALLEE_MIXIN,
|
793
799
|
{ env }
|
794
800
|
});
|
@@ -809,7 +815,7 @@ namespace Sass {
|
|
809
815
|
new_env.local_frame()["@content[m]"] = thunk;
|
810
816
|
}
|
811
817
|
|
812
|
-
bind(
|
818
|
+
bind(sass::string("Mixin"), c->name(), params, args, &new_env, &eval, traces);
|
813
819
|
|
814
820
|
Block_Obj trace_block = SASS_MEMORY_NEW(Block, c->pstate());
|
815
821
|
Trace_Obj trace = SASS_MEMORY_NEW(Trace, c->pstate(), c->name(), trace_block);
|
@@ -820,7 +826,7 @@ namespace Sass {
|
|
820
826
|
}
|
821
827
|
block_stack.push_back(trace_block);
|
822
828
|
for (auto bb : body->elements()) {
|
823
|
-
if (
|
829
|
+
if (StyleRule* r = Cast<StyleRule>(bb)) {
|
824
830
|
r->is_root(trace_block->is_root());
|
825
831
|
}
|
826
832
|
Statement_Obj ith = bb->perform(this);
|