mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[NFC][RemoteInspection] Use existing cache to build conformance table
There is an existing cache which is built when looking up FieldDescriptors. collectAllConformances ignored this cache and would parse every FieldDescriptor again. Use the existing cache mechanism. rdar://166098516
This commit is contained in:
@@ -597,6 +597,9 @@ public:
|
||||
/// an external file.
|
||||
remote::ExternalTypeRefCache *ExternalTypeRefCache = nullptr;
|
||||
|
||||
/// Ensure all field descriptors are in the FieldTypeInfoCache.
|
||||
void ensureAllFieldDescriptorsCached();
|
||||
|
||||
public:
|
||||
///
|
||||
/// Dumping typerefs, field declarations, builtin types, captures,
|
||||
@@ -746,20 +749,18 @@ public:
|
||||
ConformanceCollectionResult collectAllConformances() {
|
||||
ConformanceCollectionResult result;
|
||||
|
||||
// The Fields section has gathered info on types that includes their
|
||||
// mangled names. Use that to build a dictionary from a type's demangled
|
||||
// name to its mangled name
|
||||
ensureAllFieldDescriptorsCached();
|
||||
|
||||
Demangler dem;
|
||||
// Build the demangled to mangled name map from the FieldTypeInfoCache.
|
||||
std::unordered_map<std::string, std::string> typeNameToManglingMap;
|
||||
for (const auto §ion : ReflectionInfos) {
|
||||
for (auto descriptor : section.Field) {
|
||||
TypeRefBuilder::ScopedNodeFactoryCheckpoint checkpoint(&Builder);
|
||||
auto TypeRef = readTypeRef(descriptor, descriptor->MangledTypeName);
|
||||
auto OptionalMangledTypeName = normalizeReflectionName(TypeRef);
|
||||
auto TypeName = nodeToString(Builder.demangleTypeRef(TypeRef));
|
||||
if (OptionalMangledTypeName.has_value()) {
|
||||
typeNameToManglingMap[TypeName] = OptionalMangledTypeName.value();
|
||||
}
|
||||
}
|
||||
for (const auto &entry : FieldTypeInfoCache) {
|
||||
const std::string &mangledName = entry.first;
|
||||
RemoteRef<FieldDescriptor> descriptor = entry.second;
|
||||
|
||||
auto node = dem.demangleType(mangledName);
|
||||
auto demangledName = nodeToString(node);
|
||||
typeNameToManglingMap[demangledName] = mangledName;
|
||||
}
|
||||
|
||||
// Collect all conformances and aggregate them per-conforming-type.
|
||||
|
||||
@@ -335,6 +335,13 @@ void TypeRefBuilder::ReflectionTypeDescriptorFinder::
|
||||
ProcessedReflectionInfoIndexes.insert(Index);
|
||||
}
|
||||
|
||||
void TypeRefBuilder::ReflectionTypeDescriptorFinder::
|
||||
ensureAllFieldDescriptorsCached() {
|
||||
for (size_t i = 0; i < ReflectionInfos.size(); ++i) {
|
||||
populateFieldTypeInfoCacheWithReflectionAtIndex(i);
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<RemoteRef<FieldDescriptor>>
|
||||
TypeRefBuilder::ReflectionTypeDescriptorFinder::findFieldDescriptorAtIndex(
|
||||
size_t Index, const std::string &MangledName) {
|
||||
|
||||
Reference in New Issue
Block a user