@@ -379,16 +379,26 @@ ASTPrinter &operator<<(ASTPrinter &printer, tok keyword) {
379
379
380
380
// / Determine whether to escape the given keyword in the given context.
381
381
static bool escapeKeywordInContext (StringRef keyword, PrintNameContext context){
382
+
383
+ bool isKeyword = llvm::StringSwitch<bool >(keyword)
384
+ #define KEYWORD (KW ) \
385
+ .Case (#KW, true )
386
+ #include " swift/Syntax/TokenKinds.def"
387
+ .Default (false );
388
+
382
389
switch (context) {
383
390
case PrintNameContext::Normal:
384
391
case PrintNameContext::Attribute:
385
- return true ;
392
+ return isKeyword ;
386
393
case PrintNameContext::Keyword:
387
394
return false ;
388
395
389
396
case PrintNameContext::ClassDynamicSelf:
390
397
case PrintNameContext::GenericParameter:
391
- return keyword != " Self" ;
398
+ return isKeyword && keyword != " Self" ;
399
+
400
+ case PrintNameContext::TypeMember:
401
+ return isKeyword || !canBeMemberName (keyword);
392
402
393
403
case PrintNameContext::FunctionParameterExternal:
394
404
case PrintNameContext::FunctionParameterLocal:
@@ -407,19 +417,13 @@ void ASTPrinter::printName(Identifier Name, PrintNameContext Context) {
407
417
printNamePost (Context);
408
418
return ;
409
419
}
410
- bool IsKeyword = llvm::StringSwitch<bool >(Name.str ())
411
- #define KEYWORD (KW ) \
412
- .Case (#KW, true )
413
- #include " swift/Syntax/TokenKinds.def"
414
- .Default (false );
415
420
416
- if (IsKeyword)
417
- IsKeyword = escapeKeywordInContext (Name.str (), Context);
421
+ bool shouldEscapeKeyword = escapeKeywordInContext (Name.str (), Context);
418
422
419
- if (IsKeyword )
423
+ if (shouldEscapeKeyword )
420
424
*this << " `" ;
421
425
*this << Name.str ();
422
- if (IsKeyword )
426
+ if (shouldEscapeKeyword )
423
427
*this << " `" ;
424
428
425
429
printNamePost (Context);
@@ -1015,6 +1019,14 @@ static bool mustPrintPropertyName(VarDecl *decl, PrintOptions opts) {
1015
1019
return false ;
1016
1020
}
1017
1021
1022
+ // / Gets the print name context of a given decl, choosing between TypeMember
1023
+ // / and Normal, depending if this decl lives in a nominal type decl.
1024
+ static PrintNameContext getTypeMemberPrintNameContext (const Decl *d) {
1025
+ return d->getDeclContext ()->isTypeContext () ?
1026
+ PrintNameContext::TypeMember :
1027
+ PrintNameContext::Normal;
1028
+ }
1029
+
1018
1030
void PrintAST::printPattern (const Pattern *pattern) {
1019
1031
switch (pattern->getKind ()) {
1020
1032
case PatternKind::Any:
@@ -1028,7 +1040,8 @@ void PrintAST::printPattern(const Pattern *pattern) {
1028
1040
// FIXME: This always returns true now, because of the FIXMEs listed in
1029
1041
// mustPrintPropertyName.
1030
1042
if (mustPrintPropertyName (decl, Options))
1031
- Printer.printName (named->getBoundName ());
1043
+ Printer.printName (named->getBoundName (),
1044
+ getTypeMemberPrintNameContext (decl));
1032
1045
else
1033
1046
Printer << " _" ;
1034
1047
});
@@ -2241,7 +2254,7 @@ void PrintAST::visitTypeAliasDecl(TypeAliasDecl *decl) {
2241
2254
printContextIfNeeded (decl);
2242
2255
recordDeclLoc (decl,
2243
2256
[&]{
2244
- Printer.printName (decl->getName ());
2257
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2245
2258
}, [&]{ // Signature
2246
2259
printGenericDeclGenericParams (decl);
2247
2260
});
@@ -2284,7 +2297,7 @@ void PrintAST::visitAssociatedTypeDecl(AssociatedTypeDecl *decl) {
2284
2297
Printer << tok::kw_associatedtype << " " ;
2285
2298
recordDeclLoc (decl,
2286
2299
[&]{
2287
- Printer.printName (decl->getName ());
2300
+ Printer.printName (decl->getName (), PrintNameContext::TypeMember );
2288
2301
});
2289
2302
2290
2303
auto proto = decl->getProtocol ();
@@ -2325,7 +2338,7 @@ void PrintAST::visitEnumDecl(EnumDecl *decl) {
2325
2338
printContextIfNeeded (decl);
2326
2339
recordDeclLoc (decl,
2327
2340
[&]{
2328
- Printer.printName (decl->getName ());
2341
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2329
2342
}, [&]{ // Signature
2330
2343
printGenericDeclGenericParams (decl);
2331
2344
});
@@ -2353,7 +2366,7 @@ void PrintAST::visitStructDecl(StructDecl *decl) {
2353
2366
printContextIfNeeded (decl);
2354
2367
recordDeclLoc (decl,
2355
2368
[&]{
2356
- Printer.printName (decl->getName ());
2369
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2357
2370
}, [&]{ // Signature
2358
2371
printGenericDeclGenericParams (decl);
2359
2372
});
@@ -2381,7 +2394,7 @@ void PrintAST::visitClassDecl(ClassDecl *decl) {
2381
2394
printContextIfNeeded (decl);
2382
2395
recordDeclLoc (decl,
2383
2396
[&]{
2384
- Printer.printName (decl->getName ());
2397
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2385
2398
}, [&]{ // Signature
2386
2399
printGenericDeclGenericParams (decl);
2387
2400
});
@@ -2514,7 +2527,7 @@ void PrintAST::visitVarDecl(VarDecl *decl) {
2514
2527
printContextIfNeeded (decl);
2515
2528
recordDeclLoc (decl,
2516
2529
[&]{
2517
- Printer.printName (decl->getName ());
2530
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2518
2531
});
2519
2532
if (decl->hasInterfaceType ()) {
2520
2533
Printer << " : " ;
@@ -2771,7 +2784,8 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) {
2771
2784
if (!decl->hasName ()) {
2772
2785
Printer << " <anonymous>" ;
2773
2786
} else {
2774
- Printer.printName (decl->getName ());
2787
+ Printer.printName (decl->getName (),
2788
+ getTypeMemberPrintNameContext (decl));
2775
2789
if (decl->isOperator ())
2776
2790
Printer << " " ;
2777
2791
}
@@ -2817,7 +2831,7 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) {
2817
2831
void PrintAST::printEnumElement (EnumElementDecl *elt) {
2818
2832
recordDeclLoc (elt,
2819
2833
[&]{
2820
- Printer.printName (elt->getName ());
2834
+ Printer.printName (elt->getName (), getTypeMemberPrintNameContext (elt) );
2821
2835
});
2822
2836
2823
2837
if (auto *PL = elt->getParameterList ()) {
0 commit comments