Commit 3ed5d112 by Aaron Leung

Using a multimap to store selector extension requests -- necessary to allow a…

Using a multimap to store selector extension requests -- necessary to allow a selector to be extended multiple times.
parent f0c05807
......@@ -43,7 +43,7 @@ namespace Sass {
Context::Context(const char* paths_str)
: global_env(Environment()),
function_env(map<pair<string, size_t>, Function>()),
extensions(map<Node, Node>()),
extensions(multimap<Node, Node>()),
pending_extensions(vector<pair<Node, Node> >()),
source_refs(vector<char*>()),
include_paths(vector<string>()),
......
......@@ -43,7 +43,7 @@ namespace Sass {
struct Context {
Environment global_env;
map<pair<string, size_t>, Function> function_env;
map<Node, Node> extensions;
multimap<Node, Node> extensions;
vector<pair<Node, Node> > pending_extensions;
vector<char*> source_refs; // all the source c-strings
vector<string> include_paths;
......
......@@ -478,7 +478,9 @@ namespace Sass {
}
else if (lex< extend >()) {
Node extendee(parse_simple_selector_sequence());
context.extensions[extendee] = surrounding_ruleset;
// context.extensions[extendee] = surrounding_ruleset;
context.extensions.insert(pair<Node, Node>(extendee, surrounding_ruleset));
cerr << "PARSED EXTENSION REQUEST: " << surrounding_ruleset[0].to_string() << " EXTENDS " << extendee.to_string() << endl;
context.has_extensions = true;
semicolon = true;
}
......
......@@ -46,21 +46,28 @@ namespace Sass {
} break;
case Node::ruleset: {
// if the selector contains interpolants, eval it and re-parse
if (expr[0].type() == Node::selector_schema) {
expr[0] = eval(expr[0], prefix, env, f_env, new_Node, ctx);
}
// expand the selector with the prefix and save it in expr[2]
expr << expand_selector(expr[0], prefix, new_Node);
// gather selector extensions into a pending queue
if (ctx.has_extensions) {
Node sel(expr.back());
if (sel.type() == Node::selector) sel = sel.back();
Node sel(selector_base(expr.back()));
// if (sel.type() == Node::selector) sel = sel.back();
if (ctx.extensions.count(sel)) {
cerr << "HEY: " << sel.to_string() << endl;
ctx.pending_extensions.push_back(pair<Node, Node>(expr, ctx.extensions[sel]));
cerr << ctx.extensions.count(sel) << endl;
for (multimap<Node, Node>::iterator i = ctx.extensions.lower_bound(sel); i != ctx.extensions.upper_bound(sel); ++i) {
cerr << "HEY: " << sel.to_string() << endl;
ctx.pending_extensions.push_back(pair<Node, Node>(expr, i->second));
}
}
}
// eval the body with the current selector as the prefix
eval(expr[1], expr.back(), env, f_env, new_Node, ctx);
return expr;
......
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