Commit 247e5ed3 by Aaron Leung

Starting to redo selector inheritance so it works for all cases.

parent 5bd4581b
...@@ -588,11 +588,14 @@ namespace Sass { ...@@ -588,11 +588,14 @@ namespace Sass {
semicolon = true; semicolon = true;
} }
else if (lex< extend >()) { else if (lex< extend >()) {
if (surrounding_ruleset.is_null()) throw_syntax_error("@extend directive may only be used within rules"); // if (surrounding_ruleset.is_null()) throw_syntax_error("@extend directive may only be used within rules");
Node extendee(parse_simple_selector_sequence()); Node extendee(parse_simple_selector_sequence());
context.extensions.insert(pair<Node, Node>(extendee, surrounding_ruleset)); // context.extensions.insert(pair<Node, Node>(extendee, surrounding_ruleset));
context.has_extensions = true; Node request(context.new_Node(Node::extend_directive, path, line, 1));
request << extendee;
// context.has_extensions = true;
semicolon = true; semicolon = true;
block << request;
} }
else if (peek< media >()) { else if (peek< media >()) {
block << parse_media_query(inside_of); block << parse_media_query(inside_of);
......
...@@ -79,30 +79,30 @@ namespace Sass { ...@@ -79,30 +79,30 @@ namespace Sass {
// 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) {
// check single selector // // check single selector
if (expr.back().type() != Node::selector_group) { // if (expr.back().type() != Node::selector_group) {
Node sel(selector_base(expr.back())); // Node sel(selector_base(expr.back()));
if (ctx.extensions.count(sel)) { // if (ctx.extensions.count(sel)) {
for (multimap<Node, Node>::iterator i = ctx.extensions.lower_bound(sel); i != ctx.extensions.upper_bound(sel); ++i) { // for (multimap<Node, Node>::iterator i = ctx.extensions.lower_bound(sel); i != ctx.extensions.upper_bound(sel); ++i) {
ctx.pending_extensions.push_back(pair<Node, Node>(expr, i->second)); // ctx.pending_extensions.push_back(pair<Node, Node>(expr, i->second));
} // }
} // }
} // }
// individually check each selector in a group // // individually check each selector in a group
else { // else {
Node group(expr.back()); // Node group(expr.back());
for (size_t i = 0, S = group.size(); i < S; ++i) { // for (size_t i = 0, S = group.size(); i < S; ++i) {
Node sel(selector_base(group[i])); // Node sel(selector_base(group[i]));
if (ctx.extensions.count(sel)) { // if (ctx.extensions.count(sel)) {
for (multimap<Node, Node>::iterator j = ctx.extensions.lower_bound(sel); j != ctx.extensions.upper_bound(sel); ++j) { // for (multimap<Node, Node>::iterator j = ctx.extensions.lower_bound(sel); j != ctx.extensions.upper_bound(sel); ++j) {
ctx.pending_extensions.push_back(pair<Node, Node>(expr, j->second)); // ctx.pending_extensions.push_back(pair<Node, Node>(expr, j->second));
} // }
} // }
} // }
} // }
} // }
// expand the body with the newly expanded selector as the prefix // expand the body with the newly expanded selector as the prefix
expand(expr[1], expr.back(), env, f_env, new_Node, ctx); expand(expr[1], expr.back(), env, f_env, new_Node, ctx);
...@@ -164,6 +164,12 @@ namespace Sass { ...@@ -164,6 +164,12 @@ namespace Sass {
} }
} break; } break;
case Node::extend_directive: {
if (prefix.is_null()) throw_eval_error("@extend directive may only be used within rules", expr.path(), expr.line());
ctx.extensions.insert(pair<Node, Node>(expr[0], prefix));
ctx.has_extensions = true;
} break;
case Node::if_directive: { case Node::if_directive: {
Node expansion = Node(); Node expansion = Node();
for (size_t i = 0, S = expr.size(); i < S; i += 2) { for (size_t i = 0, S = expr.size(); i < S; i += 2) {
......
...@@ -157,6 +157,8 @@ namespace Sass { ...@@ -157,6 +157,8 @@ namespace Sass {
parameters, parameters,
arguments, arguments,
extend_directive,
if_directive, if_directive,
for_through_directive, for_through_directive,
for_to_directive, for_to_directive,
......
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