Files
ms/packages/molang/src/parser/expressions/ternary.ts
MiaoWoo 6816e51239 feat: add molang package
1. upgrade bukkit chat
2. fix config update error

Signed-off-by: MiaoWoo <admin@yumc.pw>
2022-02-12 16:29:40 +08:00

80 lines
2.1 KiB
TypeScript

import { Expression, IExpression } from '../expression'
import { VoidExpression } from './void'
export class TernaryExpression extends Expression {
type = 'TernaryExpression'
protected leftResult: unknown
constructor(
protected leftExpression: IExpression,
protected thenExpression: IExpression,
protected elseExpression: IExpression
) {
super()
}
get allExpressions() {
if (this.leftExpression.isStatic())
return [
this.leftExpression,
this.leftExpression.eval()
? this.thenExpression
: this.elseExpression,
]
return [this.leftExpression, this.thenExpression, this.elseExpression]
}
setExpressionAt(index: number, expr: IExpression) {
if (index === 0) this.leftExpression = expr
else if (index === 1) this.thenExpression = expr
else if (index === 2) this.elseExpression = expr
}
get isReturn() {
if (this.leftResult === undefined)
return this.thenExpression.isReturn && this.elseExpression.isReturn
return this.leftResult
? this.thenExpression.isReturn
: this.elseExpression.isReturn
}
get hasReturn() {
return this.thenExpression.isReturn || this.elseExpression.isReturn
}
get isContinue() {
if (this.leftResult === undefined)
return (
this.thenExpression.isContinue && this.elseExpression.isContinue
)
return this.leftResult
? this.thenExpression.isContinue
: this.elseExpression.isContinue
}
get isBreak() {
if (this.leftResult === undefined)
return this.thenExpression.isBreak && this.elseExpression.isBreak
return this.leftResult
? this.thenExpression.isBreak
: this.elseExpression.isBreak
}
isStatic() {
return (
this.leftExpression.isStatic() &&
this.thenExpression.isStatic() &&
this.elseExpression.isStatic()
)
}
eval() {
this.leftResult = this.leftExpression.eval()
return this.leftResult
? this.thenExpression.eval()
: this.elseExpression.eval()
}
toString() {
if (this.elseExpression instanceof VoidExpression)
return `${this.leftExpression.toString()}?${this.thenExpression.toString()}`
return `${this.leftExpression.toString()}?${this.thenExpression.toString()}:${this.elseExpression.toString()}`
}
}