@@ -481,107 +481,107 @@ class TypeDecoder {
481
481
return BuiltProtocolConformance ();
482
482
483
483
return decodeMangledProtocolConformance (Node->getChild (0 ));
484
-
484
+
485
485
case NodeKind::ConcreteProtocolConformance: {
486
486
if (Node->getNumChildren () < 3 )
487
487
return BuiltProtocolConformance ();
488
-
488
+
489
489
auto conformingType = decodeMangledType (Node->getChild (0 ));
490
490
if (!conformingType)
491
491
return BuiltProtocolConformance ();
492
-
492
+
493
493
auto conformanceDecl
494
494
= decodeMangledProtocolConformanceDecl (conformingType,
495
495
Node->getChild (1 ));
496
-
496
+
497
497
if (!conformanceDecl)
498
498
return BuiltProtocolConformance ();
499
-
499
+
500
500
std::vector<BuiltProtocolConformance> conformanceArgs;
501
-
501
+
502
502
if (Node->getChild (2 )->getKind () != NodeKind::AnyProtocolConformanceList)
503
503
return BuiltProtocolConformance ();
504
-
504
+
505
505
for (auto mangledArg : *Node->getChild (2 )) {
506
506
auto arg = decodeMangledProtocolConformance (mangledArg);
507
507
if (!arg)
508
508
return BuiltProtocolConformance ();
509
509
conformanceArgs.push_back (arg);
510
510
}
511
-
511
+
512
512
return Builder.createConcreteProtocolConformance (conformingType,
513
513
conformanceDecl,
514
514
conformanceArgs);
515
515
}
516
-
516
+
517
517
case NodeKind::DependentProtocolConformanceRoot: {
518
518
if (Node->getNumChildren () < 3 )
519
519
return BuiltProtocolConformance ();
520
-
520
+
521
521
auto conformingType = decodeMangledType (Node->getChild (0 ));
522
522
if (!conformingType)
523
523
return BuiltProtocolConformance ();
524
-
524
+
525
525
auto conformingRequirement = decodeMangledProtocolType (Node->getChild (1 ));
526
526
if (!conformingRequirement)
527
527
return BuiltProtocolConformance ();
528
-
528
+
529
529
if (!Node->getChild (2 )->hasIndex ())
530
530
return BuiltProtocolConformance ();
531
-
531
+
532
532
auto index = Node->getChild (2 )->getIndex ();
533
-
533
+
534
534
return Builder.createDependentProtocolConformanceRoot (conformingType,
535
535
conformingRequirement,
536
536
index);
537
537
}
538
-
538
+
539
539
case NodeKind::DependentProtocolConformanceAssociated: {
540
540
if (Node->getNumChildren () < 3 )
541
541
return BuiltProtocolConformance ();
542
542
543
543
auto base = decodeMangledProtocolConformance (Node->getChild (0 ));
544
544
if (!base)
545
545
return BuiltProtocolConformance ();
546
-
546
+
547
547
if (Node->getChild (1 )->getKind () != NodeKind::DependentAssociatedConformance)
548
548
return BuiltProtocolConformance ();
549
549
if (Node->getChild (1 )->getNumChildren () < 2 )
550
550
return BuiltProtocolConformance ();
551
-
551
+
552
552
auto conformingType = decodeMangledType (Node->getChild (1 )->getChild (0 ));
553
553
if (!conformingType)
554
554
return BuiltProtocolConformance ();
555
555
auto conformingRequirement = decodeMangledProtocolType (Node->getChild (1 )->getChild (1 ));
556
556
if (!conformingRequirement)
557
557
return BuiltProtocolConformance ();
558
-
558
+
559
559
if (!Node->getChild (2 )->hasIndex ())
560
560
return BuiltProtocolConformance ();
561
-
561
+
562
562
auto index = Node->getChild (2 )->getIndex ();
563
563
564
564
return Builder.createDependentProtocolConformanceAssociated (base,
565
565
conformingType,
566
566
conformingRequirement,
567
567
index);
568
568
}
569
-
569
+
570
570
case NodeKind::DependentProtocolConformanceInherited: {
571
571
if (Node->getNumChildren () < 3 )
572
572
return BuiltProtocolConformance ();
573
573
574
574
auto base = decodeMangledProtocolConformance (Node->getChild (0 ));
575
575
if (!base)
576
576
return BuiltProtocolConformance ();
577
-
577
+
578
578
auto superRequirement = decodeMangledProtocolType (Node->getChild (1 ));
579
579
if (!superRequirement)
580
580
return BuiltProtocolConformance ();
581
-
581
+
582
582
if (!Node->getChild (2 )->hasIndex ())
583
583
return BuiltProtocolConformance ();
584
-
584
+
585
585
auto index = Node->getChild (2 )->getIndex ();
586
586
587
587
return Builder.createDependentProtocolConformanceInherited (base,
@@ -593,7 +593,7 @@ class TypeDecoder {
593
593
return BuiltProtocolConformance ();
594
594
}
595
595
}
596
-
596
+
597
597
BuiltProtocolConformanceDecl decodeMangledProtocolConformanceDecl (BuiltType ConformingType,
598
598
NodePointer Node) {
599
599
if (!Node) return BuiltProtocolConformanceDecl ();
@@ -603,53 +603,53 @@ class TypeDecoder {
603
603
case NodeKind::ProtocolConformanceRefInTypeModule: {
604
604
if (Node->getNumChildren () < 1 )
605
605
return BuiltProtocolConformanceDecl ();
606
-
606
+
607
607
auto protocolRequirement = decodeMangledProtocolType (Node->getChild (0 ));
608
608
if (!protocolRequirement)
609
609
return BuiltProtocolConformanceDecl ();
610
-
610
+
611
611
return Builder.createProtocolConformanceDeclInTypeModule (ConformingType,
612
612
protocolRequirement);
613
613
}
614
-
614
+
615
615
case NodeKind::ProtocolConformanceRefInProtocolModule: {
616
616
if (Node->getNumChildren () < 1 )
617
617
return BuiltProtocolConformanceDecl ();
618
-
618
+
619
619
auto protocolRequirement = decodeMangledProtocolType (Node->getChild (0 ));
620
620
if (!protocolRequirement)
621
621
return BuiltProtocolConformanceDecl ();
622
-
622
+
623
623
return Builder.createProtocolConformanceDeclInProtocolModule (ConformingType,
624
624
protocolRequirement);
625
625
}
626
-
626
+
627
627
case NodeKind::ProtocolConformanceRefInOtherModule: {
628
628
if (Node->getNumChildren () < 2 )
629
629
return BuiltProtocolConformanceDecl ();
630
-
630
+
631
631
auto protocolRequirement = decodeMangledProtocolType (Node->getChild (0 ));
632
632
if (!protocolRequirement)
633
633
return BuiltProtocolConformanceDecl ();
634
-
634
+
635
635
auto moduleName = Node->getChild (1 )->getText ();
636
-
636
+
637
637
return Builder.createProtocolConformanceDeclRetroactive (ConformingType,
638
638
protocolRequirement,
639
639
moduleName);
640
640
}
641
-
641
+
642
642
/*
643
643
case NodeKind::ProtocolConformanceSymbolicReference:
644
644
return Builder.createSymbolicProtocolConformanceDecl(ConformingType,
645
645
Node);
646
646
*/
647
-
647
+
648
648
default :
649
649
return BuiltProtocolConformance ();
650
650
}
651
651
}
652
-
652
+
653
653
// / Given a demangle tree, attempt to turn it into a type.
654
654
TypeLookupErrorOr<BuiltType> decodeMangledType (NodePointer Node) {
655
655
return decodeMangledType (Node, 0 );
@@ -1730,6 +1730,12 @@ decodeMangledType(BuilderType &Builder, NodePointer Node) {
1730
1730
return TypeDecoder<BuilderType>(Builder).decodeMangledType (Node);
1731
1731
}
1732
1732
1733
+ template <typename BuilderType>
1734
+ inline TypeLookupErrorOr<typename BuilderType::BuiltProtocolConformance>
1735
+ decodeMangledProtocolConformance (BuilderType &Builder, NodePointer Node) {
1736
+ return TypeDecoder<BuilderType>(Builder).decodeMangledProtocolConformance (Node);
1737
+ }
1738
+
1733
1739
SWIFT_END_INLINE_NAMESPACE
1734
1740
} // end namespace Demangle
1735
1741
} // end namespace swift
0 commit comments