fix more any

This commit is contained in:
Olivier Gagnon 2022-07-20 01:13:06 -04:00
parent 71d8e35bb5
commit ceb9fa1249
5 changed files with 35 additions and 104 deletions

@ -1,13 +1,10 @@
import { NS } from "../ScriptEditor/NetscriptDefinitions";
/** /**
* The environment in which a script runs. The environment holds * The environment in which a script runs. The environment holds
* Netscript functions and arguments for that script. * Netscript functions and arguments for that script.
*/ */
export class Environment { export class Environment {
/**
* Parent environment. Used to implement "scope"
*/
parent: Environment | null = null;
/** /**
* Whether or not the script that uses this Environment should stop running * Whether or not the script that uses this Environment should stop running
*/ */
@ -16,58 +13,5 @@ export class Environment {
/** /**
* Environment variables (currently only Netscript functions) * Environment variables (currently only Netscript functions)
*/ */
vars: any = {}; vars: NS | null = null;
constructor(parent: Environment | null) {
if (parent instanceof Environment) {
this.vars = Object.assign({}, parent.vars);
}
this.parent = parent;
}
/**
* Finds the scope where the variable with the given name is defined
*/
lookup(name: string): Environment | null {
// eslint-disable-next-line @typescript-eslint/no-this-alias
let scope: Environment | null = this;
while (scope) {
if (Object.prototype.hasOwnProperty.call(scope.vars, name)) {
return scope;
}
scope = scope.parent;
}
return null;
}
//Get the current value of a variable
get(name: string): any {
if (name in this.vars) {
return this.vars[name];
}
throw new Error(`Undefined variable ${name}`);
}
//Sets the value of a variable in any scope
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
set(name: string, value: any): any {
const scope = this.lookup(name);
//If scope has a value, then this variable is already set in a higher scope, so
//set is there. Otherwise, create a new variable in the local scope
if (scope !== null) {
return (scope.vars[name] = value);
} else {
return (this.vars[name] = value);
}
}
//Creates (or overwrites) a variable in the current scope
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
def(name: string, value: any): any {
return (this.vars[name] = value);
}
} }

@ -142,11 +142,10 @@ export class WorkerScript {
} }
this.scriptRef = runningScriptObj; this.scriptRef = runningScriptObj;
this.args = runningScriptObj.args.slice(); this.args = runningScriptObj.args.slice();
this.env = new Environment(null); this.env = new Environment();
if (typeof nsFuncsGenerator === "function") { if (typeof nsFuncsGenerator === "function") {
this.env.vars = nsFuncsGenerator(this); this.env.vars = nsFuncsGenerator(this);
} }
this.env.set("args", runningScriptObj.args.slice());
} }
/** /**

@ -110,7 +110,6 @@ import { CityName } from "./Locations/data/CityNames";
import { InternalAPI, NetscriptContext, wrapAPI } from "./Netscript/APIWrapper"; import { InternalAPI, NetscriptContext, wrapAPI } from "./Netscript/APIWrapper";
import { INetscriptHelper, ScriptIdentifier } from "./NetscriptFunctions/INetscriptHelper"; import { INetscriptHelper, ScriptIdentifier } from "./NetscriptFunctions/INetscriptHelper";
import { IPlayer } from "./PersonObjects/IPlayer"; import { IPlayer } from "./PersonObjects/IPlayer";
import { PlayerObject } from "./PersonObjects/Player/PlayerObject";
import { GangMember } from "./Gang/GangMember"; import { GangMember } from "./Gang/GangMember";
import { GangMemberTask } from "./Gang/GangMemberTask"; import { GangMemberTask } from "./Gang/GangMemberTask";
import { ScriptArg } from "./Netscript/ScriptArg"; import { ScriptArg } from "./Netscript/ScriptArg";

@ -84,6 +84,12 @@ export async function executeJSScript(
`${script.filename} cannot be run because it does not have a main function.`, `${script.filename} cannot be run because it does not have a main function.`,
); );
} }
if (!ns) {
throw makeRuntimeRejectMsg(
workerScript,
`${script.filename} cannot be run because the NS object hasn't been constructed properly.`,
);
}
return loadedModule.main(ns); return loadedModule.main(ns);
} }

@ -145,6 +145,7 @@ async function parseOnlyRamCalculate(
]; ];
const unresolvedRefs = Object.keys(dependencyMap).filter((s) => s.startsWith(initialModule)); const unresolvedRefs = Object.keys(dependencyMap).filter((s) => s.startsWith(initialModule));
const resolvedRefs = new Set(); const resolvedRefs = new Set();
const loadedFns: Record<string, boolean> = {};
while (unresolvedRefs.length > 0) { while (unresolvedRefs.length > 0) {
const ref = unresolvedRefs.shift(); const ref = unresolvedRefs.shift();
if (ref === undefined) throw new Error("ref should not be undefined"); if (ref === undefined) throw new Error("ref should not be undefined");
@ -198,53 +199,35 @@ async function parseOnlyRamCalculate(
} }
// Only count each function once // Only count each function once
if (workerScript.loadedFns[ref]) { if (loadedFns[ref]) {
continue; continue;
} else {
workerScript.loadedFns[ref] = true;
} }
loadedFns[ref] = true;
// This accounts for namespaces (Bladeburner, CodingCpntract, etc.) // This accounts for namespaces (Bladeburner, CodingContract, etc.)
let func; const findFunc = (
let refDetail = "n/a"; prefix: string,
if (ref in workerScript.env.vars.bladeburner) { obj: object,
func = workerScript.env.vars.bladeburner[ref]; ref: string,
refDetail = `bladeburner.${ref}`; ): { func: (p: IPlayer) => number | number; refDetail: string } | undefined => {
} else if (ref in workerScript.env.vars.codingcontract) { if (!obj) return;
func = workerScript.env.vars.codingcontract[ref]; const elem = Object.entries(obj).find(([key]) => key === ref);
refDetail = `codingcontract.${ref}`; if (elem !== undefined && (typeof elem[1] === "function" || typeof elem[1] === "number")) {
} else if (ref in workerScript.env.vars.stanek) { return { func: elem[1], refDetail: `${prefix}${ref}` };
func = workerScript.env.vars.stanek[ref]; }
refDetail = `stanek.${ref}`; for (const [key, value] of Object.entries(obj)) {
} else if (ref in workerScript.env.vars.infiltration) { const found = findFunc(`${key}.`, value, ref);
func = workerScript.env.vars.infiltration[ref]; if (found) return found;
refDetail = `infiltration.${ref}`; }
} else if (ref in workerScript.env.vars.gang) { return undefined;
func = workerScript.env.vars.gang[ref]; };
refDetail = `gang.${ref}`;
} else if (ref in workerScript.env.vars.sleeve) { const details = findFunc("", RamCosts, ref);
func = workerScript.env.vars.sleeve[ref]; const fnRam = applyFuncRam(details?.func ?? 0);
refDetail = `sleeve.${ref}`;
} else if (ref in workerScript.env.vars.stock) {
func = workerScript.env.vars.stock[ref];
refDetail = `stock.${ref}`;
} else if (ref in workerScript.env.vars.ui) {
func = workerScript.env.vars.ui[ref];
refDetail = `ui.${ref}`;
} else if (ref in workerScript.env.vars.grafting) {
func = workerScript.env.vars.grafting[ref];
refDetail = `grafting.${ref}`;
} else if (ref in workerScript.env.vars.singularity) {
func = workerScript.env.vars.singularity[ref];
refDetail = `singularity.${ref}`;
} else {
func = workerScript.env.vars[ref];
refDetail = `${ref}`;
}
const fnRam = applyFuncRam(func);
ram += fnRam; ram += fnRam;
detailedCosts.push({ type: "fn", name: refDetail, cost: fnRam }); detailedCosts.push({ type: "fn", name: details?.refDetail ?? "", cost: fnRam });
} catch (error) { } catch (error) {
console.log(error);
continue; continue;
} }
} }