Skip to content

Commit c6f384c

Browse files
committed
SIL: add some APIs to SubstitutionMap
1 parent 351d42b commit c6f384c

File tree

4 files changed

+46
-0
lines changed

4 files changed

+46
-0
lines changed

SwiftCompilerSources/Sources/SIL/SubstitutionMap.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,32 @@ public struct SubstitutionMap {
2727

2828
public var hasAnySubstitutableParams: Bool { bridged.hasAnySubstitutableParams() }
2929

30+
public var conformances: ConformanceArray { ConformanceArray(substitutionMap: self) }
31+
3032
public var replacementTypes: OptionalTypeArray {
3133
let types = BridgedTypeArray.fromReplacementTypes(bridged)
3234
return OptionalTypeArray(bridged: types)
3335
}
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+
}
3458
}

include/swift/SIL/SILBridging.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,9 @@ struct BridgedSubstitutionMap {
652652
BRIDGED_INLINE BridgedSubstitutionMap();
653653
BRIDGED_INLINE bool isEmpty() const;
654654
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;
655658
};
656659

657660
struct BridgedTypeArray {

include/swift/SIL/SILBridgingImpl.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,14 @@ bool BridgedSubstitutionMap::hasAnySubstitutableParams() const {
710710
return unbridged().hasAnySubstitutableParams();
711711
}
712712

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+
713721
//===----------------------------------------------------------------------===//
714722
// BridgedLocation
715723
//===----------------------------------------------------------------------===//

lib/SIL/Utils/SILBridging.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,17 @@ BridgedOwnedString BridgedDefaultWitnessTable::getDebugDescription() const {
381381
static_assert(sizeof(BridgedSubstitutionMap) >= sizeof(swift::SubstitutionMap),
382382
"BridgedSubstitutionMap has wrong size");
383383

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+
}
384395

385396
//===----------------------------------------------------------------------===//
386397
// SILDebugLocation

0 commit comments

Comments
 (0)