def do_extend(extends, parent_directives, replace, seen)
seen_with_pseudo_selectors = seen.dup
modified_original = false
members = self.members.map do |sel|
next sel unless sel.is_a?(Pseudo) && sel.selector
next sel if seen.include?([sel])
extended = sel.selector.do_extend(extends, parent_directives, replace, seen, false)
next sel if extended == sel.selector
extended.members.reject! {|seq| seq.has_placeholder?}
if sel.normalized_name == 'not' &&
(sel.selector.members.none? {|seq| seq.members.length > 1} &&
extended.members.any? {|seq| seq.members.length == 1})
extended.members.reject! {|seq| seq.members.length > 1}
end
modified_original = true
result = sel.with_selector(extended)
result.each {|new_sel| seen_with_pseudo_selectors << [new_sel]}
result
end.flatten
groups = Sass::Util.group_by_to_a(extends[members.to_set]) {|ex| ex.extender}
groups.map! do |seq, group|
sels = group.map {|e| e.target}.flatten
self_without_sel = Sass::Util.array_minus(members, sels)
group.each {|e| e.result = :failed_to_unify unless e.result == :succeeded}
unified = seq.members.last.unify(SimpleSequence.new(self_without_sel, subject?))
next unless unified
group.each {|e| e.result = :succeeded}
group.each {|e| check_directives_match!(e, parent_directives)}
new_seq = Sequence.new(seq.members[0...-1] + [unified])
new_seq.add_sources!(sources + [seq])
[sels, new_seq]
end
groups.compact!
groups.map! do |sels, seq|
next [] if seen.include?(sels)
seq.do_extend(
extends, parent_directives, false, seen_with_pseudo_selectors + [sels], false)
end
groups.flatten!
if modified_original || !replace || groups.empty?
original = Sequence.new([SimpleSequence.new(members, @subject, source_range)])
original.add_sources! sources
groups.unshift original
end
groups.uniq!
groups
end