@@ -31,7 +31,7 @@ namespace Sass {
31
31
{
32
32
case Node::root: {
33
33
for (size_t i = 0 , S = expr.size (); i < S; ++i) {
34
- expand (expr[i], prefix, env, f_env, new_Node, ctx, bt);
34
+ expand (expr[i], prefix, env, f_env, new_Node, ctx, bt, false , content );
35
35
}
36
36
} break ;
37
37
@@ -47,7 +47,7 @@ namespace Sass {
47
47
Token name (expr[0 ].token ());
48
48
Node args (expr[1 ]);
49
49
Node this_content = expr.size () == 3 ? expr[2 ] : Node ();
50
- if (!this_content.is_null ()) expand (this_content, prefix, env, f_env, new_Node, ctx, bt);
50
+ if (!this_content.is_null ()) expand (this_content, prefix, env, f_env, new_Node, ctx, bt, false , content );
51
51
if (!env.query (name)) throw_eval_error (bt, " mixin " + name.to_string () + " is undefined" , expr.path (), expr.line ());
52
52
Node mixin (env[name]);
53
53
Backtrace here (&bt, expr.path (), expr.line (), " , in mixin '" + name.to_string () + " '" );
@@ -57,14 +57,15 @@ namespace Sass {
57
57
} break ;
58
58
59
59
case Node::mixin_content: {
60
- cerr << " HEY" << endl;
61
60
expr += content;
62
- cerr << " HO" << endl;
61
+ for (size_t i = 0 , S = expr.size (); i < S; ++i) {
62
+ re_expand (expr[i], prefix, env, f_env, new_Node, ctx, bt, false , content);
63
+ }
63
64
} break ;
64
65
65
66
case Node::propset: {
66
67
// TO DO: perform the property expansion here, rather than in the emitter (also requires the parser to allow interpolants in the property names)
67
- expand (expr[1 ], prefix, env, f_env, new_Node, ctx, bt);
68
+ expand (expr[1 ], prefix, env, f_env, new_Node, ctx, bt, false , content );
68
69
} break ;
69
70
70
71
case Node::ruleset: {
@@ -90,54 +91,22 @@ namespace Sass {
90
91
expr[0 ] = needs_reparsing.parse_selector_group ();
91
92
}
92
93
93
- // expand the selector with the prefix and save it in expr[2]
94
+ // Expand the selector with the prefix and save it in expr[2].
94
95
expr << expand_selector (expr[0 ], prefix, new_Node);
95
96
96
- // // gather selector extensions into a pending queue
97
- // if (ctx.has_extensions) {
98
- // // check single selector
99
- // if (expr.back().type() != Node::selector_group) {
100
- // Node sel(selector_base(expr.back()));
101
- // if (ctx.extensions.count(sel)) {
102
- // for (multimap<Node, Node>::iterator i = ctx.extensions.lower_bound(sel); i != ctx.extensions.upper_bound(sel); ++i) {
103
- // ctx.pending_extensions.push_back(pair<Node, Node>(expr, i->second));
104
- // }
105
- // }
106
- // }
107
- // // individually check each selector in a group
108
- // else {
109
- // Node group(expr.back());
110
- // for (size_t i = 0, S = group.size(); i < S; ++i) {
111
- // Node sel(selector_base(group[i]));
112
- // if (ctx.extensions.count(sel)) {
113
- // for (multimap<Node, Node>::iterator j = ctx.extensions.lower_bound(sel); j != ctx.extensions.upper_bound(sel); ++j) {
114
- // ctx.pending_extensions.push_back(pair<Node, Node>(expr, j->second));
115
- // }
116
- // }
117
- // }
118
- // }
119
- // }
120
-
121
- // expand the body with the newly expanded selector as the prefix
122
- // cerr << "ORIGINAL SELECTOR:\t" << expr[2].to_string() << endl;
123
- // cerr << "NORMALIZED SELECTOR:\t" << normalize_selector(expr[2], new_Node).to_string() << endl << endl;
124
- expand (expr[1 ], expr.back (), env, f_env, new_Node, ctx, bt);
97
+ expand (expr[1 ], expr.back (), env, f_env, new_Node, ctx, bt, false , content);
125
98
} break ;
126
99
127
100
case Node::media_query: {
128
- // Node block(expr[1]);
129
- // Node new_ruleset(new_Node(Node::ruleset, expr.path(), expr.line(), 3));
130
- // expr[1] = new_ruleset << prefix << block << prefix;
131
- // expand(expr[1], new_Node(Node::none, expr.path(), expr.line(), 0), env, f_env, new_Node, ctx, bt);
132
- expand (expr[1 ], prefix, env, f_env, new_Node, ctx, bt);
101
+ expand (expr[1 ], prefix, env, f_env, new_Node, ctx, bt, false , content);
133
102
expr << prefix;
134
103
} break ;
135
104
136
105
case Node::block: {
137
106
Environment new_frame;
138
107
new_frame.link (env);
139
108
for (size_t i = 0 , S = expr.size (); i < S; ++i) {
140
- expand (expr[i], prefix, new_frame, f_env, new_Node, ctx, bt);
109
+ expand (expr[i], prefix, new_frame, f_env, new_Node, ctx, bt, false , content );
141
110
}
142
111
} break ;
143
112
@@ -241,12 +210,12 @@ namespace Sass {
241
210
if (expr[i].type () != Node::block) {
242
211
Node predicate_val (eval (expr[i], prefix, env, f_env, new_Node, ctx, bt));
243
212
if (!predicate_val.is_false ()) {
244
- expand (expansion = expr[i+1 ], prefix, env, f_env, new_Node, ctx, bt);
213
+ expand (expansion = expr[i+1 ], prefix, env, f_env, new_Node, ctx, bt, false , content );
245
214
break ;
246
215
}
247
216
}
248
217
else {
249
- expand (expansion = expr[i], prefix, env, f_env, new_Node, ctx, bt);
218
+ expand (expansion = expr[i], prefix, env, f_env, new_Node, ctx, bt, false , content );
250
219
break ;
251
220
}
252
221
}
@@ -274,7 +243,7 @@ namespace Sass {
274
243
Node i_node (new_Node (expr.path (), expr.line (), i));
275
244
Node fake_arg (new_Node (Node::arguments, expr.path (), expr.line (), 1 ));
276
245
fake_arg << i_node;
277
- expr += apply_mixin (fake_mixin, fake_arg, Node () , prefix, env, f_env, new_Node, ctx, bt, true );
246
+ expr += apply_mixin (fake_mixin, fake_arg, content , prefix, env, f_env, new_Node, ctx, bt, true );
278
247
}
279
248
} break ;
280
249
@@ -294,7 +263,7 @@ namespace Sass {
294
263
Node fake_arg (new_Node (Node::arguments, expr.path (), expr.line (), 1 ));
295
264
list[i].should_eval () = true ;
296
265
fake_arg << eval (list[i], prefix, env, f_env, new_Node, ctx, bt);
297
- expr += apply_mixin (fake_mixin, fake_arg, Node () , prefix, env, f_env, new_Node, ctx, bt, true );
266
+ expr += apply_mixin (fake_mixin, fake_arg, content , prefix, env, f_env, new_Node, ctx, bt, true );
298
267
}
299
268
} break ;
300
269
@@ -310,14 +279,14 @@ namespace Sass {
310
279
expr.pop_back ();
311
280
Node ev_pred (eval (pred, prefix, env, f_env, new_Node, ctx, bt));
312
281
while (!ev_pred.is_false ()) {
313
- expr += apply_mixin (fake_mixin, fake_arg, Node () , prefix, env, f_env, new_Node, ctx, bt, true );
282
+ expr += apply_mixin (fake_mixin, fake_arg, content , prefix, env, f_env, new_Node, ctx, bt, true );
314
283
ev_pred = eval (pred, prefix, env, f_env, new_Node, ctx, bt);
315
284
}
316
285
} break ;
317
286
318
287
case Node::block_directive: {
319
288
// TO DO: eval the directive name for interpolants
320
- expand (expr[1 ], new_Node (Node::none, expr.path (), expr.line (), 0 ), env, f_env, new_Node, ctx, bt);
289
+ expand (expr[1 ], new_Node (Node::none, expr.path (), expr.line (), 0 ), env, f_env, new_Node, ctx, bt, false , content );
321
290
} break ;
322
291
323
292
case Node::warning: {
@@ -342,6 +311,37 @@ namespace Sass {
342
311
}
343
312
}
344
313
314
+ void re_expand (Node expr, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool function_name, const Node content)
315
+ {
316
+ switch (expr.type ())
317
+ {
318
+ case Node::ruleset: {
319
+ expr[2 ] = expand_selector (expr[0 ], prefix, new_Node);
320
+ re_expand (expr[1 ], expr[2 ], env, f_env, new_Node, ctx, bt, false , content);
321
+ } break ;
322
+
323
+ case Node::block: {
324
+ for (size_t i = 0 , S = expr.size (); i < S; ++i) {
325
+ re_expand (expr[i], prefix, env, f_env, new_Node, ctx, bt, false , content);
326
+ }
327
+ } break ;
328
+
329
+ case Node::media_query: {
330
+ expr[2 ] = prefix;
331
+ re_expand (expr[1 ], prefix, env, f_env, new_Node, ctx, bt, false , content);
332
+ } break ;
333
+
334
+ case Node::block_directive: {
335
+ re_expand (expr[1 ], prefix, env, f_env, new_Node, ctx, bt, false , content);
336
+ } break ;
337
+
338
+ default : {
339
+ return ;
340
+ } break ;
341
+ }
342
+ return ;
343
+ }
344
+
345
345
void expand_list (Node list, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt)
346
346
{
347
347
for (size_t i = 0 , S = list.size (); i < S; ++i) {
0 commit comments