diff --git a/packages/fcl-js/src/jstoken.pp b/packages/fcl-js/src/jstoken.pp index 4554bcdb0c..853d6ae6ff 100644 --- a/packages/fcl-js/src/jstoken.pp +++ b/packages/fcl-js/src/jstoken.pp @@ -48,7 +48,8 @@ type tjsSWITCH, tjsTHIS, tjsTHROW, tjsTrue, tjsTRY, tjsTYPEOF, tjsVAR, tjsVOID, - tjsWHILE, tjsWITH + tjsWHILE, tjsWITH, + tjsAWAIT ); const @@ -83,7 +84,8 @@ const 'switch', 'this', 'throw', 'true', 'try', 'typeof', 'var', 'void', - 'while', 'with' + 'while', 'with', + 'await' ); diff --git a/packages/fcl-js/src/jstree.pp b/packages/fcl-js/src/jstree.pp index 90dd4339cd..f8eacd3ae3 100644 --- a/packages/fcl-js/src/jstree.pp +++ b/packages/fcl-js/src/jstree.pp @@ -126,6 +126,7 @@ Type TJSFuncDef = Class(TJSObject) private FBody: TJSFunctionBody; + FIsAsync: Boolean; FIsEmpty: Boolean; FName: TJSString; FParams: TStrings; @@ -137,6 +138,7 @@ Type Property Body : TJSFunctionBody Read FBody Write FBody; // can be nil Property Name : TJSString Read FName Write FName; Property IsEmpty : Boolean Read FIsEmpty Write FIsEmpty; + Property IsAsync : Boolean Read FIsAsync Write FIsAsync; end; { TJSElement } @@ -383,6 +385,13 @@ Type Class function PrefixOperatorToken : tjsToken; override; end; + { TJSAwaitExpression - e.g. 'await A' } + + TJSAwaitExpression = Class(TJSUnaryExpression) + Public + Class function PrefixOperatorToken : tjsToken; Override; + end; + { TJSUnaryPrePlusPlusExpression - e.g. '++A' } TJSUnaryPrePlusPlusExpression = Class(TJSUnaryExpression) @@ -1514,6 +1523,13 @@ begin Result:=tjsTypeOf; end; +{ TJSAwaitExpression } + +class function TJSAwaitExpression.PrefixOperatorToken: tjsToken; +begin + Result:=tjsAwait; +end; + { TJSUnaryDeleteExpression } Class function TJSUnaryDeleteExpression.PrefixOperatorToken : tjsToken; @@ -1705,7 +1721,7 @@ begin else begin Result:=TokenInfos[t]; - if t in [tjsTypeOf,tjsVoid,tjsDelete,tjsThrow] then + if t in [tjsTypeOf,tjsVoid,tjsDelete,tjsThrow,tjsAwait] then Result:=Result+' '; end; end; diff --git a/packages/fcl-js/src/jswriter.pp b/packages/fcl-js/src/jswriter.pp index eb02b24896..b1d167179e 100644 --- a/packages/fcl-js/src/jswriter.pp +++ b/packages/fcl-js/src/jswriter.pp @@ -927,6 +927,8 @@ Var begin LastEl:=Writer.CurElement; C:=(woCompact in Options); + if fd.IsAsync then + Write('async '); Write('function '); If (FD.Name<>'') then Write(FD.Name); diff --git a/packages/fcl-js/tests/tcwriter.pp b/packages/fcl-js/tests/tcwriter.pp index 0bf95f71e6..6db7186936 100644 --- a/packages/fcl-js/tests/tcwriter.pp +++ b/packages/fcl-js/tests/tcwriter.pp @@ -167,6 +167,7 @@ type Procedure TestFunctionDefBody1Compact; Procedure TestFunctionDefBody2; Procedure TestFunctionDefBody2Compact; + Procedure TestFunctionDefAsync; Procedure TestTryCatch; Procedure TestTryCatchCompact; Procedure TestTryFinally; @@ -193,6 +194,7 @@ type Procedure TestUnaryDelete; Procedure TestUnaryVoid; Procedure TestUnaryTypeOf; + Procedure TestUnaryAwait; Procedure TestPrefixPlusPLus; Procedure TestPrefixMinusMinus; Procedure TestUnaryMinus; @@ -347,6 +349,11 @@ begin TestUnary('typeof expresssion',TJSUnaryTypeOfExpression,'typeof a'); end; +procedure TTestExpressionWriter.TestUnaryAwait; +begin + TestUnary('await expresssion',TJSAwaitExpression,'await a'); +end; + procedure TTestExpressionWriter.TestPrefixPlusPLus; begin TestUnary('prefix ++ expresssion',TJSUnaryPrePlusPlusExpression,'++a'); @@ -1902,6 +1909,21 @@ begin AssertWrite('Function, 2 statements, compact','function a(b) {b=b*10; return b}',FD); end; +procedure TTestStatementWriter.TestFunctionDefAsync; + +Var + FD : TJSFunctionDeclarationStatement; + +begin + FD:=TJSFunctionDeclarationStatement.Create(0,0); + FD.AFunction:=TJSFuncDef.Create; + FD.AFunction.IsAsync:=true; + FD.AFunction.Name:='a'; + AssertWrite('Async function', + 'async function a() {'+sLineBreak + +'}',FD); +end; + procedure TTestStatementWriter.TestTryCatch; Var