Skip to content

Commit 844243e

Browse files
committed
Feature(compiler): Start working on Classes
1 parent 40a0e42 commit 844243e

2 files changed

Lines changed: 51 additions & 0 deletions

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
2+
import * as ts from "typescript";
3+
import * as llvm from 'llvm-node';
4+
5+
import {NodeGenerateInterface} from "../node-generate.interface";
6+
import {Context} from "../context";
7+
import UnsupportedError from "../../error/unsupported.error";
8+
import {NativeTypeResolver} from "../native-type-resolver";
9+
10+
export class ClassDeclarationGenerator implements NodeGenerateInterface<ts.ClassDeclaration, void> {
11+
generate(node: ts.ClassDeclaration, ctx: Context, builder: llvm.IRBuilder): void {
12+
if (node.typeParameters) {
13+
throw new UnsupportedError(
14+
node,
15+
'Generic classes are unsupported'
16+
)
17+
}
18+
19+
const classType = ctx.typeChecker.getTypeAtLocation(node);
20+
21+
const properties = ctx.typeChecker.getPropertiesOfType(classType);
22+
23+
const struct = llvm.StructType.get(ctx.llvmContext, properties.map(
24+
(property: ts.Symbol) => {
25+
const nativeType = NativeTypeResolver.getType(
26+
ctx.typeChecker.getTypeOfSymbolAtLocation(property, node),
27+
ctx
28+
);
29+
30+
return nativeType.getType();
31+
}
32+
));
33+
34+
if (node.members) {
35+
node.members.forEach(
36+
(member) => {
37+
if (!ts.isPropertyDeclaration(member)) {
38+
throw new UnsupportedError(
39+
node,
40+
'Classes with methods are not supported'
41+
)
42+
}
43+
}
44+
);
45+
}
46+
}
47+
}

src/backend/llvm/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {DoStatementGenerator} from "./code-generation/do-statement";
1717
import {WhileStatementGenerator} from "./code-generation/while-statement";
1818
import {BreakStatementGenerator} from "./code-generation/break-statement";
1919
import {ContinueStatementGenerator} from "./code-generation/continue-statement";
20+
import {ClassDeclarationGenerator} from "./code-generation/class-statement";
2021

2122
export function passIfStatement(parent: ts.IfStatement, ctx: Context, builder: llvm.IRBuilder) {
2223
const positiveBlock = llvm.BasicBlock.create(ctx.llvmContext, "if.true");
@@ -495,6 +496,9 @@ export function passStatement(stmt: ts.Statement, ctx: Context, builder: llvm.IR
495496
case ts.SyntaxKind.ReturnStatement:
496497
new ReturnStatementCodeGenerator().generate(<any>stmt, ctx, builder);
497498
break;
499+
case ts.SyntaxKind.ClassDeclaration:
500+
new ClassDeclarationGenerator().generate(<any>stmt, ctx, builder);
501+
break;
498502
case ts.SyntaxKind.BreakStatement:
499503
new BreakStatementGenerator().generate(<any>stmt, ctx, builder);
500504
break;

0 commit comments

Comments
 (0)