Skip to content

Commit 76acaa8

Browse files
committed
fix: Add AST node for await expressions
1 parent aacbed0 commit 76acaa8

25 files changed

+136
-9
lines changed

Diff for: packages/cxx-frontend/src/AST.ts

+13
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,18 @@ export class YieldExpressionAST extends ExpressionAST {
997997
}
998998
}
999999

1000+
export class AwaitExpressionAST extends ExpressionAST {
1001+
accept<Context, Result>(visitor: ASTVisitor<Context, Result>, context: Context): Result {
1002+
return visitor.visitAwaitExpression(this, context);
1003+
}
1004+
getAwaitToken(): Token | undefined {
1005+
return Token.from(cxx.getASTSlot(this.getHandle(), 0), this.parser);
1006+
}
1007+
getExpression(): ExpressionAST | undefined {
1008+
return AST.from<ExpressionAST>(cxx.getASTSlot(this.getHandle(), 1), this.parser);
1009+
}
1010+
}
1011+
10001012
export class UnaryExpressionAST extends ExpressionAST {
10011013
accept<Context, Result>(visitor: ASTVisitor<Context, Result>, context: Context): Result {
10021014
return visitor.visitUnaryExpression(this, context);
@@ -3489,6 +3501,7 @@ const AST_CONSTRUCTORS: Array<new (handle: number, kind: ASTKind, parser: Transl
34893501
AlignofExpressionAST,
34903502
TypeTraitsExpressionAST,
34913503
YieldExpressionAST,
3504+
AwaitExpressionAST,
34923505
UnaryExpressionAST,
34933506
BinaryExpressionAST,
34943507
AssignmentExpressionAST,

Diff for: packages/cxx-frontend/src/ASTKind.ts

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export enum ASTKind {
8282
AlignofExpression,
8383
TypeTraitsExpression,
8484
YieldExpression,
85+
AwaitExpression,
8586
UnaryExpression,
8687
BinaryExpression,
8788
AssignmentExpression,

Diff for: packages/cxx-frontend/src/ASTVisitor.ts

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export abstract class ASTVisitor<Context, Result> {
8686
abstract visitAlignofExpression(node: ast.AlignofExpressionAST, context: Context): Result;
8787
abstract visitTypeTraitsExpression(node: ast.TypeTraitsExpressionAST, context: Context): Result;
8888
abstract visitYieldExpression(node: ast.YieldExpressionAST, context: Context): Result;
89+
abstract visitAwaitExpression(node: ast.AwaitExpressionAST, context: Context): Result;
8990
abstract visitUnaryExpression(node: ast.UnaryExpressionAST, context: Context): Result;
9091
abstract visitBinaryExpression(node: ast.BinaryExpressionAST, context: Context): Result;
9192
abstract visitAssignmentExpression(node: ast.AssignmentExpressionAST, context: Context): Result;

Diff for: packages/cxx-frontend/src/RecursiveASTVisitor.ts

+4
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,10 @@ export class RecursiveASTVisitor<Context> extends ASTVisitor<Context, void> {
317317
this.accept(node.getExpression(), context);
318318
}
319319

320+
visitAwaitExpression(node: ast.AwaitExpressionAST, context: Context): void {
321+
this.accept(node.getExpression(), context);
322+
}
323+
320324
visitUnaryExpression(node: ast.UnaryExpressionAST, context: Context): void {
321325
this.accept(node.getExpression(), context);
322326
}

Diff for: src/frontend/cxx/ast_printer.cc

+5
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,11 @@ void ASTPrinter::visit(YieldExpressionAST* ast) {
625625
accept(ast->expression, "expression");
626626
}
627627

628+
void ASTPrinter::visit(AwaitExpressionAST* ast) {
629+
fmt::print(out_, "{}\n", "await-expression");
630+
accept(ast->expression, "expression");
631+
}
632+
628633
void ASTPrinter::visit(UnaryExpressionAST* ast) {
629634
fmt::print(out_, "{}\n", "unary-expression");
630635
if (ast->op != TokenKind::T_EOF_SYMBOL) {

Diff for: src/frontend/cxx/ast_printer.h

+1
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ class ASTPrinter : ASTVisitor {
101101
void visit(AlignofExpressionAST* ast) override;
102102
void visit(TypeTraitsExpressionAST* ast) override;
103103
void visit(YieldExpressionAST* ast) override;
104+
void visit(AwaitExpressionAST* ast) override;
104105
void visit(UnaryExpressionAST* ast) override;
105106
void visit(BinaryExpressionAST* ast) override;
106107
void visit(AssignmentExpressionAST* ast) override;

Diff for: src/parser/cxx/ast.cc

+12
Original file line numberDiff line numberDiff line change
@@ -834,6 +834,18 @@ auto YieldExpressionAST::lastSourceLocation() -> SourceLocation {
834834
return {};
835835
}
836836

837+
auto AwaitExpressionAST::firstSourceLocation() -> SourceLocation {
838+
if (auto loc = cxx::firstSourceLocation(awaitLoc)) return loc;
839+
if (auto loc = cxx::firstSourceLocation(expression)) return loc;
840+
return {};
841+
}
842+
843+
auto AwaitExpressionAST::lastSourceLocation() -> SourceLocation {
844+
if (auto loc = cxx::lastSourceLocation(expression)) return loc;
845+
if (auto loc = cxx::lastSourceLocation(awaitLoc)) return loc;
846+
return {};
847+
}
848+
837849
auto UnaryExpressionAST::firstSourceLocation() -> SourceLocation {
838850
if (auto loc = cxx::firstSourceLocation(opLoc)) return loc;
839851
if (auto loc = cxx::firstSourceLocation(expression)) return loc;

Diff for: src/parser/cxx/ast.fbs

+6
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ union Expression {
155155
AlignofExpression,
156156
TypeTraitsExpression,
157157
YieldExpression,
158+
AwaitExpression,
158159
UnaryExpression,
159160
BinaryExpression,
160161
AssignmentExpression,
@@ -976,6 +977,11 @@ table YieldExpression /* ExpressionAST */ {
976977
yield_loc: SourceLocation;
977978
}
978979

980+
table AwaitExpression /* ExpressionAST */ {
981+
expression: Expression;
982+
await_loc: SourceLocation;
983+
}
984+
979985
table UnaryExpression /* ExpressionAST */ {
980986
expression: Expression;
981987
op: uint32;

Diff for: src/parser/cxx/ast.h

+13
Original file line numberDiff line numberDiff line change
@@ -1024,6 +1024,19 @@ class YieldExpressionAST final : public ExpressionAST {
10241024
auto lastSourceLocation() -> SourceLocation override;
10251025
};
10261026

1027+
class AwaitExpressionAST final : public ExpressionAST {
1028+
public:
1029+
AwaitExpressionAST() : ExpressionAST(ASTKind::AwaitExpression) {}
1030+
1031+
SourceLocation awaitLoc;
1032+
ExpressionAST* expression = nullptr;
1033+
1034+
void accept(ASTVisitor* visitor) override { visitor->visit(this); }
1035+
1036+
auto firstSourceLocation() -> SourceLocation override;
1037+
auto lastSourceLocation() -> SourceLocation override;
1038+
};
1039+
10271040
class UnaryExpressionAST final : public ExpressionAST {
10281041
public:
10291042
UnaryExpressionAST() : ExpressionAST(ASTKind::UnaryExpression) {}

Diff for: src/parser/cxx/ast_cloner.cc

+15
Original file line numberDiff line numberDiff line change
@@ -1072,6 +1072,21 @@ void ASTCloner::visit(YieldExpressionAST* ast) {
10721072
copy->expression = accept(ast->expression);
10731073
}
10741074

1075+
void ASTCloner::visit(AwaitExpressionAST* ast) {
1076+
auto copy = new (arena_) AwaitExpressionAST();
1077+
copy_ = copy;
1078+
1079+
copy->setChecked(ast->checked());
1080+
1081+
copy->valueCategory = ast->valueCategory;
1082+
1083+
copy->constValue = ast->constValue;
1084+
1085+
copy->awaitLoc = ast->awaitLoc;
1086+
1087+
copy->expression = accept(ast->expression);
1088+
}
1089+
10751090
void ASTCloner::visit(UnaryExpressionAST* ast) {
10761091
auto copy = new (arena_) UnaryExpressionAST();
10771092
copy_ = copy;

Diff for: src/parser/cxx/ast_cloner.h

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class ASTCloner : public ASTVisitor {
8989
void visit(AlignofExpressionAST* ast) override;
9090
void visit(TypeTraitsExpressionAST* ast) override;
9191
void visit(YieldExpressionAST* ast) override;
92+
void visit(AwaitExpressionAST* ast) override;
9293
void visit(UnaryExpressionAST* ast) override;
9394
void visit(BinaryExpressionAST* ast) override;
9495
void visit(AssignmentExpressionAST* ast) override;

Diff for: src/parser/cxx/ast_decoder.cc

+13
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ auto ASTDecoder::decodeExpression(const void* ptr, io::Expression type)
139139
case io::Expression_YieldExpression:
140140
return decodeYieldExpression(
141141
reinterpret_cast<const io::YieldExpression*>(ptr));
142+
case io::Expression_AwaitExpression:
143+
return decodeAwaitExpression(
144+
reinterpret_cast<const io::AwaitExpression*>(ptr));
142145
case io::Expression_UnaryExpression:
143146
return decodeUnaryExpression(
144147
reinterpret_cast<const io::UnaryExpression*>(ptr));
@@ -1460,6 +1463,16 @@ auto ASTDecoder::decodeYieldExpression(const io::YieldExpression* node)
14601463
return ast;
14611464
}
14621465

1466+
auto ASTDecoder::decodeAwaitExpression(const io::AwaitExpression* node)
1467+
-> AwaitExpressionAST* {
1468+
if (!node) return nullptr;
1469+
1470+
auto ast = new (pool_) AwaitExpressionAST();
1471+
ast->expression =
1472+
decodeExpression(node->expression(), node->expression_type());
1473+
return ast;
1474+
}
1475+
14631476
auto ASTDecoder::decodeUnaryExpression(const io::UnaryExpression* node)
14641477
-> UnaryExpressionAST* {
14651478
if (!node) return nullptr;

Diff for: src/parser/cxx/ast_encoder.cc

+14
Original file line numberDiff line numberDiff line change
@@ -1663,6 +1663,20 @@ void ASTEncoder::visit(YieldExpressionAST* ast) {
16631663
type_ = io::Expression_YieldExpression;
16641664
}
16651665

1666+
void ASTEncoder::visit(AwaitExpressionAST* ast) {
1667+
auto awaitLoc = encodeSourceLocation(ast->awaitLoc);
1668+
1669+
const auto [expression, expressionType] = acceptExpression(ast->expression);
1670+
1671+
io::AwaitExpression::Builder builder{fbb_};
1672+
builder.add_await_loc(awaitLoc.o);
1673+
builder.add_expression(expression);
1674+
builder.add_expression_type(static_cast<io::Expression>(expressionType));
1675+
1676+
offset_ = builder.Finish().Union();
1677+
type_ = io::Expression_AwaitExpression;
1678+
}
1679+
16661680
void ASTEncoder::visit(UnaryExpressionAST* ast) {
16671681
auto opLoc = encodeSourceLocation(ast->opLoc);
16681682

Diff for: src/parser/cxx/ast_fwd.h

+1
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class TypeidOfTypeExpressionAST;
134134
class AlignofExpressionAST;
135135
class TypeTraitsExpressionAST;
136136
class YieldExpressionAST;
137+
class AwaitExpressionAST;
137138
class UnaryExpressionAST;
138139
class BinaryExpressionAST;
139140
class AssignmentExpressionAST;

Diff for: src/parser/cxx/ast_kind.h

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ enum struct ASTKind {
8686
AlignofExpression,
8787
TypeTraitsExpression,
8888
YieldExpression,
89+
AwaitExpression,
8990
UnaryExpression,
9091
BinaryExpression,
9192
AssignmentExpression,

Diff for: src/parser/cxx/ast_slot.cc

+15
Original file line numberDiff line numberDiff line change
@@ -1136,6 +1136,21 @@ void ASTSlot::visit(YieldExpressionAST* ast) {
11361136
slotCount_ = 2;
11371137
}
11381138

1139+
void ASTSlot::visit(AwaitExpressionAST* ast) {
1140+
switch (slot_) {
1141+
case 0: // awaitLoc
1142+
value_ = ast->awaitLoc.index();
1143+
slotKind_ = ASTSlotKind::kToken;
1144+
break;
1145+
case 1: // expression
1146+
value_ = reinterpret_cast<std::intptr_t>(ast->expression);
1147+
slotKind_ = ASTSlotKind::kNode;
1148+
break;
1149+
} // switch
1150+
1151+
slotCount_ = 2;
1152+
}
1153+
11391154
void ASTSlot::visit(UnaryExpressionAST* ast) {
11401155
switch (slot_) {
11411156
case 0: // opLoc

Diff for: src/parser/cxx/ast_slot.h

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ class ASTSlot final : ASTVisitor {
100100
void visit(AlignofExpressionAST* ast) override;
101101
void visit(TypeTraitsExpressionAST* ast) override;
102102
void visit(YieldExpressionAST* ast) override;
103+
void visit(AwaitExpressionAST* ast) override;
103104
void visit(UnaryExpressionAST* ast) override;
104105
void visit(BinaryExpressionAST* ast) override;
105106
void visit(AssignmentExpressionAST* ast) override;

Diff for: src/parser/cxx/ast_visitor.h

+1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ class ASTVisitor {
9090
virtual void visit(AlignofExpressionAST* ast) = 0;
9191
virtual void visit(TypeTraitsExpressionAST* ast) = 0;
9292
virtual void visit(YieldExpressionAST* ast) = 0;
93+
virtual void visit(AwaitExpressionAST* ast) = 0;
9394
virtual void visit(UnaryExpressionAST* ast) = 0;
9495
virtual void visit(BinaryExpressionAST* ast) = 0;
9596
virtual void visit(AssignmentExpressionAST* ast) = 0;

Diff for: src/parser/cxx/default_ast_visitor.cc

+4
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,10 @@ void DefaultASTVisitor::visit(YieldExpressionAST* ast) {
257257
cxx_runtime_error("visit(YieldExpressionAST): not implemented");
258258
}
259259

260+
void DefaultASTVisitor::visit(AwaitExpressionAST* ast) {
261+
cxx_runtime_error("visit(AwaitExpressionAST): not implemented");
262+
}
263+
260264
void DefaultASTVisitor::visit(UnaryExpressionAST* ast) {
261265
cxx_runtime_error("visit(UnaryExpressionAST): not implemented");
262266
}

Diff for: src/parser/cxx/default_ast_visitor.h

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class DefaultASTVisitor : public ASTVisitor {
8888
void visit(AlignofExpressionAST* ast) override;
8989
void visit(TypeTraitsExpressionAST* ast) override;
9090
void visit(YieldExpressionAST* ast) override;
91+
void visit(AwaitExpressionAST* ast) override;
9192
void visit(UnaryExpressionAST* ast) override;
9293
void visit(BinaryExpressionAST* ast) override;
9394
void visit(AssignmentExpressionAST* ast) override;

Diff for: src/parser/cxx/parser.cc

+5-9
Original file line numberDiff line numberDiff line change
@@ -2088,17 +2088,13 @@ auto Parser::parse_await_expression(ExpressionAST*& yyast) -> bool {
20882088

20892089
if (!match(TokenKind::T_CO_AWAIT, awaitLoc)) return false;
20902090

2091-
SourceLocation lparenLoc;
2092-
2093-
expect(TokenKind::T_LPAREN, lparenLoc);
2094-
2095-
ExpressionAST* expression = nullptr;
2096-
2097-
if (!parse_cast_expression(expression)) parse_error("expected an expression");
2091+
auto ast = new (pool) AwaitExpressionAST();
2092+
yyast = ast;
20982093

2099-
SourceLocation rparenLoc;
2094+
ast->awaitLoc = awaitLoc;
21002095

2101-
expect(TokenKind::T_RPAREN, rparenLoc);
2096+
if (!parse_cast_expression(ast->expression))
2097+
parse_error("expected an expression");
21022098

21032099
return true;
21042100
}

Diff for: src/parser/cxx/private/ast_decoder.h

+2
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ class ASTDecoder {
179179
-> TypeTraitsExpressionAST*;
180180
auto decodeYieldExpression(const io::YieldExpression* node)
181181
-> YieldExpressionAST*;
182+
auto decodeAwaitExpression(const io::AwaitExpression* node)
183+
-> AwaitExpressionAST*;
182184
auto decodeUnaryExpression(const io::UnaryExpression* node)
183185
-> UnaryExpressionAST*;
184186
auto decodeBinaryExpression(const io::BinaryExpression* node)

Diff for: src/parser/cxx/private/ast_encoder.h

+1
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ class ASTEncoder : ASTVisitor {
185185
void visit(AlignofExpressionAST* ast) override;
186186
void visit(TypeTraitsExpressionAST* ast) override;
187187
void visit(YieldExpressionAST* ast) override;
188+
void visit(AwaitExpressionAST* ast) override;
188189
void visit(UnaryExpressionAST* ast) override;
189190
void visit(BinaryExpressionAST* ast) override;
190191
void visit(AssignmentExpressionAST* ast) override;

Diff for: src/parser/cxx/recursive_ast_visitor.cc

+4
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,10 @@ void RecursiveASTVisitor::visit(YieldExpressionAST* ast) {
493493
acceptExpression(ast->expression);
494494
}
495495

496+
void RecursiveASTVisitor::visit(AwaitExpressionAST* ast) {
497+
acceptExpression(ast->expression);
498+
}
499+
496500
void RecursiveASTVisitor::visit(UnaryExpressionAST* ast) {
497501
acceptExpression(ast->expression);
498502
}

Diff for: src/parser/cxx/recursive_ast_visitor.h

+1
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ class RecursiveASTVisitor : public ASTVisitor {
144144
void visit(AlignofExpressionAST* ast) override;
145145
void visit(TypeTraitsExpressionAST* ast) override;
146146
void visit(YieldExpressionAST* ast) override;
147+
void visit(AwaitExpressionAST* ast) override;
147148
void visit(UnaryExpressionAST* ast) override;
148149
void visit(BinaryExpressionAST* ast) override;
149150
void visit(AssignmentExpressionAST* ast) override;

0 commit comments

Comments
 (0)