@@ -277,7 +277,7 @@ static void synchronize(Parser* parser) {
277
277
static Ast * expression (Parser * parser );
278
278
static Ast * statement (Parser * parser );
279
279
static Ast * block (Parser * parser );
280
- static Ast * function (Parser * parser , bool isAsync , bool isLambda );
280
+ static Ast * function (Parser * parser , bool isAsync , bool isLambda , bool isVoid );
281
281
static Ast * declaration (Parser * parser );
282
282
static ParseRule * getRule (TokenSymbol type );
283
283
static Ast * parsePrecedence (Parser * parser , Precedence precedence );
@@ -517,11 +517,11 @@ static Ast* collection(Parser* parser, Token token, bool canAssign) {
517
517
}
518
518
519
519
static Ast * closure (Parser * parser , Token token , bool canAssign ) {
520
- return function (parser , false, false);
520
+ return function (parser , false, false, false );
521
521
}
522
522
523
523
static Ast * lambda (Parser * parser , Token token , bool canAssign ) {
524
- return function (parser , false, true);
524
+ return function (parser , false, true, false );
525
525
}
526
526
527
527
static Ast * variable (Parser * parser , Token token , bool canAssign ) {
@@ -588,13 +588,14 @@ static Ast* lambdaParameters(Parser* parser) {
588
588
return params ;
589
589
}
590
590
591
- static Ast * function (Parser * parser , bool isAsync , bool isLambda ) {
591
+ static Ast * function (Parser * parser , bool isAsync , bool isLambda , bool isVoid ) {
592
592
Token token = parser -> previous ;
593
593
Ast * params = isLambda ? lambdaParameters (parser ) : functionParameters (parser );
594
594
Ast * body = block (parser );
595
595
Ast * func = newAst (AST_EXPR_FUNCTION , token , 2 , params , body );
596
596
func -> modifier .isAsync = isAsync ;
597
597
func -> modifier .isLambda = isLambda ;
598
+ func -> modifier .isVoid = isVoid ;
598
599
return func ;
599
600
}
600
601
@@ -603,10 +604,11 @@ static Ast* methods(Parser* parser, Token* name) {
603
604
Ast * methodList = emptyAst (AST_LIST_METHOD , * name );
604
605
605
606
while (!check (parser , TOKEN_RIGHT_BRACE ) && !check (parser , TOKEN_EOF )) {
606
- bool isAsync = false, isClass = false, isInitializer = false, hasReturnType = false;
607
+ bool isAsync = false, isClass = false, isInitializer = false, isVoid = false, hasReturnType = false;
607
608
Ast * returnType = NULL ;
608
609
if (match (parser , TOKEN_ASYNC )) isAsync = true;
609
610
if (match (parser , TOKEN_CLASS )) isClass = true;
611
+ if (match (parser , TOKEN_VOID )) isVoid = true;
610
612
if (check2 (parser , TOKEN_IDENTIFIER ) || (check (parser , TOKEN_IDENTIFIER ) && tokenIsOperator (parser -> next ))) {
611
613
hasReturnType = true;
612
614
returnType = type_ (parser , "Expect method return type." );
@@ -623,6 +625,7 @@ static Ast* methods(Parser* parser, Token* name) {
623
625
method -> modifier .isAsync = isAsync ;
624
626
method -> modifier .isClass = isClass ;
625
627
method -> modifier .isInitializer = isInitializer ;
628
+ method -> modifier .isVoid = isVoid ;
626
629
627
630
if (hasReturnType ) {
628
631
astAppendChild (method , returnType );
@@ -711,10 +714,10 @@ static Ast* yield(Parser* parser, Token token, bool canAssign) {
711
714
712
715
static Ast * async (Parser * parser , Token token , bool canAssign ) {
713
716
if (match (parser , TOKEN_FUN )) {
714
- return function (parser , true, false);
717
+ return function (parser , true, false, false );
715
718
}
716
719
else if (match (parser , TOKEN_LEFT_BRACE )) {
717
- return function (parser , true, true);
720
+ return function (parser , true, true, false );
718
721
}
719
722
else {
720
723
parseErrorAtPrevious (parser , "Can only use async as expression modifier for anonymous functions or lambda." );
@@ -1115,12 +1118,14 @@ static Ast* classDeclaration(Parser* parser) {
1115
1118
}
1116
1119
1117
1120
static Ast * funDeclaration (Parser * parser , bool isAsync , bool hasReturnType ) {
1121
+ bool isVoid = match (parser , TOKEN_VOID );
1118
1122
Ast * returnType = hasReturnType ? type_ (parser , "Expect function return type." ) : NULL ;
1119
1123
consume (parser , TOKEN_IDENTIFIER , "Expect function name." );
1120
1124
Token name = parser -> previous ;
1121
- Ast * body = function (parser , isAsync , false);
1125
+ Ast * body = function (parser , isAsync , false, isVoid );
1122
1126
1123
1127
Ast * ast = newAst (AST_DECL_FUN , name , 1 , body );
1128
+ ast -> modifier .isVoid = true;
1124
1129
if (returnType != NULL ) astAppendChild (ast , returnType );
1125
1130
return ast ;
1126
1131
}
@@ -1172,7 +1177,11 @@ static Ast* declaration(Parser* parser) {
1172
1177
advance (parser );
1173
1178
return funDeclaration (parser , true, false);
1174
1179
}
1175
- if (check (parser , TOKEN_ASYNC ) && checkNext (parser , TOKEN_IDENTIFIER )) {
1180
+ else if (check (parser , TOKEN_ASYNC ) && checkNext (parser , TOKEN_VOID )) {
1181
+ advance (parser );
1182
+ return funDeclaration (parser , true, false);
1183
+ }
1184
+ else if (check (parser , TOKEN_ASYNC ) && checkNext (parser , TOKEN_IDENTIFIER )) {
1176
1185
advance (parser );
1177
1186
return funDeclaration (parser , true, true);
1178
1187
}
@@ -1184,6 +1193,9 @@ static Ast* declaration(Parser* parser) {
1184
1193
advance (parser );
1185
1194
return funDeclaration (parser , false, false);
1186
1195
}
1196
+ else if (check (parser , TOKEN_VOID ) && checkNext (parser , TOKEN_IDENTIFIER )) {
1197
+ return funDeclaration (parser , false, false);
1198
+ }
1187
1199
else if (check2 (parser , TOKEN_IDENTIFIER )) {
1188
1200
return funDeclaration (parser , false, true);
1189
1201
}
0 commit comments