Skip to content

Commit 17cde53

Browse files
committed
[gardening] ASTPrinter: encapsulate archetype-transformation related stuff into a sub-structure. NFC
1 parent 31e01a5 commit 17cde53

File tree

2 files changed

+89
-37
lines changed

2 files changed

+89
-37
lines changed

include/swift/AST/PrintOptions.h

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,28 @@ class Type;
2727
enum DeclAttrKind : unsigned;
2828
class PrinterArchetypeTransformer;
2929

30+
/// Necessary information for archetype transformation during printing.
31+
struct ArchetypeTransformContext {
32+
Type getTypeBase();
33+
NominalTypeDecl *getNominal();
34+
PrinterArchetypeTransformer *getTransformer() { return Transformer.get(); }
35+
bool isPrintingSynthesizedExtension();
36+
bool isPrintingTypeInteface();
37+
ArchetypeTransformContext(PrinterArchetypeTransformer *Transformer);
38+
ArchetypeTransformContext(PrinterArchetypeTransformer *Transformer,
39+
Type T);
40+
ArchetypeTransformContext(PrinterArchetypeTransformer *Transformer,
41+
NominalTypeDecl *NTD);
42+
Type transform(Type Input);
43+
StringRef transform(StringRef Input);
44+
private:
45+
std::shared_ptr<PrinterArchetypeTransformer> Transformer;
46+
47+
// When printing a type interface, this is the type to print.
48+
// When synthesizing extensions, this is the target nominal.
49+
llvm::PointerUnion<TypeBase*, NominalTypeDecl*> TypeBaseOrNominal;
50+
};
51+
3052
/// Options for printing AST nodes.
3153
///
3254
/// A default-constructed PrintOptions is suitable for printing to users;
@@ -201,12 +223,8 @@ struct PrintOptions {
201223
/// \brief Print types with alternative names from their canonical names.
202224
llvm::DenseMap<CanType, Identifier> *AlternativeTypeNames = nullptr;
203225

204-
/// \brief When printing a type interface, register the type to print.
205-
TypeBase *TypeToPrint = nullptr;
206-
207-
std::shared_ptr<PrinterArchetypeTransformer> pTransformer;
208-
209-
NominalTypeDecl *SynthesizedTarget = nullptr;
226+
/// \brief The information for converting archetypes to specialized types.
227+
std::shared_ptr<ArchetypeTransformContext> TransformContext;
210228

211229
/// Retrieve the set of options for verbose printing to users.
212230
static PrintOptions printVerbose() {
@@ -257,8 +275,6 @@ struct PrintOptions {
257275

258276
void initArchetypeTransformerForSynthesizedExtensions(NominalTypeDecl *D);
259277

260-
bool isPrintingSynthesizedExtension();
261-
262278
void clearArchetypeTransformerForSynthesizedExtensions();
263279

264280
/// Retrieve the print options that are suitable to print the testable interface.

lib/AST/ASTPrinter.cpp

Lines changed: 65 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -199,31 +199,62 @@ class ArchetypeSelfTransformer : public PrinterArchetypeTransformer {
199199

200200
PrintOptions PrintOptions::printTypeInterface(Type T, const DeclContext *DC) {
201201
PrintOptions result = printInterface();
202-
result.setArchetypeTransform(T, DC);
203-
result.TypeToPrint = T.getPointer();
202+
result.TransformContext = std::make_shared<ArchetypeTransformContext>(
203+
new PrinterArchetypeNameTransformer(T, DC), T);
204204
return result;
205205
}
206206

207207
void PrintOptions::setArchetypeTransform(Type T, const DeclContext *DC) {
208-
pTransformer = std::make_shared<PrinterArchetypeNameTransformer>(T, DC);
208+
TransformContext = std::make_shared<ArchetypeTransformContext>(
209+
new PrinterArchetypeNameTransformer(T, DC));
209210
}
210211

211212
void PrintOptions::setArchetypeTransformForQuickHelp(Type T, DeclContext *DC) {
212-
pTransformer = std::make_shared<ArchetypeSelfTransformer>(T, *DC);
213+
TransformContext = std::make_shared<ArchetypeTransformContext>(
214+
new ArchetypeSelfTransformer(T, *DC));
213215
}
214216

215217
void PrintOptions::initArchetypeTransformerForSynthesizedExtensions(NominalTypeDecl *D) {
216-
pTransformer = std::make_shared<ArchetypeSelfTransformer>(D);
217-
SynthesizedTarget = D;
218+
TransformContext = std::make_shared<ArchetypeTransformContext>(
219+
new ArchetypeSelfTransformer(D), D);
218220
}
219221

220-
bool PrintOptions::isPrintingSynthesizedExtension() {
221-
return pTransformer && SynthesizedTarget;
222+
void PrintOptions::clearArchetypeTransformerForSynthesizedExtensions() {
223+
TransformContext.reset();
222224
}
223225

224-
void PrintOptions::clearArchetypeTransformerForSynthesizedExtensions() {
225-
pTransformer = nullptr;
226-
SynthesizedTarget = nullptr;
226+
ArchetypeTransformContext::ArchetypeTransformContext(
227+
PrinterArchetypeTransformer *Transformer): Transformer(Transformer){};
228+
229+
ArchetypeTransformContext::ArchetypeTransformContext(
230+
PrinterArchetypeTransformer *Transformer, Type T):
231+
Transformer(Transformer), TypeBaseOrNominal(T.getPointer()) {};
232+
233+
ArchetypeTransformContext::ArchetypeTransformContext(
234+
PrinterArchetypeTransformer *Transformer, NominalTypeDecl *NTD) :
235+
Transformer(Transformer), TypeBaseOrNominal(NTD){};
236+
237+
NominalTypeDecl *ArchetypeTransformContext::getNominal() {
238+
return TypeBaseOrNominal.get<NominalTypeDecl*>();
239+
}
240+
241+
Type ArchetypeTransformContext::getTypeBase() {
242+
return TypeBaseOrNominal.get<TypeBase*>();
243+
}
244+
245+
bool ArchetypeTransformContext::isPrintingSynthesizedExtension() {
246+
return !TypeBaseOrNominal.isNull() && TypeBaseOrNominal.is<NominalTypeDecl*>();
247+
}
248+
bool ArchetypeTransformContext::isPrintingTypeInteface() {
249+
return !TypeBaseOrNominal.isNull() && TypeBaseOrNominal.is<TypeBase*>();
250+
}
251+
252+
Type ArchetypeTransformContext::transform(Type Input) {
253+
return Transformer->transform(Input);
254+
}
255+
256+
StringRef ArchetypeTransformContext::transform(StringRef Input) {
257+
return Transformer->transform(Input);
227258
}
228259

229260
std::string ASTPrinter::sanitizeUtf8(StringRef Text) {
@@ -557,8 +588,8 @@ class PrintAST : public ASTVisitor<PrintAST> {
557588
}
558589

559590
void printTypeLoc(const TypeLoc &TL) {
560-
if (Options.pTransformer && TL.getType()) {
561-
if (auto RT = Options.pTransformer->transform(TL.getType())) {
591+
if (Options.TransformContext && TL.getType()) {
592+
if (auto RT = Options.TransformContext->transform(TL.getType())) {
562593
PrintOptions FreshOptions;
563594
RT.print(Printer, FreshOptions);
564595
return;
@@ -643,16 +674,17 @@ class PrintAST : public ASTVisitor<PrintAST> {
643674
if (!shouldPrint(D, true))
644675
return false;
645676

646-
bool Synthesize = Options.isPrintingSynthesizedExtension() &&
677+
bool Synthesize = Options.TransformContext &&
678+
Options.TransformContext->isPrintingSynthesizedExtension() &&
647679
D->getKind() == DeclKind::Extension;
648680
if (Synthesize)
649-
Printer.setSynthesizedTarget(Options.SynthesizedTarget);
681+
Printer.setSynthesizedTarget(Options.TransformContext->getNominal());
650682
Printer.callPrintDeclPre(D);
651683
ASTVisitor::visit(D);
652684
if (Synthesize) {
653685
Printer.setSynthesizedTarget(nullptr);
654686
Printer.printSynthesizedExtensionPost(cast<ExtensionDecl>(D),
655-
Options.SynthesizedTarget);
687+
Options.TransformContext->getNominal());
656688
} else {
657689
Printer.printDeclPost(D);
658690
}
@@ -798,8 +830,10 @@ void PrintAST::printGenericParams(GenericParamList *Params) {
798830
Printer << "<";
799831
bool IsFirst = true;
800832
SmallVector<Type, 4> Scrach;
801-
if (Options.TypeToPrint) {
802-
auto ArgArr = Options.TypeToPrint->getAllGenericArgs(Scrach);
833+
if (Options.TransformContext &&
834+
Options.TransformContext->isPrintingTypeInteface()) {
835+
auto ArgArr = Options.TransformContext->getTypeBase()->
836+
getAllGenericArgs(Scrach);
803837
for (auto Arg : ArgArr) {
804838
if (IsFirst) {
805839
IsFirst = false;
@@ -841,9 +875,9 @@ void PrintAST::printWhereClause(ArrayRef<RequirementRepr> requirements) {
841875
auto FirstType = std::get<0>(Tuple);
842876
auto SecondType = std::get<1>(Tuple);
843877
auto Kind = std::get<2>(Tuple);
844-
if (Options.pTransformer) {
845-
FirstType = Options.pTransformer->transform(FirstType);
846-
SecondType = Options.pTransformer->transform(SecondType);
878+
if (Options.TransformContext) {
879+
FirstType = Options.TransformContext->transform(FirstType);
880+
SecondType = Options.TransformContext->transform(SecondType);
847881
}
848882
if (FirstType == SecondType)
849883
continue;
@@ -913,8 +947,8 @@ bool PrintAST::shouldPrintPattern(const Pattern *P) {
913947
void PrintAST::printPatternType(const Pattern *P) {
914948
if (P->hasType()) {
915949
Type T = P->getType();
916-
if (Options.pTransformer) {
917-
T = Options.pTransformer->transform(T);
950+
if (Options.TransformContext) {
951+
T = Options.TransformContext->transform(T);
918952
}
919953
Printer << ": ";
920954
T.print(Printer, Options);
@@ -1493,8 +1527,9 @@ void PrintAST::printExtension(ExtensionDecl* decl) {
14931527
}
14941528

14951529
void PrintAST::visitExtensionDecl(ExtensionDecl *decl) {
1496-
if (Options.SynthesizedTarget && Options.pTransformer)
1497-
printSynthesizedExtension(Options.SynthesizedTarget, decl);
1530+
if (Options.TransformContext &&
1531+
Options.TransformContext->isPrintingSynthesizedExtension())
1532+
printSynthesizedExtension(Options.TransformContext->getNominal(), decl);
14981533
else
14991534
printExtension(decl);
15001535
}
@@ -1758,8 +1793,9 @@ void PrintAST::visitVarDecl(VarDecl *decl) {
17581793
});
17591794
if (decl->hasType()) {
17601795
Printer << ": ";
1761-
if (Options.pTransformer)
1762-
Options.pTransformer->transform(decl->getType()).print(Printer, Options);
1796+
if (Options.TransformContext)
1797+
Options.TransformContext->transform(decl->getType()).
1798+
print(Printer, Options);
17631799
else
17641800
decl->getType().print(Printer, Options);
17651801
}
@@ -2054,8 +2090,8 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) {
20542090
Type ResultTy = decl->getResultType();
20552091
if (ResultTy && !ResultTy->isEqual(TupleType::getEmpty(Context))) {
20562092
Printer << " -> ";
2057-
if (Options.pTransformer) {
2058-
ResultTy = Options.pTransformer->transform(ResultTy);
2093+
if (Options.TransformContext) {
2094+
ResultTy = Options.TransformContext->transform(ResultTy);
20592095
PrintOptions FreshOptions;
20602096
ResultTy->print(Printer, FreshOptions);
20612097
} else

0 commit comments

Comments
 (0)