@@ -316,6 +316,48 @@ _buildDemanglingForNominalType(const Metadata *type, Demangle::Demangler &Dem) {
316
316
return _buildDemanglingForContext (description, demangledGenerics, Dem);
317
317
}
318
318
319
+ static Demangle::NodePointer
320
+ _buildDemanglingForProtocolDescriptor (ProtocolDescriptorRef protocol,
321
+ Demangle::Demangler &Dem) {
322
+ #if SWIFT_OBJC_INTEROP
323
+ if (protocol.isObjC ()) {
324
+ // The protocol name is mangled as a type symbol, with the _Tt prefix.
325
+ StringRef ProtoName (protocol.getName ());
326
+ NodePointer protocolNode = Dem.demangleSymbol (ProtoName);
327
+
328
+ // ObjC protocol names aren't mangled.
329
+ if (!protocolNode) {
330
+ auto module = Dem.createNode (Node::Kind::Module, MANGLING_MODULE_OBJC);
331
+ auto node = Dem.createNode (Node::Kind::Protocol);
332
+ node->addChild (module , Dem);
333
+ node->addChild (Dem.createNode (Node::Kind::Identifier, ProtoName), Dem);
334
+ auto typeNode = Dem.createNode (Node::Kind::Type);
335
+ typeNode->addChild (node, Dem);
336
+ return typeNode;
337
+ }
338
+
339
+ // Dig out the protocol node.
340
+ // Global -> (Protocol|TypeMangling)
341
+ protocolNode = protocolNode->getChild (0 );
342
+ if (protocolNode->getKind () == Node::Kind::TypeMangling) {
343
+ protocolNode = protocolNode->getChild (0 ); // TypeMangling -> Type
344
+ protocolNode = protocolNode->getChild (0 ); // Type -> ProtocolList
345
+ protocolNode = protocolNode->getChild (0 ); // ProtocolList -> TypeList
346
+ protocolNode = protocolNode->getChild (0 ); // TypeList -> Type
347
+
348
+ assert (protocolNode->getKind () == Node::Kind::Type);
349
+ assert (protocolNode->getChild (0 )->getKind () == Node::Kind::Protocol);
350
+ } else {
351
+ assert (protocolNode->getKind () == Node::Kind::Protocol);
352
+ }
353
+
354
+ return protocolNode;
355
+ }
356
+ #endif
357
+
358
+ return _buildDemanglingForContext (protocol.getSwiftProtocol (), {}, Dem);
359
+ }
360
+
319
361
// Build a demangled type tree for a type.
320
362
//
321
363
// FIXME: This should use MetadataReader.h.
@@ -361,48 +403,7 @@ swift::_swift_buildDemanglingForMetadata(const Metadata *type,
361
403
// its canonical ordering of protocols.
362
404
363
405
for (auto protocol : protocols) {
364
- #if SWIFT_OBJC_INTEROP
365
- if (protocol.isObjC ()) {
366
- // The protocol name is mangled as a type symbol, with the _Tt prefix.
367
- StringRef ProtoName (protocol.getName ());
368
- NodePointer protocolNode = Dem.demangleSymbol (ProtoName);
369
-
370
- // ObjC protocol names aren't mangled.
371
- if (!protocolNode) {
372
- auto module = Dem.createNode (Node::Kind::Module,
373
- MANGLING_MODULE_OBJC);
374
- auto node = Dem.createNode (Node::Kind::Protocol);
375
- node->addChild (module , Dem);
376
- node->addChild (Dem.createNode (Node::Kind::Identifier, ProtoName),
377
- Dem);
378
- auto typeNode = Dem.createNode (Node::Kind::Type);
379
- typeNode->addChild (node, Dem);
380
- type_list->addChild (typeNode, Dem);
381
- continue ;
382
- }
383
-
384
- // Dig out the protocol node.
385
- // Global -> (Protocol|TypeMangling)
386
- protocolNode = protocolNode->getChild (0 );
387
- if (protocolNode->getKind () == Node::Kind::TypeMangling) {
388
- protocolNode = protocolNode->getChild (0 ); // TypeMangling -> Type
389
- protocolNode = protocolNode->getChild (0 ); // Type -> ProtocolList
390
- protocolNode = protocolNode->getChild (0 ); // ProtocolList -> TypeList
391
- protocolNode = protocolNode->getChild (0 ); // TypeList -> Type
392
-
393
- assert (protocolNode->getKind () == Node::Kind::Type);
394
- assert (protocolNode->getChild (0 )->getKind () == Node::Kind::Protocol);
395
- } else {
396
- assert (protocolNode->getKind () == Node::Kind::Protocol);
397
- }
398
-
399
- type_list->addChild (protocolNode, Dem);
400
- continue ;
401
- }
402
- #endif
403
-
404
- auto protocolNode =
405
- _buildDemanglingForContext (protocol.getSwiftProtocol (), { }, Dem);
406
+ auto protocolNode = _buildDemanglingForProtocolDescriptor (protocol, Dem);
406
407
if (!protocolNode)
407
408
return nullptr ;
408
409
@@ -443,6 +444,53 @@ swift::_swift_buildDemanglingForMetadata(const Metadata *type,
443
444
// Just a simple composition of protocols.
444
445
return proto_list;
445
446
}
447
+ case MetadataKind::ExtendedExistential: {
448
+ auto exis = static_cast <const ExtendedExistentialTypeMetadata *>(type);
449
+ auto genSig = exis->Shape ->getGeneralizationSignature ();
450
+ const unsigned selfParamIdx = genSig.getParams ().size ();
451
+ auto node = Dem.createNode (Node::Kind::ParameterizedProtocol);
452
+ for (const auto &reqt :
453
+ exis->Shape ->getRequirementSignature ().getRequirements ()) {
454
+ if (reqt.getKind () != GenericRequirementKind::Protocol) {
455
+ continue ;
456
+ }
457
+
458
+ if (!reqt.Flags .hasKeyArgument ()) {
459
+ continue ;
460
+ }
461
+
462
+ auto lhsTypeNode = Dem.demangleType (reqt.getParam ());
463
+ if (!lhsTypeNode || lhsTypeNode->getKind () != Node::Kind::Type ||
464
+ !lhsTypeNode->hasChildren () ||
465
+ lhsTypeNode->getChild (0 )->getKind () !=
466
+ Node::Kind::DependentGenericParamType ||
467
+ lhsTypeNode->getChild (0 )->getNumChildren () != 2 ) {
468
+ continue ;
469
+ }
470
+ auto index = lhsTypeNode->getChild (0 )->getChild (1 )->getIndex ();
471
+ if (index + 1 != selfParamIdx)
472
+ continue ;
473
+
474
+ auto *protocolNode =
475
+ _buildDemanglingForProtocolDescriptor (reqt.getProtocol (), Dem);
476
+ if (!protocolNode)
477
+ continue ;
478
+
479
+ node->addChild (protocolNode, Dem);
480
+ }
481
+
482
+ const unsigned shapeArgumentCount =
483
+ exis->Shape ->getGenSigArgumentLayoutSizeInWords ();
484
+ auto type_list = Dem.createNode (Node::Kind::TypeList);
485
+ for (unsigned i = 0 ; i < shapeArgumentCount; ++i) {
486
+ auto genArg = exis->getGeneralizationArguments ()[i];
487
+ auto eltType =
488
+ _swift_buildDemanglingForMetadata ((const Metadata *)genArg, Dem);
489
+ type_list->addChild (eltType, Dem);
490
+ }
491
+ node->addChild (type_list, Dem);
492
+ return node;
493
+ }
446
494
case MetadataKind::ExistentialMetatype: {
447
495
auto metatype = static_cast <const ExistentialMetatypeMetadata *>(type);
448
496
auto instance = _swift_buildDemanglingForMetadata (metatype->InstanceType ,
0 commit comments