|
|
|
@ -20,6 +20,7 @@ const UNKNOWN = Symbol('unknown');
|
|
|
|
|
/** Includes `BigInt` */
|
|
|
|
|
export const NUMBER = Symbol('number');
|
|
|
|
|
export const STRING = Symbol('string');
|
|
|
|
|
export const FUNCTION = Symbol('string');
|
|
|
|
|
|
|
|
|
|
/** @type {Record<string, [type: NUMBER | STRING | UNKNOWN, fn?: Function]>} */
|
|
|
|
|
const globals = {
|
|
|
|
@ -200,6 +201,13 @@ class Evaluation {
|
|
|
|
|
*/
|
|
|
|
|
is_number = true;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* True if the value is known to be a function
|
|
|
|
|
* @readonly
|
|
|
|
|
* @type {boolean}
|
|
|
|
|
*/
|
|
|
|
|
is_function = true;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @readonly
|
|
|
|
|
* @type {any}
|
|
|
|
@ -209,7 +217,7 @@ class Evaluation {
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* @param {Scope} scope
|
|
|
|
|
* @param {Expression} expression
|
|
|
|
|
* @param {Expression | FunctionDeclaration} expression
|
|
|
|
|
* @param {Set<any>} values
|
|
|
|
|
*/
|
|
|
|
|
constructor(scope, expression, values) {
|
|
|
|
@ -500,6 +508,13 @@ class Evaluation {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case 'ArrowFunctionExpression':
|
|
|
|
|
case 'FunctionExpression':
|
|
|
|
|
case 'FunctionDeclaration': {
|
|
|
|
|
this.values.add(FUNCTION);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default: {
|
|
|
|
|
this.values.add(UNKNOWN);
|
|
|
|
|
}
|
|
|
|
@ -516,6 +531,10 @@ class Evaluation {
|
|
|
|
|
this.is_number = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (value !== FUNCTION) {
|
|
|
|
|
this.is_function = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (value == null || value === UNKNOWN) {
|
|
|
|
|
this.is_defined = false;
|
|
|
|
|
}
|
|
|
|
|