Skip to content

Commit 50116ac

Browse files
committed
Progress
1 parent f55fc70 commit 50116ac

12 files changed

Lines changed: 760 additions & 177 deletions

src/ast.ts

Lines changed: 98 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,16 @@ export enum NodeKind {
9494
BINARY,
9595
CALL,
9696
ELEMENTACCESS,
97+
FALSE,
9798
LITERAL,
9899
NEW,
100+
NULL,
99101
PARENTHESIZED,
100102
PROPERTYACCESS,
101103
SELECT,
104+
SUPER,
105+
THIS,
106+
TRUE,
102107
UNARYPOSTFIX,
103108
UNARYPREFIX,
104109

@@ -163,17 +168,22 @@ export function nodeKindToString(kind: NodeKind): string {
163168
case NodeKind.EXPORTIMPORT: return "EXPORTIMPORT";
164169
case NodeKind.EXPRESSION: return "EXPRESSION";
165170
case NodeKind.INTERFACE: return "INTERFACE";
171+
case NodeKind.FALSE: return "FALSE";
166172
case NodeKind.FOR: return "FOR";
167173
case NodeKind.FUNCTION: return "FUNCTION";
168174
case NodeKind.IF: return "IF";
169175
case NodeKind.IMPORT: return "IMPORT";
170176
case NodeKind.IMPORTDECLARATION: return "IMPORTDECLARATION";
171177
case NodeKind.METHOD: return "METHOD";
172178
case NodeKind.NAMESPACE: return "NAMESPACE";
179+
case NodeKind.NULL: return "NULL";
173180
case NodeKind.FIELD: return "PROPERTY";
174181
case NodeKind.RETURN: return "RETURN";
182+
case NodeKind.SUPER: return "SUPER";
175183
case NodeKind.SWITCH: return "SWITCH";
184+
case NodeKind.THIS: return "THIS";
176185
case NodeKind.THROW: return "THROW";
186+
case NodeKind.TRUE: return "TRUE";
177187
case NodeKind.TRY: return "TRY";
178188
case NodeKind.VARIABLE: return "VARIABLE";
179189
case NodeKind.VARIABLEDECLARATION: return "VARIABLEDECLARATION";
@@ -286,6 +296,12 @@ export abstract class Expression extends Node {
286296
return expr;
287297
}
288298

299+
static createFalse(range: Range): FalseExpression {
300+
const expr: FalseExpression = new FalseExpression();
301+
expr.range = range;
302+
return expr;
303+
}
304+
289305
static createFloatLiteral(value: f64, range: Range): FloatLiteralExpression {
290306
const expr: FloatLiteralExpression = new FloatLiteralExpression();
291307
expr.range = range;
@@ -310,6 +326,12 @@ export abstract class Expression extends Node {
310326
return expr;
311327
}
312328

329+
static createNull(range: Range): NullExpression {
330+
const expr: NullExpression = new NullExpression();
331+
expr.range = range;
332+
return expr;
333+
}
334+
313335
static createParenthesized(expression: Expression, range: Range): ParenthesizedExpression {
314336
const expr: ParenthesizedExpression = new ParenthesizedExpression();
315337
expr.range = range;
@@ -348,6 +370,24 @@ export abstract class Expression extends Node {
348370
return expr;
349371
}
350372

373+
static createSuper(range: Range): SuperExpression {
374+
const expr: SuperExpression = new SuperExpression();
375+
expr.range = range;
376+
return expr;
377+
}
378+
379+
static createThis(range: Range): ThisExpression {
380+
const expr: ThisExpression = new ThisExpression();
381+
expr.range = range;
382+
return expr;
383+
}
384+
385+
static createTrue(range: Range): TrueExpression {
386+
const expr: TrueExpression = new TrueExpression();
387+
expr.range = range;
388+
return expr;
389+
}
390+
351391
static createUnaryPostfix(operator: Token, expression: Expression, range: Range): UnaryPostfixExpression {
352392
const expr: UnaryPostfixExpression = new UnaryPostfixExpression();
353393
expr.range = range;
@@ -614,6 +654,11 @@ export class NewExpression extends CallExpression {
614654
}
615655
}
616656

657+
export class NullExpression extends IdentifierExpression {
658+
kind = NodeKind.NULL;
659+
name = "null";
660+
}
661+
617662
export class ParenthesizedExpression extends Expression {
618663

619664
kind = NodeKind.PARENTHESIZED;
@@ -711,6 +756,26 @@ export class StringLiteralExpression extends LiteralExpression {
711756
}
712757
}
713758

759+
export class SuperExpression extends IdentifierExpression {
760+
kind = NodeKind.SUPER;
761+
name = "super";
762+
}
763+
764+
export class ThisExpression extends IdentifierExpression {
765+
kind = NodeKind.THIS;
766+
name = "this";
767+
}
768+
769+
export class TrueExpression extends IdentifierExpression {
770+
kind = NodeKind.TRUE;
771+
name = "true";
772+
}
773+
774+
export class FalseExpression extends IdentifierExpression {
775+
kind = NodeKind.FALSE;
776+
name = "false";
777+
}
778+
714779
export abstract class UnaryExpression extends Expression {
715780
operator: Token;
716781
expression: Expression;
@@ -798,7 +863,7 @@ export abstract class Statement extends Node {
798863
static createBlock(statements: Statement[], range: Range): BlockStatement {
799864
const stmt: BlockStatement = new BlockStatement();
800865
stmt.range = range;
801-
for (let i: i32 = 0, k = (stmt.statements = statements).length; i < k; ++i) statements[i].parent = stmt;
866+
for (let i: i32 = 0, k: i32 = (stmt.statements = statements).length; i < k; ++i) statements[i].parent = stmt;
802867
return stmt;
803868
}
804869

@@ -1055,13 +1120,14 @@ export abstract class Statement extends Node {
10551120
return stmt;
10561121
}
10571122

1058-
static createTry(statements: Statement[], catchVariable: VariableDeclaration, catchStatements: Statement[], range: Range): TryStatement {
1123+
static createTry(statements: Statement[], catchVariable: IdentifierExpression | null, catchStatements: Statement[] | null, finallyStatements: Statement[] | null, range: Range): TryStatement {
10591124
const stmt: TryStatement = new TryStatement();
10601125
stmt.range = range;
10611126
let i: i32, k: i32;
10621127
for (i = 0, k = (stmt.statements = statements).length; i < k; ++i) statements[i].parent = stmt;
1063-
(stmt.catchVariable = catchVariable).parent = stmt;
1064-
for (i = 0, k = (stmt.catchStatements = catchStatements).length; i < k; ++i) catchStatements[i].parent = stmt;
1128+
if (stmt.catchVariable = catchVariable) (<IdentifierExpression>catchVariable).parent = stmt;
1129+
if (stmt.catchStatements = catchStatements) for (i = 0, k = (<Statement[]>catchStatements).length; i < k; ++i) (<Statement[]>catchStatements)[i].parent = stmt;
1130+
if (stmt.finallyStatements = finallyStatements) for (i = 0, k = (<Statement[]>finallyStatements).length; i < k; ++i) (<Statement[]>finallyStatements)[i].parent = stmt;
10651131
return stmt;
10661132
}
10671133

@@ -1117,7 +1183,7 @@ export class Source extends Node {
11171183
get isDeclaration(): bool { return !this.isEntry && this.path.endsWith(".d.ts"); }
11181184

11191185
serialize(sb: string[]): void {
1120-
for (let i: i32 = 0, k = this.statements.length; i < k; ++i) {
1186+
for (let i: i32 = 0, k: i32 = this.statements.length; i < k; ++i) {
11211187
const statement: Statement = this.statements[i];
11221188
statement.serialize(sb);
11231189
const last: string = sb[sb.length - 1];
@@ -1142,7 +1208,7 @@ export class BlockStatement extends Statement {
11421208
sb.push("{\n");
11431209
for (let i: i32 = 0, k: i32 = this.statements.length; i < k; ++i) {
11441210
this.statements[i].serialize(sb);
1145-
if (builderEndsWith(CharCode.CLOSEBRACE, sb))
1211+
if (builderEndsWith(sb, CharCode.CLOSEBRACE))
11461212
sb.push("\n");
11471213
else
11481214
sb.push(";\n");
@@ -1211,7 +1277,7 @@ export class ClassDeclaration extends DeclarationStatement {
12111277
sb.push(" {\n");
12121278
for (i = 0, k = this.members.length; i < k; ++i) {
12131279
this.members[i].serialize(sb);
1214-
if (builderEndsWith(CharCode.CLOSEBRACE, sb))
1280+
if (builderEndsWith(sb, CharCode.CLOSEBRACE))
12151281
sb.push("\n");
12161282
else
12171283
sb.push(";\n");
@@ -1493,7 +1559,7 @@ export class FunctionDeclaration extends DeclarationStatement {
14931559
for (i = 0, k = (<Statement[]>this.statements).length; i < k; ++i) {
14941560
const statement: Statement = (<Statement[]>this.statements)[i];
14951561
statement.serialize(sb);
1496-
if (builderEndsWith(CharCode.CLOSEBRACE, sb))
1562+
if (builderEndsWith(sb, CharCode.CLOSEBRACE))
14971563
sb.push("\n");
14981564
else
14991565
sb.push(";\n");
@@ -1592,7 +1658,7 @@ export class InterfaceDeclaration extends DeclarationStatement {
15921658
sb.push(" {\n");
15931659
for (i = 0, k = this.members.length; i < k; ++i) {
15941660
this.members[i].serialize(sb);
1595-
if (builderEndsWith(CharCode.CLOSEBRACE, sb))
1661+
if (builderEndsWith(sb, CharCode.CLOSEBRACE))
15961662
sb.push("\n");
15971663
else
15981664
sb.push(";\n");
@@ -1623,7 +1689,7 @@ export class NamespaceDeclaration extends DeclarationStatement {
16231689

16241690
kind = NodeKind.NAMESPACE;
16251691
modifiers: Modifier[];
1626-
members: DeclarationStatement[];
1692+
members: Statement[];
16271693

16281694
serialize(sb: string[]): void {
16291695
let i: i32, k: i32;
@@ -1636,7 +1702,7 @@ export class NamespaceDeclaration extends DeclarationStatement {
16361702
sb.push(" {\n");
16371703
for (i = 0, k = this.members.length; i < k; ++i) {
16381704
this.members[i].serialize(sb);
1639-
if (builderEndsWith(CharCode.CLOSEBRACE, sb))
1705+
if (builderEndsWith(sb, CharCode.CLOSEBRACE))
16401706
sb.push("\n");
16411707
else
16421708
sb.push(";\n");
@@ -1720,7 +1786,7 @@ export class SwitchCase extends Node {
17201786
if (i > 0)
17211787
sb.push("\n");
17221788
this.statements[i].serialize(sb);
1723-
if (builderEndsWith(CharCode.CLOSEBRACE, sb))
1789+
if (builderEndsWith(sb, CharCode.CLOSEBRACE))
17241790
sb.push("\n");
17251791
else
17261792
sb.push(";\n");
@@ -1761,8 +1827,9 @@ export class TryStatement extends Statement {
17611827

17621828
kind = NodeKind.TRY;
17631829
statements: Statement[];
1764-
catchVariable: VariableDeclaration;
1765-
catchStatements: Statement[];
1830+
catchVariable: IdentifierExpression | null;
1831+
catchStatements: Statement[] | null;
1832+
finallyStatements: Statement[] | null;
17661833

17671834
serialize(sb: string[]): void {
17681835
sb.push("try {\n");
@@ -1771,12 +1838,22 @@ export class TryStatement extends Statement {
17711838
this.statements[i].serialize(sb);
17721839
sb.push(";\n");
17731840
}
1774-
sb.push("} catch (");
1775-
this.catchVariable.serialize(sb);
1776-
sb.push(") {\n");
1777-
for (i = 0, k = this.catchStatements.length; i < k; ++i) {
1778-
this.catchStatements[i].serialize(sb);
1779-
sb.push(";\n");
1841+
if (this.catchVariable) {
1842+
sb.push("} catch (");
1843+
(<IdentifierExpression>this.catchVariable).serialize(sb);
1844+
sb.push(") {\n");
1845+
if (this.catchStatements)
1846+
for (i = 0, k = (<Statement[]>this.catchStatements).length; i < k; ++i) {
1847+
(<Statement[]>this.catchStatements)[i].serialize(sb);
1848+
sb.push(";\n");
1849+
}
1850+
}
1851+
if (this.finallyStatements) {
1852+
sb.push("} finally {\n");
1853+
for (i = 0, k = (<Statement[]>this.finallyStatements).length; i < k; ++i) {
1854+
(<Statement[]>this.finallyStatements)[i].serialize(sb);
1855+
sb.push(";\n");
1856+
}
17801857
}
17811858
sb.push("}");
17821859
}
@@ -1857,7 +1934,7 @@ export function serialize(node: Node, indent: i32 = 0): string {
18571934
return sb.join("");
18581935
}
18591936

1860-
function builderEndsWith(code: CharCode, sb: string[]): bool {
1937+
function builderEndsWith(sb: string[], code: CharCode): bool {
18611938
if (sb.length) {
18621939
const last: string = sb[sb.length - 1];
18631940
return last.length ? last.charCodeAt(last.length - 1) == code : false;

0 commit comments

Comments
 (0)