Skip to content
This repository was archived by the owner on Oct 24, 2025. It is now read-only.

Commit bc59b31

Browse files
author
Aaron Leung
committed
Got mixin content working.
1 parent 2b81527 commit bc59b31

File tree

2 files changed

+48
-47
lines changed

2 files changed

+48
-47
lines changed

eval_apply.cpp

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {

eval_apply.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ namespace Sass {
1818
using std::map;
1919

2020
void expand(Node expr, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool function_name = false, const Node content = Node());
21+
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);
2122
Node eval(Node expr, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool function_name = false);
2223
Node eval_arguments(Node args, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt);
2324
Node eval_function(string name, Node stm, Environment& bindings, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool toplevel = false);

0 commit comments

Comments
 (0)