ソースを参照

Add class hierarchy back to object explorer screen

Tanner Bennett 6 年 前
コミット
6ec780b679

+ 3 - 1
Classes/ObjectExplorers/FLEXObjectExplorer.h

@@ -43,9 +43,11 @@
 @property (nonatomic, readonly) NSArray<NSArray<FLEXMethod *> *> *allClassMethods;
 @property (nonatomic, readonly) NSArray<NSArray<FLEXMethod *> *> *allClassMethods;
 @property (nonatomic, readonly) NSArray<FLEXMethod *> *classMethods;
 @property (nonatomic, readonly) NSArray<FLEXMethod *> *classMethods;
 
 
+@property (nonatomic, readonly) NSArray<Class> *classHierarchyClasses;
+@property (nonatomic, readonly) NSArray<FLEXStaticMetadata *> *classHierarchy;
+
 @property (nonatomic, readonly) NSArray<NSArray<FLEXProtocol *> *> *allConformedProtocols;
 @property (nonatomic, readonly) NSArray<NSArray<FLEXProtocol *> *> *allConformedProtocols;
 @property (nonatomic, readonly) NSArray<FLEXProtocol *> *conformedProtocols;
 @property (nonatomic, readonly) NSArray<FLEXProtocol *> *conformedProtocols;
-@property (nonatomic, readonly) NSArray<Class> *classHierarchy;
 
 
 @property (nonatomic, readonly) NSArray<FLEXStaticMetadata *> *allInstanceSizes;
 @property (nonatomic, readonly) NSArray<FLEXStaticMetadata *> *allInstanceSizes;
 @property (nonatomic, readonly) FLEXStaticMetadata *instanceSize;
 @property (nonatomic, readonly) FLEXStaticMetadata *instanceSize;

+ 10 - 4
Classes/ObjectExplorers/FLEXObjectExplorer.m

@@ -99,11 +99,11 @@
     // Loop over each class and each superclass, collect
     // Loop over each class and each superclass, collect
     // the fresh and unique metadata in each category
     // the fresh and unique metadata in each category
     Class superclass = nil;
     Class superclass = nil;
-    NSInteger count = self.classHierarchy.count;
+    NSInteger count = self.classHierarchyClasses.count;
     NSInteger rootIdx = count - 1;
     NSInteger rootIdx = count - 1;
     for (NSInteger i = 0; i < count; i++) {
     for (NSInteger i = 0; i < count; i++) {
-        Class cls = self.classHierarchy[i];
-        superclass = (i < rootIdx) ? self.classHierarchy[i+1] : nil;
+        Class cls = self.classHierarchyClasses[i];
+        superclass = (i < rootIdx) ? self.classHierarchyClasses[i+1] : nil;
 
 
         [_allProperties addObject:[self
         [_allProperties addObject:[self
             metadataUniquedByName:[cls flex_allInstanceProperties]
             metadataUniquedByName:[cls flex_allInstanceProperties]
@@ -135,6 +135,9 @@
             superclass:superclass
             superclass:superclass
             kind:FLEXMetadataKindProtocols
             kind:FLEXMetadataKindProtocols
         ]];
         ]];
+        
+        // TODO: join instance size, image name, and class hierarchy into a single model object
+        // This would greatly reduce the laziness that has begun to manifest itself here
         [_allInstanceSizes addObject:[FLEXStaticMetadata
         [_allInstanceSizes addObject:[FLEXStaticMetadata
             style:FLEXStaticMetadataRowStyleKeyValue
             style:FLEXStaticMetadataRowStyleKeyValue
             title:@"Instance Size" number:@(class_getInstanceSize(cls))
             title:@"Instance Size" number:@(class_getInstanceSize(cls))
@@ -144,6 +147,8 @@
             title:@"Image Name" string:@(class_getImageName(cls))
             title:@"Image Name" string:@(class_getImageName(cls))
         ]];
         ]];
     }
     }
+    
+    _classHierarchy = [FLEXStaticMetadata classHierarchy:self.classHierarchyClasses];
 
 
     // Set up UIKit helper data
     // Set up UIKit helper data
     // Really, we only need to call this on properties and ivars
     // Really, we only need to call this on properties and ivars
@@ -210,6 +215,7 @@
                     break;
                     break;
 
 
                 case FLEXMetadataKindProtocols:
                 case FLEXMetadataKindProtocols:
+                case FLEXMetadataKindClassHierarchy:
                 case FLEXMetadataKindOther:
                 case FLEXMetadataKindOther:
                     return YES; // These types are already uniqued
                     return YES; // These types are already uniqued
                     break;
                     break;
@@ -229,7 +235,7 @@
 - (void)reloadClassHierarchy {
 - (void)reloadClassHierarchy {
     // The class hierarchy will never contain metaclass objects by this logic;
     // The class hierarchy will never contain metaclass objects by this logic;
     // it is always the same for a given class and instances of it
     // it is always the same for a given class and instances of it
-    _classHierarchy = [[self.object class] flex_classHierarchy];
+    _classHierarchyClasses = [[self.object class] flex_classHierarchy];
 }
 }
 
 
 @end
 @end

+ 2 - 2
Classes/ObjectExplorers/FLEXObjectExplorerViewController.m

@@ -110,7 +110,7 @@
 
 
     // Carousel scope bar
     // Carousel scope bar
     [self.explorer reloadClassHierarchy];
     [self.explorer reloadClassHierarchy];
-    self.carousel.items = [self.explorer.classHierarchy flex_mapped:^id(Class cls, NSUInteger idx) {
+    self.carousel.items = [self.explorer.classHierarchyClasses flex_mapped:^id(Class cls, NSUInteger idx) {
         return NSStringFromClass(cls);
         return NSStringFromClass(cls);
     }];
     }];
     
     
@@ -192,9 +192,9 @@
         [FLEXMetadataSection explorer:self.explorer kind:FLEXMetadataKindIvars],
         [FLEXMetadataSection explorer:self.explorer kind:FLEXMetadataKindIvars],
         [FLEXMetadataSection explorer:self.explorer kind:FLEXMetadataKindMethods],
         [FLEXMetadataSection explorer:self.explorer kind:FLEXMetadataKindMethods],
         [FLEXMetadataSection explorer:self.explorer kind:FLEXMetadataKindClassMethods],
         [FLEXMetadataSection explorer:self.explorer kind:FLEXMetadataKindClassMethods],
+        [FLEXMetadataSection explorer:self.explorer kind:FLEXMetadataKindClassHierarchy],
         [FLEXMetadataSection explorer:self.explorer kind:FLEXMetadataKindProtocols],
         [FLEXMetadataSection explorer:self.explorer kind:FLEXMetadataKindProtocols],
         [FLEXMetadataSection explorer:self.explorer kind:FLEXMetadataKindOther],
         [FLEXMetadataSection explorer:self.explorer kind:FLEXMetadataKindOther],
-//        [FLEXMetadataSection explorer:self.explorer kind:FLEXMetadataKindClassHierarchy],
         referencesSection
         referencesSection
     ]];
     ]];
 
 

+ 1 - 0
Classes/ObjectExplorers/Sections/FLEXMetadataSection.h

@@ -15,6 +15,7 @@ typedef NS_ENUM(NSUInteger, FLEXMetadataKind) {
     FLEXMetadataKindIvars,
     FLEXMetadataKindIvars,
     FLEXMetadataKindMethods,
     FLEXMetadataKindMethods,
     FLEXMetadataKindClassMethods,
     FLEXMetadataKindClassMethods,
+    FLEXMetadataKindClassHierarchy,
     FLEXMetadataKindProtocols,
     FLEXMetadataKindProtocols,
     FLEXMetadataKindOther
     FLEXMetadataKindOther
 };
 };

+ 5 - 0
Classes/ObjectExplorers/Sections/FLEXMetadataSection.m

@@ -90,6 +90,8 @@
             return [self titleWithBaseName:@"Methods"];
             return [self titleWithBaseName:@"Methods"];
         case FLEXMetadataKindClassMethods:
         case FLEXMetadataKindClassMethods:
             return [self titleWithBaseName:@"Class Methods"];
             return [self titleWithBaseName:@"Class Methods"];
+        case FLEXMetadataKindClassHierarchy:
+            return [self titleWithBaseName:@"Class Hierarchy"];
         case FLEXMetadataKindProtocols:
         case FLEXMetadataKindProtocols:
             return [self titleWithBaseName:@"Protocols"];
             return [self titleWithBaseName:@"Protocols"];
         case FLEXMetadataKindOther:
         case FLEXMetadataKindOther:
@@ -133,6 +135,9 @@
         case FLEXMetadataKindProtocols:
         case FLEXMetadataKindProtocols:
             self.allMetadata = self.explorer.conformedProtocols;
             self.allMetadata = self.explorer.conformedProtocols;
             break;
             break;
+        case FLEXMetadataKindClassHierarchy:
+            self.allMetadata = self.explorer.classHierarchy;
+            break;
         case FLEXMetadataKindOther:
         case FLEXMetadataKindOther:
             self.allMetadata = @[self.explorer.instanceSize, self.explorer.imageName];
             self.allMetadata = @[self.explorer.instanceSize, self.explorer.imageName];
             break;
             break;

+ 2 - 0
Classes/Utility/Categories/FLEXRuntime+UIKitHelpers.h

@@ -62,4 +62,6 @@ typedef NS_ENUM(NSUInteger, FLEXStaticMetadataRowStyle)
 + (instancetype)style:(FLEXStaticMetadataRowStyle)style title:(NSString *)title string:(NSString *)string;
 + (instancetype)style:(FLEXStaticMetadataRowStyle)style title:(NSString *)title string:(NSString *)string;
 + (instancetype)style:(FLEXStaticMetadataRowStyle)style title:(NSString *)title number:(NSNumber *)number;
 + (instancetype)style:(FLEXStaticMetadataRowStyle)style title:(NSString *)title number:(NSNumber *)number;
 
 
++ (NSArray<FLEXStaticMetadata *> *)classHierarchy:(NSArray<Class> *)classes;
+
 @end
 @end

+ 52 - 4
Classes/Utility/Categories/FLEXRuntime+UIKitHelpers.m

@@ -14,7 +14,9 @@
 #import "FLEXFieldEditorViewController.h"
 #import "FLEXFieldEditorViewController.h"
 #import "FLEXMethodCallingViewController.h"
 #import "FLEXMethodCallingViewController.h"
 #import "FLEXTableView.h"
 #import "FLEXTableView.h"
+#import "NSArray+Functional.h"
 
 
+#pragma mark FLEXProperty
 @implementation FLEXProperty (UIKitHelpers)
 @implementation FLEXProperty (UIKitHelpers)
 
 
 /// Decide whether to use object or [object class] to get or set property
 /// Decide whether to use object or [object class] to get or set property
@@ -107,6 +109,7 @@
 @end
 @end
 
 
 
 
+#pragma mark FLEXIvar
 @implementation FLEXIvar (UIKitHelpers)
 @implementation FLEXIvar (UIKitHelpers)
 
 
 - (BOOL)isEditable {
 - (BOOL)isEditable {
@@ -176,6 +179,7 @@
 @end
 @end
 
 
 
 
+#pragma mark FLEXMethod*
 @implementation FLEXMethodBase (UIKitHelpers)
 @implementation FLEXMethodBase (UIKitHelpers)
 
 
 - (BOOL)isEditable {
 - (BOOL)isEditable {
@@ -245,6 +249,7 @@
 @end
 @end
 
 
 
 
+#pragma mark FLEXProtocol
 @implementation FLEXProtocol (UIKitHelpers)
 @implementation FLEXProtocol (UIKitHelpers)
 
 
 - (BOOL)isEditable {
 - (BOOL)isEditable {
@@ -280,16 +285,30 @@
 @end
 @end
 
 
 
 
-@interface FLEXStaticMetadata ()
-@property (nonatomic, readonly) FLEXTableViewCellReuseIdentifier reuse;
-@property (nonatomic, readonly) NSString *subtitle;
-@property (nonatomic, readonly) id metadata;
+#pragma mark FLEXStaticMetadata
+@interface FLEXStaticMetadata () {
+    @protected
+    NSString *_name;
+}
+@property (nonatomic) FLEXTableViewCellReuseIdentifier reuse;
+@property (nonatomic) NSString *subtitle;
+@property (nonatomic) id metadata;
+@end
+
+@interface FLEXStaticMetadata_Class : FLEXStaticMetadata
++ (instancetype)withClass:(Class)cls;
 @end
 @end
 
 
 @implementation FLEXStaticMetadata
 @implementation FLEXStaticMetadata
 @synthesize name = _name;
 @synthesize name = _name;
 @synthesize tag = _tag;
 @synthesize tag = _tag;
 
 
++ (NSArray<FLEXStaticMetadata *> *)classHierarchy:(NSArray<Class> *)classes {
+    return [classes flex_mapped:^id(Class cls, NSUInteger idx) {
+        return [FLEXStaticMetadata_Class withClass:cls];
+    }];
+}
+
 + (instancetype)style:(FLEXStaticMetadataRowStyle)style title:(NSString *)title string:(NSString *)string {
 + (instancetype)style:(FLEXStaticMetadataRowStyle)style title:(NSString *)title string:(NSString *)string {
     return [[self alloc] initWithStyle:style title:title subtitle:string];
     return [[self alloc] initWithStyle:style title:title subtitle:string];
 }
 }
@@ -351,3 +370,32 @@
 }
 }
 
 
 @end
 @end
+
+
+#pragma mark FLEXStaticMetadata_Class
+@implementation FLEXStaticMetadata_Class
+
++ (instancetype)withClass:(Class)cls {
+    NSParameterAssert(cls);
+    
+    FLEXStaticMetadata_Class *metadata = [self new];
+    metadata.metadata = cls;
+    metadata->_name = NSStringFromClass(cls);
+    metadata.reuse = kFLEXDefaultCell;
+    return metadata;
+}
+
+- (id)initWithStyle:(FLEXStaticMetadataRowStyle)style title:(NSString *)title subtitle:(NSString *)subtitle {
+    @throw NSInternalInconsistencyException;
+    return nil;
+}
+
+- (UIViewController *)viewerWithTarget:(id)object {
+    return [FLEXObjectExplorerFactory explorerViewControllerForObject:self.metadata];
+}
+
+- (UITableViewCellAccessoryType)suggestedAccessoryTypeWithTarget:(id)object {
+    return UITableViewCellAccessoryDisclosureIndicator;
+}
+
+@end