@@ -1518,7 +1518,8 @@ namespace Sass {
1518
1518
DEBUG_EXEC (EXTEND_COMPOUND, printCompoundSelector (pSelector, " EXTEND COMPOUND: " ))
1519
1519
// TODO: Ruby has another loop here to skip certain members?
1520
1520
1521
- Node extendedSelectors = Node::createCollection ();
1521
+ // let RESULTS be an empty list of complex selectors
1522
+ Node results = Node::createCollection ();
1522
1523
// extendedSelectors.got_line_feed = true;
1523
1524
1524
1525
SubSetMapPairs entries = subset_map.get_v (pSelector);
@@ -1529,24 +1530,18 @@ namespace Sass {
1529
1530
1530
1531
SubSetMapLookups holder;
1531
1532
1532
-
1533
- for (SubSetMapResults::iterator groupedIter = arr.begin (), groupedIterEnd = arr.end (); groupedIter != groupedIterEnd; groupedIter++) {
1534
- SubSetMapResult& groupedPair = *groupedIter;
1533
+ // for each (EXTENDER, TARGET) in MAP.get(COMPOUND):
1534
+ for (SubSetMapResult& groupedPair : arr) {
1535
1535
1536
1536
Complex_Selector_Obj seq = groupedPair.first ;
1537
1537
SubSetMapPairs& group = groupedPair.second ;
1538
1538
1539
1539
DEBUG_EXEC (EXTEND_COMPOUND, printComplexSelector (seq, " SEQ: " ))
1540
1540
1541
1541
Compound_Selector_Obj pSels = SASS_MEMORY_NEW (Compound_Selector, pSelector->pstate ());
1542
- for (SubSetMapPairs::iterator groupIter = group.begin (), groupIterEnd = group.end (); groupIter != groupIterEnd; groupIter++) {
1543
- SubSetMapPair& pair = *groupIter;
1544
- Compound_Selector_Obj pCompound = pair.second ;
1545
- for (size_t index = 0 ; index < pCompound->length (); index++) {
1546
- Simple_Selector_Obj pSimpleSelector = (*pCompound)[index];
1547
- pSels->append (pSimpleSelector);
1548
- pCompound->extended (true );
1549
- }
1542
+ for (SubSetMapPair& pair : group) {
1543
+ pair.second ->extended (true );
1544
+ pSels->concat (pair.second );
1550
1545
}
1551
1546
1552
1547
DEBUG_EXEC (EXTEND_COMPOUND, printCompoundSelector (pSels, " SELS: " ))
@@ -1630,8 +1625,7 @@ namespace Sass {
1630
1625
}
1631
1626
1632
1627
1633
- for (SubSetMapLookups::iterator holderIter = holder.begin (), holderIterEnd = holder.end (); holderIter != holderIterEnd; holderIter++) {
1634
- SubSetMapLookup& pair = *holderIter;
1628
+ for (SubSetMapLookup& pair : holder) {
1635
1629
1636
1630
Compound_Selector_Obj pSels = pair.first ;
1637
1631
Complex_Selector_Obj pNewSelector = pair.second ;
@@ -1656,28 +1650,28 @@ namespace Sass {
1656
1650
iterator != endIterator; ++iterator) {
1657
1651
Node newSelector = *iterator;
1658
1652
1659
- // DEBUG_PRINTLN(EXTEND_COMPOUND, "EXTENDED AT THIS POINT: " << extendedSelectors )
1660
- // DEBUG_PRINTLN(EXTEND_COMPOUND, "SELECTOR EXISTS ALREADY: " << newSelector << " " << extendedSelectors .contains(newSelector, false /*simpleSelectorOrderDependent*/));
1653
+ // DEBUG_PRINTLN(EXTEND_COMPOUND, "EXTENDED AT THIS POINT: " << results )
1654
+ // DEBUG_PRINTLN(EXTEND_COMPOUND, "SELECTOR EXISTS ALREADY: " << newSelector << " " << results .contains(newSelector, false /*simpleSelectorOrderDependent*/));
1661
1655
1662
- if (!extendedSelectors .contains (newSelector)) {
1656
+ if (!results .contains (newSelector)) {
1663
1657
// DEBUG_PRINTLN(EXTEND_COMPOUND, "ADDING NEW SELECTOR")
1664
- extendedSelectors .collection ()->push_back (newSelector);
1658
+ results .collection ()->push_back (newSelector);
1665
1659
}
1666
1660
}
1667
1661
}
1668
1662
1669
1663
DEBUG_EXEC (EXTEND_COMPOUND, printCompoundSelector (pSelector, " EXTEND COMPOUND END: " ))
1670
1664
1671
- return extendedSelectors ;
1665
+ return results ;
1672
1666
}
1673
1667
1674
1668
1675
1669
// check if selector has something to be extended by subset_map
1676
- bool Extend::complexSelectorHasExtension (Complex_Selector_Ptr pComplexSelector , CompoundSelectorSet& seen) {
1670
+ bool Extend::complexSelectorHasExtension (Complex_Selector_Ptr selector , CompoundSelectorSet& seen) {
1677
1671
1678
1672
bool hasExtension = false ;
1679
1673
1680
- Complex_Selector_Obj pIter = pComplexSelector ;
1674
+ Complex_Selector_Obj pIter = selector ;
1681
1675
1682
1676
while (!hasExtension && pIter) {
1683
1677
Compound_Selector_Obj pHead = pIter->head ();
@@ -1706,7 +1700,7 @@ namespace Sass {
1706
1700
err << " You may only @extend selectors within the same directive.\n " ;
1707
1701
err << " From \" @extend " << ext.second ->to_string () << " \" " ;
1708
1702
err << " on line " << pstate.line +1 << " of " << rel_path << " \n " ;
1709
- error (err.str (), pComplexSelector ->pstate ());
1703
+ error (err.str (), selector ->pstate ());
1710
1704
}
1711
1705
if (entries.size () > 0 ) hasExtension = true ;
1712
1706
}
@@ -1729,19 +1723,18 @@ namespace Sass {
1729
1723
the combinator and compound selector are one unit
1730
1724
next [[sseq_or_op]] unless sseq_or_op.is_a?(SimpleSequence)
1731
1725
*/
1732
- Node Extend::extendComplexSelector (Complex_Selector_Ptr pComplexSelector , CompoundSelectorSet& seen, bool isReplace, bool isOriginal) {
1726
+ Node Extend::extendComplexSelector (Complex_Selector_Ptr selector , CompoundSelectorSet& seen, bool isReplace, bool isOriginal) {
1733
1727
1734
- Node complexSelector = complexSelectorToNode (pComplexSelector);
1728
+ // convert the input selector to extend node format
1729
+ Node complexSelector = complexSelectorToNode (selector);
1735
1730
DEBUG_PRINTLN (EXTEND_COMPLEX, " EXTEND COMPLEX: " << complexSelector)
1736
1731
1737
- Node extendedNotExpanded = Node::createCollection ();
1738
-
1739
- for (NodeDeque::iterator complexSelIter = complexSelector.collection ()->begin (),
1740
- complexSelIterEnd = complexSelector.collection ()->end ();
1741
- complexSelIter != complexSelIterEnd; ++complexSelIter)
1742
- {
1732
+ // let CHOICES be an empty list of selector-lists
1733
+ // create new collection to hold the results
1734
+ Node choices = Node::createCollection ();
1743
1735
1744
- Node& sseqOrOp = *complexSelIter;
1736
+ // for each compound selector COMPOUND in COMPLEX:
1737
+ for (Node& sseqOrOp : *complexSelector.collection ()) {
1745
1738
1746
1739
DEBUG_PRINTLN (EXTEND_COMPLEX, " LOOP: " << sseqOrOp)
1747
1740
@@ -1754,94 +1747,90 @@ namespace Sass {
1754
1747
Node inner = Node::createCollection ();
1755
1748
outer.collection ()->push_back (inner);
1756
1749
inner.collection ()->push_back (sseqOrOp);
1757
- extendedNotExpanded .collection ()->push_back (outer);
1750
+ choices .collection ()->push_back (outer);
1758
1751
continue ;
1759
1752
}
1760
1753
1761
- Compound_Selector_Obj pCompoundSelector = sseqOrOp.selector ()->head ();
1754
+ // verified now that node is a valid selector
1755
+ Complex_Selector_Obj sseqSel = sseqOrOp.selector ();
1756
+ Compound_Selector_Obj sseqHead = sseqSel->head ();
1762
1757
1758
+ // let EXTENDED be extend_compound(COMPOUND, SEEN)
1759
+ // extend the compound selector against the given subset_map
1763
1760
// RUBY: extended = sseq_or_op.do_extend(extends, parent_directives, replace, seen)
1764
- Node extended = extendCompoundSelector (pCompoundSelector , seen, isReplace);
1761
+ Node extended = extendCompoundSelector (sseqHead , seen, isReplace); // slow(17%)!
1765
1762
if (sseqOrOp.got_line_feed ) extended.got_line_feed = true ;
1766
1763
DEBUG_PRINTLN (EXTEND_COMPLEX, " EXTENDED: " << extended)
1767
1764
1768
-
1769
- // Prepend the Compound_Selector based on the choices logic; choices seems to be extend but with an ruby Array instead of a Sequence
1770
- // due to the member mapping: choices = extended.map {|seq| seq.members}
1771
- Complex_Selector_Obj pJustCurrentCompoundSelector = sseqOrOp.selector ();
1772
-
1765
+ // Prepend the Compound_Selector based on the choices logic; choices seems to be extend but with a ruby
1766
+ // Array instead of a Sequence due to the member mapping: choices = extended.map {|seq| seq.members}
1773
1767
// RUBY: extended.first.add_sources!([self]) if original && !has_placeholder?
1774
- if (isOriginal && !pComplexSelector ->has_placeholder ()) {
1768
+ if (isOriginal && !selector ->has_placeholder ()) {
1775
1769
ComplexSelectorSet srcset;
1776
- srcset.insert (pComplexSelector );
1777
- pJustCurrentCompoundSelector ->addSources (srcset);
1770
+ srcset.insert (selector );
1771
+ sseqSel ->addSources (srcset);
1778
1772
DEBUG_PRINTLN (EXTEND_COMPLEX, " ADD SOURCES: " << *pComplexSelector)
1779
1773
}
1780
1774
1781
1775
bool isSuperselector = false ;
1782
- for (NodeDeque::iterator iterator = extended.collection ()->begin (), endIterator = extended.collection ()->end ();
1783
- iterator != endIterator; ++iterator) {
1784
- Node& childNode = *iterator;
1776
+ // if no complex selector in EXTENDED is a superselector of COMPOUND:
1777
+ for (Node& childNode : *extended.collection ()) {
1785
1778
Complex_Selector_Obj pExtensionSelector = nodeToComplexSelector (childNode);
1786
- if (pExtensionSelector->is_superselector_of (pJustCurrentCompoundSelector )) {
1779
+ if (pExtensionSelector->is_superselector_of (sseqSel )) {
1787
1780
isSuperselector = true ;
1788
1781
break ;
1789
1782
}
1790
1783
}
1791
1784
1792
1785
if (!isSuperselector) {
1793
- if (sseqOrOp.got_line_feed ) pJustCurrentCompoundSelector->has_line_feed (sseqOrOp.got_line_feed );
1794
- extended.collection ()->push_front (complexSelectorToNode (pJustCurrentCompoundSelector));
1786
+ // add a complex selector composed only of COMPOUND to EXTENDED
1787
+ if (sseqOrOp.got_line_feed ) sseqSel->has_line_feed (sseqOrOp.got_line_feed );
1788
+ extended.collection ()->push_front (complexSelectorToNode (sseqSel));
1795
1789
}
1796
1790
1797
1791
DEBUG_PRINTLN (EXTEND_COMPLEX, " CHOICES UNSHIFTED: " << extended)
1798
1792
1793
+ // add EXTENDED to CHOICES
1799
1794
// Aggregate our current extensions
1800
- extendedNotExpanded .collection ()->push_back (extended);
1795
+ choices .collection ()->push_back (extended);
1801
1796
}
1802
1797
1803
1798
1804
- DEBUG_PRINTLN (EXTEND_COMPLEX, " EXTENDED NOT EXPANDED: " << extendedNotExpanded )
1799
+ DEBUG_PRINTLN (EXTEND_COMPLEX, " EXTENDED NOT EXPANDED: " << choices )
1805
1800
1806
1801
1807
1802
1808
1803
// Ruby Equivalent: paths
1809
- Node paths = Sass::paths (extendedNotExpanded );
1804
+ Node paths = Sass::paths (choices );
1810
1805
1811
1806
DEBUG_PRINTLN (EXTEND_COMPLEX, " PATHS: " << paths)
1812
1807
1813
-
1814
-
1815
- // Ruby Equivalent: weave
1808
+ // let WEAVES be an empty list of selector lists
1816
1809
Node weaves = Node::createCollection ();
1817
1810
1818
- for (NodeDeque::iterator pathsIter = paths.collection ()->begin (), pathsEndIter = paths.collection ()->end (); pathsIter != pathsEndIter; ++pathsIter) {
1819
- Node& path = *pathsIter;
1820
- Node weaved = weave (path);
1811
+ // for each list of complex selectors PATH in paths(CHOICES):
1812
+ for (Node& path : *paths.collection ()) {
1813
+ // add weave(PATH) to WEAVES
1814
+ Node weaved = weave (path); // slow(12%)!
1821
1815
weaved.got_line_feed = path.got_line_feed ;
1822
1816
weaves.collection ()->push_back (weaved);
1823
1817
}
1824
1818
1825
1819
DEBUG_PRINTLN (EXTEND_COMPLEX, " WEAVES: " << weaves)
1826
1820
1827
-
1828
-
1829
1821
// Ruby Equivalent: trim
1830
- Node trimmed = trim (weaves, isReplace);
1822
+ Node trimmed ( trim (weaves, isReplace)); // slow(19%)!
1831
1823
1832
1824
DEBUG_PRINTLN (EXTEND_COMPLEX, " TRIMMED: " << trimmed)
1833
1825
1834
-
1835
1826
// Ruby Equivalent: flatten
1836
- Node extendedSelectors = flatten (trimmed, 1 );
1827
+ Node flattened ( flatten (trimmed, 1 ) );
1837
1828
1838
1829
DEBUG_PRINTLN (EXTEND_COMPLEX, " >>>>> EXTENDED: " << extendedSelectors)
1839
-
1840
-
1841
1830
DEBUG_PRINTLN (EXTEND_COMPLEX, " EXTEND COMPLEX END: " << complexSelector)
1842
1831
1843
-
1844
- return extendedSelectors ;
1832
+ // return trim(WEAVES)
1833
+ return flattened ;
1845
1834
}
1846
1835
1847
1836
@@ -1876,18 +1865,22 @@ namespace Sass {
1876
1865
1877
1866
// now do the actual extension of the complex selector
1878
1867
Node extendedSelectors = extendComplexSelector (pSelector, seen, isReplace, true );
1868
+
1879
1869
if (!pSelector->has_placeholder ()) {
1880
- if (!extendedSelectors.contains (complexSelectorToNode (pSelector))) {
1870
+ Node nSelector (complexSelectorToNode (pSelector));
1871
+ if (!extendedSelectors.contains (nSelector)) {
1881
1872
pNewSelectors->append (pSelector);
1882
1873
continue ;
1883
1874
}
1884
1875
}
1885
1876
1886
- for (NodeDeque::iterator iterator = extendedSelectors.collection ()->begin (), iteratorBegin = extendedSelectors.collection ()->begin (), iteratorEnd = extendedSelectors.collection ()->end (); iterator != iteratorEnd; ++iterator) {
1877
+ bool doReplace = isReplace;
1878
+ for (Node& childNode : *extendedSelectors.collection ()) {
1887
1879
// When it is a replace, skip the first one, unless there is only one
1888
- if (isReplace && iterator == iteratorBegin && extendedSelectors.collection ()->size () > 1 ) continue ;
1889
-
1890
- Node& childNode = *iterator;
1880
+ if (doReplace && extendedSelectors.collection ()->size () > 1 ) {
1881
+ doReplace = false ;
1882
+ continue ;
1883
+ }
1891
1884
pNewSelectors->append (nodeToComplexSelector (childNode));
1892
1885
}
1893
1886
}
0 commit comments