49 lines
1.0 KiB
TypeScript
49 lines
1.0 KiB
TypeScript
import { ExecutionEnvironment } from '../../env/env'
|
|
import { Expression, IExpression } from '../expression'
|
|
import { NameExpression } from './name'
|
|
|
|
export class ContextSwitchExpression extends Expression {
|
|
type = 'NameExpression'
|
|
|
|
constructor(
|
|
protected leftExpr: NameExpression,
|
|
protected rightExpr: NameExpression
|
|
) {
|
|
super()
|
|
}
|
|
|
|
get allExpressions() {
|
|
return [this.leftExpr, this.rightExpr]
|
|
}
|
|
setExpressionAt(index: number, expr: IExpression) {
|
|
if (!(expr instanceof NameExpression))
|
|
throw new Error(
|
|
`Cannot use context switch operator "->" on ${expr.type}`
|
|
)
|
|
|
|
if (index === 0) this.leftExpr = expr
|
|
else if (index === 1) this.rightExpr = expr
|
|
}
|
|
|
|
isStatic() {
|
|
return false
|
|
}
|
|
|
|
eval() {
|
|
const context = this.leftExpr.eval()
|
|
if (typeof context !== 'object') return 0
|
|
|
|
this.rightExpr.setExecutionEnv(
|
|
new ExecutionEnvironment(
|
|
context,
|
|
this.rightExpr.executionEnv.config
|
|
)
|
|
)
|
|
return this.rightExpr.eval()
|
|
}
|
|
|
|
toString() {
|
|
return `${this.leftExpr.toString()}->${this.rightExpr.toString()}`
|
|
}
|
|
}
|