RenderCore/RCComponentDescriptionHelper.mm (71 lines of code) (raw):

/* * Copyright (c) 2014-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * */ #import "RCComponentDescriptionHelper.h" #import <RenderCore/CKMountable.h> static NSString *componentDescriptionOrClass(id<CKMountable> component) { return [component description] ?: NSStringFromClass([component class]); } static NSString *RCComponentBacktraceDescription(NSArray<id<CKMountable>> *componentBacktrace, BOOL nested, BOOL compactDescription) noexcept { NSMutableString *const description = [NSMutableString string]; for (NSInteger index = [componentBacktrace count] - 1; index >= 0; index--) { const NSInteger depth = componentBacktrace.count - index - 1; if (depth != 0) { [description appendString:@"\n"]; } const auto component = componentBacktrace[index]; if (nested) { [description appendString:[@"" stringByPaddingToLength:depth withString:@" " startingAtIndex:0]]; } NSString *componentDescription = compactDescription ? RCComponentCompactDescription(component) : componentDescriptionOrClass(component); [description appendString:componentDescription]; } return description; } NSString *RCComponentCompactDescription(id<CKMountable> component) { return component.className ?: NSStringFromClass([component class]); } NSString *RCComponentBacktraceDescription(NSArray<id<CKMountable>> *componentBacktrace) noexcept { return RCComponentBacktraceDescription(componentBacktrace, YES, NO); } NSString *RCComponentBacktraceStackDescription(NSArray<id<CKMountable>> *componentBacktrace) noexcept { return RCComponentBacktraceDescription(componentBacktrace, NO, YES); } NSString *RCComponentChildrenDescription(std::shared_ptr<const std::vector<RCLayoutChild>> children) noexcept { NSMutableString *const description = [NSMutableString string]; for (auto childIter = children->begin(); childIter != children->end(); childIter++) { if (childIter != children->begin()) { [description appendString:@"\n"]; } id<CKMountable> child = childIter->layout.component; if (child) { [description appendString:componentDescriptionOrClass(child)]; } } return description; } NSString *RCComponentDescriptionWithChildren(NSString *description, NSArray *children) { NSMutableString *result = [description mutableCopy]; for (id childComponent in children) { NSString *nested = [childComponent description]; __block NSUInteger index = 0; [nested enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) { [result appendString:(index++ ? @"\n " : @"\n - ")]; [result appendString:line]; }]; } return result; } NSArray<id<CKMountable>> *RCComponentGenerateBacktrace(id<CKMountable> component) { NSMutableArray<id<CKMountable>> *const componentBacktrace = [NSMutableArray arrayWithObject:component]; while ([componentBacktrace lastObject] && [componentBacktrace lastObject].mountInfo.supercomponent) { [componentBacktrace addObject:[componentBacktrace lastObject].mountInfo.supercomponent]; } return componentBacktrace; }