@@ -4857,31 +4857,30 @@ class AsyncConverter : private SourceEntityWalker {
4857
4857
FuncDecl *FD = cast<FuncDecl>(StartNode.get <Decl *>());
4858
4858
Identifier CompletionHandlerName = TopHandler.Handler ->getParameterName ();
4859
4859
4860
- OS << " { \n " ; // start function body
4861
- OS << " async { \n " ;
4860
+ OS << tok::l_brace << " \n " ; // start function body
4861
+ OS << " async " << tok::l_brace << " \n " ;
4862
4862
if (TopHandler.HasError ) {
4863
- OS << " do { \n " ;
4863
+ addDo () ;
4864
4864
if (!TopHandler.willAsyncReturnVoid ()) {
4865
- OS << " let result" ;
4865
+ OS << tok::kw_let << " result" ;
4866
4866
addResultTypeAnnotationIfNecessary (FD, TopHandler);
4867
- OS << " = " ;
4867
+ OS << " " << tok::equal << " " ;
4868
4868
}
4869
- OS << " try await " ;
4869
+ OS << tok::kw_try << " await " ;
4870
4870
addCallToAsyncMethod (FD, TopHandler);
4871
4871
OS << " \n " ;
4872
4872
addCallToCompletionHandler (/* HasResult=*/ true , CompletionHandlerName, FD,
4873
4873
TopHandler);
4874
4874
OS << " \n "
4875
- << " } catch { \n " ;
4875
+ << tok::r_brace << " " << tok::kw_catch << " " << tok::l_brace << " \n " ;
4876
4876
addCallToCompletionHandler (/* HasResult=*/ false , CompletionHandlerName, FD,
4877
4877
TopHandler);
4878
- OS << " \n "
4879
- << " }\n " ; // end catch
4878
+ OS << " \n " << tok::r_brace << " \n " ; // end catch
4880
4879
} else {
4881
4880
if (!TopHandler.willAsyncReturnVoid ()) {
4882
- OS << " let result" ;
4881
+ OS << tok::kw_let << " result" ;
4883
4882
addResultTypeAnnotationIfNecessary (FD, TopHandler);
4884
- OS << " = " ;
4883
+ OS << " " << tok::equal << " " ;
4885
4884
}
4886
4885
OS << " await " ;
4887
4886
addCallToAsyncMethod (FD, TopHandler);
@@ -4890,8 +4889,8 @@ class AsyncConverter : private SourceEntityWalker {
4890
4889
TopHandler);
4891
4890
OS << " \n " ;
4892
4891
}
4893
- OS << " } \n " ; // end 'async'
4894
- OS << " } \n " ; // end function body
4892
+ OS << tok::r_brace << " \n " ; // end 'async'
4893
+ OS << tok::r_brace << " \n " ; // end function body
4895
4894
return true ;
4896
4895
}
4897
4896
@@ -5510,24 +5509,24 @@ class AsyncConverter : private SourceEntityWalker {
5510
5509
// / 'await' keyword.
5511
5510
void addCallToAsyncMethod (const FuncDecl *FD,
5512
5511
const AsyncHandlerDesc &HandlerDesc) {
5513
- OS << FD->getBaseName () << " ( " ;
5512
+ OS << FD->getBaseName () << tok::l_paren ;
5514
5513
bool FirstParam = true ;
5515
5514
for (auto Param : *FD->getParameters ()) {
5516
5515
if (Param == HandlerDesc.Handler ) {
5517
5516
// / We don't need to pass the completion handler to the async method.
5518
5517
continue ;
5519
5518
}
5520
5519
if (!FirstParam) {
5521
- OS << " , " ;
5520
+ OS << tok::comma << " " ;
5522
5521
} else {
5523
5522
FirstParam = false ;
5524
5523
}
5525
5524
if (!Param->getArgumentName ().empty ()) {
5526
- OS << Param->getArgumentName () << " : " ;
5525
+ OS << Param->getArgumentName () << tok::colon << " " ;
5527
5526
}
5528
5527
OS << Param->getParameterName ();
5529
5528
}
5530
- OS << " ) " ;
5529
+ OS << tok::r_paren ;
5531
5530
}
5532
5531
5533
5532
// / If the error type of \p HandlerDesc is more specialized than \c Error,
@@ -5537,7 +5536,7 @@ class AsyncConverter : private SourceEntityWalker {
5537
5536
const ASTContext &Ctx) {
5538
5537
auto ErrorType = *HandlerDesc.getErrorType ();
5539
5538
if (ErrorType->getCanonicalType () != Ctx.getExceptionType ()) {
5540
- OS << " as! " ;
5539
+ OS << " " << tok::kw_as << tok::exclaim_postfix << " " ;
5541
5540
ErrorType->lookThroughSingleOptionalType ()->print (OS);
5542
5541
}
5543
5542
}
@@ -5559,18 +5558,18 @@ class AsyncConverter : private SourceEntityWalker {
5559
5558
OS << " error" ;
5560
5559
addCastToCustomErrorTypeIfNecessary (HandlerDesc, FD->getASTContext ());
5561
5560
} else {
5562
- OS << " nil " ;
5561
+ OS << tok::kw_nil ;
5563
5562
}
5564
5563
} else {
5565
5564
if (!HasResult) {
5566
- OS << " nil " ;
5565
+ OS << tok::kw_nil ;
5567
5566
} else if (HandlerDesc
5568
5567
.getSuccessParamAsyncReturnType (
5569
5568
HandlerDesc.params ()[Index].getPlainType ())
5570
5569
->isVoid ()) {
5571
5570
// Void return types are not returned by the async function, synthesize
5572
5571
// a Void instance.
5573
- OS << " () " ;
5572
+ OS << tok::l_paren << tok::r_paren ;
5574
5573
} else if (HandlerDesc.getSuccessParams ().size () > 1 ) {
5575
5574
// If the async method returns a tuple, we need to pass its elements to
5576
5575
// the completion handler separately. For example:
@@ -5585,7 +5584,7 @@ class AsyncConverter : private SourceEntityWalker {
5585
5584
// completion(result.0, result.1)
5586
5585
// }
5587
5586
// }
5588
- OS << " result. " << Index;
5587
+ OS << " result" << tok::period << Index;
5589
5588
} else {
5590
5589
OS << " result" ;
5591
5590
}
@@ -5601,7 +5600,7 @@ class AsyncConverter : private SourceEntityWalker {
5601
5600
void addCallToCompletionHandler (bool HasResult, Identifier HandlerName,
5602
5601
const FuncDecl *FD,
5603
5602
const AsyncHandlerDesc &HandlerDesc) {
5604
- OS << HandlerName << " ( " ;
5603
+ OS << HandlerName << tok::l_paren ;
5605
5604
5606
5605
// Construct arguments to pass to the completion handler
5607
5606
switch (HandlerDesc.Type ) {
@@ -5611,24 +5610,25 @@ class AsyncConverter : private SourceEntityWalker {
5611
5610
case HandlerType::PARAMS: {
5612
5611
for (size_t I = 0 ; I < HandlerDesc.params ().size (); ++I) {
5613
5612
if (I > 0 ) {
5614
- OS << " , " ;
5613
+ OS << tok::comma << " " ;
5615
5614
}
5616
5615
addCompletionHandlerArgument (I, HasResult, FD, HandlerDesc);
5617
5616
}
5618
5617
break ;
5619
5618
}
5620
5619
case HandlerType::RESULT: {
5621
5620
if (HasResult) {
5622
- OS << " .success(result)" ;
5621
+ OS << tok::period_prefix << " success" << tok::l_paren << " result"
5622
+ << tok::r_paren;
5623
5623
} else {
5624
- OS << " . failure( error" ;
5624
+ OS << tok::period_prefix << " failure" << tok::l_paren << " error" ;
5625
5625
addCastToCustomErrorTypeIfNecessary (HandlerDesc, FD->getASTContext ());
5626
- OS << " ) " ;
5626
+ OS << tok::r_paren ;
5627
5627
}
5628
5628
break ;
5629
5629
}
5630
5630
}
5631
- OS << " ) " ; // Close the call to the completion handler
5631
+ OS << tok::r_paren ; // Close the call to the completion handler
5632
5632
}
5633
5633
5634
5634
// / Adds the result type of a refactored async function that previously
@@ -5637,14 +5637,15 @@ class AsyncConverter : private SourceEntityWalker {
5637
5637
SmallVector<Type, 2 > Scratch;
5638
5638
auto ReturnTypes = HandlerDesc.getAsyncReturnTypes (Scratch);
5639
5639
if (ReturnTypes.size () > 1 ) {
5640
- OS << " ( " ;
5640
+ OS << tok::l_paren ;
5641
5641
}
5642
5642
5643
5643
llvm::interleave (
5644
- ReturnTypes, [&](Type Ty) { Ty->print (OS); }, [&]() { OS << " , " ; });
5644
+ ReturnTypes, [&](Type Ty) { Ty->print (OS); },
5645
+ [&]() { OS << tok::comma << " " ; });
5645
5646
5646
5647
if (ReturnTypes.size () > 1 ) {
5647
- OS << " ) " ;
5648
+ OS << tok::r_paren ;
5648
5649
}
5649
5650
}
5650
5651
@@ -5669,7 +5670,7 @@ class AsyncConverter : private SourceEntityWalker {
5669
5670
void addResultTypeAnnotationIfNecessary (const FuncDecl *FD,
5670
5671
const AsyncHandlerDesc &HandlerDesc) {
5671
5672
if (FD->isGeneric ()) {
5672
- OS << " : " ;
5673
+ OS << tok::colon << " " ;
5673
5674
addAsyncFuncReturnType (HandlerDesc);
5674
5675
}
5675
5676
}
0 commit comments