diff --git a/src/gen.ts b/src/gen.ts index d0bcb20..56321ec 100644 --- a/src/gen.ts +++ b/src/gen.ts @@ -1,3 +1,5 @@ +/// + import * as ts from 'typescript' import { OpCode, OpValue, Label } from './opcode' import { EnvironmentType } from './types' @@ -270,6 +272,9 @@ export function gen(code: string): [(OpCode | OpValue)[], VObject[]] { switch (binary.operatorToken.kind) { case ts.SyntaxKind.EqualsToken: case ts.SyntaxKind.PlusEqualsToken: + case ts.SyntaxKind.MinusEqualsToken: + case ts.SyntaxKind.AsteriskEqualsToken: + case ts.SyntaxKind.SlashEqualsToken: visitAssignmentExpression(binary as ts.AssignmentExpression) return } @@ -318,13 +323,32 @@ export function gen(code: string): [(OpCode | OpValue)[], VObject[]] { break } case ts.SyntaxKind.PlusEqualsToken: - { - visitor(expr.right) - visitor(expr.left) - op.push(OpCode.Add) - visitLeftHandSideExpression(expr.left) - op.push(OpCode.Set) - } + visitor(expr.left) + visitor(expr.right) + op.push(OpCode.Add) + visitLeftHandSideExpression(expr.left) + op.push(OpCode.Set) + break + case ts.SyntaxKind.MinusEqualsToken: + visitor(expr.left) + visitor(expr.right) + op.push(OpCode.Sub) + visitLeftHandSideExpression(expr.left) + op.push(OpCode.Set) + break + case ts.SyntaxKind.AsteriskEqualsToken: + visitor(expr.left) + visitor(expr.right) + op.push(OpCode.Mul) + visitLeftHandSideExpression(expr.left) + op.push(OpCode.Set) + break + case ts.SyntaxKind.SlashEqualsToken: + visitor(expr.left) + visitor(expr.right) + op.push(OpCode.Div) + visitLeftHandSideExpression(expr.left) + op.push(OpCode.Set) break default: throw new Error('not supported') diff --git a/tests/gen.test.ts b/tests/gen.test.ts index 39ebf62..9fb95cd 100644 --- a/tests/gen.test.ts +++ b/tests/gen.test.ts @@ -116,10 +116,13 @@ test(`should work with assignment`, () => { run(code) }) -test(`should work with add assignment`, () => { +test(`should work with add / sub / mul / div assignment`, () => { const code = ` - let a = 1; - a += 233; + let a = 5; + a += 1; + a *= 4; + a /= 2; + a -= 1; a ` run(code)