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

Commit 2b81527

Browse files
author
Aaron Leung
committed
Workin' on mixin content.
1 parent c062aee commit 2b81527

File tree

5 files changed

+30
-18
lines changed

5 files changed

+30
-18
lines changed

document_parser.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -604,11 +604,11 @@ namespace Sass {
604604
block << parse_mixin_call();
605605
semicolon = true;
606606
}
607-
else if (peek< content >(position)) {
607+
else if (lex< content >()) {
608608
if (inside_of != Node::mixin) {
609609
throw_syntax_error("@content may only be used within a mixin");
610610
}
611-
block << context.new_Node(Node::mixin_content, path, line, Token::make()); // just a stub
611+
block << context.new_Node(Node::mixin_content, path, line, 0); // just an expansion stub
612612
semicolon = true;
613613
}
614614
else if (peek< sequence< identifier, optional_spaces, exactly<':'>, optional_spaces, exactly<'{'> > >(position)) {

eval_apply.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace Sass {
2525
}
2626

2727
// Expansion function for nodes in an expansion context.
28-
void expand(Node expr, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool function_name)
28+
void 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)
2929
{
3030
switch (expr.type())
3131
{
@@ -46,14 +46,22 @@ namespace Sass {
4646
case Node::mixin_call: { // mixin invocation
4747
Token name(expr[0].token());
4848
Node args(expr[1]);
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);
4951
if (!env.query(name)) throw_eval_error(bt, "mixin " + name.to_string() + " is undefined", expr.path(), expr.line());
5052
Node mixin(env[name]);
5153
Backtrace here(&bt, expr.path(), expr.line(), ", in mixin '" + name.to_string() + "'");
52-
Node expansion(apply_mixin(mixin, args, prefix, env, f_env, new_Node, ctx, here));
54+
Node expansion(apply_mixin(mixin, args, this_content, prefix, env, f_env, new_Node, ctx, here));
5355
expr.pop_all(); // pop the mixin metadata
5456
expr += expansion; // push the expansion
5557
} break;
5658

59+
case Node::mixin_content: {
60+
cerr << "HEY" << endl;
61+
expr += content;
62+
cerr << "HO" << endl;
63+
} break;
64+
5765
case Node::propset: {
5866
// TO DO: perform the property expansion here, rather than in the emitter (also requires the parser to allow interpolants in the property names)
5967
expand(expr[1], prefix, env, f_env, new_Node, ctx, bt);
@@ -266,7 +274,7 @@ namespace Sass {
266274
Node i_node(new_Node(expr.path(), expr.line(), i));
267275
Node fake_arg(new_Node(Node::arguments, expr.path(), expr.line(), 1));
268276
fake_arg << i_node;
269-
expr += apply_mixin(fake_mixin, fake_arg, prefix, env, f_env, new_Node, ctx, bt, true);
277+
expr += apply_mixin(fake_mixin, fake_arg, Node(), prefix, env, f_env, new_Node, ctx, bt, true);
270278
}
271279
} break;
272280

@@ -286,7 +294,7 @@ namespace Sass {
286294
Node fake_arg(new_Node(Node::arguments, expr.path(), expr.line(), 1));
287295
list[i].should_eval() = true;
288296
fake_arg << eval(list[i], prefix, env, f_env, new_Node, ctx, bt);
289-
expr += apply_mixin(fake_mixin, fake_arg, prefix, env, f_env, new_Node, ctx, bt, true);
297+
expr += apply_mixin(fake_mixin, fake_arg, Node(), prefix, env, f_env, new_Node, ctx, bt, true);
290298
}
291299
} break;
292300

@@ -302,7 +310,7 @@ namespace Sass {
302310
expr.pop_back();
303311
Node ev_pred(eval(pred, prefix, env, f_env, new_Node, ctx, bt));
304312
while (!ev_pred.is_false()) {
305-
expr += apply_mixin(fake_mixin, fake_arg, prefix, env, f_env, new_Node, ctx, bt, true);
313+
expr += apply_mixin(fake_mixin, fake_arg, Node(), prefix, env, f_env, new_Node, ctx, bt, true);
306314
ev_pred = eval(pred, prefix, env, f_env, new_Node, ctx, bt);
307315
}
308316
} break;
@@ -831,7 +839,7 @@ namespace Sass {
831839
// Apply a mixin -- bind the arguments in a new environment, link the new
832840
// environment to the current one, then copy the body and eval in the new
833841
// environment.
834-
Node apply_mixin(Node mixin, const Node args, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool dynamic_scope)
842+
Node apply_mixin(Node mixin, const Node args, const Node content, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool dynamic_scope)
835843
{
836844
Node params(mixin[1]);
837845
Node body(new_Node(mixin[2])); // clone the body
@@ -852,7 +860,7 @@ namespace Sass {
852860
if (!mixin[0].is_null()) mixin_name << " " << mixin[0].to_string();
853861
bind_arguments(mixin_name.str(), params, evaluated_args, prefix, bindings, f_env, new_Node, ctx, bt);
854862
// evaluate the mixin's body
855-
expand(body, prefix, bindings, f_env, new_Node, ctx, bt);
863+
expand(body, prefix, bindings, f_env, new_Node, ctx, bt, false, content);
856864
return body;
857865
}
858866

eval_apply.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
namespace Sass {
1818
using std::map;
1919

20-
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);
20+
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());
2121
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);
2222
Node eval_arguments(Node args, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt);
2323
Node eval_function(string name, Node stm, Environment& bindings, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool toplevel = false);
2424
Node reduce(Node list, size_t head, Node acc, Node_Factory& new_Node, Backtrace& bt);
2525
double operate(Node op, double lhs, double rhs, Backtrace& bt);
2626

27-
Node apply_mixin(Node mixin, const Node args, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool dynamic_scope = false);
27+
Node apply_mixin(Node mixin, const Node args, const Node content, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt, bool dynamic_scope = false);
2828
Node apply_function(const Function& f, const Node args, Node prefix, Environment& env, map<string, Function>& f_env, Node_Factory& new_Node, Context& ctx, Backtrace& bt, string& path, size_t line);
2929
Node expand_selector(Node sel, Node pre, Node_Factory& new_Node);
3030
Node expand_backref(Node sel, Node pre);

node.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ namespace Sass {
1919
{
2020
case block:
2121
case mixin_call:
22+
case mixin_content:
2223
case root:
2324
case if_directive:
2425
case for_through_directive:
@@ -35,6 +36,7 @@ namespace Sass {
3536
switch (at(i).type())
3637
{
3738
case mixin_call:
39+
case mixin_content:
3840
case block:
3941
case if_directive:
4042
case for_through_directive:

node.hpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,8 @@ namespace Sass {
381381
case Node::for_to_directive:
382382
case Node::each_directive:
383383
case Node::while_directive:
384-
case Node::mixin_call: {
384+
case Node::mixin_call:
385+
case Node::mixin_content: {
385386
has_expansions = true;
386387
} break;
387388

@@ -400,25 +401,26 @@ namespace Sass {
400401
has_children = true;
401402
switch (n.type())
402403
{
403-
case Node::comment: has_comments = true; break;
404+
case Node::comment: has_comments = true; break;
404405

405406
case Node::css_import:
406407
case Node::rule:
407-
case Node::propset: has_statements = true; break;
408+
case Node::propset: has_statements = true; break;
408409

409410
case Node::media_query:
410-
case Node::ruleset: has_blocks = true; break;
411+
case Node::ruleset: has_blocks = true; break;
411412

412413
case Node::if_directive:
413414
case Node::for_through_directive:
414415
case Node::for_to_directive:
415416
case Node::each_directive:
416417
case Node::while_directive:
417-
case Node::mixin_call: has_expansions = true; break;
418+
case Node::mixin_call:
419+
case Node::mixin_content: has_expansions = true; break;
418420

419-
case Node::backref: has_backref = true; break;
421+
case Node::backref: has_backref = true; break;
420422

421-
default: break;
423+
default: break;
422424
}
423425
if (n.has_backref()) has_backref = true;
424426
}

0 commit comments

Comments
 (0)