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)