FLEXObjectRef.m 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //
  2. // FLEXObjectRef.m
  3. // FLEX
  4. //
  5. // Created by Tanner Bennett on 7/24/18.
  6. // Copyright (c) 2020 FLEX Team. All rights reserved.
  7. //
  8. #import "FLEXObjectRef.h"
  9. #import "FLEXRuntimeUtility.h"
  10. #import "NSArray+FLEX.h"
  11. @interface FLEXObjectRef ()
  12. @property (nonatomic, readonly) BOOL wantsSummary;
  13. @end
  14. @implementation FLEXObjectRef
  15. @synthesize summary = _summary;
  16. + (instancetype)referencing:(id)object {
  17. return [self referencing:object showSummary:YES];
  18. }
  19. + (instancetype)referencing:(id)object showSummary:(BOOL)showSummary {
  20. return [[self alloc] initWithObject:object ivarName:nil showSummary:showSummary];
  21. }
  22. + (instancetype)referencing:(id)object ivar:(NSString *)ivarName {
  23. return [[self alloc] initWithObject:object ivarName:ivarName showSummary:YES];
  24. }
  25. + (NSArray<FLEXObjectRef *> *)referencingAll:(NSArray *)objects {
  26. return [objects flex_mapped:^id(id obj, NSUInteger idx) {
  27. return [self referencing:obj showSummary:YES];
  28. }];
  29. }
  30. + (NSArray<FLEXObjectRef *> *)referencingClasses:(NSArray<Class> *)classes {
  31. return [classes flex_mapped:^id(id obj, NSUInteger idx) {
  32. return [self referencing:obj showSummary:NO];
  33. }];
  34. }
  35. - (id)initWithObject:(id)object ivarName:(NSString *)ivar showSummary:(BOOL)showSummary {
  36. self = [super init];
  37. if (self) {
  38. _object = object;
  39. _wantsSummary = showSummary;
  40. NSString *class = [FLEXRuntimeUtility safeClassNameForObject:object];
  41. if (ivar) {
  42. _reference = [NSString stringWithFormat:@"%@ %@", class, ivar];
  43. } else if (showSummary) {
  44. _reference = [NSString stringWithFormat:@"%@ %p", class, object];
  45. } else {
  46. _reference = class;
  47. }
  48. }
  49. return self;
  50. }
  51. - (NSString *)summary {
  52. if (self.wantsSummary) {
  53. if (!_summary) {
  54. _summary = [FLEXRuntimeUtility summaryForObject:self.object];
  55. }
  56. return _summary;
  57. }
  58. else {
  59. return nil;
  60. }
  61. }
  62. @end