Skip to content

Commit 7ad996f

Browse files
committed
Feature(compiler): ContinueStatement - initial support
1 parent 4b5b736 commit 7ad996f

3 files changed

Lines changed: 45 additions & 0 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
2+
import * as ts from "typescript";
3+
import * as llvm from 'llvm-node';
4+
import {NodeGenerateInterface} from "../node-generate.interface";
5+
import {Context} from "../context";
6+
import UnsupportedError from "../../error/unsupported.error";
7+
8+
export class ContinueStatementGenerator implements NodeGenerateInterface<ts.ContinueStatement, void> {
9+
generate(node: ts.ContinueStatement, ctx: Context, builder: llvm.IRBuilder): void {
10+
if (node.label) {
11+
throw new UnsupportedError(
12+
node,
13+
'Continue with label is unsupported'
14+
);
15+
}
16+
17+
if (!ctx.scope.continueBlock) {
18+
throw new UnsupportedError(
19+
node,
20+
'There is no pointer to jump outside this block to continue'
21+
);
22+
}
23+
24+
builder.createBr(ctx.scope.continueBlock);
25+
}
26+
}

src/backend/llvm/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {ForStatementGenerator} from "./code-generation/for-statement";
1616
import {DoStatementGenerator} from "./code-generation/do-statement";
1717
import {WhileStatementGenerator} from "./code-generation/while-statement";
1818
import {BreakStatementGenerator} from "./code-generation/break-statement";
19+
import {ContinueStatementGenerator} from "./code-generation/continue-statement";
1920

2021
export function passIfStatement(parent: ts.IfStatement, ctx: Context, builder: llvm.IRBuilder) {
2122
const positiveBlock = llvm.BasicBlock.create(ctx.llvmContext, "if.true");
@@ -499,6 +500,9 @@ export function passStatement(stmt: ts.Statement, ctx: Context, builder: llvm.IR
499500
case ts.SyntaxKind.BreakStatement:
500501
new BreakStatementGenerator().generate(<any>stmt, ctx, builder);
501502
break;
503+
case ts.SyntaxKind.ContinueStatement:
504+
new ContinueStatementGenerator().generate(<any>stmt, ctx, builder);
505+
break;
502506
case ts.SyntaxKind.IfStatement:
503507
passIfStatement(<any>stmt, ctx, builder);
504508
break;

tests/snapshots/math/for.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,22 @@
2424
return total;
2525
}
2626

27+
function simpleContinue(): number {
28+
let total: number = 0;
29+
30+
for (let i = 0; i++; i++) {
31+
if (i > 50) {
32+
continue;
33+
}
34+
35+
total = total + i;
36+
}
37+
38+
return total;
39+
}
40+
2741
calculateTotalFromRange(1, 100);
2842
calculateTotalFromRange(50, 100);
2943
simpleBreak();
44+
simpleContinue();
3045
}

0 commit comments

Comments
 (0)