UNPKG

@sudoo/marked

Version:

JavaScript & TypeScript code runner in JavaScript, safe with marked territory, asynchronous

119 lines (118 loc) 6.29 kB
"use strict"; /** * @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;