@sudoo/marked
Version:
JavaScript & TypeScript code runner in JavaScript, safe with marked territory, asynchronous
119 lines (118 loc) • 6.29 kB
JavaScript
;
/**
* @author WMXPY
* @namespace Evaluate
* @description Member Expression
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.memberExpressionEvaluator = exports.mountMemberExpressionEvaluator = void 0;
const error_code_1 = require("../declare/error-code");
const boolean_1 = require("../operation/member-expression/boolean");
const class_1 = require("../operation/member-expression/class");
const class_instance_1 = require("../operation/member-expression/class-instance");
const execute_object_1 = require("../operation/member-expression/execute-object");
const number_1 = require("../operation/member-expression/number");
const sand_bigint_1 = require("../operation/member-expression/sand-bigint");
const sand_function_1 = require("../operation/member-expression/sand-function");
const sand_list_1 = require("../operation/member-expression/sand-list");
const sand_regexp_1 = require("../operation/member-expression/sand-regexp");
const string_1 = require("../operation/member-expression/string");
const native_to_sand_1 = require("../parse/native-to-sand");
const error_1 = require("../util/error/error");
const native_class_1 = require("../variable/native-class/native-class");
const native_class_instance_1 = require("../variable/native-class/native-class-instance");
const sand_class_1 = require("../variable/sand-class/sand-class");
const sand_class_instance_1 = require("../variable/sand-class/sand-class-instance");
const sand_function_2 = require("../variable/sand-function/sand-function");
const sand_list_2 = require("../variable/sand-list");
const bigint_1 = require("../variable/sand-literal/bigint");
const regexp_1 = require("../variable/sand-literal/regexp");
const sand_map_1 = require("../variable/sand-map");
const mountMemberExpressionEvaluator = (sandbox) => {
sandbox.mount("MemberExpression", exports.memberExpressionEvaluator);
};
exports.mountMemberExpressionEvaluator = mountMemberExpressionEvaluator;
const memberExpressionEvaluator = function (node, scope, trace) {
return __awaiter(this, void 0, void 0, function* () {
const nextTrace = trace.stack(node);
const computed = node.computed;
const bindExecuteMemberExpressionObject = execute_object_1.executeMemberExpressionObject.bind(this);
const object = yield bindExecuteMemberExpressionObject(node.object, scope, nextTrace);
const key = computed
? yield this.execute(node.property, scope, nextTrace)
: node.property.name;
if (object instanceof native_class_1.MarkedNativeClass) {
const staticValue = (0, native_to_sand_1.parseNativeToSand)(object.getStaticMember(String(key), this));
return staticValue;
}
if (object instanceof native_class_instance_1.MarkedNativeClassInstance) {
const memberValue = (0, native_to_sand_1.parseNativeToSand)(object.getMember(String(key), this));
return memberValue;
}
if (typeof object === "undefined") {
if (node.optional) {
return undefined;
}
throw (0, error_1.error)(error_code_1.ERROR_CODE.CANNOT_READ_PROPERTY_OF_UNDEFINED, String(key), node, trace);
}
if (object === null) {
if (node.optional) {
return undefined;
}
throw (0, error_1.error)(error_code_1.ERROR_CODE.CANNOT_READ_PROPERTY_OF_NULL, String(key), node, trace);
}
if (typeof object === "string") {
return (0, string_1.memberExpressionString)(this, object, key);
}
if (typeof object === "number") {
return (0, number_1.memberExpressionNumber)(this, object, key);
}
if (typeof object === "boolean") {
return (0, boolean_1.memberExpressionBoolean)(this, object, key);
}
if (object instanceof sand_list_2.SandList) {
if (typeof key === "number") {
return object.get(key);
}
else if (typeof key === "string") {
const arrayMember = (0, sand_list_1.memberExpressionSandList)(this, object, key);
if (arrayMember !== sand_list_1.GET_ARRAY_MEMBER_NOT_FOUND_SYMBOL) {
return arrayMember;
}
}
throw (0, error_1.error)(error_code_1.ERROR_CODE.ONLY_NUMBER_AVAILABLE_FOR_LIST, key, node, trace);
}
if (object instanceof sand_map_1.SandMap) {
if (typeof key === "string") {
return object.get(key);
}
throw (0, error_1.error)(error_code_1.ERROR_CODE.ONLY_STRING_AVAILABLE_FOR_MAP, key.toString(), node, trace);
}
if (object instanceof sand_function_2.SandFunction) {
return (0, sand_function_1.memberExpressionSandFunction)(this, object, key);
}
if (object instanceof sand_class_1.SandClass) {
return (0, class_1.memberExpressionClass)(this, object, key);
}
if (object instanceof sand_class_instance_1.SandClassInstance) {
return (0, class_instance_1.memberExpressionClassInstance)(this, object, key);
}
if (object instanceof bigint_1.SandLiteralBigInt) {
return (0, sand_bigint_1.memberExpressionSandBigInt)(this, object, key);
}
if (object instanceof regexp_1.SandLiteralRegExp) {
return (0, sand_regexp_1.memberExpressionSandRegExp)(this, object, key);
}
return object[key];
});
};
exports.memberExpressionEvaluator = memberExpressionEvaluator;