Files
flipper/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Descriptors/UIDDescriptorRegister.m
Lorenzo Blasa db7aa9eeaf OSS
Summary: Move UIDebugger plugin to OSS space.

Reviewed By: passy

Differential Revision: D47634848

fbshipit-source-id: 90e8c0181a2434d0e5d76bdb99b902051e6d702e
2023-07-21 04:47:13 -07:00

104 lines
2.9 KiB
Objective-C

/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#if FB_SONARKIT_ENABLED
#import "UIDDescriptorRegister.h"
#import <objc/runtime.h>
#import "UIDChainedDescriptor.h"
#import "UIDUIApplicationDescriptor.h"
#import "UIDUILabelDescriptor.h"
#import "UIDUINavigationControllerDescriptor.h"
#import "UIDUITabBarControllerDescriptor.h"
#import "UIDUIViewControllerDescriptor.h"
#import "UIDUIViewDescriptor.h"
#import "UIDUIWindowDescriptor.h"
@interface UIDDescriptorRegister ()
- (void)prepareChain;
@end
@implementation UIDDescriptorRegister {
NSMutableDictionary<NSString*, UIDNodeDescriptor*>* _register;
}
- (instancetype)init {
self = [super init];
if (self) {
_register = [NSMutableDictionary new];
}
return self;
}
+ (instancetype)defaultRegister {
static UIDDescriptorRegister* defaultRegister = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
defaultRegister = [UIDDescriptorRegister new];
[defaultRegister registerDescriptor:[UIDUIApplicationDescriptor new]
forClass:[UIApplication class]];
[defaultRegister registerDescriptor:[UIDUIWindowDescriptor new]
forClass:[UIWindow class]];
[defaultRegister registerDescriptor:[UIDUIViewControllerDescriptor new]
forClass:[UIViewController class]];
[defaultRegister registerDescriptor:[UIDUIViewDescriptor new]
forClass:[UIView class]];
[defaultRegister registerDescriptor:[UIDUILabelDescriptor new]
forClass:[UILabel class]];
});
return defaultRegister;
}
- (void)registerDescriptor:(UIDNodeDescriptor*)descriptor
forClass:(Class)clazz {
NSString* key = NSStringFromClass(clazz);
_register[key] = descriptor;
[self prepareChain];
}
- (UIDNodeDescriptor*)descriptorForClass:(Class)clazz {
UIDNodeDescriptor* classDescriptor = nil;
while (classDescriptor == nil && clazz != nil) {
classDescriptor = [_register objectForKey:NSStringFromClass(clazz)];
clazz = [clazz superclass];
}
return classDescriptor;
}
- (void)prepareChain {
NSEnumerator* enumerator = [_register keyEnumerator];
NSString* key;
while ((key = [enumerator nextObject])) {
UIDNodeDescriptor* descriptor = [_register objectForKey:key];
if ([descriptor isKindOfClass:[UIDChainedDescriptor class]]) {
UIDChainedDescriptor* chainedDescriptor =
(UIDChainedDescriptor*)descriptor;
Class clazz = NSClassFromString(key);
Class superclass = [clazz superclass];
UIDNodeDescriptor* superDescriptor = [self descriptorForClass:superclass];
if ([superDescriptor isKindOfClass:[UIDChainedDescriptor class]]) {
chainedDescriptor.parent = (UIDChainedDescriptor*)superDescriptor;
}
}
}
}
@end
#endif