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