@@ -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);
@@ -1029,6 +1033,14 @@ static bool mustPrintPropertyName(VarDecl *decl, PrintOptions opts) {
1029
1033
return false ;
1030
1034
}
1031
1035
1036
+ // / Gets the print name context of a given decl, choosing between TypeMember
1037
+ // / and Normal, depending if this decl lives in a nominal type decl.
1038
+ static PrintNameContext getTypeMemberPrintNameContext (const Decl *d) {
1039
+ return d->getDeclContext ()->isTypeContext () ?
1040
+ PrintNameContext::TypeMember :
1041
+ PrintNameContext::Normal;
1042
+ }
1043
+
1032
1044
void PrintAST::printPattern (const Pattern *pattern) {
1033
1045
switch (pattern->getKind ()) {
1034
1046
case PatternKind::Any:
@@ -1042,7 +1054,8 @@ void PrintAST::printPattern(const Pattern *pattern) {
1042
1054
// FIXME: This always returns true now, because of the FIXMEs listed in
1043
1055
// mustPrintPropertyName.
1044
1056
if (mustPrintPropertyName (decl, Options))
1045
- Printer.printName (named->getBoundName ());
1057
+ Printer.printName (named->getBoundName (),
1058
+ getTypeMemberPrintNameContext (decl));
1046
1059
else
1047
1060
Printer << " _" ;
1048
1061
});
@@ -2255,7 +2268,7 @@ void PrintAST::visitTypeAliasDecl(TypeAliasDecl *decl) {
2255
2268
printContextIfNeeded (decl);
2256
2269
recordDeclLoc (decl,
2257
2270
[&]{
2258
- Printer.printName (decl->getName ());
2271
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2259
2272
}, [&]{ // Signature
2260
2273
printGenericDeclGenericParams (decl);
2261
2274
});
@@ -2298,7 +2311,7 @@ void PrintAST::visitAssociatedTypeDecl(AssociatedTypeDecl *decl) {
2298
2311
Printer << tok::kw_associatedtype << " " ;
2299
2312
recordDeclLoc (decl,
2300
2313
[&]{
2301
- Printer.printName (decl->getName ());
2314
+ Printer.printName (decl->getName (), PrintNameContext::TypeMember );
2302
2315
});
2303
2316
2304
2317
auto proto = decl->getProtocol ();
@@ -2339,7 +2352,7 @@ void PrintAST::visitEnumDecl(EnumDecl *decl) {
2339
2352
printContextIfNeeded (decl);
2340
2353
recordDeclLoc (decl,
2341
2354
[&]{
2342
- Printer.printName (decl->getName ());
2355
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2343
2356
}, [&]{ // Signature
2344
2357
printGenericDeclGenericParams (decl);
2345
2358
});
@@ -2367,7 +2380,7 @@ void PrintAST::visitStructDecl(StructDecl *decl) {
2367
2380
printContextIfNeeded (decl);
2368
2381
recordDeclLoc (decl,
2369
2382
[&]{
2370
- Printer.printName (decl->getName ());
2383
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2371
2384
}, [&]{ // Signature
2372
2385
printGenericDeclGenericParams (decl);
2373
2386
});
@@ -2395,7 +2408,7 @@ void PrintAST::visitClassDecl(ClassDecl *decl) {
2395
2408
printContextIfNeeded (decl);
2396
2409
recordDeclLoc (decl,
2397
2410
[&]{
2398
- Printer.printName (decl->getName ());
2411
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2399
2412
}, [&]{ // Signature
2400
2413
printGenericDeclGenericParams (decl);
2401
2414
});
@@ -2528,7 +2541,7 @@ void PrintAST::visitVarDecl(VarDecl *decl) {
2528
2541
printContextIfNeeded (decl);
2529
2542
recordDeclLoc (decl,
2530
2543
[&]{
2531
- Printer.printName (decl->getName ());
2544
+ Printer.printName (decl->getName (), getTypeMemberPrintNameContext (decl) );
2532
2545
});
2533
2546
if (decl->hasInterfaceType ()) {
2534
2547
Printer << " : " ;
@@ -2785,7 +2798,8 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) {
2785
2798
if (!decl->hasName ()) {
2786
2799
Printer << " <anonymous>" ;
2787
2800
} else {
2788
- Printer.printName (decl->getName ());
2801
+ Printer.printName (decl->getName (),
2802
+ getTypeMemberPrintNameContext (decl));
2789
2803
if (decl->isOperator ())
2790
2804
Printer << " " ;
2791
2805
}
@@ -2831,7 +2845,7 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) {
2831
2845
void PrintAST::printEnumElement (EnumElementDecl *elt) {
2832
2846
recordDeclLoc (elt,
2833
2847
[&]{
2834
- Printer.printName (elt->getName ());
2848
+ Printer.printName (elt->getName (), getTypeMemberPrintNameContext (elt) );
2835
2849
});
2836
2850
2837
2851
if (auto *PL = elt->getParameterList ()) {
0 commit comments