@@ -2211,36 +2211,6 @@ void PrintAST::printAccessors(const AbstractStorageDecl *ASD) {
2211
2211
// Otherwise, print all the concrete defining accessors.
2212
2212
bool PrintAccessorBody = Options.FunctionDefinitions ;
2213
2213
2214
- // Helper to print an accessor. Returns true if the
2215
- // accessor was present but skipped.
2216
- auto PrintAccessor = [&](AccessorKind Kind) -> bool {
2217
- auto *Accessor = ASD->getAccessor (Kind);
2218
- if (!Accessor || !shouldPrint (Accessor))
2219
- return true ;
2220
- if (!PrintAccessorBody) {
2221
- Printer << " " ;
2222
- printSelfAccessKindModifiersIfNeeded (Accessor);
2223
-
2224
- Printer.printKeyword (getAccessorLabel (Accessor->getAccessorKind ()), Options);
2225
-
2226
- // handle any effects specifiers
2227
- if (Accessor->getAccessorKind () == AccessorKind::Get) {
2228
- if (asyncGet) printWithSpace (" async" );
2229
- if (throwsGet) printWithSpace (" throws" );
2230
- }
2231
-
2232
- } else {
2233
- {
2234
- IndentRAII IndentMore (*this );
2235
- indent ();
2236
- visit (Accessor);
2237
- }
2238
- indent ();
2239
- Printer.printNewline ();
2240
- }
2241
- return false ;
2242
- };
2243
-
2244
2214
// Determine if we should print the getter without the 'get { ... }'
2245
2215
// block around it.
2246
2216
bool isOnlyGetter = impl.getReadImpl () == ReadImplKind::Get &&
@@ -2254,28 +2224,31 @@ void PrintAST::printAccessors(const AbstractStorageDecl *ASD) {
2254
2224
return ;
2255
2225
}
2256
2226
2257
- Printer << " {" ;
2258
-
2259
- if (PrintAccessorBody)
2260
- Printer.printNewline ();
2227
+ // Collect the accessor declarations that we should print.
2228
+ SmallVector<AccessorDecl *, 4 > accessorsToPrint;
2229
+ auto AddAccessorToPrint = [&](AccessorKind kind) {
2230
+ auto *Accessor = ASD->getAccessor (kind);
2231
+ if (Accessor && shouldPrint (Accessor))
2232
+ accessorsToPrint.push_back (Accessor);
2233
+ };
2261
2234
2262
2235
if (PrintAbstract) {
2263
- PrintAccessor (AccessorKind::Get);
2236
+ AddAccessorToPrint (AccessorKind::Get);
2264
2237
if (ASD->supportsMutation ())
2265
- PrintAccessor (AccessorKind::Set);
2238
+ AddAccessorToPrint (AccessorKind::Set);
2266
2239
} else {
2267
2240
switch (impl.getReadImpl ()) {
2268
2241
case ReadImplKind::Stored:
2269
2242
case ReadImplKind::Inherited:
2270
2243
break ;
2271
2244
case ReadImplKind::Get:
2272
- PrintAccessor (AccessorKind::Get);
2245
+ AddAccessorToPrint (AccessorKind::Get);
2273
2246
break ;
2274
2247
case ReadImplKind::Address:
2275
- PrintAccessor (AccessorKind::Address);
2248
+ AddAccessorToPrint (AccessorKind::Address);
2276
2249
break ;
2277
2250
case ReadImplKind::Read:
2278
- PrintAccessor (AccessorKind::Read);
2251
+ AddAccessorToPrint (AccessorKind::Read);
2279
2252
break ;
2280
2253
}
2281
2254
switch (impl.getWriteImpl ()) {
@@ -2285,27 +2258,67 @@ void PrintAST::printAccessors(const AbstractStorageDecl *ASD) {
2285
2258
llvm_unreachable (" simply-stored variable should have been filtered out" );
2286
2259
case WriteImplKind::StoredWithObservers:
2287
2260
case WriteImplKind::InheritedWithObservers: {
2288
- PrintAccessor (AccessorKind::Get);
2289
- PrintAccessor (AccessorKind::Set);
2261
+ AddAccessorToPrint (AccessorKind::Get);
2262
+ AddAccessorToPrint (AccessorKind::Set);
2290
2263
break ;
2291
2264
}
2292
2265
case WriteImplKind::Set:
2293
- PrintAccessor (AccessorKind::Set);
2266
+ AddAccessorToPrint (AccessorKind::Set);
2294
2267
if (!shouldHideModifyAccessor ())
2295
- PrintAccessor (AccessorKind::Modify);
2268
+ AddAccessorToPrint (AccessorKind::Modify);
2296
2269
break ;
2297
2270
case WriteImplKind::MutableAddress:
2298
- PrintAccessor (AccessorKind::MutableAddress);
2299
- PrintAccessor (AccessorKind::WillSet);
2300
- PrintAccessor (AccessorKind::DidSet);
2271
+ AddAccessorToPrint (AccessorKind::MutableAddress);
2272
+ AddAccessorToPrint (AccessorKind::WillSet);
2273
+ AddAccessorToPrint (AccessorKind::DidSet);
2301
2274
break ;
2302
2275
case WriteImplKind::Modify:
2303
- PrintAccessor (AccessorKind::Modify);
2276
+ AddAccessorToPrint (AccessorKind::Modify);
2304
2277
break ;
2305
2278
}
2306
2279
}
2307
2280
2308
- if (!PrintAccessorBody)
2281
+ // If we're not printing the accessor bodies and none of the accessors have
2282
+ // attributes then we can print in a shorter, compact form.
2283
+ bool PrintCompactAccessors =
2284
+ !PrintAccessorBody &&
2285
+ std::all_of (accessorsToPrint.begin (), accessorsToPrint.end (),
2286
+ [](AccessorDecl *accessor) {
2287
+ return accessor->getAttrs ().isEmpty ();
2288
+ });
2289
+
2290
+ Printer << " {" ;
2291
+
2292
+ if (!PrintCompactAccessors)
2293
+ Printer.printNewline ();
2294
+
2295
+ for (auto *accessor : accessorsToPrint) {
2296
+ if (PrintCompactAccessors) {
2297
+ Printer << " " ;
2298
+ printSelfAccessKindModifiersIfNeeded (accessor);
2299
+
2300
+ Printer.printKeyword (getAccessorLabel (accessor->getAccessorKind ()),
2301
+ Options);
2302
+
2303
+ // handle any effects specifiers
2304
+ if (accessor->getAccessorKind () == AccessorKind::Get) {
2305
+ if (asyncGet)
2306
+ printWithSpace (" async" );
2307
+ if (throwsGet)
2308
+ printWithSpace (" throws" );
2309
+ }
2310
+ } else {
2311
+ {
2312
+ IndentRAII IndentMore (*this );
2313
+ indent ();
2314
+ visit (accessor);
2315
+ }
2316
+ indent ();
2317
+ Printer.printNewline ();
2318
+ }
2319
+ }
2320
+
2321
+ if (PrintCompactAccessors)
2309
2322
Printer << " " ;
2310
2323
2311
2324
Printer << " }" ;
0 commit comments