Commit 305b07a5 by Aaron Leung

Refactoring out an apply function. Now we have an eval/apply pair.

parent 6bf362fa
...@@ -42,48 +42,49 @@ namespace Sass { ...@@ -42,48 +42,49 @@ namespace Sass {
Token name(n[0].token); Token name(n[0].token);
Node args(n[1]); Node args(n[1]);
Node mixin(context.global_env[name]); Node mixin(context.global_env[name]);
Node params(mixin[1]); // Node params(mixin[1]);
Node body(mixin[2].clone()); // Node body(mixin[2].clone());
n.children->pop_back(); n.children->pop_back();
n.children->pop_back(); n.children->pop_back();
Environment m_env; // Environment m_env;
// bind arguments // // bind arguments
for (int i = 0, j = 0; i < args.size(); ++i) { // for (int i = 0, j = 0; i < args.size(); ++i) {
if (args[i].type == Node::assignment) { // if (args[i].type == Node::assignment) {
Node arg(args[i]); // Node arg(args[i]);
Token name(arg[0].token); // Token name(arg[0].token);
if (!m_env.query(name)) { // if (!m_env.query(name)) {
m_env[name] = eval(arg[1], context.global_env); // m_env[name] = eval(arg[1], context.global_env);
} // }
} // }
else { // else {
// TO DO: ensure (j < params.size()) // // TO DO: ensure (j < params.size())
Node param(params[j]); // Node param(params[j]);
Token name(param.type == Node::variable ? param.token : param[0].token); // Token name(param.type == Node::variable ? param.token : param[0].token);
m_env[name] = eval(args[i], context.global_env); // m_env[name] = eval(args[i], context.global_env);
++j; // ++j;
} // }
} // }
// plug the holes with default arguments if any // // plug the holes with default arguments if any
for (int i = 0; i < params.size(); ++i) { // for (int i = 0; i < params.size(); ++i) {
if (params[i].type == Node::assignment) { // if (params[i].type == Node::assignment) {
Node param(params[i]); // Node param(params[i]);
Token name(param[0].token); // Token name(param[0].token);
if (!m_env.query(name)) { // if (!m_env.query(name)) {
m_env[name] = eval(param[1], context.global_env); // m_env[name] = eval(param[1], context.global_env);
} // }
} // }
} // }
m_env.link(context.global_env); // m_env.link(context.global_env);
//
for (int i = 0; i < body.size(); ++i) { // for (int i = 0; i < body.size(); ++i) {
body[i] = eval(body[i], m_env); // body[i] = eval(body[i], m_env);
} // }
//
// n += body;
n += body; n += apply(mixin, args, context.global_env);
// ideally say: n += apply(mixin, args, context.global_env);
} break; } break;
} }
} }
......
...@@ -187,4 +187,43 @@ namespace Sass { ...@@ -187,4 +187,43 @@ namespace Sass {
} }
} }
Node apply(const Node& mixin, const Node& args, Environment& env)
{
Node params(mixin[1]);
Node body(mixin[2].clone());
Environment m_env;
// bind arguments
for (int i = 0, j = 0; i < args.size(); ++i) {
if (args[i].type == Node::assignment) {
Node arg(args[i]);
Token name(arg[0].token);
if (!m_env.query(name)) {
m_env[name] = eval(arg[1], env);
}
}
else {
// TO DO: ensure (j < params.size())
Node param(params[j]);
Token name(param.type == Node::variable ? param.token : param[0].token);
m_env[name] = eval(args[i], env);
++j;
}
}
// plug the holes with default arguments if any
for (int i = 0; i < params.size(); ++i) {
if (params[i].type == Node::assignment) {
Node param(params[i]);
Token name(param[0].token);
if (!m_env.query(name)) {
m_env[name] = eval(param[1], env);
}
}
}
m_env.link(env);
for (int i = 0; i < body.size(); ++i) {
body[i] = eval(body[i], m_env);
}
return body;
}
} }
\ No newline at end of file
...@@ -14,4 +14,6 @@ namespace Sass { ...@@ -14,4 +14,6 @@ namespace Sass {
Node eval(const Node& expr, Environment& env); Node eval(const Node& expr, Environment& env);
Node accumulate(const Node::Type op, Node& acc, Node& rhs); Node accumulate(const Node::Type op, Node& acc, Node& rhs);
double operate(const Node::Type op, double lhs, double rhs); double operate(const Node::Type op, double lhs, double rhs);
Node apply(const Node& mixin, const Node& args, Environment& env);
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment