Skip to content

Commit

Permalink
Unify :root when extending.
Browse files Browse the repository at this point in the history
  • Loading branch information
nex3 committed Feb 27, 2015
1 parent 787b6ef commit cc3a41a
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 4 deletions.
2 changes: 2 additions & 0 deletions doc-src/SASS_CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

* Extending a selector that contains a non-final pseudo-class no longer crashes.

* When `@extending`, only a single `:root` element will be retained.

## 3.4.12 (13 February 2015)

[Tagged on GitHub](https://github.com/sass/sass/releases/tag/3.4.12).
Expand Down
26 changes: 22 additions & 4 deletions lib/sass/selector/sequence.rb
Original file line number Diff line number Diff line change
Expand Up @@ -260,10 +260,22 @@ def subweave(seq1, seq2)
return [seq1] if seq2.empty?

seq1, seq2 = seq1.dup, seq2.dup
init = merge_initial_ops(seq1, seq2)
return unless init
fin = merge_final_ops(seq1, seq2)
return unless fin
return unless (init = merge_initial_ops(seq1, seq2))
return unless (fin = merge_final_ops(seq1, seq2))

# Make sure there's only one root selector in the output.
root1 = has_root?(seq1.first) && seq1.shift
root2 = has_root?(seq2.first) && seq2.shift
if root1 && root2
return unless (root = root1.unify(root2))
seq1.unshift root
seq2.unshift root
elsif root1
seq2.unshift root1
elsif root2
seq1.unshift root2
end

seq1 = group_selectors(seq1)
seq2 = group_selectors(seq2)
lcs = Sass::Util.lcs(seq2, seq1) do |s1, s2|
Expand All @@ -274,6 +286,7 @@ def subweave(seq1, seq2)
end

diff = [[init]]

until lcs.empty?
diff << chunks(seq1, seq2) {|s| parent_superselector?(s.first, lcs.first)} << [lcs.shift]
seq1.shift
Expand Down Expand Up @@ -613,6 +626,11 @@ def extended_not_expanded_to_s(extended_not_expanded)
"(#{choices.join ', '})"
end.join ' '
end

def has_root?(sseq)
sseq.is_a?(SimpleSequence) &&
sseq.members.any? {|sel| sel.is_a?(Pseudo) && sel.normalized_name == "root"}
end
end
end
end
10 changes: 10 additions & 0 deletions test/sass/extend_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -503,6 +503,16 @@ def test_multilayer_pseudoclass_extend
SCSS
end

def test_root_only_allowed_at_root
assert_extends(':root .foo', '.bar .baz {@extend .foo}',
':root .foo, :root .bar .baz')
assert_extends('.foo:root .bar', '.baz:root .bang {@extend .bar}',
'.foo:root .bar, .baz.foo:root .bang')
assert_extends('html:root .bar', 'xml:root .bang {@extend .bar}', 'html:root .bar')
assert_extends('.foo:root > .bar .x', '.baz:root .bang .y {@extend .x}',
'.foo:root > .bar .x, .baz.foo:root > .bar .bang .y')
end

def test_comma_extendee
assert_equal <<CSS, render(<<SCSS)
.foo, .baz {
Expand Down

0 comments on commit cc3a41a

Please sign in to comment.