78 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| 'use strict';
 | |
| 
 | |
| Object.defineProperty(exports, "__esModule", {
 | |
|   value: true
 | |
| });
 | |
| exports.default = extractValueFromBinaryExpression;
 | |
| /**
 | |
|  * Extractor function for a BinaryExpression type value node.
 | |
|  * A binary expression has a left and right side separated by an operator
 | |
|  * such as `a + b`.
 | |
|  *
 | |
|  * @param - value - AST Value object with type `BinaryExpression`
 | |
|  * @returns - The extracted value converted to correct type.
 | |
|  */
 | |
| function extractValueFromBinaryExpression(value) {
 | |
|   // eslint-disable-next-line global-require
 | |
|   var getValue = require('.').default;
 | |
|   var operator = value.operator,
 | |
|       left = value.left,
 | |
|       right = value.right;
 | |
| 
 | |
|   var leftVal = getValue(left);
 | |
|   var rightVal = getValue(right);
 | |
| 
 | |
|   switch (operator) {
 | |
|     case '==':
 | |
|       return leftVal == rightVal; // eslint-disable-line
 | |
|     case '!=':
 | |
|       return leftVal != rightVal; // eslint-disable-line
 | |
|     case '===':
 | |
|       return leftVal === rightVal;
 | |
|     case '!==':
 | |
|       return leftVal !== rightVal;
 | |
|     case '<':
 | |
|       return leftVal < rightVal;
 | |
|     case '<=':
 | |
|       return leftVal <= rightVal;
 | |
|     case '>':
 | |
|       return leftVal > rightVal;
 | |
|     case '>=':
 | |
|       return leftVal >= rightVal;
 | |
|     case '<<':
 | |
|       return leftVal << rightVal; // eslint-disable-line no-bitwise
 | |
|     case '>>':
 | |
|       return leftVal >> rightVal; // eslint-disable-line no-bitwise
 | |
|     case '>>>':
 | |
|       return leftVal >>> rightVal; // eslint-disable-line no-bitwise
 | |
|     case '+':
 | |
|       return leftVal + rightVal;
 | |
|     case '-':
 | |
|       return leftVal - rightVal;
 | |
|     case '*':
 | |
|       return leftVal * rightVal;
 | |
|     case '/':
 | |
|       return leftVal / rightVal;
 | |
|     case '%':
 | |
|       return leftVal % rightVal;
 | |
|     case '|':
 | |
|       return leftVal | rightVal; // eslint-disable-line no-bitwise
 | |
|     case '^':
 | |
|       return leftVal ^ rightVal; // eslint-disable-line no-bitwise
 | |
|     case '&':
 | |
|       return leftVal & rightVal; // eslint-disable-line no-bitwise
 | |
|     case 'in':
 | |
|       try {
 | |
|         return leftVal in rightVal;
 | |
|       } catch (err) {
 | |
|         return false;
 | |
|       }
 | |
|     case 'instanceof':
 | |
|       if (typeof rightVal !== 'function') {
 | |
|         return false;
 | |
|       }
 | |
|       return leftVal instanceof rightVal;
 | |
|     default:
 | |
|       return undefined;
 | |
|   }
 | |
| } |