BVB ソース・コード

CoffeeScriptRedux 表示する optimiser.jsソースコード

戻る ダウンロードCoffeeScriptRedux: 個別にダウンロードoptimiser.jsソースコード - 全体をダウンロードCoffeeScriptReduxソースコード - タイプ:.js
  1. // Generated by CoffeeScript 2.0.0-beta9-dev
  2. var all, any, beingDeclared, cache$, cache$1, concat, concatMap, CS, declarationsFor, defaultRules, difference, envEnrichments, exports, foldl, foldl1, isFalsey, isTruthy, makeDispatcher, mayHaveSideEffects, union, usedAsExpression;
  3. cache$ = require('./functional-helpers');
  4. all = cache$.all;
  5. any = cache$.any;
  6. concat = cache$.concat;
  7. concatMap = cache$.concatMap;
  8. difference = cache$.difference;
  9. foldl = cache$.foldl;
  10. foldl1 = cache$.foldl1;
  11. union = cache$.union;
  12. cache$1 = require('./helpers');
  13. beingDeclared = cache$1.beingDeclared;
  14. declarationsFor = cache$1.declarationsFor;
  15. usedAsExpression = cache$1.usedAsExpression;
  16. envEnrichments = cache$1.envEnrichments;
  17. CS = require('./nodes');
  18. exports = null != ('undefined' !== typeof module && null != module ? module.exports : void 0) ? 'undefined' !== typeof module && null != module ? module.exports : void 0 : this;
  19. makeDispatcher = function (defaultValue, handlers, defaultHandler) {
  20.   var cache$2, ctor, ctors, handler, handlers_, size$;
  21.   if (null == defaultHandler)
  22.     defaultHandler = function () {
  23.     };
  24.   handlers_ = {};
  25.   for (var i$ = 0, length$ = handlers.length; i$ < length$; ++i$) {
  26.     {
  27.       cache$2 = handlers[i$];
  28.       size$ = cache$2.length;
  29.       ctors = size$ > 1 ? [].slice.call(cache$2, 0, size$ - 1) : [];
  30.       handler = cache$2[size$ - 1];
  31.     }
  32.     for (var i$1 = 0, length$1 = ctors.length; i$1 < length$1; ++i$1) {
  33.       ctor = ctors[i$1];
  34.       handlers_[ctor.prototype.className] = handler;
  35.     }
  36.   }
  37.   return function (node) {
  38.     var args;
  39.     args = arguments.length > 1 ? [].slice.call(arguments, 1) : [];
  40.     if (!(null != node))
  41.       return defaultValue;
  42.     handler = Object.prototype.hasOwnProperty.call(handlers_, node.className) ? handlers_[node.className] : defaultHandler;
  43.     return handler.apply(node, args);
  44.   };
  45. };
  46. isTruthy = makeDispatcher(false, [
  47.   [
  48.     CS.ArrayInitialiser,
  49.     CS.Class,
  50.     CS.DeleteOp,
  51.     CS.ForIn,
  52.     CS.ForOf,
  53.     CS.Function,
  54.     CS.BoundFunction,
  55.     CS.HeregExp,
  56.     CS.ObjectInitialiser,
  57.     CS.Range,
  58.     CS.RegExp,
  59.     CS.Slice,
  60.     CS.TypeofOp,
  61.     CS.While,
  62.     function () {
  63.       return true;
  64.     }
  65.   ],
  66.   [
  67.     CS.AssignOp,
  68.     function () {
  69.       return isTruthy(this.expression);
  70.     }
  71.   ],
  72.   [
  73.     CS.Block,
  74.     function () {
  75.       if (this.statements.length === 0) {
  76.         return false;
  77.       } else {
  78.         return isTruthy(this.statements[this.statements.length - 1]);
  79.       }
  80.     }
  81.   ],
  82.   [
  83.     CS.Bool,
  84.     CS.Float,
  85.     CS.Int,
  86.     CS.String,
  87.     function () {
  88.       return !!this.data;
  89.     }
  90.   ],
  91.   [
  92.     CS.Conditional,
  93.     function () {
  94.       return isTruthy(this.condition) && isTruthy(this.consequent) || isFalsey(this.condition) && isTruthy(this.alternate);
  95.     }
  96.   ],
  97.   [
  98.     CS.LogicalAndOp,
  99.     function () {
  100.       return isTruthy(this.left) && isTruthy(this.right);
  101.     }
  102.   ],
  103.   [
  104.     CS.LogicalNotOp,
  105.     function () {
  106.       return isFalsey(this.expression);
  107.     }
  108.   ],
  109.   [
  110.     CS.LogicalOrOp,
  111.     function () {
  112.       return isTruthy(this.left) || isTruthy(this.right);
  113.     }
  114.   ],
  115.   [
  116.     CS.Program,
  117.     function () {
  118.       return isTruthy(this.body);
  119.     }
  120.   ],
  121.   [
  122.     CS.SeqOp,
  123.     function () {
  124.       return isTruthy(this.right);
  125.     }
  126.   ],
  127.   [
  128.     CS.Switch,
  129.     function () {
  130.       return all(this.cases, isTruthy) && (null != this.alternate ? isTruthy(this.alternate) : true);
  131.     }
  132.   ],
  133.   [
  134.     CS.SwitchCase,
  135.     function () {
  136.       return isTruthy(this.consequent);
  137.     }
  138.   ],
  139.   [
  140.     CS.UnaryExistsOp,
  141.     function () {
  142.       return isTruthy(this.expression) || this.expression['instanceof'](CS.Int, CS.Float, CS.String, CS.UnaryPlusOp, CS.UnaryNegateOp, CS.LogicalNotOp);
  143.     }
  144.   ]
  145. ], function () {
  146.   return false;
  147. });
  148. isFalsey = makeDispatcher(false, [
  149.   [
  150.     CS.Null,
  151.     CS.Undefined,
  152.     function () {
  153.       return true;
  154.     }
  155.   ],
  156.   [
  157.     CS.AssignOp,
  158.     function () {
  159.       return isFalsey(this.expression);
  160.     }
  161.   ],
  162.   [
  163.     CS.Block,
  164.     function () {
  165.       if (this.statements.length === 0) {
  166.         return true;
  167.       } else {
  168.         return isFalsey(this.statements[this.statements.length - 1]);
  169.       }
  170.     }
  171.   ],
  172.   [
  173.     CS.Bool,
  174.     CS.Float,
  175.     CS.Int,
  176.     CS.String,
  177.     function () {
  178.       return !this.data;
  179.     }
  180.   ],
  181.   [
  182.     CS.Conditional,
  183.     function () {
  184.       return isTruthy(this.condition) && isFalsey(this.consequent) || isFalsey(this.condition) && isFalsey(this.alternate);
  185.     }
  186.   ],
  187.   [
  188.     CS.LogicalAndOp,
  189.     function () {
  190.       return isFalsey(this.left) || isFalsey(this.right);
  191.     }
  192.   ],
  193.   [
  194.     CS.LogicalNotOp,
  195.     function () {
  196.       return isTruthy(this.expression);
  197.     }
  198.   ],
  199.   [
  200.     CS.LogicalOrOp,
  201.     function () {
  202.       return isFalsey(this.left) && isFalsey(this.right);
  203.     }
  204.   ],
  205.   [
  206.     CS.Program,
  207.     function () {
  208.       return isFalsey(this.body);
  209.     }
  210.   ],
  211.   [
  212.     CS.SeqOp,
  213.     function () {
  214.       return isFalsey(this.right);
  215.     }
  216.   ],
  217.   [
  218.     CS.Switch,
  219.     function () {
  220.       return all(this.cases, isFalsey) && (null != this.alternate ? isFalsey(this.alternate) : true);
  221.     }
  222.   ],
  223.   [
  224.     CS.SwitchCase,
  225.     function () {
  226.       return isFalsey(this.block);
  227.     }
  228.   ],
  229.   [
  230.     CS.UnaryExistsOp,
  231.     function () {
  232.       return this.expression['instanceof'](CS.Null, CS.Undefined);
  233.     }
  234.   ]
  235. ], function () {
  236.   return false;
  237. });
  238. mayHaveSideEffects = makeDispatcher(false, [
  239.   [
  240.     CS.Function,
  241.     CS.BoundFunction,
  242.     CS.Null,
  243.     CS.RegExp,
  244.     CS.This,
  245.     CS.Undefined,
  246.     function () {
  247.       return false;
  248.     }
  249.   ],
  250.   [
  251.     CS.Break,
  252.     CS.Continue,
  253.     CS.Debugger,
  254.     CS.DeleteOp,
  255.     CS.NewOp,
  256.     CS.Return,
  257.     CS.Super,
  258.     CS.PreDecrementOp,
  259.     CS.PreIncrementOp,
  260.     CS.PostDecrementOp,
  261.     CS.PostIncrementOp,
  262.     CS.ClassProtoAssignOp,
  263.     CS.Constructor,
  264.     CS.Throw,
  265.     CS.JavaScript,
  266.     CS.ExtendsOp,
  267.     function () {
  268.       return true;
  269.     }
  270.   ],
  271.   [
  272.     CS.Class,
  273.     function (inScope) {
  274.       return mayHaveSideEffects(this.parent, inScope) || null != this.nameAssignee && (this.name || beingDeclared(this.nameAssignee).length > 0);
  275.     }
  276.   ],
  277.   [
  278.     CS.Conditional,
  279.     function (inScope) {
  280.       return mayHaveSideEffects(this.condition, inScope) || !isFalsey(this.condition) && mayHaveSideEffects(this.consequent, inScope) || !isTruthy(this.condition) && mayHaveSideEffects(this.alternate, inScope);
  281.     }
  282.   ],
  283.   [
  284.     CS.DoOp,
  285.     function (inScope) {
  286.       var args, newScope, p;
  287.       if (!this.expression['instanceof'](CS.Functions))
  288.         return true;
  289.       newScope = difference(inScope, concatMap(this.expression.parameters, beingDeclared));
  290.       args = function (accum$) {
  291.         for (var i$ = 0, length$ = this.expression.parameters.length; i$ < length$; ++i$) {
  292.           p = this.expression.parameters[i$];
  293.           accum$.push(p['instanceof'](CS.AssignOp) ? p.expression : p);
  294.         }
  295.         return accum$;
  296.       }.call(this, []);
  297.       if (any(args, function (a) {
  298.           return mayHaveSideEffects(a, newScope);
  299.         }))
  300.         return true;
  301.       return mayHaveSideEffects(this.expression.body, newScope);
  302.     }
  303.   ],
  304.   [
  305.     CS.ExistsOp,
  306.     function (inScope) {
  307.       if (mayHaveSideEffects(this.left, inScope))
  308.         return true;
  309.       if (this.left['instanceof'](CS.Undefined, CS.Null))
  310.         return false;
  311.       return mayHaveSideEffects(this.right, inScope);
  312.     }
  313.   ],
  314.   [
  315.     CS.FunctionApplication,
  316.     CS.SoakedFunctionApplication,
  317.     function (inScope) {
  318.       var newScope;
  319.       if (!this['function']['instanceof'](CS.Function, CS.BoundFunction))
  320.         return true;
  321.       newScope = difference(inScope, concatMap(this['function'].parameters, beingDeclared));
  322.       if (any(this['arguments'], function (a) {
  323.           return mayHaveSideEffects(a, newScope);
  324.         }))
  325.         return true;
  326.       return mayHaveSideEffects(this['function'].body, newScope);
  327.     }
  328.   ],
  329.   [
  330.     CS.LogicalAndOp,
  331.     function (inScope) {
  332.       if (mayHaveSideEffects(this.left, inScope))
  333.         return true;
  334.       if (isFalsey(this.left))
  335.         return false;
  336.       return mayHaveSideEffects(this.right, inScope);
  337.     }
  338.   ],
  339.   [
  340.     CS.LogicalOrOp,
  341.     function (inScope) {
  342.       if (mayHaveSideEffects(this.left, inScope))
  343.         return true;
  344.       if (isTruthy(this.left))
  345.         return false;
  346.       return mayHaveSideEffects(this.right, inScope);
  347.     }
  348.   ],
  349.   [
  350.     CS.While,
  351.     function (inScope) {
  352.       return mayHaveSideEffects(this.condition, inScope) || !isFalsey(this.condition) && mayHaveSideEffects(this.body, inScope);
  353.     }
  354.   ],
  355.   [
  356.     CS.AssignOp,
  357.     CS.ClassProtoAssignOp,
  358.     CS.CompoundAssignOp,
  359.     function (inScope) {
  360.       return true;
  361.     }
  362.   ],
  363.   [
  364.     CS.Bool,
  365.     CS.Float,
  366.     CS.Identifier,
  367.     CS.Int,
  368.     CS.String,
  369.     function () {
  370.       return false;
  371.     }
  372.   ]
  373. ], function (inScope) {
  374.   return any(this.childNodes, function (this$) {
  375.     return function (child) {
  376.       if (in$(child, this$.listMembers)) {
  377.         return any(this$[child], function (m) {
  378.           return mayHaveSideEffects(m, inScope);
  379.         });
  380.       } else {
  381.         return mayHaveSideEffects(this$[child], inScope);
  382.       }
  383.     };
  384.   }(this));
  385. });
  386. exports.Optimiser = function () {
  387.   Optimiser.optimise = function (this$) {
  388.     return function () {
  389.       var cache$2;
  390.       return (cache$2 = new this$()).optimise.apply(cache$2, [].slice.call(arguments));
  391.     };
  392.   }(Optimiser);
  393.   Optimiser.isTruthy = isTruthy;
  394.   Optimiser.isFalsey = isFalsey;
  395.   Optimiser.mayHaveSideEffects = mayHaveSideEffects;
  396.   defaultRules = [
  397.     [
  398.       CS.Program,
  399.       function () {
  400.         if (!(null != this.body) || mayHaveSideEffects(this.body, [])) {
  401.           return this;
  402.         } else {
  403.           return new CS.Program(null);
  404.         }
  405.       }
  406.     ],
  407.     [
  408.       CS.Block,
  409.       function (param$) {
  410.         var inScope;
  411.         inScope = param$.inScope;
  412.         switch (this.statements.length) {
  413.         case 0:
  414.           return new CS.Undefined().g();
  415.         case 1:
  416.           return this.statements[0];
  417.         default:
  418.           return foldl(this.statements[0], this.statements.slice(1), function (expr, s) {
  419.             return new CS.SeqOp(expr, s);
  420.           });
  421.         }
  422.       }
  423.     ],
  424.     [
  425.       CS.SeqOp,
  426.       function (param$) {
  427.         var ancestry, cache$2, canDropLast, inScope;
  428.         {
  429.           cache$2 = param$;
  430.           inScope = cache$2.inScope;
  431.           ancestry = cache$2.ancestry;
  432.         }
  433.         canDropLast = !usedAsExpression(this, ancestry);
  434.         if (this.left['instanceof'](CS.Undefined)) {
  435.           return this.right;
  436.         } else if (this.left['instanceof'](CS.Return, CS.Throw)) {
  437.           return this.left;
  438.         } else if (mayHaveSideEffects(this.left, inScope)) {
  439.           if (mayHaveSideEffects(this.right, inScope)) {
  440.             return this;
  441.           } else if (!canDropLast) {
  442.             return this;
  443.           } else if (this.right['instanceof'](CS.Undefined)) {
  444.             return this.left;
  445.           } else {
  446.             return new CS.SeqOp(this.left, declarationsFor(this.right, union(inScope, envEnrichments(this.left, inScope))));
  447.           }
  448.         } else if (this.right['instanceof'](CS.Identifier) && this.right.data === 'eval' && ((null != ancestry[0] ? ancestry[0]['instanceof'](CS.FunctionApplication) : void 0) && ancestry[0]['function'] === this || (null != ancestry[0] ? ancestry[0]['instanceof'](CS.DoOp) : void 0) && ancestry[0].expression === this)) {
  449.           if (this.left['instanceof'](CS.Int) && (0 <= this.left.data && this.left.data <= 9)) {
  450.             return this;
  451.           } else if (mayHaveSideEffects(this.left, inScope)) {
  452.             return this;
  453.           } else {
  454.             return new CS.SeqOp(new CS.Int(0).g(), this.right);
  455.           }
  456.         } else if (mayHaveSideEffects(this.right, inScope)) {
  457.           return new CS.SeqOp(declarationsFor(this.left, inScope), this.right);
  458.         } else if (canDropLast) {
  459.           return declarationsFor(this, inScope);
  460.         } else {
  461.           return this.right;
  462.         }
  463.       }
  464.     ],
  465.     [
  466.       CS.AssignOp,
  467.       function () {
  468.         if (!this.expression['instanceof'](CS.SeqOp))
  469.           return this;
  470.         return new CS.SeqOp(this.expression.left, new CS.AssignOp(this.assignee, this.expression.right));
  471.       }
  472.     ],
  473.     [
  474.       CS.While,
  475.       function (param$) {
  476.         var inScope;
  477.         inScope = param$.inScope;
  478.         if (isFalsey(this.condition)) {
  479.           return new CS.Block([
  480.             mayHaveSideEffects(this.condition, inScope) ? new CS.SeqOp(this.condition, declarationsFor(this.body)) : null != this.body ? declarationsFor(this.body, inScope) : new CS.Undefined,
  481.             new CS.ArrayInitialiser([])
  482.           ]);
  483.         } else if (isTruthy(this.condition)) {
  484.           if (mayHaveSideEffects(this.condition, inScope)) {
  485.             return this;
  486.           } else if (null != this.body) {
  487.             if (this instanceof CS.Loop) {
  488.               return this;
  489.             } else {
  490.               return new CS.Loop(this.body).g();
  491.             }
  492.           } else {
  493.             return new CS.ArrayInitialiser([]);
  494.           }
  495.         } else {
  496.           return this;
  497.         }
  498.       }
  499.     ],
  500.     [
  501.       CS.Conditional,
  502.       function (param$) {
  503.         var block, cache$2, cache$3, decls, inScope, removedBlock;
  504.         inScope = param$.inScope;
  505.         if (isFalsey(this.condition)) {
  506.           cache$2 = [
  507.             this.consequent,
  508.             this.alternate
  509.           ];
  510.           removedBlock = cache$2[0];
  511.           block = cache$2[1];
  512.           cache$2;
  513.         } else if (isTruthy(this.condition)) {
  514.           cache$3 = [
  515.             this.consequent,
  516.             this.alternate
  517.           ];
  518.           block = cache$3[0];
  519.           removedBlock = cache$3[1];
  520.           cache$3;
  521.         } else {
  522.           return this;
  523.         }
  524.         decls = declarationsFor(removedBlock, inScope);
  525.         block = null != block ? new CS.SeqOp(decls, block) : decls;
  526.         if (mayHaveSideEffects(this.condition, inScope))
  527.           block = new CS.SeqOp(this.condition, block);
  528.         return block;
  529.       }
  530.     ],
  531.     [
  532.       CS.ForIn,
  533.       function (param$) {
  534.         var inScope;
  535.         inScope = param$.inScope;
  536.         if (!(this.target['instanceof'](CS.ArrayInitialiser) && this.target.members.length === 0))
  537.           return this;
  538.         return new CS.SeqOp(declarationsFor(this, inScope), new CS.ArrayInitialiser([]).g());
  539.       }
  540.     ],
  541.     [
  542.       CS.ForOf,
  543.       function (param$) {
  544.         var inScope;
  545.         inScope = param$.inScope;
  546.         if (!(this.isOwn && this.target['instanceof'](CS.ObjectInitialiser) && this.target.members.length === 0))
  547.           return this;
  548.         return new CS.SeqOp(declarationsFor(this, inScope), new CS.ArrayInitialiser([]).g());
  549.       }
  550.     ],
  551.     [
  552.       CS.ForIn,
  553.       CS.ForOf,
  554.       function (param$) {
  555.         var inScope;
  556.         inScope = param$.inScope;
  557.         if (!isFalsey(this.filter))
  558.           return this;
  559.         return new CS.SeqOp(declarationsFor(this, inScope), new CS.ArrayInitialiser([]).g());
  560.       }
  561.     ],
  562.     [
  563.       CS.ForIn,
  564.       function () {
  565.         if (!isTruthy(this.filter))
  566.           return this;
  567.         return new CS.ForIn(this.valAssignee, this.keyAssignee, this.target, this.step, null, this.body);
  568.       }
  569.     ],
  570.     [
  571.       CS.ForOf,
  572.       function () {
  573.         if (!isTruthy(this.filter))
  574.           return this;
  575.         return new CS.ForOf(this.isOwn, this.keyAssignee, this.valAssignee, this.target, null, this.body);
  576.       }
  577.     ],
  578.     [
  579.       CS.ArrayInitialiser,
  580.       function (param$) {
  581.         var ancestry, cache$2, inScope;
  582.         {
  583.           cache$2 = param$;
  584.           inScope = cache$2.inScope;
  585.           ancestry = cache$2.ancestry;
  586.         }
  587.         if (usedAsExpression(this, ancestry)) {
  588.           return this;
  589.         } else {
  590.           return foldl(new CS.Undefined().g(), this.members, function (expr, m) {
  591.             return new CS.SeqOp(expr, m);
  592.           });
  593.         }
  594.       }
  595.     ],
  596.     [
  597.       CS.ExistsOp,
  598.       function () {
  599.         if (this.left['instanceof'](CS.Null, CS.Undefined)) {
  600.           return this.right;
  601.         } else {
  602.           return this;
  603.         }
  604.       }
  605.     ],
  606.     [
  607.       CS.UnaryExistsOp,
  608.       function () {
  609.         if (this.expression['instanceof'](CS.Null, CS.Undefined)) {
  610.           return new CS.Bool(false).g();
  611.         } else {
  612.           return this;
  613.         }
  614.       }
  615.     ],
  616.     [
  617.       CS.LogicalNotOp,
  618.       function (param$) {
  619.         var inScope;
  620.         inScope = param$.inScope;
  621.         switch (false) {
  622.         case !this.expression['instanceof'](CS.Int, CS.Float, CS.String, CS.Bool):
  623.           return new CS.Bool(!this.expression.data).g();
  624.         case !this.expression['instanceof'](CS.Functions):
  625.           return new CS.Bool(false).g();
  626.         case !this.expression['instanceof'](CS.Null, CS.Undefined):
  627.           return new CS.Bool(true).g();
  628.         case !this.expression['instanceof'](CS.ArrayInitialiser, CS.ObjectInitialiser):
  629.           if (mayHaveSideEffects(this.expression, inScope)) {
  630.             return this;
  631.           } else {
  632.             return new CS.SeqOp(declarationsFor(this.expression, inScope), new CS.Bool(false).g());
  633.           }
  634.         case !this.expression['instanceof'](CS.LogicalNotOp):
  635.           if (this.expression.expression['instanceof'](CS.LogicalNotOp)) {
  636.             return this.expression.expression;
  637.           } else {
  638.             return this;
  639.           }
  640.         default:
  641.           return this;
  642.         }
  643.       }
  644.     ],
  645.     [
  646.       CS.TypeofOp,
  647.       function () {
  648.         switch (false) {
  649.         case !this.expression['instanceof'](CS.Int, CS.Float, CS.UnaryNegateOp, CS.UnaryPlusOp):
  650.           return new CS.String('number').g();
  651.         case !this.expression['instanceof'](CS.String):
  652.           return new CS.String('string').g();
  653.         case !this.expression['instanceof'](CS.Functions):
  654.           return new CS.String('function').g();
  655.         case !this.expression['instanceof'](CS.Undefined):
  656.           return new CS.String('undefined').g();
  657.         default:
  658.           return this;
  659.         }
  660.       }
  661.     ],
  662.     [
  663.       CS.SeqOp,
  664.       function (param$) {
  665.         var ancestry;
  666.         ancestry = param$.ancestry;
  667.         if (!((null != ancestry[0] ? ancestry[0]['instanceof'](CS.Functions) : void 0) && ancestry[0].body === this))
  668.           return this;
  669.         if (this.right['instanceof'](CS.Return) && null != this.right.expression) {
  670.           return new CS.SeqOp(this.left, this.right.expression);
  671.         } else if (this.right['instanceof'](CS.Undefined)) {
  672.           return new CS.SeqOp(this.left, new CS.Return);
  673.         } else {
  674.           return this;
  675.         }
  676.       }
  677.     ],
  678.     [
  679.       CS.Function,
  680.       CS.BoundFunction,
  681.       function () {
  682.         if (!(null != this.block && (this.block['instanceof'](CS.Undefined) || this.block['instanceof'](CS.Return) && !(null != this.block.expression))))
  683.           return this;
  684.         return new this.constructor(this.parameters, null);
  685.       }
  686.     ],
  687.     [
  688.       CS.Return,
  689.       function () {
  690.         if (null != this.expression ? this.expression['instanceof'](CS.Undefined) : void 0) {
  691.           return new CS.Return;
  692.         } else {
  693.           return this;
  694.         }
  695.       }
  696.     ],
  697.     [
  698.       CS.Slice,
  699.       function () {
  700.         if ((null != this.left ? this.left['instanceof'](CS.Int, CS.String) : void 0) && +this.left.data === 0) {
  701.           return new CS.Slice(this.expression, this.isInclusive, null, this.right);
  702.         } else if (this.isInclusive && (null != this.right ? this.right['instanceof'](CS.UnaryNegateOp) : void 0) && this.right.expression['instanceof'](CS.Int) && this.right.expression.data === 1) {
  703.           return new CS.Slice(this.expression, true, this.left, null);
  704.         } else {
  705.           return this;
  706.         }
  707.       }
  708.     ]
  709.   ];
  710.   function Optimiser() {
  711.     var cache$2, ctor, ctors, handler, size$;
  712.     this.rules = {};
  713.     for (var i$ = 0, length$ = defaultRules.length; i$ < length$; ++i$) {
  714.       {
  715.         cache$2 = defaultRules[i$];
  716.         size$ = cache$2.length;
  717.         ctors = size$ > 1 ? [].slice.call(cache$2, 0, size$ - 1) : [];
  718.         handler = cache$2[size$ - 1];
  719.       }
  720.       for (var i$1 = 0, length$1 = ctors.length; i$1 < length$1; ++i$1) {
  721.         ctor = ctors[i$1];
  722.         this.addRule(ctor.prototype.className, handler);
  723.       }
  724.     }
  725.   }
  726.   Optimiser.prototype.addRule = function (ctor, handler) {
  727.     (null != this.rules[ctor] ? this.rules[ctor] : this.rules[ctor] = []).push(handler);
  728.     return this;
  729.   };
  730.   Optimiser.prototype.optimise = function () {
  731.     var walk;
  732.     walk = function (fn, inScope, ancestry) {
  733.       var childName, member, n, p, replacementNode;
  734.       if (null == inScope)
  735.         inScope = [];
  736.       if (null == ancestry)
  737.         ancestry = [];
  738.       ancestry.unshift(this);
  739.       for (var i$ = 0, length$ = this.childNodes.length; i$ < length$; ++i$) {
  740.         childName = this.childNodes[i$];
  741.         if (!(null != this[childName]))
  742.           continue;
  743.         if (in$(childName, this.listMembers)) {
  744.           for (var i$1 = 0, length$1 = this[childName].length; i$1 < length$1; ++i$1) {
  745.             member = this[childName][i$1];
  746.             n = i$1;
  747.             while (this[childName][n] !== walk.call(this[childName][n] = fn.call(this[childName][n], {
  748.                 inScope: inScope,
  749.                 ancestry: ancestry
  750.               }), fn, inScope, ancestry)) {
  751.             }
  752.             inScope = union(inScope, envEnrichments(this[childName][n], inScope));
  753.           }
  754.         } else {
  755.           while (this[childName] !== walk.call(this[childName] = fn.call(this[childName], {
  756.               inScope: inScope,
  757.               ancestry: ancestry
  758.             }), fn, inScope, ancestry)) {
  759.           }
  760.           inScope = union(inScope, envEnrichments(this[childName], inScope));
  761.         }
  762.       }
  763.       ancestry.shift();
  764.       replacementNode = fn.call(this, {
  765.         inScope: inScope,
  766.         ancestry: ancestry
  767.       });
  768.       if (this !== replacementNode) {
  769.         while (replacementNode !== walk.call(replacementNode = fn.call(replacementNode, {
  770.             inScope: inScope,
  771.             ancestry: ancestry
  772.           }), fn, inScope, ancestry)) {
  773.         }
  774.         for (var cache$2 = [
  775.               'raw',
  776.               'line',
  777.               'column',
  778.               'offset'
  779.             ], i$2 = 0, length$2 = cache$2.length; i$2 < length$2; ++i$2) {
  780.           p = cache$2[i$2];
  781.           replacementNode[p] = this[p];
  782.         }
  783.       }
  784.       return replacementNode;
  785.     };
  786.     return function (ast) {
  787.       var rules;
  788.       rules = this.rules;
  789.       return walk.call(ast, function (param$) {
  790.         var ancestry, memo, rule;
  791.         ancestry = param$.ancestry;
  792.         if (!(null != this) || this === global)
  793.           throw new Error('Optimiser rules must produce a node. `null` is not a node.');
  794.         if (in$(this, ancestry))
  795.           return this;
  796.         memo = this;
  797.         for (var cache$2 = null != rules[memo.className] ? rules[memo.className] : [], i$ = 0, length$ = cache$2.length; i$ < length$; ++i$) {
  798.           rule = cache$2[i$];
  799.           memo = rule.apply(memo, arguments);
  800.           if (memo !== this)
  801.             break;
  802.         }
  803.         return memo;
  804.       });
  805.     };
  806.   }();
  807.   return Optimiser;
  808. }();
  809. function in$(member, list) {
  810.   for (var i = 0, length = list.length; i < length; ++i)
  811.     if (i in list && list[i] === member)
  812.       return true;
  813.   return false;
  814. }
  815.  
個別にダウンロードoptimiser.jsソースコード - 全体をダウンロードCoffeeScriptReduxソースコード
関連するソース/ソフトウェア:
breakpoint - Sa で本当にシンプルなメディア クエリ 2017-04-23
libsvm - 2017-04-22
grr - ウーの迅速な対応: リモート ライブ フォレンジック インシデント対応のため 2017-04-22
grit - * * 砥粒はもはや維持されています。Libgit2/頑丈なをチェックしてください。 * * 粒与え... 2017-04-22
guard-livereload - Guard::LiveReload は、'ビュー' ファイルが変更されたとき自動的にブラウザーを再読... 2017-04-22
Toucan - 素晴らしい画像スウィフト処理 2017-04-23
spring-security-oauth - 春 web アプリケーションの OAuth1(a)、OAuth2 機能 (コンシューマーとプロバイダ... 2017-04-23
rouge - Pygments http://rouge.jneen.net/ と互換性のある純粋な ruby コ... 2017-04-23
sphinx_rtd_theme - Readthedocs.org のスフィンクスのテーマ 2017-04-23
BlurEffectForAndroidDesign - 実装する方法を示すサンプルは、グラフィカルなトリックをぼかし 2017-04-23
swing - Swipeable カード インターフェイス。スワイプ左/スワイプ右はい/いいえを入力します。ゼリー... 2017-04-30
qTip2 - qTip2 - 非常に強力なヒント http://qtip2.com 2017-04-30
jo - シェルから JSON 出力 2017-04-30
Fluidbox - 複製し、流体の遷移と媒体で見たライト モジュールを改善します。 http:/... 2017-04-30
boto3 - Python の AWS SDK http://aws.amazon.com... 2017-04-30
PreloadJS - PreloadJS 簡単にプリロード資産と取得集計進行状況イベント JavaScript でできます... 2017-04-29
gotraining - トレーニング教材を行く: http://www.ArdanLabs.com 2017-04-29
eigen - あなたのポケットまたはあなたのトレンディなハイテクの企業のトートバッグ、芸術家気取りの iOS アプ... 2017-04-29
rack-cors - クロス オリジン リソース共有 (CORS)、オリジン AJAX を可能にする処理のためのミドルウェ... 2017-04-29
react-redux-tutorial - 中国語カタログの反応-redux-チュートリアル & & のコード例 2017-04-29

 トップへ戻る