Fixes advanced optimizer.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Sat, 4 Oct 2014 09:32:09 +0000 (10:32 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Fri, 10 Oct 2014 20:22:45 +0000 (21:22 +0100)
* It was broken since we use tokenized data now.

lib/selectors/optimizers/advanced.js

index 5526774..a4cfe61 100644 (file)
@@ -1,5 +1,6 @@
 var PropertyOptimizer = require('../../properties/optimizer');
 var CleanUp = require('./clean-up');
+var Splitter = require('../../utils/splitter');
 
 var specialSelectors = {
   '*': /\-(moz|ms|o|webkit)\-/,
@@ -61,7 +62,6 @@ AdvancedOptimizer.prototype.mergeAdjacent = function (tokens) {
     // TODO: broken due to joining/splitting
     if (lastToken.selector && token.selector.join(',') == lastToken.selector.join(',')) {
       var joinAt = [lastToken.body.length];
-      lastToken.body = lastToken.body.concat(token.body);
       // TODO: broken due to joining/splitting
       lastToken.body = this.propertyOptimizer.process(lastToken.body.concat(token.body).join(';'), joinAt, false, token.selector.join(',')).split(';');
       forRemoval.push(i);
@@ -92,9 +92,9 @@ AdvancedOptimizer.prototype.reduceNonAdjacent = function (tokens) {
       continue;
 
     var complexSelector = token.selector;
-    var selectors = complexSelector.length > 1 && !this.isSpecial(complexSelector, this.options) ?
-      complexSelector :
-      [complexSelector];
+    var selectors = complexSelector.length > 1 && !this.isSpecial(complexSelector.join(','), this.options) ?
+      [complexSelector.join(',')].concat(complexSelector) :
+      [complexSelector.join(',')];
 
     for (var j = 0, m = selectors.length; j < m; j++) {
       // TODO: broken due to joining/splitting
@@ -151,7 +151,7 @@ AdvancedOptimizer.prototype.reduceComplexNonAdjacentCases = function (tokens, po
 
   allSelectors:
   for (var complexSelector in positions) {
-    if (positions[complexSelector].length == 1)
+    if (complexSelector.indexOf(',') == -1)
       continue;
 
     var into = positions[complexSelector];
@@ -159,10 +159,9 @@ AdvancedOptimizer.prototype.reduceComplexNonAdjacentCases = function (tokens, po
     var intoToken = tokens[intoPosition];
 
     // TODO: broken due to joining/splitting
-    // var selectors = this.isSpecial(complexSelector) ?
-    //   [complexSelector] :
-    //   complexSelector;
-    var selectors = complexSelector.split(',');
+    var selectors = this.isSpecial(complexSelector) ?
+      [complexSelector] :
+      new Splitter(',').split(complexSelector);
     var reducedBodies = [];
 
     for (var j = 0, m = selectors.length; j < m; j++) {
@@ -179,7 +178,7 @@ AdvancedOptimizer.prototype.reduceComplexNonAdjacentCases = function (tokens, po
         },
         callback: function (token, newBody, processedCount, tokenIdx) {
           if (tokenIdx === 0)
-            reducedBodies.push(newBody);
+            reducedBodies.push(newBody.join(';'));
         }
       });
 
@@ -187,7 +186,7 @@ AdvancedOptimizer.prototype.reduceComplexNonAdjacentCases = function (tokens, po
         continue allSelectors;
     }
 
-    intoToken.body = reducedBodies[0];
+    intoToken.body = reducedBodies[0].split(';');
     reduced = true;
   }
 
@@ -219,15 +218,15 @@ AdvancedOptimizer.prototype.reduceSelector = function (tokens, selector, data, o
   }
 
   // TODO: broken due to joining/splitting
-  var optimizedBody = this.propertyOptimizer.process(bodies.join(';'), joinsAt, true, selector).split(';');
-  var optimizedProperties = optimizedBody;
+  var optimizedBody = this.propertyOptimizer.process(bodies.join(';'), joinsAt, true, selector);
+  var optimizedProperties = optimizedBody.split(';');
 
   var processedCount = processedTokens.length;
   var propertyIdx = optimizedProperties.length - 1;
   var tokenIdx = processedCount - 1;
 
   while (tokenIdx >= 0) {
-    if ((tokenIdx === 0 || splitBodies[tokenIdx].join(';').indexOf(optimizedProperties[propertyIdx]) > -1) && propertyIdx > -1) {
+    if ((tokenIdx === 0 || splitBodies[tokenIdx].indexOf(optimizedProperties[propertyIdx]) > -1) && propertyIdx > -1) {
       propertyIdx--;
       continue;
     }
@@ -259,22 +258,34 @@ function optimizeProperties(tokens, propertyOptimizer) {
 }
 
 AdvancedOptimizer.prototype.optimize = function (tokens) {
-  optimizeProperties(tokens, this.propertyOptimizer);
+  var self = this;
 
-  // Run until 2 last operations do not yield any changes
-  while (true) {
-    if (this.noChanges())
-      break;
-    this.removeDuplicates(tokens);
+  function _optimize(tokens) {
+    tokens.forEach(function (token) {
+      if (token.block)
+        _optimize(token.body);
+    });
+
+    optimizeProperties(tokens, self.propertyOptimizer);
+
+    // Run until 2 last operations do not yield any changes
+    self.minificationsMade = [];
+    while (true) {
+      if (self.noChanges())
+        break;
+      self.removeDuplicates(tokens);
 
-    if (this.noChanges())
-      break;
-    this.mergeAdjacent(tokens);
+      if (self.noChanges())
+        break;
+      self.mergeAdjacent(tokens);
 
-    if (this.noChanges())
-      break;
-    this.reduceNonAdjacent(tokens);
+      if (self.noChanges())
+        break;
+      self.reduceNonAdjacent(tokens);
+    }
   }
+
+  _optimize(tokens);
 };
 
 module.exports = AdvancedOptimizer;