@@ -31,7 +31,7 @@ namespace Sass {
3131 {
3232 case Node::root: {
3333 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 );
3535 }
3636 } break ;
3737
@@ -47,7 +47,7 @@ namespace Sass {
4747 Token name (expr[0 ].token ());
4848 Node args (expr[1 ]);
4949 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 );
5151 if (!env.query (name)) throw_eval_error (bt, " mixin " + name.to_string () + " is undefined" , expr.path (), expr.line ());
5252 Node mixin (env[name]);
5353 Backtrace here (&bt, expr.path (), expr.line (), " , in mixin '" + name.to_string () + " '" );
@@ -57,14 +57,15 @@ namespace Sass {
5757 } break ;
5858
5959 case Node::mixin_content: {
60- cerr << " HEY" << endl;
6160 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+ }
6364 } break ;
6465
6566 case Node::propset: {
6667 // 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 );
6869 } break ;
6970
7071 case Node::ruleset: {
@@ -90,54 +91,22 @@ namespace Sass {
9091 expr[0 ] = needs_reparsing.parse_selector_group ();
9192 }
9293
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].
9495 expr << expand_selector (expr[0 ], prefix, new_Node);
9596
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);
12598 } break ;
12699
127100 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);
133102 expr << prefix;
134103 } break ;
135104
136105 case Node::block: {
137106 Environment new_frame;
138107 new_frame.link (env);
139108 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 );
141110 }
142111 } break ;
143112
@@ -241,12 +210,12 @@ namespace Sass {
241210 if (expr[i].type () != Node::block) {
242211 Node predicate_val (eval (expr[i], prefix, env, f_env, new_Node, ctx, bt));
243212 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 );
245214 break ;
246215 }
247216 }
248217 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 );
250219 break ;
251220 }
252221 }
@@ -274,7 +243,7 @@ namespace Sass {
274243 Node i_node (new_Node (expr.path (), expr.line (), i));
275244 Node fake_arg (new_Node (Node::arguments, expr.path (), expr.line (), 1 ));
276245 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 );
278247 }
279248 } break ;
280249
@@ -294,7 +263,7 @@ namespace Sass {
294263 Node fake_arg (new_Node (Node::arguments, expr.path (), expr.line (), 1 ));
295264 list[i].should_eval () = true ;
296265 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 );
298267 }
299268 } break ;
300269
@@ -310,14 +279,14 @@ namespace Sass {
310279 expr.pop_back ();
311280 Node ev_pred (eval (pred, prefix, env, f_env, new_Node, ctx, bt));
312281 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 );
314283 ev_pred = eval (pred, prefix, env, f_env, new_Node, ctx, bt);
315284 }
316285 } break ;
317286
318287 case Node::block_directive: {
319288 // 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 );
321290 } break ;
322291
323292 case Node::warning: {
@@ -342,6 +311,37 @@ namespace Sass {
342311 }
343312 }
344313
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+
345345 void expand_list (Node list, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt)
346346 {
347347 for (size_t i = 0 , S = list.size (); i < S; ++i) {
0 commit comments