CKDuplicateComponentInfo CKFindDuplicateComponent()

in ComponentKit/Core/Scope/CKTreeVerificationHelpers.mm [37:69]


CKDuplicateComponentInfo CKFindDuplicateComponent(const RCLayout &layout)
{
  std::queue<const RCLayout> queue;
  NSMutableSet<id<NSObject>> *const previouslySeenComponent = [NSMutableSet new];
  NSMapTable<id<CKMountable>, id<CKMountable>> *const componentsToParentComponents = [NSMapTable strongToStrongObjectsMapTable];
  queue.push(layout);
  while (!queue.empty()) {
    const auto componentLayout = queue.front();
    queue.pop();
    auto const component = componentLayout.component;

    if (component.class == CKEmptyComponent.class) {
      continue;
    }

    if (component && [previouslySeenComponent containsObject:component]) {
      return {
        .component = component,
        .backtraceDescription = RCComponentBacktraceDescription(generateComponentBacktrace(component, componentsToParentComponents)),
      };
    }
    if (component) {
      [previouslySeenComponent addObject:component];
    }
    if (componentLayout.children) {
      for (const auto& childComponentLayout : *componentLayout.children) {
        queue.push(childComponentLayout.layout);
        [componentsToParentComponents setObject:componentLayout.component forKey:childComponentLayout.layout.component];
      }
    }
  }
  return {};
}