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