Skip to content

Commit 45f31b4

Browse files
committed
AST: Refactor ASTPrinter to use getRequirementsWithInverses()
1 parent 6ed553d commit 45f31b4

File tree

4 files changed

+64
-132
lines changed

4 files changed

+64
-132
lines changed

include/swift/AST/PrintOptions.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,11 @@ struct PrintOptions {
329329
/// Whether to print generic requirements in a where clause.
330330
bool PrintGenericRequirements = true;
331331

332+
/// Whether to print generic signatures with inverse requirements (ie,
333+
/// ~Copyable noting the absence of Copyable) or the internal desugared form
334+
/// (where the implicit Copyable conformance is spelled explicitly).
335+
bool PrintInverseRequirements = false;
336+
332337
/// Whether to print the internal layout name instead of AnyObject, etc.
333338
bool PrintInternalLayoutName = false;
334339

lib/AST/ASTPrinter.cpp

Lines changed: 52 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -943,7 +943,7 @@ class PrintAST : public ASTVisitor<PrintAST> {
943943
InnermostOnly = 4,
944944
SwapSelfAndDependentMemberType = 8,
945945
PrintInherited = 16,
946-
CollapseDefaultReqs = 32,
946+
PrintInverseRequirements = 32,
947947
};
948948

949949
void printInheritedFromRequirementSignature(ProtocolDecl *proto,
@@ -953,11 +953,9 @@ class PrintAST : public ASTVisitor<PrintAST> {
953953
void printInherited(const Decl *decl);
954954

955955
void printGenericSignature(GenericSignature genericSig,
956-
ArrayRef<InverseRequirement> inverses,
957956
unsigned flags);
958957
void
959958
printGenericSignature(GenericSignature genericSig,
960-
ArrayRef<InverseRequirement> inverses,
961959
unsigned flags,
962960
llvm::function_ref<bool(const Requirement &)> filter);
963961
void printSingleDepthOfGenericSignature(
@@ -1457,44 +1455,6 @@ static unsigned getDepthOfType(Type ty) {
14571455
return depth;
14581456
}
14591457

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-
14981458
namespace {
14991459
struct RequirementPrintLocation {
15001460
/// The Decl where the requirement should be attached (whether inherited or in
@@ -1615,13 +1575,9 @@ void PrintAST::printInheritedFromRequirementSignature(ProtocolDecl *proto,
16151575
else
16161576
llvm_unreachable("nonexhaustive");
16171577

1618-
SmallVector<InverseRequirement, 2> inverses;
1619-
reconstituteInverses(proto->getGenericSignature(), attachedGP, inverses);
1620-
16211578
printGenericSignature(
16221579
proto->getRequirementSignatureAsGenericSignature(),
1623-
inverses,
1624-
PrintInherited | CollapseDefaultReqs,
1580+
PrintInherited,
16251581
[&](const Requirement &req) {
16261582
// Skip the inferred 'Self : AnyObject' constraint if this is an
16271583
// @objc protocol.
@@ -1640,12 +1596,11 @@ void PrintAST::printInheritedFromRequirementSignature(ProtocolDecl *proto,
16401596

16411597
void PrintAST::printWhereClauseFromRequirementSignature(ProtocolDecl *proto,
16421598
TypeDecl *attachingTo) {
1643-
unsigned flags = PrintRequirements | CollapseDefaultReqs;
1599+
unsigned flags = PrintRequirements;
16441600
if (isa<AssociatedTypeDecl>(attachingTo))
16451601
flags |= SwapSelfAndDependentMemberType;
16461602
printGenericSignature(
16471603
proto->getRequirementSignatureAsGenericSignature(),
1648-
{}, // NOTE: a protocol's inverses are only printed in inheritance clause!
16491604
flags,
16501605
[&](const Requirement &req) {
16511606
auto location = bestRequirementPrintLocation(proto, req);
@@ -1681,31 +1636,27 @@ static unsigned getDepthOfRequirement(const Requirement &req) {
16811636
llvm_unreachable("bad RequirementKind");
16821637
}
16831638

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-
16951639
void PrintAST::printGenericSignature(GenericSignature genericSig,
1696-
ArrayRef<InverseRequirement> inverses,
16971640
unsigned flags) {
1698-
printGenericSignature(genericSig, inverses, flags,
1641+
printGenericSignature(genericSig, flags,
16991642
// print everything
17001643
[&](const Requirement &) { return true; });
17011644
}
17021645

17031646
void PrintAST::printGenericSignature(
17041647
GenericSignature genericSig,
1705-
ArrayRef<InverseRequirement> inverses,
17061648
unsigned flags,
17071649
llvm::function_ref<bool(const Requirement &)> filter) {
1708-
auto requirements = genericSig.getRequirements();
1650+
1651+
SmallVector<Requirement, 2> requirements;
1652+
SmallVector<InverseRequirement, 2> inverses;
1653+
1654+
if (flags & PrintInverseRequirements) {
1655+
genericSig->getRequirementsWithInverses(requirements, inverses);
1656+
} else {
1657+
requirements.append(genericSig.getRequirements().begin(),
1658+
genericSig.getRequirements().end());
1659+
}
17091660

17101661
if (flags & InnermostOnly) {
17111662
auto genericParams = genericSig.getInnermostGenericParams();
@@ -1741,34 +1692,27 @@ void PrintAST::printGenericSignature(
17411692
genericParams.slice(paramIdx, lastParamIdx - paramIdx);
17421693

17431694
SmallVector<InverseRequirement, 2> inversesAtDepth;
1744-
if (flags & CollapseDefaultReqs)
1745-
reconstituteInverses(genericSig, genericParamsAtDepth, inversesAtDepth);
1695+
for (auto inverseReq : inverses) {
1696+
if (inverseReq.subject->castTo<GenericTypeParamType>()->getDepth() == depth)
1697+
inversesAtDepth.push_back(inverseReq);
1698+
}
17461699

17471700
SmallVector<Requirement, 2> requirementsAtDepth;
1748-
getRequirementsAtDepth(genericSig, depth, requirementsAtDepth);
1701+
for (auto reqt : requirements) {
1702+
unsigned currentDepth = getDepthOfRequirement(reqt);
1703+
assert(currentDepth != ErrorDepth);
1704+
if (currentDepth == depth)
1705+
requirementsAtDepth.push_back(reqt);
1706+
}
17491707

17501708
printSingleDepthOfGenericSignature(
1751-
genericParamsAtDepth,
1752-
requirementsAtDepth, inversesAtDepth, flags, filter);
1709+
genericParamsAtDepth, requirementsAtDepth, inversesAtDepth,
1710+
flags, filter);
17531711

17541712
paramIdx = lastParamIdx;
17551713
}
17561714
}
17571715

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-
17721716
void PrintAST::printSingleDepthOfGenericSignature(
17731717
ArrayRef<GenericTypeParamType *> genericParams,
17741718
ArrayRef<Requirement> requirements,
@@ -1792,7 +1736,6 @@ void PrintAST::printSingleDepthOfGenericSignature(
17921736
bool printInherited = (flags & PrintInherited);
17931737
bool swapSelfAndDependentMemberType =
17941738
(flags & SwapSelfAndDependentMemberType);
1795-
const bool collapseDefaults = (flags & CollapseDefaultReqs);
17961739

17971740
unsigned typeContextDepth = 0;
17981741
SubstitutionMap subMap;
@@ -1884,17 +1827,10 @@ void PrintAST::printSingleDepthOfGenericSignature(
18841827
}
18851828

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

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

19001836
if (dependsOnOpaque(first))
@@ -2678,7 +2614,7 @@ void PrintAST::printGenericDeclGenericParams(GenericContext *decl) {
26782614
if (decl->isGeneric())
26792615
if (auto GenericSig = decl->getGenericSignature()) {
26802616
Printer.printStructurePre(PrintStructureKind::DeclGenericParameterClause);
2681-
printGenericSignature(GenericSig, {}, PrintParams | InnermostOnly);
2617+
printGenericSignature(GenericSig, PrintParams | InnermostOnly);
26822618
Printer.printStructurePost(PrintStructureKind::DeclGenericParameterClause);
26832619
}
26842620
}
@@ -2697,13 +2633,9 @@ void PrintAST::printDeclGenericRequirements(GenericContext *decl) {
26972633
SmallVector<Type, 2> genericParams;
26982634
InverseRequirement::enumerateDefaultedParams(decl, genericParams);
26992635

2700-
SmallVector<InverseRequirement, 2> inverses;
2701-
reconstituteInverses(genericSig, genericParams, inverses);
2702-
27032636
Printer.printStructurePre(PrintStructureKind::DeclGenericParameterClause);
27042637
printGenericSignature(genericSig,
2705-
inverses,
2706-
PrintRequirements | CollapseDefaultReqs,
2638+
PrintRequirements | PrintInverseRequirements,
27072639
[parentSig](const Requirement &req) {
27082640
if (parentSig)
27092641
return !parentSig->isRequirementSatisfied(req);
@@ -2961,12 +2893,8 @@ void PrintAST::printExtension(ExtensionDecl *decl) {
29612893
auto baseGenericSig = decl->getExtendedNominal()->getGenericSignature();
29622894
assert(baseGenericSig &&
29632895
"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.
29672896
printGenericSignature(genericSig,
2968-
{},
2969-
PrintRequirements,
2897+
PrintRequirements | PrintInverseRequirements,
29702898
[baseGenericSig](const Requirement &req) -> bool {
29712899
// Only include constraints that are not satisfied by the base type.
29722900
return !baseGenericSig->isRequirementSatisfied(req);
@@ -7216,12 +7144,8 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
72167144
Printer.printStructurePost(PrintStructureKind::FunctionReturnType);
72177145
}
72187146

7219-
void printGenericSignature(GenericSignature genericSig,
7220-
ArrayRef<InverseRequirement> inverses,
7221-
unsigned flags) {
7222-
PrintAST(Printer, Options).printGenericSignature(genericSig,
7223-
inverses,
7224-
flags);
7147+
void printGenericSignature(GenericSignature genericSig, unsigned flags) {
7148+
PrintAST(Printer, Options).printGenericSignature(genericSig, flags);
72257149
}
72267150

72277151
void printSubstitutions(SubstitutionMap subs) {
@@ -7241,17 +7165,11 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
72417165
Printer.printStructurePost(PrintStructureKind::FunctionType);
72427166
};
72437167

7244-
SmallVector<InverseRequirement, 2> inverses;
7245-
reconstituteInverses(T->getGenericSignature(),
7246-
T->getGenericParams(),
7247-
inverses);
7248-
72497168
printFunctionExtInfo(T);
72507169
printGenericSignature(T->getGenericSignature(),
7251-
inverses,
72527170
PrintAST::PrintParams |
72537171
PrintAST::PrintRequirements |
7254-
PrintAST::CollapseDefaultReqs);
7172+
PrintAST::PrintInverseRequirements);
72557173
Printer << " ";
72567174

72577175
visitAnyFunctionTypeParams(T->getParams(), /*printLabels*/true);
@@ -7327,11 +7245,11 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
73277245
printFunctionExtInfo(T);
73287246
printCalleeConvention(T->getCalleeConvention());
73297247

7330-
if (auto sig = T->getInvocationGenericSignature()) {
7248+
if (GenericSignature sig = T->getInvocationGenericSignature()) {
73317249
printGenericSignature(sig,
7332-
/*inverses=*/{},
73337250
PrintAST::PrintParams |
7334-
PrintAST::PrintRequirements);
7251+
PrintAST::PrintRequirements |
7252+
PrintAST::PrintInverseRequirements);
73357253
Printer << " ";
73367254
}
73377255

@@ -7351,11 +7269,13 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
73517269
subBuffer.emplace(Printer, subOptions);
73527270
sub = &*subBuffer;
73537271

7272+
GenericSignature sig = substitutions.getGenericSignature();
7273+
73547274
sub->Printer << "@substituted ";
7355-
sub->printGenericSignature(substitutions.getGenericSignature(),
7356-
/*inverses=*/{},
7275+
sub->printGenericSignature(sig,
73577276
PrintAST::PrintParams |
7358-
PrintAST::PrintRequirements);
7277+
PrintAST::PrintRequirements |
7278+
PrintAST::PrintInverseRequirements);
73597279
sub->Printer << " ";
73607280
}
73617281

@@ -7465,8 +7385,10 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
74657385
// printer, but only the sub-Printer.
74667386
[&sub, T]{
74677387
if (auto sig = T->getLayout()->getGenericSignature()) {
7468-
sub.printGenericSignature(sig, /*inverses=*/{},
7469-
PrintAST::PrintParams | PrintAST::PrintRequirements);
7388+
sub.printGenericSignature(sig,
7389+
PrintAST::PrintParams |
7390+
PrintAST::PrintRequirements |
7391+
PrintAST::PrintInverseRequirements);
74707392
sub.Printer << " ";
74717393
}
74727394
sub.Printer << "{";
@@ -8020,10 +7942,11 @@ void GenericSignature::print(ASTPrinter &Printer,
80207942
Printer << "<null>";
80217943
return;
80227944
}
8023-
PrintAST(Printer, Opts).printGenericSignature(*this,
8024-
/*inverses=*/{},
8025-
PrintAST::PrintParams |
8026-
PrintAST::PrintRequirements);
7945+
7946+
auto flags = PrintAST::PrintParams | PrintAST::PrintRequirements;
7947+
if (Opts.PrintInverseRequirements)
7948+
flags |= PrintAST::PrintInverseRequirements;
7949+
PrintAST(Printer, Opts).printGenericSignature(*this, flags);
80277950
}
80287951

80297952
void Requirement::print(raw_ostream &os, const PrintOptions &opts) const {
@@ -8221,9 +8144,10 @@ void ProtocolConformance::printName(llvm::raw_ostream &os,
82218144
StreamPrinter sPrinter(os);
82228145
TypePrinter typePrinter(sPrinter, PO);
82238146
typePrinter
8224-
.printGenericSignature(genericSig, /*inverses=*/{},
8147+
.printGenericSignature(genericSig,
82258148
PrintAST::PrintParams |
8226-
PrintAST::PrintRequirements);
8149+
PrintAST::PrintRequirements |
8150+
PrintAST::PrintInverseRequirements);
82278151
os << ' ';
82288152
}
82298153
}

lib/SIL/IR/SILPrinter.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2845,7 +2845,9 @@ class SILPrinter : public SILInstructionVisitor<SILPrinter> {
28452845
auto pattern = KPI->getPattern();
28462846

28472847
if (pattern->getGenericSignature()) {
2848-
pattern->getGenericSignature()->print(PrintState.OS);
2848+
PrintOptions Opts;
2849+
Opts.PrintInverseRequirements = true;
2850+
pattern->getGenericSignature()->print(PrintState.OS, Opts);
28492851
*this << ' ';
28502852
}
28512853

@@ -3777,7 +3779,6 @@ static void printFileIDMap(SILPrintContext &Ctx, const FileIDMap map) {
37773779
}
37783780

37793781
void SILProperty::print(SILPrintContext &Ctx) const {
3780-
PrintOptions Options = PrintOptions::printSIL(&Ctx);
37813782

37823783
auto &OS = Ctx.OS();
37833784
OS << "sil_property ";
@@ -3788,6 +3789,8 @@ void SILProperty::print(SILPrintContext &Ctx) const {
37883789
printValueDecl(getDecl(), OS);
37893790
if (auto sig = getDecl()->getInnermostDeclContext()
37903791
->getGenericSignatureOfContext()) {
3792+
PrintOptions Options = PrintOptions::printSIL(&Ctx);
3793+
Options.PrintInverseRequirements = true;
37913794
sig.getCanonicalSignature()->print(OS, Options);
37923795
}
37933796
OS << " (";

0 commit comments

Comments
 (0)