From a79a1e13905483e408c95412c3e9aba9c754ebdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A2=8E=E7=A2=8E=E9=85=B1?= Date: Tue, 27 Aug 2019 11:27:30 +0800 Subject: [PATCH 1/2] support -=, *=, /= operators --- src/gen.ts | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) 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') From bab0431dcd250830c92791b97901faaf42a06d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A2=8E=E7=A2=8E=E9=85=B1?= Date: Tue, 27 Aug 2019 11:32:50 +0800 Subject: [PATCH 2/2] add test case --- tests/gen.test.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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)