void AttributedTypeRepr::printAttrs(ASTPrinter &Printer, const PrintOptions &Options) const { const TypeAttributes &Attrs = getAttrs(); auto hasAttr = [&](TypeAttrKind K) -> bool { if (Options.excludeAttrKind(K)) return false; return Attrs.has(K); }; if (hasAttr(TAK_autoclosure)) Printer.printSimpleAttr("@autoclosure") << " "; if (hasAttr(TAK_escaping)) Printer.printSimpleAttr("@escaping") << " "; if (hasAttr(TAK_thin)) Printer.printSimpleAttr("@thin") << " "; if (hasAttr(TAK_thick)) Printer.printSimpleAttr("@thick") << " "; if (hasAttr(TAK_convention) && Attrs.convention.hasValue()) { Printer.callPrintStructurePre(PrintStructureKind::BuiltinAttribute); Printer.printAttrName("@convention"); Printer << "(" << Attrs.convention.getValue() << ")"; Printer.printStructurePost(PrintStructureKind::BuiltinAttribute); Printer << " "; } }
void DeclAttributes::print(ASTPrinter &Printer, const PrintOptions &Options, const Decl *D) const { if (!DeclAttrs) return; using AttributeVector = SmallVector<const DeclAttribute *, 8>; AttributeVector orderedAttributes(begin(), end()); std::reverse(orderedAttributes.begin(), orderedAttributes.end()); // Process attributes in passes. AttributeVector shortAvailableAttributes; const DeclAttribute *swiftVersionAvailableAttribute = nullptr; AttributeVector longAttributes; AttributeVector attributes; AttributeVector modifiers; for (auto DA : orderedAttributes) { if (!Options.PrintImplicitAttrs && DA->isImplicit()) continue; if (!Options.PrintUserInaccessibleAttrs && DeclAttribute::isUserInaccessible(DA->getKind())) continue; if (Options.excludeAttrKind(DA->getKind())) continue; // Be careful not to coalesce `@available(swift 5)` with other short // `available' attributes. if (auto *availableAttr = dyn_cast<AvailableAttr>(DA)) { if (availableAttr->isLanguageVersionSpecific() && isShortAvailable(availableAttr)) { swiftVersionAvailableAttribute = availableAttr; continue; } } AttributeVector &which = DA->isDeclModifier() ? modifiers : isShortAvailable(DA) ? shortAvailableAttributes : DA->isLongAttribute() ? longAttributes : attributes; which.push_back(DA); } if (swiftVersionAvailableAttribute) printShortFormAvailable(swiftVersionAvailableAttribute, Printer, Options); if (!shortAvailableAttributes.empty()) printShortFormAvailable(shortAvailableAttributes, Printer, Options); for (auto DA : longAttributes) DA->print(Printer, Options, D); for (auto DA : attributes) DA->print(Printer, Options, D); for (auto DA : modifiers) DA->print(Printer, Options, D); }
void DeclAttributes::print(ASTPrinter &Printer, const PrintOptions &Options, const Decl *D) const { if (!DeclAttrs) return; using AttributeVector = SmallVector<const DeclAttribute *, 8>; AttributeVector orderedAttributes(begin(), end()); std::reverse(orderedAttributes.begin(), orderedAttributes.end()); // Process attributes in passes. AttributeVector shortAvailableAttributes; AttributeVector longAttributes; AttributeVector attributes; AttributeVector modifiers; for (auto DA : orderedAttributes) { if (!Options.PrintImplicitAttrs && DA->isImplicit()) continue; if (!Options.PrintUserInaccessibleAttrs && DeclAttribute::isUserInaccessible(DA->getKind())) continue; if (Options.excludeAttrKind(DA->getKind())) continue; AttributeVector &which = DA->isDeclModifier() ? modifiers : isShortAvailable(DA) ? shortAvailableAttributes : DA->isLongAttribute() ? longAttributes : attributes; which.push_back(DA); } if (!shortAvailableAttributes.empty()) { printShortFormAvailable(shortAvailableAttributes, Printer, Options); } for (auto DA : longAttributes) DA->print(Printer, Options, D); for (auto DA : attributes) DA->print(Printer, Options, D); for (auto DA : modifiers) DA->print(Printer, Options, D); }