@@ -376,16 +376,26 @@ ASTPrinter &operator<<(ASTPrinter &printer, tok keyword) {
376
376
377
377
// / Determine whether to escape the given keyword in the given context.
378
378
static bool escapeKeywordInContext (StringRef keyword, PrintNameContext context){
379
+
380
+ bool isKeyword = llvm::StringSwitch<bool >(keyword)
381
+ #define KEYWORD (KW ) \
382
+ .Case (#KW, true )
383
+ #include " swift/Syntax/TokenKinds.def"
384
+ .Default (false );
385
+
379
386
switch (context) {
380
387
case PrintNameContext::Normal:
381
388
case PrintNameContext::Attribute:
382
- return true ;
389
+ return isKeyword ;
383
390
case PrintNameContext::Keyword:
384
391
return false ;
385
392
386
393
case PrintNameContext::ClassDynamicSelf:
387
394
case PrintNameContext::GenericParameter:
388
- return keyword != " Self" ;
395
+ return isKeyword && keyword != " Self" ;
396
+
397
+ case PrintNameContext::TypeMember:
398
+ return isKeyword || !canBeMemberName (keyword);
389
399
390
400
case PrintNameContext::FunctionParameterExternal:
391
401
case PrintNameContext::FunctionParameterLocal:
@@ -404,19 +414,13 @@ void ASTPrinter::printName(Identifier Name, PrintNameContext Context) {
404
414
printNamePost (Context);
405
415
return ;
406
416
}
407
- bool IsKeyword = llvm::StringSwitch<bool >(Name.str ())
408
- #define KEYWORD (KW ) \
409
- .Case (#KW, true )
410
- #include " swift/Syntax/TokenKinds.def"
411
- .Default (false );
412
417
413
- if (IsKeyword)
414
- IsKeyword = escapeKeywordInContext (Name.str (), Context);
418
+ bool shouldEscapeKeyword = escapeKeywordInContext (Name.str (), Context);
415
419
416
- if (IsKeyword )
420
+ if (shouldEscapeKeyword )
417
421
*this << " `" ;
418
422
*this << Name.str ();
419
- if (IsKeyword )
423
+ if (shouldEscapeKeyword )
420
424
*this << " `" ;
421
425
422
426
printNamePost (Context);
@@ -1012,6 +1016,14 @@ static bool mustPrintPropertyName(VarDecl *decl, PrintOptions opts) {
1012
1016
return false ;
1013
1017
}
1014
1018
1019
+ // / Gets the print name context of a given decl, choosing between TypeMember
1020
+ // / and Normal, depending if this decl lives in a nominal type decl.
1021
+ static PrintNameContext getTypeMemberPrintNameContext (const Decl *d) {
1022
+ return d->getDeclContext ()->isTypeContext () ?
1023
+ PrintNameContext::TypeMember :
1024
+ PrintNameContext::Normal;
1025
+ }
1026
+
1015
1027
void PrintAST::printPattern (const Pattern *pattern) {
1016
1028
switch (pattern->getKind ()) {
1017
1029
case PatternKind::Any:
@@ -1025,7 +1037,8 @@ void PrintAST::printPattern(const Pattern *pattern) {
1025
1037
// FIXME: This always returns true now, because of the FIXMEs listed in
1026
1038
// mustPrintPropertyName.
1027
1039
if (mustPrintPropertyName (decl, Options))
1028
- Printer.printName (named->getBoundName ());
1040
+ Printer.printName (named->getBoundName (),
1041
+ getTypeMemberPrintNameContext (decl));
1029
1042
else
1030
1043
Printer << " _" ;
1031
1044
});
@@ -2231,7 +2244,7 @@ void PrintAST::visitTypeAliasDecl(TypeAliasDecl *decl) {
2231
2244
printContextIfNeeded (decl);
2232
2245
recordDeclLoc (decl,
2233
2246
[&]{
2234
- Printer.printName (decl->getName ());
2247
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2235
2248
}, [&]{ // Signature
2236
2249
printGenericDeclGenericParams (decl);
2237
2250
});
@@ -2264,7 +2277,7 @@ void PrintAST::visitAssociatedTypeDecl(AssociatedTypeDecl *decl) {
2264
2277
Printer << tok::kw_associatedtype << " " ;
2265
2278
recordDeclLoc (decl,
2266
2279
[&]{
2267
- Printer.printName (decl->getName ());
2280
+ Printer.printName (decl->getName (), PrintNameContext::TypeMember );
2268
2281
});
2269
2282
2270
2283
auto proto = decl->getProtocol ();
@@ -2305,7 +2318,7 @@ void PrintAST::visitEnumDecl(EnumDecl *decl) {
2305
2318
printContextIfNeeded (decl);
2306
2319
recordDeclLoc (decl,
2307
2320
[&]{
2308
- Printer.printName (decl->getName ());
2321
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2309
2322
}, [&]{ // Signature
2310
2323
printGenericDeclGenericParams (decl);
2311
2324
});
@@ -2333,7 +2346,7 @@ void PrintAST::visitStructDecl(StructDecl *decl) {
2333
2346
printContextIfNeeded (decl);
2334
2347
recordDeclLoc (decl,
2335
2348
[&]{
2336
- Printer.printName (decl->getName ());
2349
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2337
2350
}, [&]{ // Signature
2338
2351
printGenericDeclGenericParams (decl);
2339
2352
});
@@ -2361,7 +2374,7 @@ void PrintAST::visitClassDecl(ClassDecl *decl) {
2361
2374
printContextIfNeeded (decl);
2362
2375
recordDeclLoc (decl,
2363
2376
[&]{
2364
- Printer.printName (decl->getName ());
2377
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2365
2378
}, [&]{ // Signature
2366
2379
printGenericDeclGenericParams (decl);
2367
2380
});
@@ -2494,7 +2507,7 @@ void PrintAST::visitVarDecl(VarDecl *decl) {
2494
2507
printContextIfNeeded (decl);
2495
2508
recordDeclLoc (decl,
2496
2509
[&]{
2497
- Printer.printName (decl->getName ());
2510
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2498
2511
});
2499
2512
if (decl->hasInterfaceType ()) {
2500
2513
Printer << " : " ;
@@ -2750,7 +2763,8 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) {
2750
2763
if (!decl->hasName ()) {
2751
2764
Printer << " <anonymous>" ;
2752
2765
} else {
2753
- Printer.printName (decl->getName ());
2766
+ Printer.printName (decl->getName (),
2767
+ getTypeMemberPrintNameContext (decl));
2754
2768
if (decl->isOperator ())
2755
2769
Printer << " " ;
2756
2770
}
@@ -2788,7 +2802,7 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) {
2788
2802
void PrintAST::printEnumElement (EnumElementDecl *elt) {
2789
2803
recordDeclLoc (elt,
2790
2804
[&]{
2791
- Printer.printName (elt->getName ());
2805
+ Printer.printName (elt->getName (), getTypeMemberPrintNameContext (elt) );
2792
2806
});
2793
2807
2794
2808
if (auto *PL = elt->getParameterList ()) {
0 commit comments