[SymbolGraph] Only include where clause constraints in swiftExtension

Otherwise, this creates noise in conditional conformance phrasings.

rdar://64425199
This commit is contained in:
Ashley Garland
2020-06-16 19:33:20 -07:00
parent d51ac72791
commit a9d692c1fb
5 changed files with 77 additions and 27 deletions

View File

@@ -69,9 +69,7 @@ void swift::symbolgraphgen::serialize(const ExtensionDecl *Extension,
SmallVector<Requirement, 4> FilteredRequirements;
filterGenericRequirements(Extension->getGenericRequirements(),
Extension->getExtendedNominal()
->getDeclContext()->getSelfNominalTypeDecl(),
filterGenericRequirements(Extension,
FilteredRequirements);
if (!FilteredRequirements.empty()) {
@@ -122,24 +120,36 @@ void swift::symbolgraphgen::filterGenericRequirements(
const NominalTypeDecl *Self,
SmallVectorImpl<Requirement> &FilteredRequirements) {
for (const auto &Req : Requirements) {
if (Req.getKind() == RequirementKind::Layout) {
continue;
}
/*
Don't serialize constraints that aren't applicable for display.
For example:
extension Equatable {
func foo(_ thing: Self) {}
}
`foo` includes a constraint `Self: Equatable` for the compiler's purposes,
but that's redundant for the purposes of documentation.
This is extending Equatable, after all!
*/
if (Req.getFirstType()->getString() == "Self" &&
Req.getSecondType()->getAnyNominal() == Self) {
if (Req.getKind() == RequirementKind::Layout) {
continue;
}
// extension /* protocol */ Q {
// func foo() {}
// }
// ignore Self : Q, obvious
if (Req.getSecondType()->getAnyNominal() == Self) {
continue;
}
FilteredRequirements.push_back(Req);
}
}
void
swift::symbolgraphgen::filterGenericRequirements(const ExtensionDecl *Extension,
SmallVectorImpl<Requirement> &FilteredRequirements) {
for (const auto &Req : Extension->getGenericRequirements()) {
if (Req.getKind() == RequirementKind::Layout) {
continue;
}
if (!isa<ProtocolDecl>(Extension->getExtendedNominal()) &&
Req.getFirstType()->isEqual(Extension->getExtendedType())) {
continue;
}
// extension /* protocol */ Q
// ignore Self : Q, obvious
if (Req.getSecondType()->isEqual(Extension->getExtendedType())) {
continue;
}
FilteredRequirements.push_back(Req);