Skip to content

Commit e8aee18

Browse files
committed
ASTPrinter: Refactor to use getRequirementsWithInverses()
1 parent bbc4d42 commit e8aee18

File tree

1 file changed

+31
-132
lines changed

1 file changed

+31
-132
lines changed

lib/AST/ASTPrinter.cpp

Lines changed: 31 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -943,7 +943,6 @@ class PrintAST : public ASTVisitor<PrintAST> {
943943
InnermostOnly = 4,
944944
SwapSelfAndDependentMemberType = 8,
945945
PrintInherited = 16,
946-
CollapseDefaultReqs = 32,
947946
};
948947

949948
void printInheritedFromRequirementSignature(ProtocolDecl *proto,
@@ -953,11 +952,9 @@ class PrintAST : public ASTVisitor<PrintAST> {
953952
void printInherited(const Decl *decl);
954953

955954
void printGenericSignature(GenericSignature genericSig,
956-
ArrayRef<InverseRequirement> inverses,
957955
unsigned flags);
958956
void
959957
printGenericSignature(GenericSignature genericSig,
960-
ArrayRef<InverseRequirement> inverses,
961958
unsigned flags,
962959
llvm::function_ref<bool(const Requirement &)> filter);
963960
void printSingleDepthOfGenericSignature(
@@ -1457,44 +1454,6 @@ static unsigned getDepthOfType(Type ty) {
14571454
return depth;
14581455
}
14591456

1460-
/// Recomputes which inverses must have been written for the given generic
1461-
/// signature.
1462-
static void reconstituteInverses(GenericSignature genericSig,
1463-
ArrayRef<Type> typeParams,
1464-
SmallVectorImpl<InverseRequirement> &inverses) {
1465-
auto &ctx = genericSig->getASTContext();
1466-
1467-
if (!ctx.LangOpts.hasFeature(swift::Feature::NoncopyableGenerics))
1468-
return;
1469-
1470-
for (auto tp : typeParams) {
1471-
assert(tp);
1472-
1473-
// Any generic parameter with a superclass bound could not have an inverse.
1474-
if (genericSig->getSuperclassBound(tp))
1475-
continue;
1476-
1477-
auto defaults = InverseRequirement::expandDefault(tp);
1478-
for (auto ip : defaults) {
1479-
auto *proto = ctx.getProtocol(getKnownProtocolKind(ip));
1480-
1481-
// If the generic signature reflects the default requirement,
1482-
// then there was no inverse for this generic parameter.
1483-
if (genericSig->requiresProtocol(tp, proto))
1484-
continue;
1485-
1486-
inverses.push_back({tp, proto, SourceLoc()});
1487-
}
1488-
}
1489-
}
1490-
1491-
static void reconstituteInverses(GenericSignature genericSig,
1492-
ArrayRef<GenericTypeParamType *> genericParams,
1493-
SmallVectorImpl<InverseRequirement> &inverses) {
1494-
SmallVector<Type, 4> asType(genericParams);
1495-
reconstituteInverses(genericSig, asType, inverses);
1496-
}
1497-
14981457
namespace {
14991458
struct RequirementPrintLocation {
15001459
/// The Decl where the requirement should be attached (whether inherited or in
@@ -1615,13 +1574,9 @@ void PrintAST::printInheritedFromRequirementSignature(ProtocolDecl *proto,
16151574
else
16161575
llvm_unreachable("nonexhaustive");
16171576

1618-
SmallVector<InverseRequirement, 2> inverses;
1619-
reconstituteInverses(proto->getGenericSignature(), attachedGP, inverses);
1620-
16211577
printGenericSignature(
16221578
proto->getRequirementSignatureAsGenericSignature(),
1623-
inverses,
1624-
PrintInherited | CollapseDefaultReqs,
1579+
PrintInherited,
16251580
[&](const Requirement &req) {
16261581
// Skip the inferred 'Self : AnyObject' constraint if this is an
16271582
// @objc protocol.
@@ -1640,12 +1595,11 @@ void PrintAST::printInheritedFromRequirementSignature(ProtocolDecl *proto,
16401595

16411596
void PrintAST::printWhereClauseFromRequirementSignature(ProtocolDecl *proto,
16421597
TypeDecl *attachingTo) {
1643-
unsigned flags = PrintRequirements | CollapseDefaultReqs;
1598+
unsigned flags = PrintRequirements;
16441599
if (isa<AssociatedTypeDecl>(attachingTo))
16451600
flags |= SwapSelfAndDependentMemberType;
16461601
printGenericSignature(
16471602
proto->getRequirementSignatureAsGenericSignature(),
1648-
{}, // NOTE: a protocol's inverses are only printed in inheritance clause!
16491603
flags,
16501604
[&](const Requirement &req) {
16511605
auto location = bestRequirementPrintLocation(proto, req);
@@ -1681,31 +1635,20 @@ static unsigned getDepthOfRequirement(const Requirement &req) {
16811635
llvm_unreachable("bad RequirementKind");
16821636
}
16831637

1684-
static void getRequirementsAtDepth(GenericSignature genericSig,
1685-
unsigned depth,
1686-
SmallVectorImpl<Requirement> &result) {
1687-
for (auto reqt : genericSig.getRequirements()) {
1688-
unsigned currentDepth = getDepthOfRequirement(reqt);
1689-
assert(currentDepth != ErrorDepth);
1690-
if (currentDepth == depth)
1691-
result.push_back(reqt);
1692-
}
1693-
}
1694-
16951638
void PrintAST::printGenericSignature(GenericSignature genericSig,
1696-
ArrayRef<InverseRequirement> inverses,
16971639
unsigned flags) {
1698-
printGenericSignature(genericSig, inverses, flags,
1640+
printGenericSignature(genericSig, flags,
16991641
// print everything
17001642
[&](const Requirement &) { return true; });
17011643
}
17021644

17031645
void PrintAST::printGenericSignature(
17041646
GenericSignature genericSig,
1705-
ArrayRef<InverseRequirement> inverses,
17061647
unsigned flags,
17071648
llvm::function_ref<bool(const Requirement &)> filter) {
1708-
auto requirements = genericSig.getRequirements();
1649+
SmallVector<Requirement, 2> requirements;
1650+
SmallVector<InverseRequirement, 2> inverses;
1651+
genericSig->getRequirementsWithInverses(requirements, inverses);
17091652

17101653
if (flags & InnermostOnly) {
17111654
auto genericParams = genericSig.getInnermostGenericParams();
@@ -1741,34 +1684,27 @@ void PrintAST::printGenericSignature(
17411684
genericParams.slice(paramIdx, lastParamIdx - paramIdx);
17421685

17431686
SmallVector<InverseRequirement, 2> inversesAtDepth;
1744-
if (flags & CollapseDefaultReqs)
1745-
reconstituteInverses(genericSig, genericParamsAtDepth, inversesAtDepth);
1687+
for (auto inverseReq : inverses) {
1688+
if (inverseReq.subject->castTo<GenericTypeParamType>()->getDepth() == depth)
1689+
inversesAtDepth.push_back(inverseReq);
1690+
}
17461691

17471692
SmallVector<Requirement, 2> requirementsAtDepth;
1748-
getRequirementsAtDepth(genericSig, depth, requirementsAtDepth);
1693+
for (auto reqt : requirements) {
1694+
unsigned currentDepth = getDepthOfRequirement(reqt);
1695+
assert(currentDepth != ErrorDepth);
1696+
if (currentDepth == depth)
1697+
requirementsAtDepth.push_back(reqt);
1698+
}
17491699

17501700
printSingleDepthOfGenericSignature(
1751-
genericParamsAtDepth,
1752-
requirementsAtDepth, inversesAtDepth, flags, filter);
1701+
genericParamsAtDepth, requirementsAtDepth, inversesAtDepth,
1702+
flags, filter);
17531703

17541704
paramIdx = lastParamIdx;
17551705
}
17561706
}
17571707

1758-
/// \returns the invertible protocol kind iff this requirement is a conformance
1759-
/// to an invertible protocol.
1760-
static llvm::Optional<InvertibleProtocolKind>
1761-
getInvertibleProtocolKind(const Requirement &req) {
1762-
if (req.getKind() != RequirementKind::Conformance)
1763-
return llvm::None;
1764-
1765-
auto constraintTy = req.getSecondType();
1766-
if (auto kp = constraintTy->getKnownProtocol())
1767-
return getInvertibleProtocolKind(*kp);
1768-
1769-
return llvm::None;
1770-
}
1771-
17721708
void PrintAST::printSingleDepthOfGenericSignature(
17731709
ArrayRef<GenericTypeParamType *> genericParams,
17741710
ArrayRef<Requirement> requirements,
@@ -1792,7 +1728,6 @@ void PrintAST::printSingleDepthOfGenericSignature(
17921728
bool printInherited = (flags & PrintInherited);
17931729
bool swapSelfAndDependentMemberType =
17941730
(flags & SwapSelfAndDependentMemberType);
1795-
const bool collapseDefaults = (flags & CollapseDefaultReqs);
17961731

17971732
unsigned typeContextDepth = 0;
17981733
SubstitutionMap subMap;
@@ -1884,17 +1819,10 @@ void PrintAST::printSingleDepthOfGenericSignature(
18841819
}
18851820

18861821
if (printRequirements || printInherited) {
1887-
// If we're not collapsing defaults, we shouldn't also print inverses!
1888-
assert(collapseDefaults || inverses.empty());
1889-
18901822
for (const auto &req : requirements) {
18911823
if (!filter(req))
18921824
continue;
18931825

1894-
/// Skip all requirements for a conformance to an invertible protocol.
1895-
if (collapseDefaults && getInvertibleProtocolKind(req))
1896-
continue;
1897-
18981826
auto first = req.getFirstType();
18991827

19001828
if (dependsOnOpaque(first))
@@ -2678,7 +2606,7 @@ void PrintAST::printGenericDeclGenericParams(GenericContext *decl) {
26782606
if (decl->isGeneric())
26792607
if (auto GenericSig = decl->getGenericSignature()) {
26802608
Printer.printStructurePre(PrintStructureKind::DeclGenericParameterClause);
2681-
printGenericSignature(GenericSig, {}, PrintParams | InnermostOnly);
2609+
printGenericSignature(GenericSig, PrintParams | InnermostOnly);
26822610
Printer.printStructurePost(PrintStructureKind::DeclGenericParameterClause);
26832611
}
26842612
}
@@ -2697,13 +2625,9 @@ void PrintAST::printDeclGenericRequirements(GenericContext *decl) {
26972625
SmallVector<Type, 2> genericParams;
26982626
InverseRequirement::enumerateDefaultedParams(decl, genericParams);
26992627

2700-
SmallVector<InverseRequirement, 2> inverses;
2701-
reconstituteInverses(genericSig, genericParams, inverses);
2702-
27032628
Printer.printStructurePre(PrintStructureKind::DeclGenericParameterClause);
27042629
printGenericSignature(genericSig,
2705-
inverses,
2706-
PrintRequirements | CollapseDefaultReqs,
2630+
PrintRequirements,
27072631
[parentSig](const Requirement &req) {
27082632
if (parentSig)
27092633
return !parentSig->isRequirementSatisfied(req);
@@ -2961,11 +2885,7 @@ void PrintAST::printExtension(ExtensionDecl *decl) {
29612885
auto baseGenericSig = decl->getExtendedNominal()->getGenericSignature();
29622886
assert(baseGenericSig &&
29632887
"an extension can't be generic if the base type isn't");
2964-
// NOTE: We do _not_ CollapseDefaultReqs for the where-clause of an
2965-
// extension, because conditions involving Copyable here are not
2966-
// automatically inferred based on the extension itself.
29672888
printGenericSignature(genericSig,
2968-
{},
29692889
PrintRequirements,
29702890
[baseGenericSig](const Requirement &req) -> bool {
29712891
// Only include constraints that are not satisfied by the base type.
@@ -7216,12 +7136,8 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
72167136
Printer.printStructurePost(PrintStructureKind::FunctionReturnType);
72177137
}
72187138

7219-
void printGenericSignature(GenericSignature genericSig,
7220-
ArrayRef<InverseRequirement> inverses,
7221-
unsigned flags) {
7222-
PrintAST(Printer, Options).printGenericSignature(genericSig,
7223-
inverses,
7224-
flags);
7139+
void printGenericSignature(GenericSignature genericSig, unsigned flags) {
7140+
PrintAST(Printer, Options).printGenericSignature(genericSig, flags);
72257141
}
72267142

72277143
void printSubstitutions(SubstitutionMap subs) {
@@ -7241,17 +7157,10 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
72417157
Printer.printStructurePost(PrintStructureKind::FunctionType);
72427158
};
72437159

7244-
SmallVector<InverseRequirement, 2> inverses;
7245-
reconstituteInverses(T->getGenericSignature(),
7246-
T->getGenericParams(),
7247-
inverses);
7248-
72497160
printFunctionExtInfo(T);
72507161
printGenericSignature(T->getGenericSignature(),
7251-
inverses,
72527162
PrintAST::PrintParams |
7253-
PrintAST::PrintRequirements |
7254-
PrintAST::CollapseDefaultReqs);
7163+
PrintAST::PrintRequirements);
72557164
Printer << " ";
72567165

72577166
visitAnyFunctionTypeParams(T->getParams(), /*printLabels*/true);
@@ -7328,14 +7237,9 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
73287237
printCalleeConvention(T->getCalleeConvention());
73297238

73307239
if (GenericSignature sig = T->getInvocationGenericSignature()) {
7331-
SmallVector<InverseRequirement, 2> inverses;
7332-
reconstituteInverses(sig, sig.getGenericParams(), inverses);
7333-
73347240
printGenericSignature(sig,
7335-
inverses,
73367241
PrintAST::PrintParams |
7337-
PrintAST::PrintRequirements |
7338-
PrintAST::CollapseDefaultReqs);
7242+
PrintAST::PrintRequirements);
73397243
Printer << " ";
73407244
}
73417245

@@ -7357,14 +7261,10 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
73577261

73587262
GenericSignature sig = substitutions.getGenericSignature();
73597263

7360-
SmallVector<InverseRequirement, 2> inverses;
7361-
reconstituteInverses(sig, sig.getGenericParams(), inverses);
7362-
73637264
sub->Printer << "@substituted ";
7364-
sub->printGenericSignature(sig, inverses,
7265+
sub->printGenericSignature(sig,
73657266
PrintAST::PrintParams |
7366-
PrintAST::PrintRequirements |
7367-
PrintAST::CollapseDefaultReqs);
7267+
PrintAST::PrintRequirements);
73687268
sub->Printer << " ";
73697269
}
73707270

@@ -7474,7 +7374,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
74747374
// printer, but only the sub-Printer.
74757375
[&sub, T]{
74767376
if (auto sig = T->getLayout()->getGenericSignature()) {
7477-
sub.printGenericSignature(sig, /*inverses=*/{},
7377+
sub.printGenericSignature(sig,
74787378
PrintAST::PrintParams | PrintAST::PrintRequirements);
74797379
sub.Printer << " ";
74807380
}
@@ -8029,10 +7929,9 @@ void GenericSignature::print(ASTPrinter &Printer,
80297929
Printer << "<null>";
80307930
return;
80317931
}
8032-
PrintAST(Printer, Opts).printGenericSignature(*this,
8033-
/*inverses=*/{},
8034-
PrintAST::PrintParams |
8035-
PrintAST::PrintRequirements);
7932+
7933+
PrintAST(Printer, Opts).printGenericSignature(
7934+
*this, PrintAST::PrintParams | PrintAST::PrintRequirements);
80367935
}
80377936

80387937
void Requirement::print(raw_ostream &os, const PrintOptions &opts) const {
@@ -8230,7 +8129,7 @@ void ProtocolConformance::printName(llvm::raw_ostream &os,
82308129
StreamPrinter sPrinter(os);
82318130
TypePrinter typePrinter(sPrinter, PO);
82328131
typePrinter
8233-
.printGenericSignature(genericSig, /*inverses=*/{},
8132+
.printGenericSignature(genericSig,
82348133
PrintAST::PrintParams |
82358134
PrintAST::PrintRequirements);
82368135
os << ' ';

0 commit comments

Comments
 (0)