@@ -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+
617662export 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+
714779export 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