Procházet zdrojové kódy

Namespace files in RuntimeBrowser/

Tanner Bennett před 6 roky
rodič
revize
907b315601
30 změnil soubory, kde provedl 415 přidání a 422 odebrání
  1. 0 0
      Classes/Editing/FLEXArgumentInputViewFactory.h
  2. 0 0
      Classes/Editing/FLEXArgumentInputViewFactory.m
  3. 8 9
      Classes/GlobalStateExplorers/RuntimeBrowser/DataSources/TBRuntime.h
  4. 10 11
      Classes/GlobalStateExplorers/RuntimeBrowser/DataSources/TBRuntime.m
  5. 7 6
      Classes/GlobalStateExplorers/RuntimeBrowser/DataSources/TBRuntimeController.h
  6. 25 25
      Classes/GlobalStateExplorers/RuntimeBrowser/DataSources/TBRuntimeController.m
  7. 31 0
      Classes/GlobalStateExplorers/RuntimeBrowser/FLEXKBToolbarButton.h
  8. 13 11
      Classes/GlobalStateExplorers/RuntimeBrowser/TBToolbarButton.m
  9. 5 5
      Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPathSearchController.h
  10. 22 22
      Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPathSearchController.m
  11. 18 0
      Classes/GlobalStateExplorers/RuntimeBrowser/FLEXKeyboardToolbar.h
  12. 7 5
      Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyboardToolbar.m
  13. 6 9
      Classes/GlobalStateExplorers/RuntimeBrowser/FLEXObjcRuntimeViewController.m
  14. 18 0
      Classes/GlobalStateExplorers/RuntimeBrowser/FLEXRuntimeBrowserToolbar.h
  15. 92 0
      Classes/GlobalStateExplorers/RuntimeBrowser/FLEXRuntimeBrowserToolbar.m
  16. 9 10
      Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPath.h
  17. 18 19
      Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPath.m
  18. 4 5
      Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPathTokenizer.h
  19. 18 19
      Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPathTokenizer.m
  20. 2 3
      Classes/GlobalStateExplorers/RuntimeBrowser/TBToken.h
  21. 16 16
      Classes/GlobalStateExplorers/RuntimeBrowser/TBToken.m
  22. 0 19
      Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPathToolbar.h
  23. 0 93
      Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPathToolbar.m
  24. 0 20
      Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyboardToolbar.h
  25. 0 29
      Classes/GlobalStateExplorers/RuntimeBrowser/TBToolbarButton.h
  26. 1 1
      Classes/GlobalStateExplorers/SystemLog/FLEXSystemLogViewController.m
  27. 2 2
      Classes/Utility/Categories/UIGestureRecognizer+Blocks.m
  28. 1 1
      Classes/Utility/Runtime/fishhook.c
  29. 0 0
      Classes/Utility/Runtime/flex_fishhook.h
  30. 82 82
      FLEX.xcodeproj/project.pbxproj

Classes/Editing/ArgumentInputViews/FLEXArgumentInputViewFactory.h → Classes/Editing/FLEXArgumentInputViewFactory.h


Classes/Editing/ArgumentInputViews/FLEXArgumentInputViewFactory.m → Classes/Editing/FLEXArgumentInputViewFactory.m


+ 8 - 9
Classes/GlobalStateExplorers/RuntimeBrowser/DataSources/TBRuntime.h

@@ -1,21 +1,20 @@
 //
-//  FLEXRuntime.h
+//  FLEXRuntimeClient.h
 //  FLEX
 //
 //  Created by Tanner on 3/22/17.
 //  Copyright © 2017 Tanner Bennett. All rights reserved.
 //
 
-#import "TBToken.h"
+#import "FLEXSearchToken.h"
 @class FLEXMethod;
 
-
 /// Accepts runtime queries given a token.
-@interface TBRuntime : NSObject
+@interface FLEXRuntimeClient : NSObject
 
 + (instancetype)runtime;
 
-/// Called automatically when \c TBRuntime is first used.
+/// Called automatically when \c FLEXRuntime is first used.
 /// You may call it again when you think a library has
 /// been loaded since this method was first called.
 - (void)reloadLibrariesList;
@@ -29,15 +28,15 @@
 - (NSString *)imageNameForShortName:(NSString *)imageName;
 
 /// @return Bundle names for the UI
-- (NSMutableArray<NSString *> *)bundleNamesForToken:(TBToken *)token;
+- (NSMutableArray<NSString *> *)bundleNamesForToken:(FLEXSearchToken *)token;
 /// @return Bundle paths for more queries
-- (NSMutableArray<NSString *> *)bundlePathsForToken:(TBToken *)token;
+- (NSMutableArray<NSString *> *)bundlePathsForToken:(FLEXSearchToken *)token;
 /// @return Class names
-- (NSMutableArray<NSString *> *)classesForToken:(TBToken *)token
+- (NSMutableArray<NSString *> *)classesForToken:(FLEXSearchToken *)token
                                       inBundles:(NSMutableArray<NSString *> *)bundlePaths;
 /// @return A list of lists of \c FLEXMethods where
 /// each list corresponds to one of the given classes
-- (NSArray<NSMutableArray<FLEXMethod *> *> *)methodsForToken:(TBToken *)token
+- (NSArray<NSMutableArray<FLEXMethod *> *> *)methodsForToken:(FLEXSearchToken *)token
                                       instance:(NSNumber *)onlyInstanceMethods
                                      inClasses:(NSArray<NSString*> *)classes;
 

+ 10 - 11
Classes/GlobalStateExplorers/RuntimeBrowser/DataSources/TBRuntime.m

@@ -1,25 +1,24 @@
 //
-//  FLEXRuntime.m
+//  FLEXRuntimeClient.m
 //  FLEX
 //
 //  Created by Tanner on 3/22/17.
 //  Copyright © 2017 Tanner Bennett. All rights reserved.
 //
 
-#import "TBRuntime.h"
+#import "FLEXRuntimeClient.h"
 #import "NSObject+Reflection.h"
 #import "FLEXMethod.h"
 #import "NSArray+Functional.h"
 #import "FLEXRuntimeSafety.h"
 
-
 #define Equals(a, b)    ([a compare:b options:NSCaseInsensitiveSearch] == NSOrderedSame)
 #define Contains(a, b)  ([a rangeOfString:b options:NSCaseInsensitiveSearch].location != NSNotFound)
 #define HasPrefix(a, b) ([a rangeOfString:b options:NSCaseInsensitiveSearch].location == 0)
 #define HasSuffix(a, b) ([a rangeOfString:b options:NSCaseInsensitiveSearch].location == (a.length - b.length))
 
 
-@interface TBRuntime () {
+@interface FLEXRuntimeClient () {
     NSMutableArray<NSString*> *_imageDisplayNames;
 }
 
@@ -73,12 +72,12 @@ static inline NSString * TBWildcardMap(NSString *token, NSString *candidate, TBW
     return TBWildcardMap_(token, candidate, candidate, options);
 }
 
-@implementation TBRuntime
+@implementation FLEXRuntimeClient
 
 #pragma mark - Initialization
 
 + (instancetype)runtime {
-    static TBRuntime *runtime;
+    static FLEXRuntimeClient *runtime;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         runtime = [self new];
@@ -188,7 +187,7 @@ static inline NSString * TBWildcardMap(NSString *token, NSString *candidate, TBW
 
 #pragma mark - Public
 
-- (NSMutableArray<NSString*> *)bundleNamesForToken:(TBToken *)token {
+- (NSMutableArray<NSString*> *)bundleNamesForToken:(FLEXSearchToken *)token {
     if (self.imagePaths.count) {
         TBWildcardOptions options = token.options;
         NSString *query = token.string;
@@ -208,7 +207,7 @@ static inline NSString * TBWildcardMap(NSString *token, NSString *candidate, TBW
     return [NSMutableArray array];
 }
 
-- (NSMutableArray<NSString*> *)bundlePathsForToken:(TBToken *)token {
+- (NSMutableArray<NSString*> *)bundlePathsForToken:(FLEXSearchToken *)token {
     if (self.imagePaths.count) {
         TBWildcardOptions options = token.options;
         NSString *query = token.string;
@@ -228,7 +227,7 @@ static inline NSString * TBWildcardMap(NSString *token, NSString *candidate, TBW
     return [NSMutableArray array];
 }
 
-- (NSMutableArray<NSString*> *)classesForToken:(TBToken *)token inBundles:(NSMutableArray<NSString*> *)bundles {
+- (NSMutableArray<NSString*> *)classesForToken:(FLEXSearchToken *)token inBundles:(NSMutableArray<NSString*> *)bundles {
     // Edge case where token is the class we want already; return superclasses
     if (token.isAbsolute) {
         if (FLEXClassIsSafe(NSClassFromString(token.string))) {
@@ -251,7 +250,7 @@ static inline NSString * TBWildcardMap(NSString *token, NSString *candidate, TBW
     return [NSMutableArray array];
 }
 
-- (NSMutableArray<NSString*> *)_classesForToken:(TBToken *)token inBundles:(NSMutableArray<NSString*> *)bundles {
+- (NSMutableArray<NSString*> *)_classesForToken:(FLEXSearchToken *)token inBundles:(NSMutableArray<NSString*> *)bundles {
     TBWildcardOptions options = token.options;
     NSString *query = token.string;
 
@@ -282,7 +281,7 @@ static inline NSString * TBWildcardMap(NSString *token, NSString *candidate, TBW
     }
 }
 
-- (NSArray<NSMutableArray<FLEXMethod *> *> *)methodsForToken:(TBToken *)token
+- (NSArray<NSMutableArray<FLEXMethod *> *> *)methodsForToken:(FLEXSearchToken *)token
                                                     instance:(NSNumber *)checkInstance
                                                    inClasses:(NSArray<NSString *> *)classes {
     if (classes.count) {

+ 7 - 6
Classes/GlobalStateExplorers/RuntimeBrowser/DataSources/TBRuntimeController.h

@@ -3,27 +3,28 @@
 //  FLEX
 //
 //  Created by Tanner on 3/23/17.
+//  Copyright © 2017 Tanner Bennett. All rights reserved.
 //
 
-#import "TBKeyPath.h"
+#import "FLEXRuntimeKeyPath.h"
 
-
-@interface TBRuntimeController : NSObject
+/// Wraps FLEXRuntimeClient and provides caching mechanisms
+@interface FLEXRuntimeController : NSObject
 
 /// @return An array of strings if the key path only evaluates
 ///         to a class or bundle; otherwise, a list of lists of FLEXMethods.
-+ (NSArray *)dataForKeyPath:(TBKeyPath *)keyPath;
++ (NSArray *)dataForKeyPath:(FLEXRuntimeKeyPath *)keyPath;
 
 /// Useful when you need to specify which classes to search in.
 /// \c dataForKeyPath: will only search classes matching the class key.
 /// We use this elsewhere when we need to search a class hierarchy.
-+ (NSArray<NSArray<FLEXMethod *> *> *)methodsForToken:(TBToken *)token
++ (NSArray<NSArray<FLEXMethod *> *> *)methodsForToken:(FLEXSearchToken *)token
                                              instance:(NSNumber *)onlyInstanceMethods
                                             inClasses:(NSArray<NSString*> *)classes;
 
 /// Useful when you need the classes that are associated with the
 /// double list of methods returned from \c dataForKeyPath
-+ (NSMutableArray<NSString *> *)classesForKeyPath:(TBKeyPath *)keyPath;
++ (NSMutableArray<NSString *> *)classesForKeyPath:(FLEXRuntimeKeyPath *)keyPath;
 
 + (NSString *)shortBundleNameForClass:(NSString *)name;
 

+ 25 - 25
Classes/GlobalStateExplorers/RuntimeBrowser/DataSources/TBRuntimeController.m

@@ -3,25 +3,25 @@
 //  FLEX
 //
 //  Created by Tanner on 3/23/17.
+//  Copyright © 2017 Tanner Bennett. All rights reserved.
 //
 
-#import "TBRuntimeController.h"
-#import "TBRuntime.h"
+#import "FLEXRuntimeController.h"
+#import "FLEXRuntimeClient.h"
 #import "FLEXMethod.h"
 
-
-@interface TBRuntimeController ()
+@interface FLEXRuntimeController ()
 @property (nonatomic, readonly) NSCache *bundlePathsCache;
 @property (nonatomic, readonly) NSCache *bundleNamesCache;
 @property (nonatomic, readonly) NSCache *classNamesCache;
 @property (nonatomic, readonly) NSCache *methodsCache;
 @end
 
-@implementation TBRuntimeController
+@implementation FLEXRuntimeController
 
 #pragma mark Initialization
 
-static TBRuntimeController *controller = nil;
+static FLEXRuntimeController *controller = nil;
 + (instancetype)shared {
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
@@ -45,7 +45,7 @@ static TBRuntimeController *controller = nil;
 
 #pragma mark Public
 
-+ (NSArray *)dataForKeyPath:(TBKeyPath *)keyPath {
++ (NSArray *)dataForKeyPath:(FLEXRuntimeKeyPath *)keyPath {
     if (keyPath.bundleKey) {
         if (keyPath.classKey) {
             if (keyPath.methodKey) {
@@ -61,17 +61,17 @@ static TBRuntimeController *controller = nil;
     }
 }
 
-+ (NSArray<NSArray<FLEXMethod *> *> *)methodsForToken:(TBToken *)token
++ (NSArray<NSArray<FLEXMethod *> *> *)methodsForToken:(FLEXSearchToken *)token
                          instance:(NSNumber *)inst
                         inClasses:(NSArray<NSString*> *)classes {
-    return [[TBRuntime runtime]
+    return [[FLEXRuntimeClient runtime]
         methodsForToken:token
         instance:inst
         inClasses:classes
     ];
 }
 
-+ (NSMutableArray<NSString *> *)classesForKeyPath:(TBKeyPath *)keyPath {
++ (NSMutableArray<NSString *> *)classesForKeyPath:(FLEXRuntimeKeyPath *)keyPath {
     return [[self shared] classesForKeyPath:keyPath];
 }
 
@@ -81,20 +81,20 @@ static TBRuntimeController *controller = nil;
         return @"(unspecified)";
     }
     
-    return [[TBRuntime runtime] shortNameForImageName:@(imageName)];
+    return [[FLEXRuntimeClient runtime] shortNameForImageName:@(imageName)];
 }
 
 + (NSString *)imagePathWithShortName:(NSString *)suffix {
-    return [[TBRuntime runtime] imageNameForShortName:suffix];
+    return [[FLEXRuntimeClient runtime] imageNameForShortName:suffix];
 }
 
 + (NSArray *)allBundleNames {
-    return [TBRuntime runtime].imageDisplayNames;
+    return [FLEXRuntimeClient runtime].imageDisplayNames;
 }
 
 #pragma mark Private
 
-- (NSMutableArray *)bundlePathsForToken:(TBToken *)token {
+- (NSMutableArray *)bundlePathsForToken:(FLEXSearchToken *)token {
     // Only cache if no wildcard
     BOOL shouldCache = token == TBWildcardOptionsNone;
 
@@ -104,16 +104,16 @@ static TBRuntimeController *controller = nil;
             return cached;
         }
 
-        NSMutableArray<NSString*> *bundles = [[TBRuntime runtime] bundlePathsForToken:token];
+        NSMutableArray<NSString*> *bundles = [[FLEXRuntimeClient runtime] bundlePathsForToken:token];
         [self.bundlePathsCache setObject:bundles forKey:token];
         return bundles;
     }
     else {
-        return [[TBRuntime runtime] bundlePathsForToken:token];
+        return [[FLEXRuntimeClient runtime] bundlePathsForToken:token];
     }
 }
 
-- (NSMutableArray<NSString *> *)bundleNamesForToken:(TBToken *)token {
+- (NSMutableArray<NSString *> *)bundleNamesForToken:(FLEXSearchToken *)token {
     // Only cache if no wildcard
     BOOL shouldCache = token == TBWildcardOptionsNone;
 
@@ -123,18 +123,18 @@ static TBRuntimeController *controller = nil;
             return cached;
         }
 
-        NSMutableArray<NSString*> *bundles = [[TBRuntime runtime] bundleNamesForToken:token];
+        NSMutableArray<NSString*> *bundles = [[FLEXRuntimeClient runtime] bundleNamesForToken:token];
         [self.bundleNamesCache setObject:bundles forKey:token];
         return bundles;
     }
     else {
-        return [[TBRuntime runtime] bundleNamesForToken:token];
+        return [[FLEXRuntimeClient runtime] bundleNamesForToken:token];
     }
 }
 
-- (NSMutableArray<NSString *> *)classesForKeyPath:(TBKeyPath *)keyPath {
-    TBToken *classToken = keyPath.classKey;
-    TBToken *bundleToken = keyPath.bundleKey;
+- (NSMutableArray<NSString *> *)classesForKeyPath:(FLEXRuntimeKeyPath *)keyPath {
+    FLEXSearchToken *classToken = keyPath.classKey;
+    FLEXSearchToken *bundleToken = keyPath.bundleKey;
     
     // Only cache if no wildcard
     BOOL shouldCache = bundleToken.options == 0 && classToken.options == 0;
@@ -149,7 +149,7 @@ static TBRuntimeController *controller = nil;
     }
 
     NSMutableArray *bundles = [self bundlePathsForToken:bundleToken];
-    NSMutableArray *classes = [[TBRuntime runtime] classesForToken:classToken inBundles:bundles];
+    NSMutableArray *classes = [[FLEXRuntimeClient runtime] classesForToken:classToken inBundles:bundles];
 
     if (shouldCache) {
         [self.classNamesCache setObject:classes forKey:key];
@@ -158,7 +158,7 @@ static TBRuntimeController *controller = nil;
     return classes;
 }
 
-- (NSArray<NSMutableArray<FLEXMethod *> *> *)methodsForKeyPath:(TBKeyPath *)keyPath {
+- (NSArray<NSMutableArray<FLEXMethod *> *> *)methodsForKeyPath:(FLEXRuntimeKeyPath *)keyPath {
     // Only cache if no wildcard, but check cache anyway bc I'm lazy
     NSArray<NSMutableArray *> *cached = [self.methodsCache objectForKey:keyPath];
     if (cached) {
@@ -166,7 +166,7 @@ static TBRuntimeController *controller = nil;
     }
 
     NSArray<NSString *> *classes = [self classesForKeyPath:keyPath];
-    NSArray<NSMutableArray<FLEXMethod *> *> *methodLists = [[TBRuntime runtime]
+    NSArray<NSMutableArray<FLEXMethod *> *> *methodLists = [[FLEXRuntimeClient runtime]
         methodsForToken:keyPath.methodKey
         instance:keyPath.instanceMethods
         inClasses:classes

+ 31 - 0
Classes/GlobalStateExplorers/RuntimeBrowser/FLEXKBToolbarButton.h

@@ -0,0 +1,31 @@
+//
+//  FLEXKBToolbarButton.h
+//  FLEX
+//
+//  Created by Tanner on 6/11/17.
+//  Copyright © 2017 Tanner Bennett. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void (^FLEXKBToolbarAction)(NSString *buttonTitle, BOOL isSuggestion);
+
+
+@interface FLEXKBToolbarButton : UIButton
+
+/// Set to `default` to use the system appearance on iOS 13+
+@property (nonatomic) UIKeyboardAppearance appearance;
+
++ (instancetype)buttonWithTitle:(NSString *)title;
++ (instancetype)buttonWithTitle:(NSString *)title action:(FLEXKBToolbarAction)eventHandler;
++ (instancetype)buttonWithTitle:(NSString *)title action:(FLEXKBToolbarAction)action forControlEvents:(UIControlEvents)controlEvents;
+
+/// Adds the event handler for the button.
+///
+/// @param eventHandler The event handler block.
+/// @param controlEvent The type of event.
+- (void)addEventHandler:(FLEXKBToolbarAction)eventHandler forControlEvents:(UIControlEvents)controlEvents;
+
+@end
+
+@interface FLEXKBToolbarSuggestedButton : FLEXKBToolbarButton @end

+ 13 - 11
Classes/GlobalStateExplorers/RuntimeBrowser/TBToolbarButton.m

@@ -1,36 +1,38 @@
 //
-//  FLEXToolbarButton.m
+//  FLEXKBToolbarButton.m
+//  FLEX
 //
 //  Created by Tanner on 6/11/17.
+//  Copyright © 2017 Tanner Bennett. All rights reserved.
 //
 
-#import "TBToolbarButton.h"
+#import "FLEXKBToolbarButton.h"
 #import "UIFont+FLEX.h"
 #import "FLEXUtility.h"
 #import "CALayer+FLEX.h"
 
-@interface TBToolbarButton ()
+@interface FLEXKBToolbarButton ()
 @property (nonatomic      ) NSString *title;
-@property (nonatomic, copy) TBToolbarAction buttonPressBlock;
+@property (nonatomic, copy) FLEXKBToolbarAction buttonPressBlock;
 /// YES if appearance is set to `default`
 @property (nonatomic, readonly) BOOL useSystemAppearance;
 /// YES if the current trait collection is set to dark mode and \c useSystemAppearance is YES
 @property (nonatomic, readonly) BOOL usingDarkMode;
 @end
 
-@implementation TBToolbarButton
+@implementation FLEXKBToolbarButton
 
 + (instancetype)buttonWithTitle:(NSString *)title {
     return [[self alloc] initWithTitle:title];
 }
 
-+ (instancetype)buttonWithTitle:(NSString *)title action:(TBToolbarAction)eventHandler forControlEvents:(UIControlEvents)controlEvent {
-    TBToolbarButton *newButton = [self buttonWithTitle:title];
++ (instancetype)buttonWithTitle:(NSString *)title action:(FLEXKBToolbarAction)eventHandler forControlEvents:(UIControlEvents)controlEvent {
+    FLEXKBToolbarButton *newButton = [self buttonWithTitle:title];
     [newButton addEventHandler:eventHandler forControlEvents:controlEvent];
     return newButton;
 }
 
-+ (instancetype)buttonWithTitle:(NSString *)title action:(TBToolbarAction)eventHandler {
++ (instancetype)buttonWithTitle:(NSString *)title action:(FLEXKBToolbarAction)eventHandler {
     return [self buttonWithTitle:title action:eventHandler forControlEvents:UIControlEventTouchUpInside];
 }
 
@@ -63,7 +65,7 @@
     return self;
 }
 
-- (void)addEventHandler:(TBToolbarAction)eventHandler forControlEvents:(UIControlEvents)controlEvent {
+- (void)addEventHandler:(FLEXKBToolbarAction)eventHandler forControlEvents:(UIControlEvents)controlEvent {
     self.buttonPressBlock = eventHandler;
     [self addTarget:self action:@selector(buttonPressed) forControlEvents:controlEvent];
 }
@@ -113,7 +115,7 @@
 }
 
 - (BOOL)isEqual:(id)object {
-    if ([object isKindOfClass:[TBToolbarButton class]]) {
+    if ([object isKindOfClass:[FLEXKBToolbarButton class]]) {
         return [self.title isEqualToString:[object title]];
     }
 
@@ -151,7 +153,7 @@
 @end
 
 
-@implementation TBToolbarSuggestedButton
+@implementation FLEXKBToolbarSuggestedButton
 
 - (void)buttonPressed {
     self.buttonPressBlock(self.title, YES);

+ 5 - 5
Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPathSearchController.h

@@ -7,10 +7,10 @@
 //
 
 #import <UIKit/UIKit.h>
-#import "TBKeyPathToolbar.h"
+#import "FLEXRuntimeBrowserToolbar.h"
 #import "FLEXMethod.h"
 
-@protocol TBKeyPathSearchControllerDelegate <UITableViewDataSource>
+@protocol FLEXKeyPathSearchControllerDelegate <UITableViewDataSource>
 
 @property (nonatomic, readonly) UITableView *tableView;
 @property (nonatomic, readonly) UISearchController *searchController;
@@ -23,11 +23,11 @@
 @end
 
 
-@interface TBKeyPathSearchController : NSObject <UISearchBarDelegate, UITableViewDataSource, UITableViewDelegate>
+@interface FLEXKeyPathSearchController : NSObject <UISearchBarDelegate, UITableViewDataSource, UITableViewDelegate>
 
-+ (instancetype)delegate:(id<TBKeyPathSearchControllerDelegate>)delegate;
++ (instancetype)delegate:(id<FLEXKeyPathSearchControllerDelegate>)delegate;
 
-@property (nonatomic) TBKeyPathToolbar *toolbar;
+@property (nonatomic) FLEXRuntimeBrowserToolbar *toolbar;
 
 /// Suggestions for the toolbar
 @property (nonatomic, readonly) NSArray<NSString *> *suggestions;

+ 22 - 22
Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPathSearchController.m

@@ -6,9 +6,9 @@
 //  Copyright © 2017 Tanner Bennett. All rights reserved.
 //
 
-#import "TBKeyPathSearchController.h"
-#import "TBKeyPathTokenizer.h"
-#import "TBRuntimeController.h"
+#import "FLEXKeyPathSearchController.h"
+#import "FLEXRuntimeKeyPathTokenizer.h"
+#import "FLEXRuntimeController.h"
 #import "NSString+FLEX.h"
 #import "NSArray+Functional.h"
 #import "UITextField+Range.h"
@@ -17,15 +17,15 @@
 #import "FLEXUtility.h"
 #import "FLEXObjectExplorerFactory.h"
 
-@interface TBKeyPathSearchController ()
-@property (nonatomic, readonly, weak) id<TBKeyPathSearchControllerDelegate> delegate;
+@interface FLEXKeyPathSearchController ()
+@property (nonatomic, readonly, weak) id<FLEXKeyPathSearchControllerDelegate> delegate;
 @property (nonatomic) NSTimer *timer;
 /// If \c keyPath is \c nil or if it only has a \c bundleKey, this is
 /// a list of bundle key path components like \c UICatalog or \c UIKit\.framework
 /// If \c keyPath has more than a \c bundleKey then it is a list of class names.
 @property (nonatomic) NSArray<NSString *> *bundlesOrClasses;
 /// nil when search bar is empty
-@property (nonatomic) TBKeyPath *keyPath;
+@property (nonatomic) FLEXRuntimeKeyPath *keyPath;
 
 @property (nonatomic, readonly) NSString *emptySuggestion;
 
@@ -42,11 +42,11 @@
 @property (nonatomic) NSArray<NSArray<FLEXMethod *> *> *classesToMethods;
 @end
 
-@implementation TBKeyPathSearchController
+@implementation FLEXKeyPathSearchController
 
-+ (instancetype)delegate:(id<TBKeyPathSearchControllerDelegate>)delegate {
-    TBKeyPathSearchController *controller = [self new];
-    controller->_bundlesOrClasses = [TBRuntimeController allBundleNames];
++ (instancetype)delegate:(id<FLEXKeyPathSearchControllerDelegate>)delegate {
+    FLEXKeyPathSearchController *controller = [self new];
+    controller->_bundlesOrClasses = [FLEXRuntimeController allBundleNames];
     controller->_delegate         = delegate;
     controller->_emptySuggestion  = NSBundle.mainBundle.executablePath.lastPathComponent;
 
@@ -73,7 +73,7 @@
     }
 }
 
-- (void)setToolbar:(TBKeyPathToolbar *)toolbar {
+- (void)setToolbar:(FLEXRuntimeBrowserToolbar *)toolbar {
     _toolbar = toolbar;
     self.delegate.searchController.searchBar.inputAccessoryView = toolbar;
 }
@@ -104,7 +104,7 @@
     NSString *keyPath = [orig stringByReplacingLastKeyPathComponent:text];
     self.delegate.searchController.searchBar.text = keyPath;
 
-    self.keyPath = [TBKeyPathTokenizer tokenizeString:keyPath];
+    self.keyPath = [FLEXRuntimeKeyPathTokenizer tokenizeString:keyPath];
 
     // Get classes if class was selected
     if (self.keyPath.classKey.isAbsolute && self.keyPath.methodKey.isAny) {
@@ -169,14 +169,14 @@
             // Here, our class key is 'absolute'; .classes is a list of superclasses
             // and we want to show the methods for those classes specifically
             // TODO: add caching to this somehow
-            NSMutableArray *methods = [TBRuntimeController
+            NSMutableArray *methods = [FLEXRuntimeController
                 methodsForToken:self.keyPath.methodKey
                 instance:self.keyPath.instanceMethods
                 inClasses:self.classes
             ].mutableCopy;
             
             // Remove classes without results if we're searching for a method
-            TBToken *methodKey = self.keyPath.methodKey;
+            FLEXSearchToken *methodKey = self.keyPath.methodKey;
             if (methodKey && !methodKey.isAny) {
                 [self setNonEmptyMethodLists:methods withClasses:self.classes.mutableCopy];
             } else {
@@ -184,13 +184,13 @@
             }
         }
         else {
-            TBKeyPath *keyPath = self.keyPath;
-            NSArray *models = [TBRuntimeController dataForKeyPath:keyPath];
+            FLEXRuntimeKeyPath *keyPath = self.keyPath;
+            NSArray *models = [FLEXRuntimeController dataForKeyPath:keyPath];
             if (keyPath.methodKey) { // We're looking at methods
                 self.bundlesOrClasses = nil;
                 
                 NSMutableArray *methods = models.mutableCopy;
-                NSMutableArray *classes = [TBRuntimeController classesForKeyPath:keyPath];
+                NSMutableArray *classes = [FLEXRuntimeController classesForKeyPath:keyPath];
                 self.classes = classes.copy;
                 [self setNonEmptyMethodLists:methods withClasses:classes];
             } else { // We're looking at bundles or classes
@@ -227,7 +227,7 @@
 
 - (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
     // Check if character is even legal
-    if (![TBKeyPathTokenizer allowedInKeyPath:text]) {
+    if (![FLEXRuntimeKeyPathTokenizer allowedInKeyPath:text]) {
         return NO;
     }
     
@@ -240,7 +240,7 @@
     // Actually parse input
     @try {
         text = [searchBar.text stringByReplacingCharactersInRange:range withString:text] ?: text;
-        self.keyPath = [TBKeyPathTokenizer tokenizeString:text];
+        self.keyPath = [FLEXRuntimeKeyPathTokenizer tokenizeString:text];
         if (self.keyPath.classKey.isAbsolute && terminatedToken) {
             [self didSelectAbsoluteClass:self.keyPath.classKey.string];
         }
@@ -267,7 +267,7 @@
     }
     // ... or remove all rows
     else {
-        _bundlesOrClasses = [TBRuntimeController allBundleNames];
+        _bundlesOrClasses = [FLEXRuntimeController allBundleNames];
         _classesToMethods = nil;
         _classes = nil;
         _keyPath = nil;
@@ -277,7 +277,7 @@
 }
 
 - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
-    self.keyPath = [TBKeyPath empty];
+    self.keyPath = [FLEXRuntimeKeyPath empty];
     [self updateTable];
 }
 
@@ -397,7 +397,7 @@
 
 - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
     NSString *bundleSuffixOrClass = self.bundlesOrClasses[indexPath.row];
-    NSString *imagePath = [TBRuntimeController imagePathWithShortName:bundleSuffixOrClass];
+    NSString *imagePath = [FLEXRuntimeController imagePathWithShortName:bundleSuffixOrClass];
     NSBundle *bundle = [NSBundle bundleWithPath:imagePath.stringByDeletingLastPathComponent];
 
     if (bundle) {

+ 18 - 0
Classes/GlobalStateExplorers/RuntimeBrowser/FLEXKeyboardToolbar.h

@@ -0,0 +1,18 @@
+//
+//  FLEXKeyboardToolbar.h
+//  FLEX
+//
+//  Created by Tanner on 6/11/17.
+//  Copyright © 2017 Tanner Bennett. All rights reserved.
+//
+
+#import "FLEXKBToolbarButton.h"
+
+@interface FLEXKeyboardToolbar : UIView
+
++ (instancetype)toolbarWithButtons:(NSArray *)buttons;
+
+@property (nonatomic) NSArray<FLEXKBToolbarButton*> *buttons;
+@property (nonatomic) UIKeyboardAppearance appearance;
+
+@end

+ 7 - 5
Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyboardToolbar.m

@@ -1,17 +1,19 @@
 //
 //  FLEXKeyboardToolbar.m
+//  FLEX
 //
 //  Created by Tanner on 6/11/17.
+//  Copyright © 2017 Tanner Bennett. All rights reserved.
 //
 
-#import "TBKeyboardToolbar.h"
+#import "FLEXKeyboardToolbar.h"
 #import "FLEXUtility.h"
 
 #define kToolbarHeight 44
 #define kButtonSpacing 6
 #define kScrollViewHorizontalMargins 3
 
-@interface TBKeyboardToolbar ()
+@interface FLEXKeyboardToolbar ()
 
 /// The fake top border to replicate the toolbar.
 @property (nonatomic) CALayer      *topBorder;
@@ -24,7 +26,7 @@
 @property (nonatomic, readonly) BOOL usingDarkMode;
 @end
 
-@implementation TBKeyboardToolbar
+@implementation FLEXKeyboardToolbar
 
 + (instancetype)toolbarWithButtons:(NSArray *)buttons {
     return [[self alloc] initWithButtons:buttons];
@@ -164,7 +166,7 @@
     CGFloat top    = self.scrollView.contentInset.top;
     CGFloat bottom = self.scrollView.contentInset.bottom;
     
-    for (TBToolbarButton *button in self.buttons) {
+    for (FLEXKBToolbarButton *button in self.buttons) {
         button.appearance = self.appearance;
         
         originFrame             = button.frame;
@@ -191,7 +193,7 @@
     [self setNeedsLayout];
 }
 
-- (void)setButtons:(NSArray<TBToolbarButton *> *)buttons {
+- (void)setButtons:(NSArray<FLEXKBToolbarButton *> *)buttons {
     [_buttons makeObjectsPerformSelector:@selector(removeFromSuperview)];
     _buttons = buttons.copy;
     

+ 6 - 9
Classes/GlobalStateExplorers/RuntimeBrowser/FLEXObjcRuntimeViewController.m

@@ -7,21 +7,18 @@
 //
 
 #import "FLEXObjcRuntimeViewController.h"
-#import "TBKeyPathSearchController.h"
-#import "TBKeyPathToolbar.h"
+#import "FLEXKeyPathSearchController.h"
+#import "FLEXRuntimeBrowserToolbar.h"
 #import "UIGestureRecognizer+Blocks.h"
 #import "FLEXTableView.h"
 #import "FLEXObjectExplorerFactory.h"
 #import "FLEXAlert.h"
 
+@interface FLEXObjcRuntimeViewController () <FLEXKeyPathSearchControllerDelegate>
 
-@interface FLEXObjcRuntimeViewController () <TBKeyPathSearchControllerDelegate>
-
-@property (nonatomic, readonly ) TBKeyPathSearchController *keyPathController;
+@property (nonatomic, readonly ) FLEXKeyPathSearchController *keyPathController;
 @property (nonatomic, readonly ) UIView *promptView;
 
-// .@property (nonatomic, readonly) void (^callback)();
-
 @end
 
 @implementation FLEXObjcRuntimeViewController
@@ -44,9 +41,9 @@
     // key path controller automatically assigns itself as the delegate of the search bar
     // To avoid a retain cycle below, use local variables
     UISearchBar *searchBar = self.searchController.searchBar;
-    TBKeyPathSearchController *keyPathController = [TBKeyPathSearchController delegate:self];
+    FLEXKeyPathSearchController *keyPathController = [FLEXKeyPathSearchController delegate:self];
     _keyPathController = keyPathController;
-    _keyPathController.toolbar = [TBKeyPathToolbar toolbarWithHandler:^(NSString *text, BOOL suggestion) {
+    _keyPathController.toolbar = [FLEXRuntimeBrowserToolbar toolbarWithHandler:^(NSString *text, BOOL suggestion) {
         if (suggestion) {
             [keyPathController didSelectKeyPathOption:text];
         } else {

+ 18 - 0
Classes/GlobalStateExplorers/RuntimeBrowser/FLEXRuntimeBrowserToolbar.h

@@ -0,0 +1,18 @@
+//
+//  FLEXRuntimeBrowserToolbar.h
+//  FLEX
+//
+//  Created by Tanner on 6/11/17.
+//  Copyright © 2017 Tanner Bennett. All rights reserved.
+//
+
+#import "FLEXKeyboardToolbar.h"
+#import "FLEXRuntimeKeyPath.h"
+
+@interface FLEXRuntimeBrowserToolbar : FLEXKeyboardToolbar
+
++ (instancetype)toolbarWithHandler:(FLEXKBToolbarAction)tapHandler suggestions:(NSArray<NSString *> *)suggestions;
+
+- (void)setKeyPath:(FLEXRuntimeKeyPath *)keyPath suggestions:(NSArray<NSString *> *)suggestions;
+
+@end

+ 92 - 0
Classes/GlobalStateExplorers/RuntimeBrowser/FLEXRuntimeBrowserToolbar.m

@@ -0,0 +1,92 @@
+//
+//  FLEXRuntimeBrowserToolbar.m
+//  FLEX
+//
+//  Created by Tanner on 6/11/17.
+//  Copyright © 2017 Tanner Bennett. All rights reserved.
+//
+
+#import "FLEXRuntimeBrowserToolbar.h"
+#import "FLEXRuntimeKeyPathTokenizer.h"
+
+@interface FLEXRuntimeBrowserToolbar ()
+@property (nonatomic, copy) FLEXKBToolbarAction tapHandler;
+@end
+
+@implementation FLEXRuntimeBrowserToolbar
+
++ (instancetype)toolbarWithHandler:(FLEXKBToolbarAction)tapHandler suggestions:(NSArray<NSString *> *)suggestions {
+    NSArray *buttons = [self
+        buttonsForKeyPath:FLEXRuntimeKeyPath.empty suggestions:suggestions handler:tapHandler
+    ];
+
+    FLEXRuntimeBrowserToolbar *me = [self toolbarWithButtons:buttons];
+    me.tapHandler = tapHandler;
+    return me;
+}
+
++ (NSArray<FLEXKBToolbarButton*> *)buttonsForKeyPath:(FLEXRuntimeKeyPath *)keyPath
+                                     suggestions:(NSArray<NSString *> *)suggestions
+                                         handler:(FLEXKBToolbarAction)handler {
+    NSMutableArray *buttons = [NSMutableArray array];
+    FLEXSearchToken *lastKey = nil;
+    BOOL lastKeyIsMethod = NO;
+
+    if (keyPath.methodKey) {
+        lastKey = keyPath.methodKey;
+        lastKeyIsMethod = YES;
+    } else {
+        lastKey = keyPath.classKey ?: keyPath.bundleKey;
+    }
+
+    switch (lastKey.options) {
+        case TBWildcardOptionsNone:
+        case TBWildcardOptionsAny:
+            if (lastKeyIsMethod) {
+                if (!keyPath.instanceMethods) {
+                    [buttons addObject:[FLEXKBToolbarButton buttonWithTitle:@"-" action:handler]];
+                    [buttons addObject:[FLEXKBToolbarButton buttonWithTitle:@"+" action:handler]];
+                }
+                [buttons addObject:[FLEXKBToolbarButton buttonWithTitle:@"*" action:handler]];
+            } else {
+                [buttons addObject:[FLEXKBToolbarButton buttonWithTitle:@"*" action:handler]];
+                [buttons addObject:[FLEXKBToolbarButton buttonWithTitle:@"*." action:handler]];
+            }
+            break;
+
+        default: {
+            if (lastKey.options & TBWildcardOptionsPrefix) {
+                if (lastKeyIsMethod) {
+                    if (lastKey.string.length) {
+                        [buttons addObject:[FLEXKBToolbarButton buttonWithTitle:@"*" action:handler]];
+                    }
+                } else {
+                    if (lastKey.string.length) {
+                        [buttons addObject:[FLEXKBToolbarButton buttonWithTitle:@"*." action:handler]];
+                    }
+                }
+            }
+
+            else if (lastKey.options & TBWildcardOptionsSuffix) {
+                if (!lastKeyIsMethod) {
+                    [buttons addObject:[FLEXKBToolbarButton buttonWithTitle:@"*" action:handler]];
+                    [buttons addObject:[FLEXKBToolbarButton buttonWithTitle:@"*." action:handler]];
+                }
+            }
+        }
+    }
+    
+    for (NSString *suggestion in suggestions) {
+        [buttons addObject:[FLEXKBToolbarSuggestedButton buttonWithTitle:suggestion action:handler]];
+    }
+
+    return buttons;
+}
+
+- (void)setKeyPath:(FLEXRuntimeKeyPath *)keyPath suggestions:(NSArray<NSString *> *)suggestions {
+    self.buttons = [self.class
+        buttonsForKeyPath:keyPath suggestions:suggestions handler:self.tapHandler
+    ];
+}
+
+@end

+ 9 - 10
Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPath.h

@@ -1,15 +1,14 @@
 //
-//  FLEXKeyPath.h
+//  FLEXRuntimeKeyPath.h
 //  FLEX
 //
 //  Created by Tanner on 3/22/17.
 //  Copyright © 2017 Tanner Bennett. All rights reserved.
 //
 
-#import "TBToken.h"
+#import "FLEXSearchToken.h"
 @class FLEXMethod;
 
-
 NS_ASSUME_NONNULL_BEGIN
 
 /// A key path represents a query into a set of bundles or classes
@@ -21,20 +20,20 @@ NS_ASSUME_NONNULL_BEGIN
 ///
 /// The @code TBKeyPathTokenizer @endcode class is used to create
 /// a key path from a string.
-@interface TBKeyPath : NSObject
+@interface FLEXRuntimeKeyPath : NSObject
 
 + (instancetype)empty;
 
 /// @param method must start with either a wildcard or a + or -.
-+ (instancetype)bundle:(TBToken *)bundle
-                 class:(TBToken *)cls
-                method:(TBToken *)method
++ (instancetype)bundle:(FLEXSearchToken *)bundle
+                 class:(FLEXSearchToken *)cls
+                method:(FLEXSearchToken *)method
             isInstance:(NSNumber *)instance
                 string:(NSString *)keyPathString;
 
-@property (nonatomic, nullable, readonly) TBToken *bundleKey;
-@property (nonatomic, nullable, readonly) TBToken *classKey;
-@property (nonatomic, nullable, readonly) TBToken *methodKey;
+@property (nonatomic, nullable, readonly) FLEXSearchToken *bundleKey;
+@property (nonatomic, nullable, readonly) FLEXSearchToken *classKey;
+@property (nonatomic, nullable, readonly) FLEXSearchToken *methodKey;
 
 /// Indicates whether the method token specifies instance methods.
 /// Nil if not specified.

+ 18 - 19
Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPath.m

@@ -1,41 +1,40 @@
 //
-//  FLEXKeyPath.m
+//  FLEXRuntimeKeyPath.m
 //  FLEX
 //
 //  Created by Tanner on 3/22/17.
 //  Copyright © 2017 Tanner Bennett. All rights reserved.
 //
 
-#import "TBKeyPath.h"
+#import "FLEXRuntimeKeyPath.h"
 
-
-@interface TBKeyPath () {
-    NSString *tb_description;
+@interface FLEXRuntimeKeyPath () {
+    NSString *flex_description;
 }
 @end
 
-@implementation TBKeyPath
+@implementation FLEXRuntimeKeyPath
 
 + (instancetype)empty {
-    static TBKeyPath *empty = nil;
+    static FLEXRuntimeKeyPath *empty = nil;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
-        TBToken *any = [TBToken any];
+        FLEXSearchToken *any = [FLEXSearchToken any];
 
         empty = [self new];
         empty->_bundleKey = any;
-        empty->tb_description = @"";
+        empty->flex_description = @"";
     });
 
     return empty;
 }
 
-+ (instancetype)bundle:(TBToken *)bundle
-                 class:(TBToken *)cls
-                method:(TBToken *)method
++ (instancetype)bundle:(FLEXSearchToken *)bundle
+                 class:(FLEXSearchToken *)cls
+                method:(FLEXSearchToken *)method
             isInstance:(NSNumber *)instance
                 string:(NSString *)keyPathString {
-    TBKeyPath *keyPath  = [self new];
+    FLEXRuntimeKeyPath *keyPath  = [self new];
     keyPath->_bundleKey = bundle;
     keyPath->_classKey  = cls;
     keyPath->_methodKey = method;
@@ -46,23 +45,23 @@
     if ([keyPathString hasSuffix:@"*"]) {
         keyPathString = [keyPathString substringToIndex:keyPathString.length];
     }
-    keyPath->tb_description = keyPathString;
+    keyPath->flex_description = keyPathString;
 
     return keyPath;
 }
 
 - (NSString *)description {
-    return tb_description;
+    return flex_description;
 }
 
 - (NSUInteger)hash {
-    return tb_description.hash;
+    return flex_description.hash;
 }
 
 - (BOOL)isEqual:(id)object {
-    if ([object isKindOfClass:[TBKeyPath class]]) {
-        TBKeyPath *kp = object;
-        return [tb_description isEqualToString:kp->tb_description];
+    if ([object isKindOfClass:[FLEXRuntimeKeyPath class]]) {
+        FLEXRuntimeKeyPath *kp = object;
+        return [flex_description isEqualToString:kp->flex_description];
     }
 
     return NO;

+ 4 - 5
Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPathTokenizer.h

@@ -1,18 +1,17 @@
 //
-//  FLEXKeyPathTokenizer.h
+//  FLEXRuntimeKeyPathTokenizer.h
 //  FLEX
 //
 //  Created by Tanner on 3/22/17.
 //  Copyright © 2017 Tanner Bennett. All rights reserved.
 //
 
-#import "TBKeyPath.h"
+#import "FLEXRuntimeKeyPath.h"
 
-
-@interface TBKeyPathTokenizer : NSObject
+@interface FLEXRuntimeKeyPathTokenizer : NSObject
 
 + (NSUInteger)tokenCountOfString:(NSString *)userInput;
-+ (TBKeyPath *)tokenizeString:(NSString *)userInput;
++ (FLEXRuntimeKeyPath *)tokenizeString:(NSString *)userInput;
 
 + (BOOL)allowedInKeyPath:(NSString *)text;
 

+ 18 - 19
Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPathTokenizer.m

@@ -1,17 +1,16 @@
 //
-//  FLEXKeyPathTokenizer.m
+//  FLEXRuntimeKeyPathTokenizer.m
 //  FLEX
 //
 //  Created by Tanner on 3/22/17.
 //  Copyright © 2017 Tanner Bennett. All rights reserved.
 //
 
-#import "TBKeyPathTokenizer.h"
+#import "FLEXRuntimeKeyPathTokenizer.h"
 
 #define TBCountOfStringOccurence(target, str) ([target componentsSeparatedByString:str].count - 1)
 
-
-@implementation TBKeyPathTokenizer
+@implementation FLEXRuntimeKeyPathTokenizer
 
 #pragma mark Initialization
 
@@ -38,7 +37,7 @@ static NSCharacterSet *methodAllowed     = nil;
 
 #pragma mark Public
 
-+ (TBKeyPath *)tokenizeString:(NSString *)userInput {
++ (FLEXRuntimeKeyPath *)tokenizeString:(NSString *)userInput {
     if (!userInput.length) {
         return nil;
     }
@@ -54,11 +53,11 @@ static NSCharacterSet *methodAllowed     = nil;
 
     NSNumber *instance = nil;
     NSScanner *scanner = [NSScanner scannerWithString:userInput];
-    TBToken *bundle    = [self scanToken:scanner allowed:filenameAllowed first:filenameAllowed];
-    TBToken *cls       = [self scanToken:scanner allowed:identifierAllowed first:firstAllowed];
-    TBToken *method    = tokens > 2 ? [self scanMethodToken:scanner instance:&instance] : nil;
+    FLEXSearchToken *bundle    = [self scanToken:scanner allowed:filenameAllowed first:filenameAllowed];
+    FLEXSearchToken *cls       = [self scanToken:scanner allowed:identifierAllowed first:firstAllowed];
+    FLEXSearchToken *method    = tokens > 2 ? [self scanMethodToken:scanner instance:&instance] : nil;
 
-    return [TBKeyPath bundle:bundle
+    return [FLEXRuntimeKeyPath bundle:bundle
                        class:cls
                       method:method
                   isInstance:instance
@@ -82,10 +81,10 @@ static NSCharacterSet *methodAllowed     = nil;
     return tokenCount;
 }
 
-+ (TBToken *)scanToken:(NSScanner *)scanner allowed:(NSCharacterSet *)allowedChars first:(NSCharacterSet *)first {
++ (FLEXSearchToken *)scanToken:(NSScanner *)scanner allowed:(NSCharacterSet *)allowedChars first:(NSCharacterSet *)first {
     if (scanner.isAtEnd) {
         if ([scanner.string hasSuffix:@"."] && ![scanner.string hasSuffix:@"\\."]) {
-            return [TBToken string:nil options:TBWildcardOptionsAny];
+            return [FLEXSearchToken string:nil options:TBWildcardOptionsAny];
         }
         return nil;
     }
@@ -99,10 +98,10 @@ static NSCharacterSet *methodAllowed     = nil;
     }
 
     if ([scanner scanString:@"*." intoString:nil]) {
-        return [TBToken string:nil options:TBWildcardOptionsAny];
+        return [FLEXSearchToken string:nil options:TBWildcardOptionsAny];
     } else if ([scanner scanString:@"*" intoString:nil]) {
         if (scanner.isAtEnd) {
-            return [TBToken any];
+            return [FLEXSearchToken any];
         }
         
         options |= TBWildcardOptionsPrefix;
@@ -123,7 +122,7 @@ static NSCharacterSet *methodAllowed     = nil;
                     [token appendString:@"."];
                 } else if (scanner.isAtEnd && options == TBWildcardOptionsPrefix) {
                     // Only allow standalone '\' if prefixed by '*'
-                    return [TBToken any];
+                    return [FLEXSearchToken any];
                 } else {
                     // Token starts with a number, period, or something else not allowed,
                     // or token is a standalone '\' with no '*' prefix
@@ -142,7 +141,7 @@ static NSCharacterSet *methodAllowed     = nil;
                 [token appendString:@"."];
             } else if (scanner.isAtEnd) {
                 // Ignore forward slash not followed by period if at end
-                return [TBToken string:token options:options | TBWildcardOptionsSuffix];
+                return [FLEXSearchToken string:token options:options | TBWildcardOptionsSuffix];
             } else {
                 // Only periods can follow a forward slash
                 @throw NSInternalInconsistencyException;
@@ -175,13 +174,13 @@ static NSCharacterSet *methodAllowed     = nil;
         options |= TBWildcardOptionsSuffix;
     }
 
-    return [TBToken string:token options:options];
+    return [FLEXSearchToken string:token options:options];
 }
 
-+ (TBToken *)scanMethodToken:(NSScanner *)scanner instance:(NSNumber **)instance {
++ (FLEXSearchToken *)scanMethodToken:(NSScanner *)scanner instance:(NSNumber **)instance {
     if (scanner.isAtEnd) {
         if ([scanner.string hasSuffix:@"."]) {
-            return [TBToken string:nil options:TBWildcardOptionsAny];
+            return [FLEXSearchToken string:nil options:TBWildcardOptionsAny];
         }
         return nil;
     }
@@ -210,7 +209,7 @@ static NSCharacterSet *methodAllowed     = nil;
     }
 
     if (scanner.isAtEnd) {
-        return [TBToken string:@"" options:TBWildcardOptionsSuffix];
+        return [FLEXSearchToken string:@"" options:TBWildcardOptionsSuffix];
     }
 
     return [self scanToken:scanner allowed:methodAllowed first:firstAllowed];

+ 2 - 3
Classes/GlobalStateExplorers/RuntimeBrowser/TBToken.h

@@ -1,5 +1,5 @@
 //
-//  FLEXToken.h
+//  FLEXSearchToken.h
 //  FLEX
 //
 //  Created by Tanner on 3/22/17.
@@ -8,7 +8,6 @@
 
 #import <Foundation/Foundation.h>
 
-
 typedef NS_OPTIONS(NSUInteger, TBWildcardOptions) {
     TBWildcardOptionsNone   = 0,
     TBWildcardOptionsAny    = 1,
@@ -18,7 +17,7 @@ typedef NS_OPTIONS(NSUInteger, TBWildcardOptions) {
 
 /// A token may contain wildcards at one or either end,
 /// but not in the middle of the token (as of now).
-@interface TBToken : NSObject
+@interface FLEXSearchToken : NSObject
 
 + (instancetype)any;
 + (instancetype)string:(NSString *)string options:(TBWildcardOptions)options;

+ 16 - 16
Classes/GlobalStateExplorers/RuntimeBrowser/TBToken.m

@@ -1,22 +1,22 @@
 //
-//  FLEXToken.m
+//  FLEXSearchToken.m
 //  FLEX
 //
 //  Created by Tanner on 3/22/17.
 //  Copyright © 2017 Tanner Bennett. All rights reserved.
 //
 
-#import "TBToken.h"
+#import "FLEXSearchToken.h"
 
-
-@interface TBToken () {
-    NSString *tb_description;
+@interface FLEXSearchToken () {
+    NSString *flex_description;
 }
 @end
-@implementation TBToken
+
+@implementation FLEXSearchToken
 
 + (instancetype)any {
-    static TBToken *any = nil;
+    static FLEXSearchToken *any = nil;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         any = [self string:nil options:TBWildcardOptionsAny];
@@ -26,7 +26,7 @@
 }
 
 + (instancetype)string:(NSString *)string options:(TBWildcardOptions)options {
-    TBToken *token  = [self new];
+    FLEXSearchToken *token  = [self new];
     token->_string  = string;
     token->_options = options;
     return token;
@@ -45,16 +45,16 @@
 }
 
 - (NSString *)description {
-    if (tb_description) {
-        return tb_description;
+    if (flex_description) {
+        return flex_description;
     }
 
     switch (_options) {
         case TBWildcardOptionsNone:
-            tb_description = _string;
+            flex_description = _string;
             break;
         case TBWildcardOptionsAny:
-            tb_description = @"*";
+            flex_description = @"*";
             break;
         default: {
             NSMutableString *desc = [NSMutableString string];
@@ -65,11 +65,11 @@
             if (_options & TBWildcardOptionsSuffix) {
                 [desc appendString:@"*"];
             }
-            tb_description = desc;
+            flex_description = desc;
         }
     }
 
-    return tb_description;
+    return flex_description;
 }
 
 - (NSUInteger)hash {
@@ -77,8 +77,8 @@
 }
 
 - (BOOL)isEqual:(id)object {
-    if ([object isKindOfClass:[TBToken class]]) {
-        TBToken *token = object;
+    if ([object isKindOfClass:[FLEXSearchToken class]]) {
+        FLEXSearchToken *token = object;
         return [_string isEqualToString:token->_string] && _options == token->_options;
     }
 

+ 0 - 19
Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPathToolbar.h

@@ -1,19 +0,0 @@
-//
-//  FLEXKeyPathToolbar.h
-//  FLEX
-//
-//  Created by Tanner on 6/11/17.
-//  Copyright © 2017 Tanner Bennett. All rights reserved.
-//
-
-#import "TBKeyboardToolbar.h"
-#import "TBKeyPath.h"
-
-
-@interface TBKeyPathToolbar : TBKeyboardToolbar
-
-+ (instancetype)toolbarWithHandler:(TBToolbarAction)tapHandler suggestions:(NSArray<NSString *> *)suggestions;
-
-- (void)setKeyPath:(TBKeyPath *)keyPath suggestions:(NSArray<NSString *> *)suggestions;
-
-@end

+ 0 - 93
Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyPathToolbar.m

@@ -1,93 +0,0 @@
-//
-//  FLEXKeyPathToolbar.m
-//  FLEX
-//
-//  Created by Tanner on 6/11/17.
-//  Copyright © 2017 Tanner Bennett. All rights reserved.
-//
-
-#import "TBKeyPathToolbar.h"
-#import "TBKeyPathTokenizer.h"
-
-
-@interface TBKeyPathToolbar ()
-@property (nonatomic, copy) TBToolbarAction tapHandler;
-@end
-
-@implementation TBKeyPathToolbar
-
-+ (instancetype)toolbarWithHandler:(TBToolbarAction)tapHandler suggestions:(NSArray<NSString *> *)suggestions {
-    NSArray *buttons = [self
-        buttonsForKeyPath:TBKeyPath.empty suggestions:suggestions handler:tapHandler
-    ];
-
-    TBKeyPathToolbar *me = [self toolbarWithButtons:buttons];
-    me.tapHandler = tapHandler;
-    return me;
-}
-
-+ (NSArray<TBToolbarButton*> *)buttonsForKeyPath:(TBKeyPath *)keyPath
-                                     suggestions:(NSArray<NSString *> *)suggestions
-                                         handler:(TBToolbarAction)handler {
-    NSMutableArray *buttons = [NSMutableArray array];
-    TBToken *lastKey = nil;
-    BOOL lastKeyIsMethod = NO;
-
-    if (keyPath.methodKey) {
-        lastKey = keyPath.methodKey;
-        lastKeyIsMethod = YES;
-    } else {
-        lastKey = keyPath.classKey ?: keyPath.bundleKey;
-    }
-
-    switch (lastKey.options) {
-        case TBWildcardOptionsNone:
-        case TBWildcardOptionsAny:
-            if (lastKeyIsMethod) {
-                if (!keyPath.instanceMethods) {
-                    [buttons addObject:[TBToolbarButton buttonWithTitle:@"-" action:handler]];
-                    [buttons addObject:[TBToolbarButton buttonWithTitle:@"+" action:handler]];
-                }
-                [buttons addObject:[TBToolbarButton buttonWithTitle:@"*" action:handler]];
-            } else {
-                [buttons addObject:[TBToolbarButton buttonWithTitle:@"*" action:handler]];
-                [buttons addObject:[TBToolbarButton buttonWithTitle:@"*." action:handler]];
-            }
-            break;
-
-        default: {
-            if (lastKey.options & TBWildcardOptionsPrefix) {
-                if (lastKeyIsMethod) {
-                    if (lastKey.string.length) {
-                        [buttons addObject:[TBToolbarButton buttonWithTitle:@"*" action:handler]];
-                    }
-                } else {
-                    if (lastKey.string.length) {
-                        [buttons addObject:[TBToolbarButton buttonWithTitle:@"*." action:handler]];
-                    }
-                }
-            }
-
-            else if (lastKey.options & TBWildcardOptionsSuffix) {
-                if (!lastKeyIsMethod) {
-                    [buttons addObject:[TBToolbarButton buttonWithTitle:@"*" action:handler]];
-                    [buttons addObject:[TBToolbarButton buttonWithTitle:@"*." action:handler]];
-                }
-            }
-        }
-    }
-    
-    for (NSString *suggestion in suggestions) {
-        [buttons addObject:[TBToolbarSuggestedButton buttonWithTitle:suggestion action:handler]];
-    }
-
-    return buttons;
-}
-
-- (void)setKeyPath:(TBKeyPath *)keyPath suggestions:(NSArray<NSString *> *)suggestions {
-    self.buttons = [self.class
-        buttonsForKeyPath:keyPath suggestions:suggestions handler:self.tapHandler
-    ];
-}
-
-@end

+ 0 - 20
Classes/GlobalStateExplorers/RuntimeBrowser/TBKeyboardToolbar.h

@@ -1,20 +0,0 @@
-//
-//  FLEXKeyboardToolbar.h
-//
-//  Created by Tanner on 6/11/17.
-//
-
-#import <UIKit/UIKit.h>
-#include <AvailabilityMacros.h>
-
-#import "TBToolbarButton.h"
-
-
-@interface TBKeyboardToolbar : UIView
-
-+ (instancetype)toolbarWithButtons:(NSArray *)buttons;
-
-@property (nonatomic) NSArray<TBToolbarButton*> *buttons;
-@property (nonatomic) UIKeyboardAppearance appearance;
-
-@end

+ 0 - 29
Classes/GlobalStateExplorers/RuntimeBrowser/TBToolbarButton.h

@@ -1,29 +0,0 @@
-//
-//  FLEXToolbarButton.h
-//
-//  Created by Tanner on 6/11/17.
-//
-
-#import <UIKit/UIKit.h>
-
-typedef void (^TBToolbarAction)(NSString *buttonTitle, BOOL isSuggestion);
-
-
-@interface TBToolbarButton : UIButton
-
-/// Set to `default` to use the system appearance on iOS 13+
-@property (nonatomic) UIKeyboardAppearance appearance;
-
-+ (instancetype)buttonWithTitle:(NSString *)title;
-+ (instancetype)buttonWithTitle:(NSString *)title action:(TBToolbarAction)eventHandler;
-+ (instancetype)buttonWithTitle:(NSString *)title action:(TBToolbarAction)action forControlEvents:(UIControlEvents)controlEvents;
-
-/// Adds the event handler for the button.
-///
-/// @param eventHandler The event handler block.
-/// @param controlEvent The type of event.
-- (void)addEventHandler:(TBToolbarAction)eventHandler forControlEvents:(UIControlEvents)controlEvents;
-
-@end
-
-@interface TBToolbarSuggestedButton : TBToolbarButton @end

+ 1 - 1
Classes/GlobalStateExplorers/SystemLog/FLEXSystemLogViewController.m

@@ -16,7 +16,7 @@
 #import "FLEXResources.h"
 #import "UIBarButtonItem+FLEX.h"
 #import "NSUserDefaults+FLEX.h"
-#import "fishhook.h"
+#import "flex_fishhook.h"
 #import <dlfcn.h>
 
 @interface FLEXSystemLogViewController ()

+ 2 - 2
Classes/Utility/Categories/UIGestureRecognizer+Blocks.m

@@ -16,12 +16,12 @@ static void * actionKey;
 
 + (instancetype)action:(GestureBlock)action {
     UIGestureRecognizer *gesture = [[self alloc] initWithTarget:nil action:nil];
-    [gesture addTarget:gesture action:@selector(tb_invoke)];
+    [gesture addTarget:gesture action:@selector(flex_invoke)];
     gesture.action = action;
     return gesture;
 }
 
-- (void)tb_invoke {
+- (void)flex_invoke {
     self.action(self);
 }
 

+ 1 - 1
Classes/Utility/Runtime/fishhook.c

@@ -21,7 +21,7 @@
 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-#include "fishhook.h"
+#include "flex_fishhook.h"
 
 #include <dlfcn.h>
 #include <stdbool.h>

Classes/Utility/Runtime/fishhook.h → Classes/Utility/Runtime/flex_fishhook.h


+ 82 - 82
FLEX.xcodeproj/project.pbxproj

@@ -152,8 +152,8 @@
 		C312A13D23ECE79000E38049 /* FLEXWindowManagerController.h in Headers */ = {isa = PBXBuildFile; fileRef = C312A13B23ECE79000E38049 /* FLEXWindowManagerController.h */; };
 		C313853F23F5C1A10046E63C /* FLEXViewControllersViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = C313853D23F5C1A10046E63C /* FLEXViewControllersViewController.h */; };
 		C313854023F5C1A10046E63C /* FLEXViewControllersViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C313853E23F5C1A10046E63C /* FLEXViewControllersViewController.m */; };
-		C313854823F5F7D50046E63C /* fishhook.c in Sources */ = {isa = PBXBuildFile; fileRef = C313854623F5F7D40046E63C /* fishhook.c */; };
-		C313854923F5F7D50046E63C /* fishhook.h in Headers */ = {isa = PBXBuildFile; fileRef = C313854723F5F7D50046E63C /* fishhook.h */; };
+		C313854823F5F7D50046E63C /* flex_fishhook.c in Sources */ = {isa = PBXBuildFile; fileRef = C313854623F5F7D40046E63C /* flex_fishhook.c */; };
+		C313854923F5F7D50046E63C /* flex_fishhook.h in Headers */ = {isa = PBXBuildFile; fileRef = C313854723F5F7D50046E63C /* flex_fishhook.h */; };
 		C31C4A6923342A2200C35F12 /* FLEXMetadataSection.h in Headers */ = {isa = PBXBuildFile; fileRef = C31C4A6723342A2200C35F12 /* FLEXMetadataSection.h */; };
 		C31C4A6A23342A2200C35F12 /* FLEXMetadataSection.m in Sources */ = {isa = PBXBuildFile; fileRef = C31C4A6823342A2200C35F12 /* FLEXMetadataSection.m */; };
 		C31D93E423E38CBE005517BF /* FLEXBlockShortcuts.h in Headers */ = {isa = PBXBuildFile; fileRef = C31D93E223E38CBE005517BF /* FLEXBlockShortcuts.h */; };
@@ -247,28 +247,28 @@
 		C38F3F32230C958F004E3731 /* FLEXAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = C38F3F30230C958F004E3731 /* FLEXAlert.m */; };
 		C397E318240EC98F0091E4EC /* FLEXSQLResult.h in Headers */ = {isa = PBXBuildFile; fileRef = C397E316240EC98F0091E4EC /* FLEXSQLResult.h */; };
 		C397E319240EC98F0091E4EC /* FLEXSQLResult.m in Sources */ = {isa = PBXBuildFile; fileRef = C397E317240EC98F0091E4EC /* FLEXSQLResult.m */; };
-		C398624D23AD6C67007E6793 /* TBKeyPathSearchController.h in Headers */ = {isa = PBXBuildFile; fileRef = C398624323AD6C67007E6793 /* TBKeyPathSearchController.h */; };
-		C398624E23AD6C67007E6793 /* TBKeyPath.m in Sources */ = {isa = PBXBuildFile; fileRef = C398624423AD6C67007E6793 /* TBKeyPath.m */; };
-		C398624F23AD6C67007E6793 /* TBKeyPathTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = C398624523AD6C67007E6793 /* TBKeyPathTokenizer.h */; };
+		C398624D23AD6C67007E6793 /* FLEXKeyPathSearchController.h in Headers */ = {isa = PBXBuildFile; fileRef = C398624323AD6C67007E6793 /* FLEXKeyPathSearchController.h */; };
+		C398624E23AD6C67007E6793 /* FLEXRuntimeKeyPath.m in Sources */ = {isa = PBXBuildFile; fileRef = C398624423AD6C67007E6793 /* FLEXRuntimeKeyPath.m */; };
+		C398624F23AD6C67007E6793 /* FLEXRuntimeKeyPathTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = C398624523AD6C67007E6793 /* FLEXRuntimeKeyPathTokenizer.h */; };
 		C398625023AD6C67007E6793 /* FLEXObjcRuntimeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C398624623AD6C67007E6793 /* FLEXObjcRuntimeViewController.m */; };
-		C398625123AD6C67007E6793 /* TBKeyPath.h in Headers */ = {isa = PBXBuildFile; fileRef = C398624723AD6C67007E6793 /* TBKeyPath.h */; };
-		C398625223AD6C67007E6793 /* TBKeyPathSearchController.m in Sources */ = {isa = PBXBuildFile; fileRef = C398624823AD6C67007E6793 /* TBKeyPathSearchController.m */; };
-		C398625323AD6C67007E6793 /* TBKeyPathTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = C398624923AD6C67007E6793 /* TBKeyPathTokenizer.m */; };
-		C398625423AD6C67007E6793 /* TBKeyPathToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = C398624A23AD6C67007E6793 /* TBKeyPathToolbar.h */; };
+		C398625123AD6C67007E6793 /* FLEXRuntimeKeyPath.h in Headers */ = {isa = PBXBuildFile; fileRef = C398624723AD6C67007E6793 /* FLEXRuntimeKeyPath.h */; };
+		C398625223AD6C67007E6793 /* FLEXKeyPathSearchController.m in Sources */ = {isa = PBXBuildFile; fileRef = C398624823AD6C67007E6793 /* FLEXKeyPathSearchController.m */; };
+		C398625323AD6C67007E6793 /* FLEXRuntimeKeyPathTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = C398624923AD6C67007E6793 /* FLEXRuntimeKeyPathTokenizer.m */; };
+		C398625423AD6C67007E6793 /* FLEXRuntimeBrowserToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = C398624A23AD6C67007E6793 /* FLEXRuntimeBrowserToolbar.h */; };
 		C398625523AD6C67007E6793 /* FLEXObjcRuntimeViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = C398624B23AD6C67007E6793 /* FLEXObjcRuntimeViewController.h */; };
-		C398625623AD6C67007E6793 /* TBKeyPathToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = C398624C23AD6C67007E6793 /* TBKeyPathToolbar.m */; };
-		C398625923AD6C88007E6793 /* TBToken.h in Headers */ = {isa = PBXBuildFile; fileRef = C398625723AD6C88007E6793 /* TBToken.h */; };
-		C398625A23AD6C88007E6793 /* TBToken.m in Sources */ = {isa = PBXBuildFile; fileRef = C398625823AD6C88007E6793 /* TBToken.m */; };
+		C398625623AD6C67007E6793 /* FLEXRuntimeBrowserToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = C398624C23AD6C67007E6793 /* FLEXRuntimeBrowserToolbar.m */; };
+		C398625923AD6C88007E6793 /* FLEXSearchToken.h in Headers */ = {isa = PBXBuildFile; fileRef = C398625723AD6C88007E6793 /* FLEXSearchToken.h */; };
+		C398625A23AD6C88007E6793 /* FLEXSearchToken.m in Sources */ = {isa = PBXBuildFile; fileRef = C398625823AD6C88007E6793 /* FLEXSearchToken.m */; };
 		C398625D23AD6E90007E6793 /* UIFont+FLEX.h in Headers */ = {isa = PBXBuildFile; fileRef = C398625B23AD6E90007E6793 /* UIFont+FLEX.h */; };
 		C398625E23AD6E90007E6793 /* UIFont+FLEX.m in Sources */ = {isa = PBXBuildFile; fileRef = C398625C23AD6E90007E6793 /* UIFont+FLEX.m */; };
-		C398626123AD70DF007E6793 /* TBKeyboardToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = C398625F23AD70DF007E6793 /* TBKeyboardToolbar.h */; };
-		C398626223AD70DF007E6793 /* TBKeyboardToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = C398626023AD70DF007E6793 /* TBKeyboardToolbar.m */; };
-		C398626523AD70F5007E6793 /* TBToolbarButton.h in Headers */ = {isa = PBXBuildFile; fileRef = C398626323AD70F5007E6793 /* TBToolbarButton.h */; };
-		C398626623AD70F5007E6793 /* TBToolbarButton.m in Sources */ = {isa = PBXBuildFile; fileRef = C398626423AD70F5007E6793 /* TBToolbarButton.m */; };
-		C398626B23AD71C1007E6793 /* TBRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = C398626723AD71C1007E6793 /* TBRuntime.h */; };
-		C398626C23AD71C1007E6793 /* TBRuntimeController.h in Headers */ = {isa = PBXBuildFile; fileRef = C398626823AD71C1007E6793 /* TBRuntimeController.h */; };
-		C398626D23AD71C1007E6793 /* TBRuntimeController.m in Sources */ = {isa = PBXBuildFile; fileRef = C398626923AD71C1007E6793 /* TBRuntimeController.m */; };
-		C398626E23AD71C1007E6793 /* TBRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = C398626A23AD71C1007E6793 /* TBRuntime.m */; };
+		C398626123AD70DF007E6793 /* FLEXKeyboardToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = C398625F23AD70DF007E6793 /* FLEXKeyboardToolbar.h */; };
+		C398626223AD70DF007E6793 /* FLEXKeyboardToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = C398626023AD70DF007E6793 /* FLEXKeyboardToolbar.m */; };
+		C398626523AD70F5007E6793 /* FLEXKBToolbarButton.h in Headers */ = {isa = PBXBuildFile; fileRef = C398626323AD70F5007E6793 /* FLEXKBToolbarButton.h */; };
+		C398626623AD70F5007E6793 /* FLEXKBToolbarButton.m in Sources */ = {isa = PBXBuildFile; fileRef = C398626423AD70F5007E6793 /* FLEXKBToolbarButton.m */; };
+		C398626B23AD71C1007E6793 /* FLEXRuntimeClient.h in Headers */ = {isa = PBXBuildFile; fileRef = C398626723AD71C1007E6793 /* FLEXRuntimeClient.h */; };
+		C398626C23AD71C1007E6793 /* FLEXRuntimeController.h in Headers */ = {isa = PBXBuildFile; fileRef = C398626823AD71C1007E6793 /* FLEXRuntimeController.h */; };
+		C398626D23AD71C1007E6793 /* FLEXRuntimeController.m in Sources */ = {isa = PBXBuildFile; fileRef = C398626923AD71C1007E6793 /* FLEXRuntimeController.m */; };
+		C398626E23AD71C1007E6793 /* FLEXRuntimeClient.m in Sources */ = {isa = PBXBuildFile; fileRef = C398626A23AD71C1007E6793 /* FLEXRuntimeClient.m */; };
 		C398627223AD7951007E6793 /* UIGestureRecognizer+Blocks.h in Headers */ = {isa = PBXBuildFile; fileRef = C398627023AD7951007E6793 /* UIGestureRecognizer+Blocks.h */; };
 		C398627323AD7951007E6793 /* UIGestureRecognizer+Blocks.m in Sources */ = {isa = PBXBuildFile; fileRef = C398627123AD7951007E6793 /* UIGestureRecognizer+Blocks.m */; };
 		C398627623AD79B7007E6793 /* NSString+FLEX.h in Headers */ = {isa = PBXBuildFile; fileRef = C398627423AD79B6007E6793 /* NSString+FLEX.h */; };
@@ -501,8 +501,8 @@
 		C312A13B23ECE79000E38049 /* FLEXWindowManagerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXWindowManagerController.h; sourceTree = "<group>"; };
 		C313853D23F5C1A10046E63C /* FLEXViewControllersViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEXViewControllersViewController.h; sourceTree = "<group>"; };
 		C313853E23F5C1A10046E63C /* FLEXViewControllersViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLEXViewControllersViewController.m; sourceTree = "<group>"; };
-		C313854623F5F7D40046E63C /* fishhook.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fishhook.c; sourceTree = "<group>"; };
-		C313854723F5F7D50046E63C /* fishhook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fishhook.h; sourceTree = "<group>"; };
+		C313854623F5F7D40046E63C /* flex_fishhook.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = flex_fishhook.c; sourceTree = "<group>"; };
+		C313854723F5F7D50046E63C /* flex_fishhook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flex_fishhook.h; sourceTree = "<group>"; };
 		C31C4A6723342A2200C35F12 /* FLEXMetadataSection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEXMetadataSection.h; sourceTree = "<group>"; };
 		C31C4A6823342A2200C35F12 /* FLEXMetadataSection.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLEXMetadataSection.m; sourceTree = "<group>"; };
 		C31D93E223E38CBE005517BF /* FLEXBlockShortcuts.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEXBlockShortcuts.h; sourceTree = "<group>"; };
@@ -598,28 +598,28 @@
 		C38F3F30230C958F004E3731 /* FLEXAlert.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLEXAlert.m; sourceTree = "<group>"; };
 		C397E316240EC98F0091E4EC /* FLEXSQLResult.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEXSQLResult.h; sourceTree = "<group>"; };
 		C397E317240EC98F0091E4EC /* FLEXSQLResult.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLEXSQLResult.m; sourceTree = "<group>"; };
-		C398624323AD6C67007E6793 /* TBKeyPathSearchController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TBKeyPathSearchController.h; sourceTree = "<group>"; };
-		C398624423AD6C67007E6793 /* TBKeyPath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TBKeyPath.m; sourceTree = "<group>"; };
-		C398624523AD6C67007E6793 /* TBKeyPathTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TBKeyPathTokenizer.h; sourceTree = "<group>"; };
+		C398624323AD6C67007E6793 /* FLEXKeyPathSearchController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXKeyPathSearchController.h; sourceTree = "<group>"; };
+		C398624423AD6C67007E6793 /* FLEXRuntimeKeyPath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXRuntimeKeyPath.m; sourceTree = "<group>"; };
+		C398624523AD6C67007E6793 /* FLEXRuntimeKeyPathTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXRuntimeKeyPathTokenizer.h; sourceTree = "<group>"; };
 		C398624623AD6C67007E6793 /* FLEXObjcRuntimeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXObjcRuntimeViewController.m; sourceTree = "<group>"; };
-		C398624723AD6C67007E6793 /* TBKeyPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TBKeyPath.h; sourceTree = "<group>"; };
-		C398624823AD6C67007E6793 /* TBKeyPathSearchController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TBKeyPathSearchController.m; sourceTree = "<group>"; };
-		C398624923AD6C67007E6793 /* TBKeyPathTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TBKeyPathTokenizer.m; sourceTree = "<group>"; };
-		C398624A23AD6C67007E6793 /* TBKeyPathToolbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TBKeyPathToolbar.h; sourceTree = "<group>"; };
+		C398624723AD6C67007E6793 /* FLEXRuntimeKeyPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXRuntimeKeyPath.h; sourceTree = "<group>"; };
+		C398624823AD6C67007E6793 /* FLEXKeyPathSearchController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXKeyPathSearchController.m; sourceTree = "<group>"; };
+		C398624923AD6C67007E6793 /* FLEXRuntimeKeyPathTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXRuntimeKeyPathTokenizer.m; sourceTree = "<group>"; };
+		C398624A23AD6C67007E6793 /* FLEXRuntimeBrowserToolbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXRuntimeBrowserToolbar.h; sourceTree = "<group>"; };
 		C398624B23AD6C67007E6793 /* FLEXObjcRuntimeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXObjcRuntimeViewController.h; sourceTree = "<group>"; };
-		C398624C23AD6C67007E6793 /* TBKeyPathToolbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TBKeyPathToolbar.m; sourceTree = "<group>"; };
-		C398625723AD6C88007E6793 /* TBToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TBToken.h; sourceTree = "<group>"; };
-		C398625823AD6C88007E6793 /* TBToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TBToken.m; sourceTree = "<group>"; };
+		C398624C23AD6C67007E6793 /* FLEXRuntimeBrowserToolbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXRuntimeBrowserToolbar.m; sourceTree = "<group>"; };
+		C398625723AD6C88007E6793 /* FLEXSearchToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXSearchToken.h; sourceTree = "<group>"; };
+		C398625823AD6C88007E6793 /* FLEXSearchToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXSearchToken.m; sourceTree = "<group>"; };
 		C398625B23AD6E90007E6793 /* UIFont+FLEX.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIFont+FLEX.h"; sourceTree = "<group>"; };
 		C398625C23AD6E90007E6793 /* UIFont+FLEX.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIFont+FLEX.m"; sourceTree = "<group>"; };
-		C398625F23AD70DF007E6793 /* TBKeyboardToolbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TBKeyboardToolbar.h; sourceTree = "<group>"; };
-		C398626023AD70DF007E6793 /* TBKeyboardToolbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TBKeyboardToolbar.m; sourceTree = "<group>"; };
-		C398626323AD70F5007E6793 /* TBToolbarButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TBToolbarButton.h; sourceTree = "<group>"; };
-		C398626423AD70F5007E6793 /* TBToolbarButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TBToolbarButton.m; sourceTree = "<group>"; };
-		C398626723AD71C1007E6793 /* TBRuntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TBRuntime.h; sourceTree = "<group>"; };
-		C398626823AD71C1007E6793 /* TBRuntimeController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TBRuntimeController.h; sourceTree = "<group>"; };
-		C398626923AD71C1007E6793 /* TBRuntimeController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TBRuntimeController.m; sourceTree = "<group>"; };
-		C398626A23AD71C1007E6793 /* TBRuntime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TBRuntime.m; sourceTree = "<group>"; };
+		C398625F23AD70DF007E6793 /* FLEXKeyboardToolbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXKeyboardToolbar.h; sourceTree = "<group>"; };
+		C398626023AD70DF007E6793 /* FLEXKeyboardToolbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXKeyboardToolbar.m; sourceTree = "<group>"; };
+		C398626323AD70F5007E6793 /* FLEXKBToolbarButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXKBToolbarButton.h; sourceTree = "<group>"; };
+		C398626423AD70F5007E6793 /* FLEXKBToolbarButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXKBToolbarButton.m; sourceTree = "<group>"; };
+		C398626723AD71C1007E6793 /* FLEXRuntimeClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXRuntimeClient.h; sourceTree = "<group>"; };
+		C398626823AD71C1007E6793 /* FLEXRuntimeController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXRuntimeController.h; sourceTree = "<group>"; };
+		C398626923AD71C1007E6793 /* FLEXRuntimeController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXRuntimeController.m; sourceTree = "<group>"; };
+		C398626A23AD71C1007E6793 /* FLEXRuntimeClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXRuntimeClient.m; sourceTree = "<group>"; };
 		C398627023AD7951007E6793 /* UIGestureRecognizer+Blocks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIGestureRecognizer+Blocks.h"; sourceTree = "<group>"; };
 		C398627123AD7951007E6793 /* UIGestureRecognizer+Blocks.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIGestureRecognizer+Blocks.m"; sourceTree = "<group>"; };
 		C398627423AD79B6007E6793 /* NSString+FLEX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+FLEX.h"; sourceTree = "<group>"; };
@@ -818,6 +818,8 @@
 			isa = PBXGroup;
 			children = (
 				3A4C94671B5B21410088C3F2 /* ArgumentInputViews */,
+				3A4C94801B5B21410088C3F2 /* FLEXArgumentInputViewFactory.h */,
+				3A4C94811B5B21410088C3F2 /* FLEXArgumentInputViewFactory.m */,
 				3A4C94841B5B21410088C3F2 /* FLEXFieldEditorView.h */,
 				3A4C94851B5B21410088C3F2 /* FLEXFieldEditorView.m */,
 				C3878DB923A749960038FDBE /* FLEXVariableEditorViewController.h */,
@@ -859,8 +861,6 @@
 				3A4C947D1B5B21410088C3F2 /* FLEXArgumentInputTextView.m */,
 				3A4C947E1B5B21410088C3F2 /* FLEXArgumentInputView.h */,
 				3A4C947F1B5B21410088C3F2 /* FLEXArgumentInputView.m */,
-				3A4C94801B5B21410088C3F2 /* FLEXArgumentInputViewFactory.h */,
-				3A4C94811B5B21410088C3F2 /* FLEXArgumentInputViewFactory.m */,
 			);
 			path = ArgumentInputViews;
 			sourceTree = "<group>";
@@ -1158,8 +1158,8 @@
 				C31D93E723E38E97005517BF /* FLEXBlockDescription.m */,
 				C3854DF223F36C9E00FCD1E2 /* FLEXTypeEncodingParser.h */,
 				C3854DF123F36C9E00FCD1E2 /* FLEXTypeEncodingParser.m */,
-				C313854623F5F7D40046E63C /* fishhook.c */,
-				C313854723F5F7D50046E63C /* fishhook.h */,
+				C313854723F5F7D50046E63C /* flex_fishhook.h */,
+				C313854623F5F7D40046E63C /* flex_fishhook.c */,
 			);
 			path = Runtime;
 			sourceTree = "<group>";
@@ -1235,22 +1235,22 @@
 			isa = PBXGroup;
 			children = (
 				C398626F23AD71C6007E6793 /* DataSources */,
-				C398625723AD6C88007E6793 /* TBToken.h */,
-				C398625823AD6C88007E6793 /* TBToken.m */,
-				C398624723AD6C67007E6793 /* TBKeyPath.h */,
-				C398624423AD6C67007E6793 /* TBKeyPath.m */,
-				C398624323AD6C67007E6793 /* TBKeyPathSearchController.h */,
-				C398624823AD6C67007E6793 /* TBKeyPathSearchController.m */,
-				C398624523AD6C67007E6793 /* TBKeyPathTokenizer.h */,
-				C398624923AD6C67007E6793 /* TBKeyPathTokenizer.m */,
-				C398624A23AD6C67007E6793 /* TBKeyPathToolbar.h */,
-				C398624C23AD6C67007E6793 /* TBKeyPathToolbar.m */,
+				C398625723AD6C88007E6793 /* FLEXSearchToken.h */,
+				C398625823AD6C88007E6793 /* FLEXSearchToken.m */,
+				C398624723AD6C67007E6793 /* FLEXRuntimeKeyPath.h */,
+				C398624423AD6C67007E6793 /* FLEXRuntimeKeyPath.m */,
+				C398624323AD6C67007E6793 /* FLEXKeyPathSearchController.h */,
+				C398624823AD6C67007E6793 /* FLEXKeyPathSearchController.m */,
+				C398624523AD6C67007E6793 /* FLEXRuntimeKeyPathTokenizer.h */,
+				C398624923AD6C67007E6793 /* FLEXRuntimeKeyPathTokenizer.m */,
+				C398624A23AD6C67007E6793 /* FLEXRuntimeBrowserToolbar.h */,
+				C398624C23AD6C67007E6793 /* FLEXRuntimeBrowserToolbar.m */,
 				C398624B23AD6C67007E6793 /* FLEXObjcRuntimeViewController.h */,
 				C398624623AD6C67007E6793 /* FLEXObjcRuntimeViewController.m */,
-				C398625F23AD70DF007E6793 /* TBKeyboardToolbar.h */,
-				C398626023AD70DF007E6793 /* TBKeyboardToolbar.m */,
-				C398626323AD70F5007E6793 /* TBToolbarButton.h */,
-				C398626423AD70F5007E6793 /* TBToolbarButton.m */,
+				C398625F23AD70DF007E6793 /* FLEXKeyboardToolbar.h */,
+				C398626023AD70DF007E6793 /* FLEXKeyboardToolbar.m */,
+				C398626323AD70F5007E6793 /* FLEXKBToolbarButton.h */,
+				C398626423AD70F5007E6793 /* FLEXKBToolbarButton.m */,
 			);
 			path = RuntimeBrowser;
 			sourceTree = "<group>";
@@ -1258,10 +1258,10 @@
 		C398626F23AD71C6007E6793 /* DataSources */ = {
 			isa = PBXGroup;
 			children = (
-				C398626723AD71C1007E6793 /* TBRuntime.h */,
-				C398626A23AD71C1007E6793 /* TBRuntime.m */,
-				C398626823AD71C1007E6793 /* TBRuntimeController.h */,
-				C398626923AD71C1007E6793 /* TBRuntimeController.m */,
+				C398626723AD71C1007E6793 /* FLEXRuntimeClient.h */,
+				C398626A23AD71C1007E6793 /* FLEXRuntimeClient.m */,
+				C398626823AD71C1007E6793 /* FLEXRuntimeController.h */,
+				C398626923AD71C1007E6793 /* FLEXRuntimeController.m */,
 			);
 			path = DataSources;
 			sourceTree = "<group>";
@@ -1378,7 +1378,7 @@
 				C34D4EB823A2B17900C1F903 /* FLEXBundleShortcuts.h in Headers */,
 				C3694DC223EA147F006625D7 /* UIBarButtonItem+FLEX.h in Headers */,
 				C38F3F31230C958F004E3731 /* FLEXAlert.h in Headers */,
-				C398624D23AD6C67007E6793 /* TBKeyPathSearchController.h in Headers */,
+				C398624D23AD6C67007E6793 /* FLEXKeyPathSearchController.h in Headers */,
 				3A4C95381B5B21410088C3F2 /* FLEXNetworkRecorder.h in Headers */,
 				3A4C94251B5B20570088C3F2 /* FLEX.h in Headers */,
 				C383C3C523B6BB81007A321B /* FLEXCodeFontCell.h in Headers */,
@@ -1403,18 +1403,18 @@
 				3A4C95361B5B21410088C3F2 /* FLEXNetworkMITMViewController.h in Headers */,
 				3A4C94DD1B5B21410088C3F2 /* FLEXHeapEnumerator.h in Headers */,
 				C3F527BD2318603F009CBA07 /* FLEXShortcutsSection.h in Headers */,
-				C398626B23AD71C1007E6793 /* TBRuntime.h in Headers */,
+				C398626B23AD71C1007E6793 /* FLEXRuntimeClient.h in Headers */,
 				3A4C95321B5B21410088C3F2 /* FLEXSystemLogCell.h in Headers */,
 				C3F977852311B38F0032776D /* NSDictionary+ObjcRuntime.h in Headers */,
 				C3DFCD982416E7DD00BB7084 /* FLEXMutableListSection.h in Headers */,
-				C398625123AD6C67007E6793 /* TBKeyPath.h in Headers */,
+				C398625123AD6C67007E6793 /* FLEXRuntimeKeyPath.h in Headers */,
 				3A4C94F91B5B21410088C3F2 /* FLEXArgumentInputNumberView.h in Headers */,
 				C3F646F223A045DB00D4A011 /* FLEXClassShortcuts.h in Headers */,
 				C387C87A22DFCD6A00750E58 /* FLEXCarouselCell.h in Headers */,
 				C3511B9122D7C99E0057BAB7 /* FLEXGlobalsSection.h in Headers */,
 				C398625D23AD6E90007E6793 /* UIFont+FLEX.h in Headers */,
 				3A4C953A1B5B21410088C3F2 /* FLEXNetworkSettingsTableViewController.h in Headers */,
-				C398626C23AD71C1007E6793 /* TBRuntimeController.h in Headers */,
+				C398626C23AD71C1007E6793 /* FLEXRuntimeController.h in Headers */,
 				779B1ED01C0C4D7C001F5E49 /* FLEXMultiColumnTableView.h in Headers */,
 				3A4C94D31B5B21410088C3F2 /* FLEXObjectExplorerFactory.h in Headers */,
 				3A4C94CD1B5B21410088C3F2 /* FLEXGlobalsEntry.h in Headers */,
@@ -1428,7 +1428,7 @@
 				C312A13023ECB5D300E38049 /* FLEXBookmarkManager.h in Headers */,
 				3A4C95341B5B21410088C3F2 /* FLEXSystemLogViewController.h in Headers */,
 				C34C9BDD23A7F2740031CA3E /* FLEXRuntime+UIKitHelpers.h in Headers */,
-				C398624F23AD6C67007E6793 /* TBKeyPathTokenizer.h in Headers */,
+				C398624F23AD6C67007E6793 /* FLEXRuntimeKeyPathTokenizer.h in Headers */,
 				C362AE8123C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.h in Headers */,
 				3A4C95091B5B21410088C3F2 /* FLEXFieldEditorView.h in Headers */,
 				C3E5D9FD2316E83700E655DB /* FLEXRuntime+Compare.h in Headers */,
@@ -1450,7 +1450,7 @@
 				C33E46AF223B02CD004BD0E6 /* FLEXASLLogController.h in Headers */,
 				C34EE30821CB23CC00BD3A7C /* FLEXOSLogController.h in Headers */,
 				3A4C94FF1B5B21410088C3F2 /* FLEXArgumentInputSwitchView.h in Headers */,
-				C398625423AD6C67007E6793 /* TBKeyPathToolbar.h in Headers */,
+				C398625423AD6C67007E6793 /* FLEXRuntimeBrowserToolbar.h in Headers */,
 				3A4C94E71B5B21410088C3F2 /* FLEXHierarchyTableViewCell.h in Headers */,
 				224D49AA1C673AB5000EAB86 /* FLEXSQLiteDatabaseManager.h in Headers */,
 				3A4C95031B5B21410088C3F2 /* FLEXArgumentInputView.h in Headers */,
@@ -1497,7 +1497,7 @@
 				3A4C94F31B5B21410088C3F2 /* FLEXArgumentInputFontView.h in Headers */,
 				C3A9423C23C54010006871A3 /* FHSSnapshotView.h in Headers */,
 				3A4C95261B5B21410088C3F2 /* FLEXGlobalsViewController.h in Headers */,
-				C398625923AD6C88007E6793 /* TBToken.h in Headers */,
+				C398625923AD6C88007E6793 /* FLEXSearchToken.h in Headers */,
 				C33C825E2316DC8600DD2451 /* FLEXObjectExplorer.h in Headers */,
 				C34D4EB423A2AF2A00C1F903 /* FLEXColorPreviewSection.h in Headers */,
 				C383C3BE23B6B398007A321B /* UITextField+Range.h in Headers */,
@@ -1515,7 +1515,7 @@
 				C3F977872311B38F0032776D /* NSObject+Reflection.h in Headers */,
 				C3DB9F642107FC9600B46809 /* FLEXObjectRef.h in Headers */,
 				3A4C95401B5B21410088C3F2 /* FLEXNetworkTransactionTableViewCell.h in Headers */,
-				C398626523AD70F5007E6793 /* TBToolbarButton.h in Headers */,
+				C398626523AD70F5007E6793 /* FLEXKBToolbarButton.h in Headers */,
 				3A4C95241B5B21410088C3F2 /* FLEXFileBrowserTableViewController.h in Headers */,
 				C31D93E423E38CBE005517BF /* FLEXBlockShortcuts.h in Headers */,
 				94AAF0381BAF2E1F00DE8760 /* FLEXKeyboardHelpViewController.h in Headers */,
@@ -1523,12 +1523,12 @@
 				C36B096523E0D4A1008F5D47 /* UIMenu+FLEX.h in Headers */,
 				C36FBFD6230F3B98008D95D5 /* FLEXIvar.h in Headers */,
 				C3A9423823C51B8D006871A3 /* FHSRangeSlider.h in Headers */,
-				C398626123AD70DF007E6793 /* TBKeyboardToolbar.h in Headers */,
+				C398626123AD70DF007E6793 /* FLEXKeyboardToolbar.h in Headers */,
 				94AAF03A1BAF2F0300DE8760 /* FLEXKeyboardShortcutManager.h in Headers */,
 				94A515181C4CA1D70063292F /* FLEXManager+Private.h in Headers */,
 				C383C3B923B6A62A007A321B /* FLEXRuntimeSafety.h in Headers */,
 				C39ED92822D63F3200B5773A /* FLEXAddressExplorerCoordinator.h in Headers */,
-				C313854923F5F7D50046E63C /* fishhook.h in Headers */,
+				C313854923F5F7D50046E63C /* flex_fishhook.h in Headers */,
 				C3A9424023C5443A006871A3 /* FHSSnapshotNodes.h in Headers */,
 				C32A195E231732E800EB02AC /* FLEXCollectionContentSection.h in Headers */,
 				3A4C94E11B5B21410088C3F2 /* FLEXResources.h in Headers */,
@@ -1657,10 +1657,10 @@
 				C31C4A6A23342A2200C35F12 /* FLEXMetadataSection.m in Sources */,
 				224D49A91C673AB5000EAB86 /* FLEXRealmDatabaseManager.m in Sources */,
 				C39ED92922D63F3200B5773A /* FLEXAddressExplorerCoordinator.m in Sources */,
-				C398626223AD70DF007E6793 /* TBKeyboardToolbar.m in Sources */,
+				C398626223AD70DF007E6793 /* FLEXKeyboardToolbar.m in Sources */,
 				C34C9BDE23A7F2740031CA3E /* FLEXRuntime+UIKitHelpers.m in Sources */,
 				2EF6B04D1D494BE50006BDA5 /* FLEXNetworkCurlLogger.m in Sources */,
-				C398625323AD6C67007E6793 /* TBKeyPathTokenizer.m in Sources */,
+				C398625323AD6C67007E6793 /* FLEXRuntimeKeyPathTokenizer.m in Sources */,
 				94A515201C4CA1F10063292F /* FLEXWindow.m in Sources */,
 				C38EF26223A2FCD20047A7EC /* FLEXViewControllerShortcuts.m in Sources */,
 				C398682523AC359600E9E391 /* FLEXShortcutsFactory+Defaults.m in Sources */,
@@ -1676,7 +1676,7 @@
 				7349FD6B22B93CDF00051810 /* FLEXColor.m in Sources */,
 				C3878DBA23A749960038FDBE /* FLEXVariableEditorViewController.m in Sources */,
 				94AAF0391BAF2E1F00DE8760 /* FLEXKeyboardHelpViewController.m in Sources */,
-				C398624E23AD6C67007E6793 /* TBKeyPath.m in Sources */,
+				C398624E23AD6C67007E6793 /* FLEXRuntimeKeyPath.m in Sources */,
 				C3694DC323EA147F006625D7 /* UIBarButtonItem+FLEX.m in Sources */,
 				C36FBFD4230F3B98008D95D5 /* FLEXProtocol.m in Sources */,
 				C34D4EB123A2ABD900C1F903 /* FLEXLayerShortcuts.m in Sources */,
@@ -1686,7 +1686,7 @@
 				779B1ED11C0C4D7C001F5E49 /* FLEXMultiColumnTableView.m in Sources */,
 				C36FBFD0230F3B98008D95D5 /* FLEXProperty.m in Sources */,
 				C3A9424E23C78CFF006871A3 /* FHSViewSnapshot.m in Sources */,
-				C398625623AD6C67007E6793 /* TBKeyPathToolbar.m in Sources */,
+				C398625623AD6C67007E6793 /* FLEXRuntimeBrowserToolbar.m in Sources */,
 				C3F31D412267D883003C991A /* FLEXMultilineTableViewCell.m in Sources */,
 				3A4C94EE1B5B21410088C3F2 /* FLEXArgumentInputColorView.m in Sources */,
 				C38DF0EB22CFE4370077B4AD /* FLEXTableViewController.m in Sources */,
@@ -1700,7 +1700,7 @@
 				679F64871BD53B7B00A8C94C /* FLEXCookiesTableViewController.m in Sources */,
 				C3A9422D23C3DA39006871A3 /* FHSView.m in Sources */,
 				3A4C94CE1B5B21410088C3F2 /* FLEXGlobalsEntry.m in Sources */,
-				C398625223AD6C67007E6793 /* TBKeyPathSearchController.m in Sources */,
+				C398625223AD6C67007E6793 /* FLEXKeyPathSearchController.m in Sources */,
 				C3E5D9FE2316E83700E655DB /* FLEXRuntime+Compare.m in Sources */,
 				71E1C2192307FBB800F5032A /* FLEXKeychainQuery.m in Sources */,
 				C398627323AD7951007E6793 /* UIGestureRecognizer+Blocks.m in Sources */,
@@ -1708,14 +1708,14 @@
 				3A4C94FE1B5B21410088C3F2 /* FLEXArgumentInputStructView.m in Sources */,
 				C3A9424123C5443A006871A3 /* FHSSnapshotNodes.m in Sources */,
 				C3F31D402267D883003C991A /* FLEXSubtitleTableViewCell.m in Sources */,
-				C398626D23AD71C1007E6793 /* TBRuntimeController.m in Sources */,
+				C398626D23AD71C1007E6793 /* FLEXRuntimeController.m in Sources */,
 				C36FBFD9230F3B98008D95D5 /* FLEXProtocolBuilder.m in Sources */,
 				3A4C95431B5B21410088C3F2 /* FLEXNetworkObserver.m in Sources */,
 				779B1EDB1C0C4D7C001F5E49 /* FLEXTableListViewController.m in Sources */,
 				3A4C94E41B5B21410088C3F2 /* FLEXRuntimeUtility.m in Sources */,
 				3A4C94D41B5B21410088C3F2 /* FLEXObjectExplorerFactory.m in Sources */,
 				94A515171C4CA1D70063292F /* FLEXManager.m in Sources */,
-				C398626623AD70F5007E6793 /* TBToolbarButton.m in Sources */,
+				C398626623AD70F5007E6793 /* FLEXKBToolbarButton.m in Sources */,
 				3A4C952F1B5B21410088C3F2 /* FLEXWebViewController.m in Sources */,
 				3A4C95041B5B21410088C3F2 /* FLEXArgumentInputView.m in Sources */,
 				C3F977842311B38F0032776D /* NSDictionary+ObjcRuntime.m in Sources */,
@@ -1742,7 +1742,7 @@
 				3A4C95351B5B21410088C3F2 /* FLEXSystemLogViewController.m in Sources */,
 				C383C3C623B6BB81007A321B /* FLEXCodeFontCell.m in Sources */,
 				3A4C95271B5B21410088C3F2 /* FLEXGlobalsViewController.m in Sources */,
-				C313854823F5F7D50046E63C /* fishhook.c in Sources */,
+				C313854823F5F7D50046E63C /* flex_fishhook.c in Sources */,
 				C3531BA223E796BD00A184AD /* FLEXManager+Extensibility.m in Sources */,
 				71E1C2172307FBB800F5032A /* FLEXKeychain.m in Sources */,
 				C3A9423923C51B8D006871A3 /* FHSRangeSlider.m in Sources */,
@@ -1791,7 +1791,7 @@
 				3A4C952D1B5B21410088C3F2 /* FLEXLiveObjectsTableViewController.m in Sources */,
 				C33E46B0223B02CD004BD0E6 /* FLEXASLLogController.m in Sources */,
 				C398625023AD6C67007E6793 /* FLEXObjcRuntimeViewController.m in Sources */,
-				C398626E23AD71C1007E6793 /* TBRuntime.m in Sources */,
+				C398626E23AD71C1007E6793 /* FLEXRuntimeClient.m in Sources */,
 				3A4C953D1B5B21410088C3F2 /* FLEXNetworkTransaction.m in Sources */,
 				3A4C94E81B5B21410088C3F2 /* FLEXHierarchyTableViewCell.m in Sources */,
 				3A4C950A1B5B21410088C3F2 /* FLEXFieldEditorView.m in Sources */,
@@ -1801,7 +1801,7 @@
 				C31D93E923E38E97005517BF /* FLEXBlockDescription.m in Sources */,
 				71E1C2182307FBB800F5032A /* FLEXKeychainTableViewController.m in Sources */,
 				94A5151E1C4CA1F10063292F /* FLEXExplorerViewController.m in Sources */,
-				C398625A23AD6C88007E6793 /* TBToken.m in Sources */,
+				C398625A23AD6C88007E6793 /* FLEXSearchToken.m in Sources */,
 				3A4C95371B5B21410088C3F2 /* FLEXNetworkMITMViewController.m in Sources */,
 				C3511B9222D7C99E0057BAB7 /* FLEXGlobalsSection.m in Sources */,
 				C32A19632317378C00EB02AC /* FLEXDefaultsContentSection.m in Sources */,