import type { AssignmentNode } from 'mathjs'; import type { Result } from './interface.js'; import { migrateAtomic } from './node.js'; import { migrateSymbolName, symbolName, unsupportedNode } from './utils.js'; import { migrateAccess } from './access.js'; import type { State } from './state.js'; /** 转换赋值语句 */ export function migrateAssignment(state: State, node: AssignmentNode, isTopLevel: boolean): Result { const { object, index, value } = node; const name = symbolName(object); if (name && index == null) { // Create local variable if (!isTopLevel) { return unsupportedNode(state, node, '不支持在表达式中创建局部变量'); } const localName = migrateSymbolName(name, true); if (state.locals.has(name)) { state.err(`不支持局部变量重新赋值: '${name}'`); return { code: `${localName} = ${migrateAtomic(state, value).code}`, }; } const expr = migrateAtomic(state, value); state.locals.set(name, expr); if (name !== localName) { state.warn(`变量名 '${name}' 是 MiraScript 关键字,已转换为 '${localName}'`); } return { code: `let ${localName} = ${expr.code};`, }; } if (index != null) { // Assignment to array/object element state.loose(); const access = migrateAccess(state, node); const expr = migrateAtomic(state, value); if (isTopLevel) { return { code: `${access.code} = ${expr.code};` }; } return { // Return the assigned value code: `{ let ret = ${expr.code}; ${access.code} = ret; ret }`, type: expr.type, }; } return unsupportedNode(state, node); }