Code coverage report for sc/lang/compiler/parser/signed-expr.js

Statements: 100% (24 / 24)      Branches: 100% (8 / 8)      Functions: 100% (3 / 3)      Lines: 100% (24 / 24)      Ignored: none     

All files » sc/lang/compiler/parser/ » signed-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 491     1   1 1 1 1             1           730 730 730 12 12 12 12 12 6   6     718     724     1 12 6   6 6      
(function(sc) {
  "use strict";
 
  require("./parser");
 
  var Syntax = sc.lang.compiler.Syntax;
  var Token = sc.lang.compiler.Token;
  var Node = sc.lang.compiler.Node;
  var Parser = sc.lang.compiler.Parser;
 
  /*
    SignedExpression :
      PrimaryExpression
      - PrimaryExpression
  */
  Parser.addParseMethod("SignedExpression", function() {
    // TODO: fix like this
    // if (!this.match("-")) {
    //   return this.parsePrimaryExpression();
    // }
 
    var marker = this.createMarker();
    var expr;
    if (this.match("-")) {
      this.lex();
      var method = Node.createIdentifier("neg");
      method = marker.update().apply(method);
      expr = this.parsePrimaryExpression();
      if (isNumber(expr)) {
        expr.value = "-" + expr.value;
      } else {
        expr = Node.createCallExpression(expr, method, { list: [] }, "(");
      }
    } else {
      expr = this.parsePrimaryExpression();
    }
 
    return marker.update().apply(expr, true);
  });
 
  function isNumber(node) {
    if (node.type !== Syntax.Literal) {
      return false;
    }
    var valueType = node.valueType;
    return valueType === Token.IntegerLiteral || valueType === Token.FloatLiteral;
  }
})(sc);