Code coverage report for sc/lang/compiler/codegen/assignment-expr.js

Statements: 100% (31 / 31)      Branches: 100% (8 / 8)      Functions: 100% (7 / 7)      Lines: 100% (31 / 31)      Ignored: none     

All files » sc/lang/compiler/codegen/ » assignment-expr.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 661     1   1   1 19 5   14     1 14   14   14   14 5     14     1 5 5 5   5   5 9         5 1           5   5       1 10 10   10 8     10      
(function(sc) {
  "use strict";
 
  require("./codegen");
 
  var CodeGen = sc.lang.compiler.CodeGen;
 
  CodeGen.addGenerateMethod("AssignmentExpression", function(node) {
    if (Array.isArray(node.left)) {
      return generateDestructuringAssignment(this, node);
    }
    return generateSimpleAssignment(this, node);
  });
 
  function generateSimpleAssignment(that, node) {
    var result = [];
 
    var opts = { right: node.right, used: false };
 
    result.push(that.generate(node.left, opts));
 
    if (!opts.used) {
      result.push(node.operator, that.generate(opts.right));
    }
 
    return result;
  }
 
  function generateDestructuringAssignment(that, node) {
    return that.useTemporaryVariable(function(tempVar) {
      var elements = node.left;
      var operator = node.operator;
 
      var result = [ "(" + tempVar + "=", that.generate(node.right), "," ];
 
      result.push(that.stitchWith(elements, ",", function(item, i) {
        return generateAssign(
          that, item, operator, tempVar + ".$('at',[$.Integer(" + i + ")])"
        );
      }));
 
      if (node.remain) {
        result.push(",", generateAssign(
          that, node.remain, operator,
          tempVar + ".$('copyToEnd',[$.Integer(" + elements.length + ")])"
        ));
      }
 
      result.push(",", tempVar + ")");
 
      return result;
    });
  }
 
  function generateAssign(that, left, operator, right) {
    var opts = { right: right, used: false };
    var result = [ that.generate(left, opts) ];
 
    if (!opts.used) {
      result.push(operator, right);
    }
 
    return result;
  }
})(sc);