1var mergeIntoShorthands = require('./merge-into-shorthands');
2var overrideProperties = require('./override-properties');
3var populateComponents = require('./populate-components');
4
5var restoreWithComponents = require('../restore-with-components');
6
7var wrapForOptimizing = require('../../wrap-for-optimizing').all;
8var removeUnused = require('../../remove-unused');
9var restoreFromOptimizing = require('../../restore-from-optimizing');
10
11var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
12
13function optimizeProperties(properties, withOverriding, withMerging, context) {
14  var levelOptions = context.options.level[OptimizationLevel.Two];
15  var _properties = wrapForOptimizing(properties, false, levelOptions.skipProperties);
16  var _property;
17  var i, l;
18
19  populateComponents(_properties, context.validator, context.warnings);
20
21  for (i = 0, l = _properties.length; i < l; i++) {
22    _property = _properties[i];
23    if (_property.block) {
24      optimizeProperties(_property.value[0][1], withOverriding, withMerging, context);
25    }
26  }
27
28  if (withMerging && levelOptions.mergeIntoShorthands) {
29    mergeIntoShorthands(_properties, context.validator);
30  }
31
32  if (withOverriding && levelOptions.overrideProperties) {
33    overrideProperties(_properties, withMerging, context.options.compatibility, context.validator);
34  }
35
36  restoreFromOptimizing(_properties, restoreWithComponents);
37  removeUnused(_properties);
38}
39
40module.exports = optimizeProperties;
41