File tree Expand file tree Collapse file tree 4 files changed +46
-0
lines changed
SwiftCompilerSources/Sources/SIL Expand file tree Collapse file tree 4 files changed +46
-0
lines changed Original file line number Diff line number Diff line change @@ -27,8 +27,32 @@ public struct SubstitutionMap {
27
27
28
28
public var hasAnySubstitutableParams : Bool { bridged. hasAnySubstitutableParams ( ) }
29
29
30
+ public var conformances : ConformanceArray { ConformanceArray ( substitutionMap: self ) }
31
+
30
32
public var replacementTypes : OptionalTypeArray {
31
33
let types = BridgedTypeArray . fromReplacementTypes ( bridged)
32
34
return OptionalTypeArray ( bridged: types)
33
35
}
36
+
37
+ public func getMethodSubstitutions( for method: Function ) -> SubstitutionMap {
38
+ return SubstitutionMap ( bridged: bridged. getMethodSubstitutions ( method. bridged) )
39
+ }
40
+
41
+ public struct ConformanceArray : BridgedRandomAccessCollection {
42
+ fileprivate let bridgedSubs : BridgedSubstitutionMap
43
+ public let count : Int
44
+
45
+ init ( substitutionMap: SubstitutionMap ) {
46
+ self . bridgedSubs = substitutionMap. bridged
47
+ self . count = substitutionMap. bridged. getNumConformances ( )
48
+ }
49
+
50
+ public var startIndex : Int { return 0 }
51
+ public var endIndex : Int { return count }
52
+
53
+ public subscript( _ index: Int ) -> ProtocolConformance {
54
+ assert ( index >= startIndex && index < endIndex)
55
+ return ProtocolConformance ( bridged: bridgedSubs. getConformance ( index) )
56
+ }
57
+ }
34
58
}
Original file line number Diff line number Diff line change @@ -652,6 +652,9 @@ struct BridgedSubstitutionMap {
652
652
BRIDGED_INLINE BridgedSubstitutionMap ();
653
653
BRIDGED_INLINE bool isEmpty () const ;
654
654
BRIDGED_INLINE bool hasAnySubstitutableParams () const ;
655
+ SWIFT_IMPORT_UNSAFE BridgedSubstitutionMap getMethodSubstitutions (BridgedFunction method) const ;
656
+ BRIDGED_INLINE SwiftInt getNumConformances () const ;
657
+ SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedProtocolConformance getConformance (SwiftInt index) const ;
655
658
};
656
659
657
660
struct BridgedTypeArray {
Original file line number Diff line number Diff line change @@ -710,6 +710,14 @@ bool BridgedSubstitutionMap::hasAnySubstitutableParams() const {
710
710
return unbridged ().hasAnySubstitutableParams ();
711
711
}
712
712
713
+ SwiftInt BridgedSubstitutionMap::getNumConformances () const {
714
+ return (SwiftInt)unbridged ().getConformances ().size ();
715
+ }
716
+
717
+ BridgedProtocolConformance BridgedSubstitutionMap::getConformance (SwiftInt index) const {
718
+ return unbridged ().getConformances ()[index];
719
+ }
720
+
713
721
// ===----------------------------------------------------------------------===//
714
722
// BridgedLocation
715
723
// ===----------------------------------------------------------------------===//
Original file line number Diff line number Diff line change @@ -381,6 +381,17 @@ BridgedOwnedString BridgedDefaultWitnessTable::getDebugDescription() const {
381
381
static_assert (sizeof (BridgedSubstitutionMap) >= sizeof(swift::SubstitutionMap),
382
382
"BridgedSubstitutionMap has wrong size");
383
383
384
+ BridgedSubstitutionMap BridgedSubstitutionMap::getMethodSubstitutions (BridgedFunction method) const {
385
+ swift::SILFunction *f = method.getFunction ();
386
+ swift::GenericSignature genericSig = f->getLoweredFunctionType ()->getInvocationGenericSignature ();
387
+
388
+ if (!genericSig || genericSig->areAllParamsConcrete ())
389
+ return swift::SubstitutionMap ();
390
+
391
+ return swift::SubstitutionMap::get (genericSig,
392
+ swift::QuerySubstitutionMap{unbridged ()},
393
+ swift::LookUpConformanceInModule ());
394
+ }
384
395
385
396
// ===----------------------------------------------------------------------===//
386
397
// SILDebugLocation
You can’t perform that action at this time.
0 commit comments