Skip to content

Commit 0a5332a

Browse files
committed
ast printer
1 parent e8cbe9f commit 0a5332a

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
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: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -943,6 +943,7 @@ class PrintAST : public ASTVisitor<PrintAST> {
943943
InnermostOnly = 4,
944944
SwapSelfAndDependentMemberType = 8,
945945
PrintInherited = 16,
946+
PrintInverseRequirements = 32,
946947
};
947948

948949
void printInheritedFromRequirementSignature(ProtocolDecl *proto,
@@ -1646,9 +1647,16 @@ void PrintAST::printGenericSignature(
16461647
GenericSignature genericSig,
16471648
unsigned flags,
16481649
llvm::function_ref<bool(const Requirement &)> filter) {
1650+
16491651
SmallVector<Requirement, 2> requirements;
16501652
SmallVector<InverseRequirement, 2> inverses;
1651-
genericSig->getRequirementsWithInverses(requirements, inverses);
1653+
1654+
if (flags & PrintInverseRequirements) {
1655+
genericSig->getRequirementsWithInverses(requirements, inverses);
1656+
} else {
1657+
requirements.append(genericSig.getRequirements().begin(),
1658+
genericSig.getRequirements().end());
1659+
}
16521660

16531661
if (flags & InnermostOnly) {
16541662
auto genericParams = genericSig.getInnermostGenericParams();
@@ -2627,7 +2635,7 @@ void PrintAST::printDeclGenericRequirements(GenericContext *decl) {
26272635

26282636
Printer.printStructurePre(PrintStructureKind::DeclGenericParameterClause);
26292637
printGenericSignature(genericSig,
2630-
PrintRequirements,
2638+
PrintRequirements | PrintInverseRequirements,
26312639
[parentSig](const Requirement &req) {
26322640
if (parentSig)
26332641
return !parentSig->isRequirementSatisfied(req);
@@ -2886,7 +2894,7 @@ void PrintAST::printExtension(ExtensionDecl *decl) {
28862894
assert(baseGenericSig &&
28872895
"an extension can't be generic if the base type isn't");
28882896
printGenericSignature(genericSig,
2889-
PrintRequirements,
2897+
PrintRequirements | PrintInverseRequirements,
28902898
[baseGenericSig](const Requirement &req) -> bool {
28912899
// Only include constraints that are not satisfied by the base type.
28922900
return !baseGenericSig->isRequirementSatisfied(req);
@@ -7160,7 +7168,8 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
71607168
printFunctionExtInfo(T);
71617169
printGenericSignature(T->getGenericSignature(),
71627170
PrintAST::PrintParams |
7163-
PrintAST::PrintRequirements);
7171+
PrintAST::PrintRequirements |
7172+
PrintAST::PrintInverseRequirements);
71647173
Printer << " ";
71657174

71667175
visitAnyFunctionTypeParams(T->getParams(), /*printLabels*/true);
@@ -7239,7 +7248,8 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
72397248
if (GenericSignature sig = T->getInvocationGenericSignature()) {
72407249
printGenericSignature(sig,
72417250
PrintAST::PrintParams |
7242-
PrintAST::PrintRequirements);
7251+
PrintAST::PrintRequirements |
7252+
PrintAST::PrintInverseRequirements);
72437253
Printer << " ";
72447254
}
72457255

@@ -7264,7 +7274,8 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
72647274
sub->Printer << "@substituted ";
72657275
sub->printGenericSignature(sig,
72667276
PrintAST::PrintParams |
7267-
PrintAST::PrintRequirements);
7277+
PrintAST::PrintRequirements |
7278+
PrintAST::PrintInverseRequirements);
72687279
sub->Printer << " ";
72697280
}
72707281

@@ -7375,7 +7386,9 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
73757386
[&sub, T]{
73767387
if (auto sig = T->getLayout()->getGenericSignature()) {
73777388
sub.printGenericSignature(sig,
7378-
PrintAST::PrintParams | PrintAST::PrintRequirements);
7389+
PrintAST::PrintParams |
7390+
PrintAST::PrintRequirements |
7391+
PrintAST::PrintInverseRequirements);
73797392
sub.Printer << " ";
73807393
}
73817394
sub.Printer << "{";
@@ -7930,8 +7943,10 @@ void GenericSignature::print(ASTPrinter &Printer,
79307943
return;
79317944
}
79327945

7933-
PrintAST(Printer, Opts).printGenericSignature(
7934-
*this, PrintAST::PrintParams | PrintAST::PrintRequirements);
7946+
auto flags = PrintAST::PrintParams | PrintAST::PrintRequirements;
7947+
if (Opts.PrintInverseRequirements)
7948+
flags |= PrintAST::PrintInverseRequirements;
7949+
PrintAST(Printer, Opts).printGenericSignature(*this, flags);
79357950
}
79367951

79377952
void Requirement::print(raw_ostream &os, const PrintOptions &opts) const {
@@ -8131,7 +8146,8 @@ void ProtocolConformance::printName(llvm::raw_ostream &os,
81318146
typePrinter
81328147
.printGenericSignature(genericSig,
81338148
PrintAST::PrintParams |
8134-
PrintAST::PrintRequirements);
8149+
PrintAST::PrintRequirements |
8150+
PrintAST::PrintInverseRequirements);
81358151
os << ' ';
81368152
}
81378153
}

0 commit comments

Comments
 (0)