import { DefaultVmContext, type GlobalReferenceChain, analyzeGlobalReferences } from '@mirascript/mirascript/subtle'; import type { EvalExpressionCache } from './parser.js'; import type { Scope } from './scope.js'; import type { Evaluator } from './main.js'; const kAnalyze = Symbol('cloudpss.expression.analyzeCache'); export type { GlobalReferenceChain }; /** * εˆ†ζžδΎθ΅– */ export function analyze( expression: EvalExpressionCache, evaluator: Evaluator, scope: Scope, ): readonly GlobalReferenceChain[] { let result = (expression as EvalExpressionCache & { [kAnalyze]?: readonly GlobalReferenceChain[] })[kAnalyze]; if (result == null) { result = analyzeGlobalReferences(expression.source); (expression as EvalExpressionCache & { [kAnalyze]?: readonly GlobalReferenceChain[] })[kAnalyze] = result; } return result.filter(([global]) => { if (scope.has(global)) return true; return !(evaluator.imported.has(global) || DefaultVmContext.has(global)); }); }