@@ -167,27 +167,29 @@ static StringRef toString(ValueWitnessKind k) {
167
167
printer_unreachable (" bad value witness kind" );
168
168
}
169
169
170
+ template <typename T>
171
+ auto operator <<(const std::unique_ptr<DemanglerPrinter> &printer,
172
+ const T &n) -> decltype ((*printer) << n) {
173
+ return (*printer) << n;
174
+ }
175
+
170
176
class NodePrinter {
171
177
private:
172
- std::unique_ptr<DemanglerPrinter> PrinterStorage;
173
- DemanglerPrinter &Printer;
178
+ std::unique_ptr<DemanglerPrinter> Printer;
174
179
DemangleOptions Options;
175
180
bool SpecializationPrefixPrinted = false ;
176
181
bool isValid = true ;
177
182
178
183
public:
179
- NodePrinter (DemangleOptions options, DemanglerPrinter *printer = nullptr )
180
- : PrinterStorage(),
181
- Printer (printer
182
- ? *printer
183
- : *(PrinterStorage = std::make_unique<DemanglerPrinter>())),
184
+ NodePrinter (DemangleOptions options, std::unique_ptr<DemanglerPrinter> printer = nullptr )
185
+ : Printer(printer ? std::move(printer) : std::make_unique<DemanglerPrinter>()),
184
186
Options (options) {}
185
187
186
188
std::string printRoot (NodePointer root) {
187
189
isValid = true ;
188
190
print (root, 0 );
189
191
if (isValid)
190
- return std::move (Printer).str ();
192
+ return std::move (* Printer).str ();
191
193
return " " ;
192
194
}
193
195
@@ -808,7 +810,7 @@ class NodePrinter {
808
810
return ;
809
811
}
810
812
811
- Printer. startParameters (depth);
813
+ Printer-> startParameters (depth);
812
814
NodePointer Parameters = ParameterType->getFirstChild ();
813
815
assert (Parameters->getKind () == Node::Kind::Type);
814
816
Parameters = Parameters->getFirstChild ();
@@ -821,7 +823,7 @@ class NodePrinter {
821
823
} else {
822
824
Printer << " (_:)" ;
823
825
}
824
- Printer. endParameters (depth);
826
+ Printer-> endParameters (depth);
825
827
return ;
826
828
}
827
829
@@ -861,7 +863,7 @@ class NodePrinter {
861
863
},
862
864
[&]() { Printer << (showTypes ? " , " : " " ); });
863
865
Printer << ' )' ;
864
- Printer. endParameters (depth);
866
+ Printer-> endParameters (depth);
865
867
}
866
868
867
869
void printFunctionType (NodePointer LabelList, NodePointer node,
@@ -2414,11 +2416,11 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
2414
2416
return nullptr ;
2415
2417
case Node::Kind::TypeSymbolicReference:
2416
2418
Printer << " type symbolic reference 0x" ;
2417
- Printer. writeHex (Node->getIndex ());
2419
+ Printer-> writeHex (Node->getIndex ());
2418
2420
return nullptr ;
2419
2421
case Node::Kind::OpaqueTypeDescriptorSymbolicReference:
2420
2422
Printer << " opaque type symbolic reference 0x" ;
2421
- Printer. writeHex (Node->getIndex ());
2423
+ Printer-> writeHex (Node->getIndex ());
2422
2424
return nullptr ;
2423
2425
case Node::Kind::DistributedThunk:
2424
2426
if (!Options.ShortenThunk ) {
@@ -2460,7 +2462,7 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
2460
2462
return nullptr ;
2461
2463
case Node::Kind::ProtocolSymbolicReference:
2462
2464
Printer << " protocol symbolic reference 0x" ;
2463
- Printer. writeHex (Node->getIndex ());
2465
+ Printer-> writeHex (Node->getIndex ());
2464
2466
return nullptr ;
2465
2467
case Node::Kind::GenericTypeMetadataPattern:
2466
2468
Printer << " generic type metadata pattern for " ;
@@ -3472,15 +3474,15 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
3472
3474
}
3473
3475
case Node::Kind::UniqueExtendedExistentialTypeShapeSymbolicReference:
3474
3476
Printer << " unique existential shape symbolic reference 0x" ;
3475
- Printer. writeHex (Node->getIndex ());
3477
+ Printer-> writeHex (Node->getIndex ());
3476
3478
return nullptr ;
3477
3479
case Node::Kind::NonUniqueExtendedExistentialTypeShapeSymbolicReference:
3478
3480
Printer << " non-unique existential shape symbolic reference 0x" ;
3479
- Printer. writeHex (Node->getIndex ());
3481
+ Printer-> writeHex (Node->getIndex ());
3480
3482
return nullptr ;
3481
3483
case Node::Kind::ObjectiveCProtocolSymbolicReference:
3482
3484
Printer << " objective-c protocol symbolic reference 0x" ;
3483
- Printer. writeHex (Node->getIndex ());
3485
+ Printer-> writeHex (Node->getIndex ());
3484
3486
return nullptr ;
3485
3487
case Node::Kind::SymbolicExtendedExistentialType: {
3486
3488
auto shape = Node->getChild (0 );
@@ -3490,7 +3492,7 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
3490
3492
Printer << " symbolic existential type ("
3491
3493
<< (isUnique ? " " : " non-" )
3492
3494
<< " unique) 0x" ;
3493
- Printer. writeHex (shape->getIndex ());
3495
+ Printer-> writeHex (shape->getIndex ());
3494
3496
Printer << " <" ;
3495
3497
print (Node->getChild (1 ), depth + 1 );
3496
3498
if (Node->getNumChildren () > 2 ) {
@@ -3577,16 +3579,16 @@ NodePointer NodePrinter::printEntity(NodePointer Entity, unsigned depth,
3577
3579
// later in suffix form.
3578
3580
PostfixContext = Context;
3579
3581
} else {
3580
- size_t CurrentPos = Printer. getStringRef ().size ();
3582
+ size_t CurrentPos = Printer-> getStringRef ().size ();
3581
3583
PostfixContext = print (Context, depth + 1 , /* asPrefixContext*/ true );
3582
3584
3583
3585
// Was the context printed as prefix?
3584
- if (Printer. getStringRef ().size () != CurrentPos)
3586
+ if (Printer-> getStringRef ().size () != CurrentPos)
3585
3587
Printer << ' .' ;
3586
3588
}
3587
3589
}
3588
3590
if (Entity->shouldTrackNameRange ()) {
3589
- Printer. startName ();
3591
+ Printer-> startName ();
3590
3592
}
3591
3593
if (hasName || !OverwriteName.empty ()) {
3592
3594
if (!ExtraName.empty () && MultiWordName) {
@@ -3598,7 +3600,7 @@ NodePointer NodePrinter::printEntity(NodePointer Entity, unsigned depth,
3598
3600
ExtraName = " " ;
3599
3601
ExtraIndex = -1 ;
3600
3602
}
3601
- size_t CurrentPos = Printer. getStringRef ().size ();
3603
+ size_t CurrentPos = Printer-> getStringRef ().size ();
3602
3604
if (!OverwriteName.empty ()) {
3603
3605
Printer << OverwriteName;
3604
3606
} else {
@@ -3609,7 +3611,7 @@ NodePointer NodePrinter::printEntity(NodePointer Entity, unsigned depth,
3609
3611
if (auto PrivateName = getChildIf (Entity, Node::Kind::PrivateDeclName))
3610
3612
print (PrivateName, depth + 1 );
3611
3613
}
3612
- if (Printer. getStringRef ().size () != CurrentPos && !ExtraName.empty ())
3614
+ if (Printer-> getStringRef ().size () != CurrentPos && !ExtraName.empty ())
3613
3615
Printer << ' .' ;
3614
3616
}
3615
3617
if (!ExtraName.empty ()) {
@@ -3618,7 +3620,7 @@ NodePointer NodePrinter::printEntity(NodePointer Entity, unsigned depth,
3618
3620
Printer << ExtraIndex;
3619
3621
}
3620
3622
if (Entity->shouldTrackNameRange ()) {
3621
- Printer. endName ();
3623
+ Printer-> endName ();
3622
3624
}
3623
3625
if (TypePr != TypePrinting::NoType) {
3624
3626
NodePointer type = getChildIf (Entity, Node::Kind::Type);
@@ -3851,11 +3853,11 @@ std::string Demangle::keyPathSourceString(const char *MangledName,
3851
3853
3852
3854
std::string Demangle::nodeToString (NodePointer root,
3853
3855
const DemangleOptions &options,
3854
- DemanglerPrinter * printer) {
3856
+ std::unique_ptr< DemanglerPrinter> printer) {
3855
3857
if (!root)
3856
3858
return " " ;
3857
3859
3858
- return NodePrinter (options, printer).printRoot (root);
3860
+ return NodePrinter (options, std::move ( printer) ).printRoot (root);
3859
3861
}
3860
3862
3861
3863
#endif
0 commit comments