You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.1 KiB
78 lines
2.1 KiB
'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; |
|
} |
|
} |