import type { SymbolNode } from 'mathjs'; import type { Result } from './interface.js'; import type { State } from './state.js'; import { operations } from '@mirascript/mirascript/subtle'; import { migrateSymbolName } from './utils.js'; /** 处理符号名称 */ export function migrateSymbol(state: State, node: SymbolNode, migrateConst: boolean): Result { const { name } = node; const local = state.locals.get(name); if (local) { return { ...local, code: migrateSymbolName(name, true), }; } { const global = state.global(name); if (global !== undefined) { if (migrateConst) { if (name === 'pi' && global === Math.PI) { return { type: 'number', code: `PI`, }; } if (name === 'e' && global === Math.E) { return { type: 'number', code: `E`, }; } } return { type: operations.$Type(global), code: migrateSymbolName(name, false), global, }; } else if (state.hasGlobal(name)) { return { type: undefined, code: migrateSymbolName(name, false), }; } } if (name.startsWith('$') || name.startsWith('@')) { return { code: name, }; } if (migrateConst) { if (name === 'i') { state.err(`不支持复数`); return { type: 'number', code: `i`, }; } if (name === '__PREVIEW') { return { type: 'boolean', code: '@PREVIEW', }; } if (name === '__ICON') { return { type: 'boolean', code: '@ICON', }; } } state.warn(`符号 '${name}' 未定义`); return { code: migrateSymbolName(name, false), }; }