Compare commits

...

22 Commits

Author SHA1 Message Date
Tanner Bennett 9db1b544df Use Reflex instead of FLEX in SPM project 2021-11-18 18:45:01 -06:00
Tanner Bennett b58629b8ea Initialize FLEXObjectExplorer.reflexAvailable 2021-11-18 18:45:01 -06:00
Tanner Bennett adeb22af15 Use Reflex and FLEXMirror 2021-11-18 18:45:01 -06:00
Tanner Bennett 6ab183e109 Add FLEXSwiftInternal to check if object from Swift 2021-11-18 18:45:01 -06:00
Tanner Bennett 034f401cb4 Modernize FLEXMirror
Differentiate between class and instance props/methods
2021-11-18 18:45:01 -06:00
Tanner Bennett da1958def5 Add (unused) libflex modulemap file
For my own use case, I dynamically link FLEX, so I need to build Reflex using libflex.tbd as well as this modulemap file after copying it into the Headers folder.
2021-11-18 18:45:01 -06:00
Tanner Bennett ffa658c49b Make a bunch of stuff private that should be private 2021-11-18 18:42:04 -06:00
Tanner Bennett 6066de480f FLEXMacros should be public 2021-11-18 18:20:59 -06:00
Tanner Bennett 0fd7dfa002 SPM: clear Headers folder when running script 2021-11-18 17:50:44 -06:00
Tanner Bennett 60403e614d Ignore Classes/Headers in VS Code search 2021-11-18 17:49:03 -06:00
skytoup fa7db997bd Fix realm database viewer crash 2021-11-16 17:34:11 -08:00
Tanner Bennett d15e72c681 Separate example projects for SPM and Cocoapods 2021-11-14 01:01:24 -06:00
Rafael Fernández 4f1ff7784d Add SPM usage in README, close #482 2021-11-14 00:56:24 -06:00
Tanner Bennett 8129a034e3 Clean up Package.swift 2021-11-14 00:56:24 -06:00
Tanner Bennett 838db6954b Add cxx standard setting 2021-11-14 00:56:24 -06:00
Tanner Bennett 5b3d3af99c Update package.swift 2021-11-14 00:56:24 -06:00
Tanner Bennett 2f9f266493 Update import format 2021-11-14 00:56:24 -06:00
Tanner Bennett 9d94979d08 Exclude LICENSE.md 2021-11-14 00:56:24 -06:00
Tanner Bennett 19b83f4404 headerSearchPath 2021-11-14 00:56:24 -06:00
Tanner Bennett 2b13378d98 Remove unsafe flags 😑 2021-11-14 00:56:24 -06:00
Tanner Bennett 4ae9d41104 Add header references 2021-11-14 00:56:24 -06:00
Tanner Bennett 1490170eb4 Add Package.swift, add script to generate headers
Update script
2021-11-14 00:56:24 -06:00
95 changed files with 1262 additions and 195 deletions
+5
View File
@@ -0,0 +1,5 @@
{
"search.exclude": {
"Classes/Headers": true
}
}
+11 -11
View File
@@ -8,15 +8,15 @@
#import <FLEX/UIBarButtonItem+FLEX.h>
#import <FLEX/CALayer+FLEX.h>
#import <FLEX/UIFont+FLEX.h>
#import <FLEX/UIGestureRecognizer+Blocks.h>
#import <FLEX/UIPasteboard+FLEX.h>
#import <FLEX/UIMenu+FLEX.h>
#import <FLEX/UITextField+Range.h>
#import <UIBarButtonItem+FLEX.h>
#import <CALayer+FLEX.h>
#import <UIFont+FLEX.h>
#import <UIGestureRecognizer+Blocks.h>
#import <UIPasteboard+FLEX.h>
#import <UIMenu+FLEX.h>
#import <UITextField+Range.h>
#import <FLEX/NSObject+FLEX_Reflection.h>
#import <FLEX/NSArray+FLEX.h>
#import <FLEX/NSUserDefaults+FLEX.h>
#import <FLEX/NSTimer+FLEX.h>
#import <NSObject+FLEX_Reflection.h>
#import <NSArray+FLEX.h>
#import <NSUserDefaults+FLEX.h>
#import <NSTimer+FLEX.h>
+11 -12
View File
@@ -6,18 +6,17 @@
// Copyright © 2020 FLEX Team. All rights reserved.
//
#import <FLEX/FLEXFilteringTableViewController.h>
#import <FLEX/FLEXNavigationController.h>
#import <FLEX/FLEXTableViewController.h>
#import <FLEX/FLEXTableView.h>
#import <FLEXFilteringTableViewController.h>
#import <FLEXNavigationController.h>
#import <FLEXTableViewController.h>
#import <FLEXTableView.h>
#import <FLEX/FLEXSingleRowSection.h>
#import <FLEX/FLEXTableViewSection.h>
#import <FLEXSingleRowSection.h>
#import <FLEXTableViewSection.h>
#import <FLEX/FLEXCodeFontCell.h>
#import <FLEX/FLEXSubtitleTableViewCell.h>
#import <FLEX/FLEXTableViewCell.h>
#import <FLEX/FLEXMultilineTableViewCell.h>
#import <FLEX/FLEXKeyValueTableViewCell.h>
#import <FLEXCodeFontCell.h>
#import <FLEXSubtitleTableViewCell.h>
#import <FLEXTableViewCell.h>
#import <FLEXMultilineTableViewCell.h>
#import <FLEXKeyValueTableViewCell.h>
#import <FLEX/FLEXScopeCarousel.h>
+11 -19
View File
@@ -6,25 +6,17 @@
// Copyright © 2020 FLEX Team. All rights reserved.
//
#import <FLEX/FLEXObjectExplorerFactory.h>
#import <FLEX/FLEXObjectExplorerViewController.h>
#import <FLEXObjectExplorerFactory.h>
#import <FLEXObjectExplorerViewController.h>
#import <FLEX/FLEXObjectExplorer.h>
#import <FLEXObjectExplorer.h>
#import <FLEX/FLEXShortcut.h>
#import <FLEX/FLEXShortcutsFactory+Defaults.h>
#import <FLEX/FLEXShortcutsSection.h>
#import <FLEX/FLEXBlockShortcuts.h>
#import <FLEX/FLEXBundleShortcuts.h>
#import <FLEX/FLEXClassShortcuts.h>
#import <FLEX/FLEXImageShortcuts.h>
#import <FLEX/FLEXLayerShortcuts.h>
#import <FLEX/FLEXViewControllerShortcuts.h>
#import <FLEX/FLEXViewShortcuts.h>
#import <FLEXShortcut.h>
#import <FLEXShortcutsSection.h>
#import <FLEX/FLEXCollectionContentSection.h>
#import <FLEX/FLEXColorPreviewSection.h>
#import <FLEX/FLEXDefaultsContentSection.h>
#import <FLEX/FLEXMetadataSection.h>
#import <FLEX/FLEXMutableListSection.h>
#import <FLEX/FLEXObjectInfoSection.h>
#import <FLEXCollectionContentSection.h>
#import <FLEXColorPreviewSection.h>
#import <FLEXDefaultsContentSection.h>
#import <FLEXMetadataSection.h>
#import <FLEXMutableListSection.h>
#import <FLEXObjectInfoSection.h>
+16 -15
View File
@@ -6,20 +6,21 @@
// Copyright © 2020 FLEX Team. All rights reserved.
//
#import <FLEX/FLEXObjcInternal.h>
#import <FLEX/FLEXRuntimeSafety.h>
#import <FLEX/FLEXBlockDescription.h>
#import <FLEX/FLEXTypeEncodingParser.h>
#import <FLEXObjcInternal.h>
#import <FLEXSwiftInternal.h>
#import <FLEXRuntimeSafety.h>
#import <FLEXBlockDescription.h>
#import <FLEXTypeEncodingParser.h>
#import <FLEX/FLEXMirror.h>
#import <FLEX/FLEXProtocol.h>
#import <FLEX/FLEXProperty.h>
#import <FLEX/FLEXIvar.h>
#import <FLEX/FLEXMethodBase.h>
#import <FLEX/FLEXMethod.h>
#import <FLEX/FLEXPropertyAttributes.h>
#import <FLEX/FLEXRuntime+Compare.h>
#import <FLEX/FLEXRuntime+UIKitHelpers.h>
#import <FLEXMirror.h>
#import <FLEXProtocol.h>
#import <FLEXProperty.h>
#import <FLEXIvar.h>
#import <FLEXMethodBase.h>
#import <FLEXMethod.h>
#import <FLEXPropertyAttributes.h>
#import <FLEXRuntime+Compare.h>
#import <FLEXRuntime+UIKitHelpers.h>
#import <FLEX/FLEXProtocolBuilder.h>
#import <FLEX/FLEXClassBuilder.h>
#import <FLEXProtocolBuilder.h>
#import <FLEXClassBuilder.h>
+13 -12
View File
@@ -7,18 +7,19 @@
// Copyright (c) 2020 FLEX Team. All rights reserved.
//
#import <FLEX/FLEXManager.h>
#import <FLEX/FLEXManager+Extensibility.h>
#import <FLEX/FLEXManager+Networking.h>
#import <FLEXManager.h>
#import <FLEXManager+Extensibility.h>
#import <FLEXManager+Networking.h>
#import <FLEX/FLEXExplorerToolbar.h>
#import <FLEX/FLEXExplorerToolbarItem.h>
#import <FLEX/FLEXGlobalsEntry.h>
#import <FLEXExplorerToolbar.h>
#import <FLEXExplorerToolbarItem.h>
#import <FLEXGlobalsEntry.h>
#import <FLEX/FLEX-Core.h>
#import <FLEX/FLEX-Runtime.h>
#import <FLEX/FLEX-Categories.h>
#import <FLEX/FLEX-ObjectExploring.h>
#import <FLEX-Core.h>
#import <FLEX-Runtime.h>
#import <FLEX-Categories.h>
#import <FLEX-ObjectExploring.h>
#import <FLEX/FLEXAlert.h>
#import <FLEX/FLEXResources.h>
#import <FLEXMacros.h>
#import <FLEXAlert.h>
#import <FLEXResources.h>
@@ -71,7 +71,10 @@
self.tables.selectionHandler = ^(FLEXTableListViewController *host, NSString *tableName) {
NSArray *rows = [host.dbm queryAllDataInTable:tableName];
NSArray *columns = [host.dbm queryAllColumnsOfTable:tableName];
NSArray *rowIDs = [host.dbm queryRowIDsInTable:tableName];
NSArray *rowIDs = nil;
if ([host.dbm respondsToSelector:@selector(queryRowIDsInTable:)]) {
rowIDs = [host.dbm queryRowIDsInTable:tableName];
}
UIViewController *resultsScreen = [FLEXTableContentViewController
columns:columns rows:rows rowIDs:rowIDs tableName:tableName database:host.dbm
];
@@ -168,15 +168,6 @@ typedef NS_ENUM(NSUInteger, FLEXObjectReferenceSection) {
}
+ (instancetype)objectsWithReferencesToObject:(id)object retained:(BOOL)retain {
static Class SwiftObjectClass = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SwiftObjectClass = NSClassFromString(@"SwiftObject");
if (!SwiftObjectClass) {
SwiftObjectClass = NSClassFromString(@"Swift._SwiftObject");
}
});
NSArray<FLEXObjectRef *> *instances = [FLEXHeapEnumerator
objectsWithReferencesToObject:object retained:retain
];
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Categories/CALayer+FLEX.h
+1
View File
@@ -0,0 +1 @@
../../Classes/FLEX-Categories.h
+1
View File
@@ -0,0 +1 @@
../../Classes/FLEX-Core.h
+1
View File
@@ -0,0 +1 @@
../../Classes/FLEX-ObjectExploring.h
+1
View File
@@ -0,0 +1 @@
../../Classes/FLEX-Runtime.h
+1
View File
@@ -0,0 +1 @@
../../Classes/FLEX.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/FLEXAlert.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/Reflection/FLEXBlockDescription.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/Reflection/FLEXClassBuilder.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Core/Views/Cells/FLEXCodeFontCell.h
+1
View File
@@ -0,0 +1 @@
../../Classes/ObjectExplorers/Sections/FLEXCollectionContentSection.h
+1
View File
@@ -0,0 +1 @@
../../Classes/ObjectExplorers/Sections/FLEXColorPreviewSection.h
+1
View File
@@ -0,0 +1 @@
../../Classes/ObjectExplorers/Sections/FLEXDefaultsContentSection.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Toolbar/FLEXExplorerToolbar.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Toolbar/FLEXExplorerToolbarItem.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Core/Controllers/FLEXFilteringTableViewController.h
+1
View File
@@ -0,0 +1 @@
../../Classes/GlobalStateExplorers/Globals/FLEXGlobalsEntry.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/Reflection/FLEXIvar.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Core/Views/Cells/FLEXKeyValueTableViewCell.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/FLEXMacros.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Manager/FLEXManager+Extensibility.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Manager/FLEXManager+Networking.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Manager/FLEXManager.h
+1
View File
@@ -0,0 +1 @@
../../Classes/ObjectExplorers/Sections/FLEXMetadataSection.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/Reflection/FLEXMethod.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/Reflection/FLEXMethodBase.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/Reflection/FLEXMirror.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Core/Views/Cells/FLEXMultilineTableViewCell.h
+1
View File
@@ -0,0 +1 @@
../../Classes/ObjectExplorers/Sections/FLEXMutableListSection.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Core/Controllers/FLEXNavigationController.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/FLEXObjcInternal.h
+1
View File
@@ -0,0 +1 @@
../../Classes/ObjectExplorers/FLEXObjectExplorer.h
+1
View File
@@ -0,0 +1 @@
../../Classes/ObjectExplorers/FLEXObjectExplorerFactory.h
+1
View File
@@ -0,0 +1 @@
../../Classes/ObjectExplorers/FLEXObjectExplorerViewController.h
+1
View File
@@ -0,0 +1 @@
../../Classes/ObjectExplorers/Sections/FLEXObjectInfoSection.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/Reflection/FLEXProperty.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/Reflection/FLEXPropertyAttributes.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/Reflection/FLEXProtocol.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/Reflection/FLEXProtocolBuilder.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/FLEXResources.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Categories/FLEXRuntime+Compare.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Categories/FLEXRuntime+UIKitHelpers.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/FLEXRuntimeConstants.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/FLEXRuntimeSafety.h
+1
View File
@@ -0,0 +1 @@
../../Classes/ObjectExplorers/Sections/Shortcuts/FLEXShortcut.h
+1
View File
@@ -0,0 +1 @@
../../Classes/ObjectExplorers/Sections/Shortcuts/FLEXShortcutsSection.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Core/FLEXSingleRowSection.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Core/Views/Cells/FLEXSubtitleTableViewCell.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/FLEXSwiftInternal.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Core/Views/FLEXTableView.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Core/Views/Cells/FLEXTableViewCell.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Core/Controllers/FLEXTableViewController.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Core/FLEXTableViewSection.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Runtime/Objc/FLEXTypeEncodingParser.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Categories/NSArray+FLEX.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Categories/NSObject+FLEX_Reflection.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Categories/NSTimer+FLEX.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Categories/NSUserDefaults+FLEX.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Categories/UIBarButtonItem+FLEX.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Categories/UIFont+FLEX.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Categories/UIGestureRecognizer+Blocks.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Categories/UIMenu+FLEX.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Categories/UIPasteboard+FLEX.h
+1
View File
@@ -0,0 +1 @@
../../Classes/Utility/Categories/UITextField+Range.h
+8
View File
@@ -0,0 +1,8 @@
module FLEX {
umbrella header "FLEX.h"
link "flex"
export *
module * { export * }
}
@@ -71,3 +71,12 @@
- (void)reloadClassHierarchy;
@end
@interface FLEXObjectExplorer (Reflex)
/// Do not enable this property manually; Reflex will flip the switch when it is loaded.
/// If you wish, you may \e disable it manually.
@property (nonatomic, class) BOOL reflexAvailable;
@end
+46 -6
View File
@@ -15,6 +15,8 @@
#import "FLEXPropertyAttributes.h"
#import "FLEXMetadataSection.h"
#import "NSUserDefaults+FLEX.h"
#import "FLEXMirror.h"
#import "FLEXSwiftInternal.h"
@implementation FLEXObjectExplorerDefaults
@@ -38,10 +40,18 @@
NSMutableArray<FLEXStaticMetadata *> *_allImageNames;
NSString *_objectDescription;
}
@property (nonatomic, readonly) id<FLEXMirror> initialMirror;
@end
@implementation FLEXObjectExplorer
+ (void)initialize {
if (self == FLEXObjectExplorer.class) {
FLEXObjectExplorer.reflexAvailable = NSClassFromString(@"FLEXSwiftMirror") != nil;
}
}
#pragma mark - Initialization
+ (id)forObject:(id)objectOrClass {
@@ -62,6 +72,25 @@
return self;
}
- (id<FLEXMirror>)initialMirror {
static Class FLEXSwiftMirror = nil;
id obj = _object;
// Should we use Reflex?
if (FLEXIsSwiftObjectOrClass(obj) && FLEXObjectExplorer.reflexAvailable) {
// Initialize FLEXSwiftMirror class if needed
if (!FLEXSwiftMirror) {
FLEXSwiftMirror = NSClassFromString(@"FLEXSwiftMirror");
}
return [(id<FLEXMirror>)[FLEXSwiftMirror alloc] initWithSubject:obj];
}
// No; not swift object, or Reflex unavailable
return [FLEXMirror reflect:obj];
}
#pragma mark - Public
@@ -149,42 +178,43 @@
Class superclass = nil;
NSInteger count = self.classHierarchyClasses.count;
NSInteger rootIdx = count - 1;
id<FLEXMirror> mirror = self.initialMirror;
for (NSInteger i = 0; i < count; i++) {
Class cls = self.classHierarchyClasses[i];
superclass = (i < rootIdx) ? self.classHierarchyClasses[i+1] : nil;
[allProperties addObject:[self
metadataUniquedByName:[cls flex_allInstanceProperties]
metadataUniquedByName:mirror.properties
superclass:superclass
kind:FLEXMetadataKindProperties
skip:showMethodOverrides
]];
[allClassProps addObject:[self
metadataUniquedByName:[cls flex_allClassProperties]
metadataUniquedByName:mirror.classProperties
superclass:superclass
kind:FLEXMetadataKindClassProperties
skip:showMethodOverrides
]];
[_allIvars addObject:[self
metadataUniquedByName:[cls flex_allIvars]
metadataUniquedByName:mirror.ivars
superclass:nil
kind:FLEXMetadataKindIvars
skip:NO
]];
[allMethods addObject:[self
metadataUniquedByName:[cls flex_allInstanceMethods]
metadataUniquedByName:mirror.methods
superclass:superclass
kind:FLEXMetadataKindMethods
skip:showMethodOverrides
]];
[allClassMethods addObject:[self
metadataUniquedByName:[cls flex_allClassMethods]
metadataUniquedByName:mirror.classMethods
superclass:superclass
kind:FLEXMetadataKindClassMethods
skip:showMethodOverrides
]];
[_allConformedProtocols addObject:[self
metadataUniquedByName:[cls flex_protocols]
metadataUniquedByName:mirror.protocols
superclass:superclass
kind:FLEXMetadataKindProtocols
skip:NO
@@ -376,3 +406,13 @@
}
@end
#pragma mark - Reflex
@implementation FLEXObjectExplorer (Reflex)
static BOOL _reflexAvailable = NO;
+ (BOOL)reflexAvailable { return _reflexAvailable; }
+ (void)setReflexAvailable:(BOOL)enable { _reflexAvailable = enable; }
@end
-9
View File
@@ -145,15 +145,6 @@ static kern_return_t reader(__unused task_t remote_task, vm_address_t remote_add
}
+ (NSArray<FLEXObjectRef *> *)objectsWithReferencesToObject:(id)object retained:(BOOL)retain {
static Class SwiftObjectClass = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SwiftObjectClass = NSClassFromString(@"SwiftObject");
if (!SwiftObjectClass) {
SwiftObjectClass = NSClassFromString(@"Swift._SwiftObject");
}
});
NSMutableArray<FLEXObjectRef *> *instances = [NSMutableArray new];
[FLEXHeapEnumerator enumerateLiveObjectsUsingBlock:^(__unsafe_unretained id tryObject, __unsafe_unretained Class actualClass) {
// Skip known-invalid objects
+5
View File
@@ -9,10 +9,13 @@
#ifndef FLEXMacros_h
#define FLEXMacros_h
#define flex_keywordify class NSObject;
#define ctor flex_keywordify __attribute__((constructor)) void __flex_ctor_##__LINE__()
#define dtor flex_keywordify __attribute__((destructor)) void __flex_dtor_##__LINE__()
#ifndef strongify
#define weakify(var) __weak __typeof(var) __weak__##var = var;
#define strongify(var) \
@@ -21,6 +24,8 @@ _Pragma("clang diagnostic ignored \"-Wshadow\"") \
__strong typeof(var) var = __weak__##var; \
_Pragma("clang diagnostic pop")
#endif
// A macro to check if we are running in a test environment
#define FLEX_IS_TESTING() (NSClassFromString(@"XCTest") != nil)
@@ -0,0 +1,23 @@
//
// FLEXSwiftInternal.h
// FLEX
//
// Created by Tanner Bennett on 10/28/21.
// Copyright © 2021 Flipboard. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
#ifdef __cplusplus
extern "C" {
#endif
BOOL FLEXIsSwiftObjectOrClass(id objOrClass);
#ifdef __cplusplus
}
#endif
NS_ASSUME_NONNULL_END
@@ -0,0 +1,92 @@
//
// FLEXSwiftInternal.m
// FLEX
//
// Created by Tanner Bennett on 10/28/21.
// Copyright © 2021 Flipboard. All rights reserved.
//
#import "FLEXSwiftInternal.h"
#import <objc/runtime.h>
#include <atomic>
// class is a Swift class from the pre-stable Swift ABI
#define FAST_IS_SWIFT_LEGACY (1UL<<0)
// class is a Swift class from the stable Swift ABI
#define FAST_IS_SWIFT_STABLE (1UL<<1)
// data pointer
#define FAST_DATA_MASK 0xfffffffcUL
typedef uintptr_t class_data_bits_t;
#if __LP64__
typedef uint32_t mask_t; // x86_64 & arm64 asm are less efficient with 16-bits
#else
typedef uint16_t mask_t;
#endif
/* dyld_shared_cache_builder and obj-C agree on these definitions */
struct preopt_cache_entry_t {
uint32_t sel_offs;
uint32_t imp_offs;
};
/* dyld_shared_cache_builder and obj-C agree on these definitions */
struct preopt_cache_t {
int32_t fallback_class_offset;
union {
struct {
uint16_t shift : 5;
uint16_t mask : 11;
};
uint16_t hash_params;
};
uint16_t occupied : 14;
uint16_t has_inlines : 1;
uint16_t bit_one : 1;
preopt_cache_entry_t entries[];
};
union isa_t {
uintptr_t bits;
// Accessing the class requires custom ptrauth operations
Class cls;
};
struct cache_t {
std::atomic<uintptr_t> _bucketsAndMaybeMask;
union {
struct {
std::atomic<mask_t> _maybeMask;
#if __LP64__
uint16_t _flags;
#endif
uint16_t _occupied;
};
std::atomic<preopt_cache_t *> _originalPreoptCache;
};
};
struct objc_object_ {
union isa_t isa;
};
struct objc_class_ : objc_object_ {
Class superclass;
cache_t cache; // formerly cache pointer and vtable
class_data_bits_t bits;
};
extern "C" BOOL FLEXIsSwiftObjectOrClass(id objOrClass) {
Class cls = objOrClass;
if (!object_isClass(objOrClass)) {
cls = object_getClass(objOrClass);
}
class_data_bits_t rodata = ((__bridge objc_class_ *)(cls))->bits;
if (@available(macOS 10.14.4, iOS 12.2, tvOS 12.2, watchOS 5.2, *)) {
return rodata & FAST_IS_SWIFT_STABLE;
} else {
return rodata & FAST_IS_SWIFT_LEGACY;
}
}
@@ -18,21 +18,28 @@ NS_SWIFT_NAME(FLEXMirrorProtocol)
@protocol FLEXMirror <NSObject>
/// Swift initializer
/// @throws If a metaclass object is passed in.
- (instancetype)initWithSubject:(id)objectOrClass NS_SWIFT_NAME(init(reflecting:));
/// The underlying object or \c Class used to create this \c FLEXMirror instance.
/// The underlying object or \c Class used to create this \c FLEXMirror.
@property (nonatomic, readonly) id value;
/// Whether the reflected thing was a class or a class instance.
/// Whether \c value was a class or a class instance.
@property (nonatomic, readonly) BOOL isClass;
/// The name of the \c Class of the \c value property.
@property (nonatomic, readonly) NSString *className;
@property (nonatomic, readonly) NSArray<FLEXProperty *> *properties;
@property (nonatomic, readonly) NSArray<FLEXProperty *> *classProperties;
@property (nonatomic, readonly) NSArray<FLEXIvar *> *ivars;
@property (nonatomic, readonly) NSArray<FLEXMethod *> *methods;
@property (nonatomic, readonly) NSArray<FLEXMethod *> *classMethods;
@property (nonatomic, readonly) NSArray<FLEXProtocol *> *protocols;
/// @return A reflection of \c value.superClass.
/// Super mirrors are initialized with the class that corresponds to the value passed in.
/// If you passed in an instance of a class, it's superclass is used to create this mirror.
/// If you passed in a class, then that class's superclass is used.
///
/// @note This property should be computed, not cached.
@property (nonatomic, readonly, nullable) id<FLEXMirror> superMirror NS_SWIFT_NAME(superMirror);
@end
@@ -45,11 +52,12 @@ NS_SWIFT_NAME(FLEXMirrorProtocol)
/// \c NSObject categories provided if your code will only use a few pieces of information,
/// or if your code needs to run faster.
///
/// If you reflect an instance of a class then \c methods and \c properties will be populated
/// with instance methods and properties. If you reflect a class itself, then \c methods
/// and \c properties will be populated with class methods and properties as you'd expect.
/// Regardless of whether you reflect an instance or a class object, \c methods and \c properties
/// will be populated with instance methods and properties, and \c classMethods and \c classProperties
/// will be populated with class methods and properties.
///
/// @param objectOrClass An instance of an objct or a \c Class object.
/// @throws If a metaclass object is passed in.
/// @return An instance of \c FLEXMirror.
+ (instancetype)reflect:(id)objectOrClass;
@@ -58,8 +66,10 @@ NS_SWIFT_NAME(FLEXMirrorProtocol)
@property (nonatomic, readonly) NSString *className;
@property (nonatomic, readonly) NSArray<FLEXProperty *> *properties;
@property (nonatomic, readonly) NSArray<FLEXProperty *> *classProperties;
@property (nonatomic, readonly) NSArray<FLEXIvar *> *ivars;
@property (nonatomic, readonly) NSArray<FLEXMethod *> *methods;
@property (nonatomic, readonly) NSArray<FLEXMethod *> *classMethods;
@property (nonatomic, readonly) NSArray<FLEXProtocol *> *protocols;
@property (nonatomic, readonly, nullable) FLEXMirror *superMirror NS_SWIFT_NAME(superMirror);
@@ -69,10 +79,14 @@ NS_SWIFT_NAME(FLEXMirrorProtocol)
@interface FLEXMirror (ExtendedMirror)
/// @return The method with the given name, or \c nil if one does not exist.
/// @return The instance method with the given name, or \c nil if one does not exist.
- (nullable FLEXMethod *)methodNamed:(nullable NSString *)name;
/// @return The property with the given name, or \c nil if one does not exist.
/// @return The class method with the given name, or \c nil if one does not exist.
- (nullable FLEXMethod *)classMethodNamed:(nullable NSString *)name;
/// @return The instance property with the given name, or \c nil if one does not exist.
- (nullable FLEXProperty *)propertyNamed:(nullable NSString *)name;
/// @return The class property with the given name, or \c nil if one does not exist.
- (nullable FLEXProperty *)classPropertyNamed:(nullable NSString *)name;
/// @return The instance variable with the given name, or \c nil if one does not exist.
- (nullable FLEXIvar *)ivarNamed:(nullable NSString *)name;
/// @return The protocol with the given name, or \c nil if one does not exist.
@@ -45,64 +45,65 @@
}
- (NSString *)description {
NSString *type = self.isClass ? @"metaclass" : @"class";
return [NSString
stringWithFormat:@"<%@ %@=%@, %lu properties, %lu ivars, %lu methods, %lu protocols>",
return [NSString stringWithFormat:@"<%@ %@=%@>",
NSStringFromClass(self.class),
type,
self.className,
(unsigned long)self.properties.count,
(unsigned long)self.ivars.count,
(unsigned long)self.methods.count,
(unsigned long)self.protocols.count
self.isClass ? @"metaclass" : @"class",
self.className
];
}
- (void)examine {
// cls is a metaclass if self.value is a class
Class cls = object_getClass(self.value);
unsigned int pcount, mcount, ivcount, pccount;
objc_property_t *objcproperties = class_copyPropertyList(cls, &pcount);
Protocol*__unsafe_unretained *procs = class_copyProtocolList(cls, &pccount);
Method *objcmethods = class_copyMethodList(cls, &mcount);
Ivar *objcivars = class_copyIvarList(cls, &ivcount);
BOOL isClass = object_isClass(self.value);
Class cls = isClass ? self.value : object_getClass(self.value);
Class meta = object_getClass(cls);
_className = NSStringFromClass(cls);
_isClass = class_isMetaClass(cls); // or object_isClass(self.value)
_isClass = isClass;
NSMutableArray *properties = [NSMutableArray new];
for (int i = 0; i < pcount; i++)
[properties addObject:[FLEXProperty property:objcproperties[i]]];
_properties = properties;
unsigned int pcount, cpcount, mcount, cmcount, ivcount, pccount;
Ivar *objcIvars = class_copyIvarList(cls, &ivcount);
Method *objcMethods = class_copyMethodList(cls, &mcount);
Method *objcClsMethods = class_copyMethodList(meta, &cmcount);
objc_property_t *objcProperties = class_copyPropertyList(cls, &pcount);
objc_property_t *objcClsProperties = class_copyPropertyList(meta, &cpcount);
Protocol *__unsafe_unretained *protos = class_copyProtocolList(cls, &pccount);
NSMutableArray *methods = [NSMutableArray new];
for (int i = 0; i < mcount; i++)
[methods addObject:[FLEXMethod method:objcmethods[i]]];
_methods = methods;
_ivars = [NSArray flex_forEachUpTo:ivcount map:^id(NSUInteger i) {
return [FLEXIvar ivar:objcIvars[i]];
}];
NSMutableArray *ivars = [NSMutableArray new];
for (int i = 0; i < ivcount; i++)
[ivars addObject:[FLEXIvar ivar:objcivars[i]]];
_ivars = ivars;
_methods = [NSArray flex_forEachUpTo:mcount map:^id(NSUInteger i) {
return [FLEXMethod method:objcMethods[i] isInstanceMethod:YES];
}];
_classMethods = [NSArray flex_forEachUpTo:cmcount map:^id(NSUInteger i) {
return [FLEXMethod method:objcClsMethods[i] isInstanceMethod:NO];
}];
NSMutableArray *protocols = [NSMutableArray new];
for (int i = 0; i < pccount; i++)
[protocols addObject:[FLEXProtocol protocol:procs[i]]];
_protocols = protocols;
_properties = [NSArray flex_forEachUpTo:pcount map:^id(NSUInteger i) {
return [FLEXProperty property:objcProperties[i] onClass:cls];
}];
_classProperties = [NSArray flex_forEachUpTo:cpcount map:^id(NSUInteger i) {
return [FLEXProperty property:objcClsProperties[i] onClass:meta];
}];
_protocols = [NSArray flex_forEachUpTo:pccount map:^id(NSUInteger i) {
return [FLEXProtocol protocol:protos[i]];
}];
// Cleanup
free(objcproperties);
free(objcmethods);
free(objcivars);
free(procs);
procs = NULL;
free(objcClsProperties);
free(objcProperties);
free(objcClsMethods);
free(objcMethods);
free(objcIvars);
free(protos);
protos = NULL;
}
#pragma mark Misc
- (FLEXMirror *)superMirror {
return [FLEXMirror reflect:[self.value superclass]];
Class cls = _isClass ? _value : object_getClass(_value);
return [FLEXMirror reflect:class_getSuperclass(cls)];
}
@end
@@ -121,10 +122,18 @@
return [self filter:self.methods forName:name];
}
- (FLEXMethod *)classMethodNamed:(NSString *)name {
return [self filter:self.classMethods forName:name];
}
- (FLEXProperty *)propertyNamed:(NSString *)name {
return [self filter:self.properties forName:name];
}
- (FLEXProperty *)classPropertyNamed:(NSString *)name {
return [self filter:self.classProperties forName:name];
}
- (FLEXIvar *)ivarNamed:(NSString *)name {
return [self filter:self.ivars forName:name];
}
@@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
A9D70EC640E633FE829EF695 /* libPods-FLEXample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD699DDBAC5A16D8CFD39AC /* libPods-FLEXample.a */; };
C386D6D02419975A00699085 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C386D6CF2419975A00699085 /* AppDelegate.swift */; };
C386D6D22419975A00699085 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C386D6D12419975A00699085 /* SceneDelegate.swift */; };
C386D6D62419975B00699085 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C386D6D52419975B00699085 /* Assets.xcassets */; };
@@ -24,13 +25,12 @@
C3A67856241AB8AD005A4681 /* MiscNetworkRequests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A67855241AB8AD005A4681 /* MiscNetworkRequests.m */; };
C3A67858241ADDF7005A4681 /* Commit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A67857241ADDF7005A4681 /* Commit.swift */; };
C3B3760025B8CDA300AD43AB /* Person.m in Sources */ = {isa = PBXBuildFile; fileRef = C3B375FF25B8CDA300AD43AB /* Person.m */; };
E211705F801A8167D308F94A /* libPods-FLEXample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD699DDBAC5A16D8CFD39AC /* libPods-FLEXample.a */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
33A4EDAC37AA215CF95EEA24 /* Pods-FLEXample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FLEXample.release.xcconfig"; path = "Target Support Files/Pods-FLEXample/Pods-FLEXample.release.xcconfig"; sourceTree = "<group>"; };
57041F764D8B1C098B9B4073 /* Pods-FLEXample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FLEXample.debug.xcconfig"; path = "Target Support Files/Pods-FLEXample/Pods-FLEXample.debug.xcconfig"; sourceTree = "<group>"; };
92E1E1EECA3F2533E1B8BF35 /* Pods-FLEXample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FLEXample.debug.xcconfig"; path = "Target Support Files/Pods-FLEXample/Pods-FLEXample.debug.xcconfig"; sourceTree = "<group>"; };
BBD699DDBAC5A16D8CFD39AC /* libPods-FLEXample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-FLEXample.a"; sourceTree = BUILT_PRODUCTS_DIR; };
BE1780244AEC542DDB894B08 /* Pods-FLEXample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FLEXample.release.xcconfig"; path = "Target Support Files/Pods-FLEXample/Pods-FLEXample.release.xcconfig"; sourceTree = "<group>"; };
C386D6CC2419975A00699085 /* FLEXample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FLEXample.app; sourceTree = BUILT_PRODUCTS_DIR; };
C386D6CF2419975A00699085 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
C386D6D12419975A00699085 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
@@ -64,7 +64,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E211705F801A8167D308F94A /* libPods-FLEXample.a in Frameworks */,
A9D70EC640E633FE829EF695 /* libPods-FLEXample.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -77,8 +77,8 @@
C386D6CE2419975A00699085 /* FLEXample */,
C3A67853241AB88F005A4681 /* Realm */,
C386D6CD2419975A00699085 /* Products */,
E367791A4E4085CCB945F0F8 /* Pods */,
DCEB5037DA3D5C01CB9CEE93 /* Frameworks */,
EB0852B7D285AB31D7532049 /* Pods */,
);
sourceTree = "<group>";
};
@@ -169,12 +169,13 @@
name = Frameworks;
sourceTree = "<group>";
};
E367791A4E4085CCB945F0F8 /* Pods */ = {
EB0852B7D285AB31D7532049 /* Pods */ = {
isa = PBXGroup;
children = (
57041F764D8B1C098B9B4073 /* Pods-FLEXample.debug.xcconfig */,
33A4EDAC37AA215CF95EEA24 /* Pods-FLEXample.release.xcconfig */,
92E1E1EECA3F2533E1B8BF35 /* Pods-FLEXample.debug.xcconfig */,
BE1780244AEC542DDB894B08 /* Pods-FLEXample.release.xcconfig */,
);
name = Pods;
path = Pods;
sourceTree = "<group>";
};
@@ -185,7 +186,7 @@
isa = PBXNativeTarget;
buildConfigurationList = C386D6E02419975B00699085 /* Build configuration list for PBXNativeTarget "FLEXample" */;
buildPhases = (
E25E87A42AA269B0CF1830D1 /* [CP] Check Pods Manifest.lock */,
FC7B42D14DC20FF97D095393 /* [CP] Check Pods Manifest.lock */,
C386D6C82419975A00699085 /* Sources */,
C386D6C92419975A00699085 /* Frameworks */,
C386D6CA2419975A00699085 /* Resources */,
@@ -215,7 +216,7 @@
};
};
};
buildConfigurationList = C386D6C72419975A00699085 /* Build configuration list for PBXProject "FLEXample" */;
buildConfigurationList = C386D6C72419975A00699085 /* Build configuration list for PBXProject "FLEXample-Cocoapods" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
@@ -253,7 +254,7 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
E25E87A42AA269B0CF1830D1 /* [CP] Check Pods Manifest.lock */ = {
FC7B42D14DC20FF97D095393 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -425,7 +426,7 @@
};
C386D6E12419975B00699085 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 57041F764D8B1C098B9B4073 /* Pods-FLEXample.debug.xcconfig */;
baseConfigurationReference = 92E1E1EECA3F2533E1B8BF35 /* Pods-FLEXample.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
@@ -450,7 +451,7 @@
};
C386D6E22419975B00699085 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 33A4EDAC37AA215CF95EEA24 /* Pods-FLEXample.release.xcconfig */;
baseConfigurationReference = BE1780244AEC542DDB894B08 /* Pods-FLEXample.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
@@ -475,7 +476,7 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
C386D6C72419975A00699085 /* Build configuration list for PBXProject "FLEXample" */ = {
C386D6C72419975A00699085 /* Build configuration list for PBXProject "FLEXample-Cocoapods" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C386D6DE2419975B00699085 /* Debug */,
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1240"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C386D6CB2419975A00699085"
BuildableName = "FLEXample.app"
BlueprintName = "FLEXample"
ReferencedContainer = "container:FLEXample-Cocoapods.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C386D6CB2419975A00699085"
BuildableName = "FLEXample.app"
BlueprintName = "FLEXample"
ReferencedContainer = "container:FLEXample-Cocoapods.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C386D6CB2419975A00699085"
BuildableName = "FLEXample.app"
BlueprintName = "FLEXample"
ReferencedContainer = "container:FLEXample-Cocoapods.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -0,0 +1,484 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 52;
objects = {
/* Begin PBXBuildFile section */
C386D6D02419975A00699085 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C386D6CF2419975A00699085 /* AppDelegate.swift */; };
C386D6D22419975A00699085 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C386D6D12419975A00699085 /* SceneDelegate.swift */; };
C386D6D62419975B00699085 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C386D6D52419975B00699085 /* Assets.xcassets */; };
C386D6D92419975B00699085 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C386D6D82419975B00699085 /* Preview Assets.xcassets */; };
C386D6DC2419975B00699085 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C386D6DA2419975B00699085 /* LaunchScreen.storyboard */; };
C386D6E62419984700699085 /* CommitListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C386D6E52419984700699085 /* CommitListViewController.m */; };
C386D6FD241AA4B700699085 /* image.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = C386D6F8241AA4B700699085 /* image.jpeg */; };
C386D6FE241AA4B700699085 /* image in Resources */ = {isa = PBXBuildFile; fileRef = C386D6F9241AA4B700699085 /* image */; };
C386D6FF241AA4B700699085 /* image.png in Resources */ = {isa = PBXBuildFile; fileRef = C386D6FA241AA4B700699085 /* image.png */; };
C386D701241AA4B700699085 /* image.jpg in Resources */ = {isa = PBXBuildFile; fileRef = C386D6FC241AA4B700699085 /* image.jpg */; };
C386D704241AA61600699085 /* music_library.db in Resources */ = {isa = PBXBuildFile; fileRef = C386D702241AA61600699085 /* music_library.db */; };
C386D705241AA61600699085 /* music_library_schema.jpg in Resources */ = {isa = PBXBuildFile; fileRef = C386D703241AA61600699085 /* music_library_schema.jpg */; };
C386D70B241AA67800699085 /* Dog.m in Sources */ = {isa = PBXBuildFile; fileRef = C386D709241AA67800699085 /* Dog.m */; };
C386D70C241AA67800699085 /* Owner.m in Sources */ = {isa = PBXBuildFile; fileRef = C386D70A241AA67800699085 /* Owner.m */; };
C3A67856241AB8AD005A4681 /* MiscNetworkRequests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A67855241AB8AD005A4681 /* MiscNetworkRequests.m */; };
C3A67858241ADDF7005A4681 /* Commit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A67857241ADDF7005A4681 /* Commit.swift */; };
C3B3760025B8CDA300AD43AB /* Person.m in Sources */ = {isa = PBXBuildFile; fileRef = C3B375FF25B8CDA300AD43AB /* Person.m */; };
C3F86CD72740ED2600E094BF /* Reflex in Frameworks */ = {isa = PBXBuildFile; productRef = C3F86CD62740ED2600E094BF /* Reflex */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
BBD699DDBAC5A16D8CFD39AC /* libPods-FLEXample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-FLEXample.a"; sourceTree = BUILT_PRODUCTS_DIR; };
C386D6CC2419975A00699085 /* FLEXample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FLEXample.app; sourceTree = BUILT_PRODUCTS_DIR; };
C386D6CF2419975A00699085 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
C386D6D12419975A00699085 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
C386D6D52419975B00699085 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
C386D6D82419975B00699085 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
C386D6DB2419975B00699085 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
C386D6DD2419975B00699085 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
C386D6E32419984700699085 /* FLEXample-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FLEXample-Bridging-Header.h"; sourceTree = "<group>"; };
C386D6E42419984700699085 /* CommitListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommitListViewController.h; sourceTree = "<group>"; };
C386D6E52419984700699085 /* CommitListViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CommitListViewController.m; sourceTree = "<group>"; };
C386D6F8241AA4B700699085 /* image.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = image.jpeg; sourceTree = "<group>"; };
C386D6F9241AA4B700699085 /* image */ = {isa = PBXFileReference; lastKnownFileType = file; path = image; sourceTree = "<group>"; };
C386D6FA241AA4B700699085 /* image.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = image.png; sourceTree = "<group>"; };
C386D6FC241AA4B700699085 /* image.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = image.jpg; sourceTree = "<group>"; };
C386D702241AA61600699085 /* music_library.db */ = {isa = PBXFileReference; lastKnownFileType = file; path = music_library.db; sourceTree = "<group>"; };
C386D703241AA61600699085 /* music_library_schema.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = music_library_schema.jpg; sourceTree = "<group>"; };
C386D706241AA66100699085 /* dogs.realm */ = {isa = PBXFileReference; lastKnownFileType = file; path = dogs.realm; sourceTree = "<group>"; };
C386D707241AA67800699085 /* Dog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Dog.h; sourceTree = "<group>"; };
C386D708241AA67800699085 /* Owner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Owner.h; sourceTree = "<group>"; };
C386D709241AA67800699085 /* Dog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Dog.m; sourceTree = "<group>"; };
C386D70A241AA67800699085 /* Owner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Owner.m; sourceTree = "<group>"; };
C3A67854241AB8AD005A4681 /* MiscNetworkRequests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MiscNetworkRequests.h; sourceTree = "<group>"; };
C3A67855241AB8AD005A4681 /* MiscNetworkRequests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MiscNetworkRequests.m; sourceTree = "<group>"; };
C3A67857241ADDF7005A4681 /* Commit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Commit.swift; sourceTree = "<group>"; };
C3B375FE25B8CDA300AD43AB /* Person.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Person.h; sourceTree = "<group>"; };
C3B375FF25B8CDA300AD43AB /* Person.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Person.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
C386D6C92419975A00699085 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
C3F86CD72740ED2600E094BF /* Reflex in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
C386D6C32419975A00699085 = {
isa = PBXGroup;
children = (
C386D6CE2419975A00699085 /* FLEXample */,
C3A67853241AB88F005A4681 /* Realm */,
C386D6CD2419975A00699085 /* Products */,
DCEB5037DA3D5C01CB9CEE93 /* Frameworks */,
);
sourceTree = "<group>";
};
C386D6CD2419975A00699085 /* Products */ = {
isa = PBXGroup;
children = (
C386D6CC2419975A00699085 /* FLEXample.app */,
);
name = Products;
sourceTree = "<group>";
};
C386D6CE2419975A00699085 /* FLEXample */ = {
isa = PBXGroup;
children = (
C386D6E72419985E00699085 /* Supporting Files */,
C386D6CF2419975A00699085 /* AppDelegate.swift */,
C386D6D12419975A00699085 /* SceneDelegate.swift */,
C3A67854241AB8AD005A4681 /* MiscNetworkRequests.h */,
C3A67855241AB8AD005A4681 /* MiscNetworkRequests.m */,
C3A67852241AB86D005A4681 /* App */,
);
path = FLEXample;
sourceTree = "<group>";
};
C386D6D72419975B00699085 /* Preview Content */ = {
isa = PBXGroup;
children = (
C386D6D82419975B00699085 /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
C386D6E72419985E00699085 /* Supporting Files */ = {
isa = PBXGroup;
children = (
C386D6D52419975B00699085 /* Assets.xcassets */,
C386D6D72419975B00699085 /* Preview Content */,
C386D6F7241AA4AA00699085 /* Bundle */,
C386D6DA2419975B00699085 /* LaunchScreen.storyboard */,
C386D6DD2419975B00699085 /* Info.plist */,
C386D6E32419984700699085 /* FLEXample-Bridging-Header.h */,
);
path = "Supporting Files";
sourceTree = "<group>";
};
C386D6F7241AA4AA00699085 /* Bundle */ = {
isa = PBXGroup;
children = (
C386D702241AA61600699085 /* music_library.db */,
C386D703241AA61600699085 /* music_library_schema.jpg */,
C386D706241AA66100699085 /* dogs.realm */,
C386D6F9241AA4B700699085 /* image */,
C386D6F8241AA4B700699085 /* image.jpeg */,
C386D6FC241AA4B700699085 /* image.jpg */,
C386D6FA241AA4B700699085 /* image.png */,
);
path = Bundle;
sourceTree = "<group>";
};
C3A67852241AB86D005A4681 /* App */ = {
isa = PBXGroup;
children = (
C3B375FE25B8CDA300AD43AB /* Person.h */,
C3B375FF25B8CDA300AD43AB /* Person.m */,
C3A67857241ADDF7005A4681 /* Commit.swift */,
C386D6E42419984700699085 /* CommitListViewController.h */,
C386D6E52419984700699085 /* CommitListViewController.m */,
);
path = App;
sourceTree = "<group>";
};
C3A67853241AB88F005A4681 /* Realm */ = {
isa = PBXGroup;
children = (
C386D707241AA67800699085 /* Dog.h */,
C386D709241AA67800699085 /* Dog.m */,
C386D708241AA67800699085 /* Owner.h */,
C386D70A241AA67800699085 /* Owner.m */,
);
path = Realm;
sourceTree = "<group>";
};
DCEB5037DA3D5C01CB9CEE93 /* Frameworks */ = {
isa = PBXGroup;
children = (
BBD699DDBAC5A16D8CFD39AC /* libPods-FLEXample.a */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
C386D6CB2419975A00699085 /* FLEXample */ = {
isa = PBXNativeTarget;
buildConfigurationList = C386D6E02419975B00699085 /* Build configuration list for PBXNativeTarget "FLEXample" */;
buildPhases = (
C386D6C82419975A00699085 /* Sources */,
C386D6C92419975A00699085 /* Frameworks */,
C386D6CA2419975A00699085 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = FLEXample;
packageProductDependencies = (
C3F86CD62740ED2600E094BF /* Reflex */,
);
productName = FLEXample;
productReference = C386D6CC2419975A00699085 /* FLEXample.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
C386D6C42419975A00699085 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1130;
LastUpgradeCheck = 1200;
ORGANIZATIONNAME = Flipboard;
TargetAttributes = {
C386D6CB2419975A00699085 = {
CreatedOnToolsVersion = 11.3.1;
LastSwiftMigration = 1130;
};
};
};
buildConfigurationList = C386D6C72419975A00699085 /* Build configuration list for PBXProject "FLEXample-SPM" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = C386D6C32419975A00699085;
packageReferences = (
C3F86CD52740ED2600E094BF /* XCRemoteSwiftPackageReference "Reflex" */,
);
productRefGroup = C386D6CD2419975A00699085 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
C386D6CB2419975A00699085 /* FLEXample */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
C386D6CA2419975A00699085 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C386D6DC2419975B00699085 /* LaunchScreen.storyboard in Resources */,
C386D6FF241AA4B700699085 /* image.png in Resources */,
C386D704241AA61600699085 /* music_library.db in Resources */,
C386D6FE241AA4B700699085 /* image in Resources */,
C386D6FD241AA4B700699085 /* image.jpeg in Resources */,
C386D701241AA4B700699085 /* image.jpg in Resources */,
C386D6D92419975B00699085 /* Preview Assets.xcassets in Resources */,
C386D6D62419975B00699085 /* Assets.xcassets in Resources */,
C386D705241AA61600699085 /* music_library_schema.jpg in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
C386D6C82419975A00699085 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C3A67858241ADDF7005A4681 /* Commit.swift in Sources */,
C386D6D02419975A00699085 /* AppDelegate.swift in Sources */,
C3B3760025B8CDA300AD43AB /* Person.m in Sources */,
C386D6E62419984700699085 /* CommitListViewController.m in Sources */,
C386D70B241AA67800699085 /* Dog.m in Sources */,
C3A67856241AB8AD005A4681 /* MiscNetworkRequests.m in Sources */,
C386D70C241AA67800699085 /* Owner.m in Sources */,
C386D6D22419975A00699085 /* SceneDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
C386D6DA2419975B00699085 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
C386D6DB2419975B00699085 /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
C386D6DE2419975B00699085 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = NO;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
C386D6DF2419975B00699085 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = NO;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
C386D6E12419975B00699085 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"FLEXample/Supporting Files/Preview Content\"";
DEVELOPMENT_TEAM = S6N2F22V2Z;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = "FLEXample/Supporting Files/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.flipboard.flex.FLEXample;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "FLEXample/Supporting Files/FLEXample-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
C386D6E22419975B00699085 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"FLEXample/Supporting Files/Preview Content\"";
DEVELOPMENT_TEAM = S6N2F22V2Z;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = "FLEXample/Supporting Files/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.flipboard.flex.FLEXample;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "FLEXample/Supporting Files/FLEXample-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
C386D6C72419975A00699085 /* Build configuration list for PBXProject "FLEXample-SPM" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C386D6DE2419975B00699085 /* Debug */,
C386D6DF2419975B00699085 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C386D6E02419975B00699085 /* Build configuration list for PBXNativeTarget "FLEXample" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C386D6E12419975B00699085 /* Debug */,
C386D6E22419975B00699085 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
C3F86CD52740ED2600E094BF /* XCRemoteSwiftPackageReference "Reflex" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "file:///Users/tanner/Repos/Reflex";
requirement = {
branch = master;
kind = branch;
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
C3F86CD62740ED2600E094BF /* Reflex */ = {
isa = XCSwiftPackageProductDependency;
package = C3F86CD52740ED2600E094BF /* XCRemoteSwiftPackageReference "Reflex" */;
productName = Reflex;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = C386D6C42419975A00699085 /* Project object */;
}
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1240"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C386D6CB2419975A00699085"
BuildableName = "FLEXample.app"
BlueprintName = "FLEXample"
ReferencedContainer = "container:FLEXample-SPM.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C386D6CB2419975A00699085"
BuildableName = "FLEXample.app"
BlueprintName = "FLEXample"
ReferencedContainer = "container:FLEXample-SPM.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C386D6CB2419975A00699085"
BuildableName = "FLEXample.app"
BlueprintName = "FLEXample"
ReferencedContainer = "container:FLEXample-SPM.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:FLEXample.xcodeproj">
</FileRef>
</Workspace>
@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
-10
View File
@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:FLEXample.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
+1
View File
@@ -1,5 +1,6 @@
platform :ios, '13.0'
target 'FLEXample' do
project 'FLEXample-Cocoapods'
pod 'FLEX', :path => '../'
end
+15 -5
View File
@@ -32,14 +32,24 @@ Pod::Spec.new do |spec|
spec.platform = :ios, "9.0"
spec.source = { :git => "https://github.com/FLEXTool/FLEX.git", :tag => "#{spec.version}" }
spec.source_files = "Classes/**/*.{h,c,m,mm}"
spec.exclude_files = "Classes/Headers/*.{h,c,m,mm}"
spec.frameworks = [ "Foundation", "UIKit", "CoreGraphics", "ImageIO", "QuartzCore", "WebKit", "Security", "SceneKit" ]
spec.libraries = [ "z", "sqlite3" ]
spec.requires_arc = true
spec.compiler_flags = "-Wno-unsupported-availability-guard"
spec.public_header_files = [ "Classes/*.h", "Classes/Manager/*.h", "Classes/Toolbar/*.h",
"Classes/GlobalStateExplorers/Globals/FLEXGlobalsEntry.h",
"Classes/Core/**/*.h", "Classes/Utility/Runtime/Objc/**/*.h",
"Classes/ObjectExplorers/**/*.h", "Classes/Editing/**/*.h",
"Classes/Utility/Categories/*.h", "Classes/Utility/FLEXAlert.h",
"Classes/Utility/FLEXResources.h" ]
"Classes/Core/Controllers/*.h", "Classes/Core/Views/*.h",
"Classes/Core/Views/Cells/*.h", "Classes/Core/*.h",
"Classes/Utility/Categories/*.h",
"Classes/Utility/Runtime/Objc/**/*.h",
"Classes/ObjectExplorers/*.h",
"Classes/ObjectExplorers/Sections/*.h",
"Classes/Utility/FLEXMacros.h",
"Classes/Utility/FLEXAlert.h",
"Classes/Utility/FLEXResources.h",
"Classes/ObjectExplorers/Sections/Shortcuts/FLEXShortcut.h",
"Classes/ObjectExplorers/Sections/Shortcuts/FLEXShortcutsSection.h",
"Classes/GlobalStateExplorers/Globals/FLEXGlobalsEntry.h"
]
end
+8
View File
@@ -242,6 +242,8 @@
C383C3C523B6BB81007A321B /* FLEXCodeFontCell.h in Headers */ = {isa = PBXBuildFile; fileRef = C383C3C323B6BB81007A321B /* FLEXCodeFontCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
C383C3C623B6BB81007A321B /* FLEXCodeFontCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C383C3C423B6BB81007A321B /* FLEXCodeFontCell.m */; };
C3854DF023F36C1700FCD1E2 /* FLEXTypeEncodingParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3854DEF23F36C1700FCD1E2 /* FLEXTypeEncodingParserTests.m */; };
C38568FA272B3BFC00B1E37F /* FLEXSwiftInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = C38568F8272B3BFC00B1E37F /* FLEXSwiftInternal.h */; };
C38568FB272B3BFC00B1E37F /* FLEXSwiftInternal.mm in Sources */ = {isa = PBXBuildFile; fileRef = C38568F9272B3BFC00B1E37F /* FLEXSwiftInternal.mm */; };
C386D6A9241995A800699085 /* FLEXTypeEncodingParser.h in Headers */ = {isa = PBXBuildFile; fileRef = C3854DF223F36C9E00FCD1E2 /* FLEXTypeEncodingParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
C386D6E924199C1B00699085 /* FLEX-Core.h in Headers */ = {isa = PBXBuildFile; fileRef = C386D6E824199C1B00699085 /* FLEX-Core.h */; settings = {ATTRIBUTES = (Public, ); }; };
C386D6EB24199E9600699085 /* FLEX-ObjectExploring.h in Headers */ = {isa = PBXBuildFile; fileRef = C386D6EA24199E9600699085 /* FLEX-ObjectExploring.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -619,6 +621,8 @@
C3854DEF23F36C1700FCD1E2 /* FLEXTypeEncodingParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXTypeEncodingParserTests.m; sourceTree = "<group>"; };
C3854DF123F36C9E00FCD1E2 /* FLEXTypeEncodingParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXTypeEncodingParser.m; sourceTree = "<group>"; };
C3854DF223F36C9E00FCD1E2 /* FLEXTypeEncodingParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXTypeEncodingParser.h; sourceTree = "<group>"; };
C38568F8272B3BFC00B1E37F /* FLEXSwiftInternal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEXSwiftInternal.h; sourceTree = "<group>"; };
C38568F9272B3BFC00B1E37F /* FLEXSwiftInternal.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = FLEXSwiftInternal.mm; sourceTree = "<group>"; };
C386D6E824199C1B00699085 /* FLEX-Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FLEX-Core.h"; sourceTree = "<group>"; };
C386D6EA24199E9600699085 /* FLEX-ObjectExploring.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FLEX-ObjectExploring.h"; sourceTree = "<group>"; };
C386D6EC24199EC600699085 /* FLEX-Runtime.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FLEX-Runtime.h"; sourceTree = "<group>"; };
@@ -1106,6 +1110,8 @@
C383C3B823B6A62A007A321B /* FLEXRuntimeSafety.m */,
C37A0C91218BAC9600848CA7 /* FLEXObjcInternal.h */,
C37A0C92218BAC9600848CA7 /* FLEXObjcInternal.mm */,
C38568F8272B3BFC00B1E37F /* FLEXSwiftInternal.h */,
C38568F9272B3BFC00B1E37F /* FLEXSwiftInternal.mm */,
C386D6EE2419A2F400699085 /* FLEXRuntimeConstants.h */,
C386D6EF2419A33F00699085 /* FLEXRuntimeConstants.m */,
C3854DF223F36C9E00FCD1E2 /* FLEXTypeEncodingParser.h */,
@@ -1561,6 +1567,7 @@
3A4C95221B5B21410088C3F2 /* FLEXFileBrowserSearchOperation.h in Headers */,
C33E46AF223B02CD004BD0E6 /* FLEXASLLogController.h in Headers */,
C34EE30821CB23CC00BD3A7C /* FLEXOSLogController.h in Headers */,
C38568FA272B3BFC00B1E37F /* FLEXSwiftInternal.h in Headers */,
3A4C94FF1B5B21410088C3F2 /* FLEXArgumentInputSwitchView.h in Headers */,
C398625423AD6C67007E6793 /* FLEXRuntimeBrowserToolbar.h in Headers */,
3A4C94E71B5B21410088C3F2 /* FLEXHierarchyTableViewCell.h in Headers */,
@@ -1794,6 +1801,7 @@
3A4C95101B5B21410088C3F2 /* FLEXMethodCallingViewController.m in Sources */,
C362AE8223C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.m in Sources */,
C3F646C2239EAA8F00D4A011 /* UIPasteboard+FLEX.m in Sources */,
C38568FB272B3BFC00B1E37F /* FLEXSwiftInternal.mm in Sources */,
C3EB6F8D242E9C83006EA386 /* FLEXRuntimeExporter.m in Sources */,
3A4C94F61B5B21410088C3F2 /* FLEXArgumentInputObjectView.m in Sources */,
3A4C94EC1B5B21410088C3F2 /* FLEXImagePreviewViewController.m in Sources */,
+100
View File
@@ -0,0 +1,100 @@
// swift-tools-version:5.3
import PackageDescription
enum FLEXBuildOptions {
/// Set this to `true` to use `.unsafeFlags` to silence warnings.
static let silenceWarnings = false
}
let package = Package(
name: "FLEX",
platforms: [.iOS(.v10)],
products: [
.library(name: "FLEX", targets: ["FLEX"])
],
targets: [
.target(
name: "FLEX",
path: "Classes",
exclude: [
"Info.plist",
"Utility/APPLE_LICENSE",
"Network/OSCache/LICENSE.md",
"Network/PonyDebugger/LICENSE",
"GlobalStateExplorers/DatabaseBrowser/LICENSE",
"GlobalStateExplorers/Keychain/SSKeychain_LICENSE",
"GlobalStateExplorers/SystemLog/LLVM_LICENSE.TXT",
],
publicHeadersPath: "Headers",
cSettings: .headerSearchPaths + .warningFlags
)
],
// Required to compile FLEXSwiftInternal.mm
cxxLanguageStandard: .gnucxx11
)
extension Array where Element == CSetting {
static var warningFlags: [Element] {
if FLEXBuildOptions.silenceWarnings {
return [.unsafeFlags([
"-Wno-deprecated-declarations",
"-Wno-strict-prototypes",
"-Wno-unsupported-availability-guard",
])]
}
return []
}
/// These are the header search paths needed for FLEX to compile, not
/// the headers used by projects linking against FLEX.
///
/// Do not modify the contents of this property by hand;
/// Instead, run `bash generate-spm-headers.sh | grep headerSearchPath | pbcopy`
/// and paste (and indent) the result below. Do this any time new folders are added.
static var headerSearchPaths: [Element] {
[
.headerSearchPath("Classes"),
.headerSearchPath("Core"),
.headerSearchPath("Core/Controllers"),
.headerSearchPath("Core/Views"),
.headerSearchPath("Core/Views/Cells"),
.headerSearchPath("Core/Views/Carousel"),
.headerSearchPath("ObjectExplorers"),
.headerSearchPath("ObjectExplorers/Sections"),
.headerSearchPath("ObjectExplorers/Sections/Shortcuts"),
.headerSearchPath("Network"),
.headerSearchPath("Network/PonyDebugger"),
.headerSearchPath("Network/OSCache"),
.headerSearchPath("Toolbar"),
.headerSearchPath("Manager"),
.headerSearchPath("Manager/Private"),
.headerSearchPath("Editing"),
.headerSearchPath("Editing/ArgumentInputViews"),
.headerSearchPath("Headers"),
.headerSearchPath("ExplorerInterface"),
.headerSearchPath("ExplorerInterface/Tabs"),
.headerSearchPath("ExplorerInterface/Bookmarks"),
.headerSearchPath("GlobalStateExplorers"),
.headerSearchPath("GlobalStateExplorers/Globals"),
.headerSearchPath("GlobalStateExplorers/Keychain"),
.headerSearchPath("GlobalStateExplorers/FileBrowser"),
.headerSearchPath("GlobalStateExplorers/SystemLog"),
.headerSearchPath("GlobalStateExplorers/DatabaseBrowser"),
.headerSearchPath("GlobalStateExplorers/RuntimeBrowser"),
.headerSearchPath("GlobalStateExplorers/RuntimeBrowser/DataSources"),
.headerSearchPath("ViewHierarchy"),
.headerSearchPath("ViewHierarchy/SnapshotExplorer"),
.headerSearchPath("ViewHierarchy/SnapshotExplorer/Scene"),
.headerSearchPath("ViewHierarchy/TreeExplorer"),
.headerSearchPath("Utility"),
.headerSearchPath("Utility/Runtime"),
.headerSearchPath("Utility/Runtime/Objc"),
.headerSearchPath("Utility/Runtime/Objc/Reflection"),
.headerSearchPath("Utility/Categories"),
.headerSearchPath("Utility/Categories/Private"),
.headerSearchPath("Utility/Keyboard")
]
}
}
+28
View File
@@ -168,6 +168,27 @@ Add the following flags to to **Other Warnings Flags** in **Build Settings:**
- `-Wno-strict-prototypes`
- `-Wno-unsupported-availability-guard`
### Swift Package Manager
Include the dependency in the `depdendencies` value of your `Package.swift`
``` swift
dependencies: [
.package(url: "https://github.com/FLEXTool/FLEX.git", .upToNextMajor(from: "4.3.0"))
]
```
Next, include the library in your target:
```js
.target(
name: "YourDependency",
dependencies: [
"FLEX"
]
)
```
## Excluding FLEX from Release (App Store) Builds
FLEX makes it easy to explore the internals of your app, so it is not something you should expose to your users. Fortunately, it is easy to exclude FLEX files from Release builds. The strategies differ depending on how you integrated FLEX in your project, and are described below.
@@ -198,6 +219,13 @@ pod 'FLEX', :configurations => ['Debug']
<img width=75% height=75% src=https://user-images.githubusercontent.com/8371943/70274062-0d4b3f80-1771-11ea-94ea-ca7e7b5ca244.jpg>
### Swift Package Manager
In Xcode, navigate to `Build Settings > Build Options > Excluded Source File Names`. For your `Release` configuration, set it to `FLEX.o` like this to exclude all files with the `FLEX` prefix:
<img width=75% height=75% src=https://user-images.githubusercontent.com/1234765/98673373-8545c080-2357-11eb-9587-0743998e23ba.png>
### FLEX files added manually to a project
In Xcode, navigate to `Build Settings > Build Options > Excluded Source File Names`. For your `Release` configuration, set it to `FLEX*` like this to exclude all files with the `FLEX` prefix:
+65
View File
@@ -0,0 +1,65 @@
#!/bin/bash
# Link a specific header
makeheader() {
/bin/rm -f "Classes/Headers/$(basename $1)"
ln -s "../../$1" "Classes/Headers/$(basename $1)"
}
# Link all headers under the given path and in subfolders
generate_headers_recursive() {
for path in `find "Classes/$1" -not -path "*Headers*" -name "*.h"`; do
makeheader "$path"
done
}
# Link all headers directly under the given path, only
generate_headers() {
for path in `ls "Classes/$1" | grep '\.h'`; do
if [[ $1 ]]; then
makeheader "Classes/$1/$path"
else
makeheader "Classes/$path"
fi
done
}
# The code below MUST match what is public_header_files in the podspec.
# When this file was last updated, this was the content of public_header_files:
#
# "Classes/*.h", "Classes/Manager/*.h", "Classes/Toolbar/*.h",
# "Classes/GlobalStateExplorers/Globals/FLEXGlobalsEntry.h",
# "Classes/Core/**/*.h", "Classes/Utility/Runtime/Objc/**/*.h",
# "Classes/ObjectExplorers/**/*.h", "Classes/Editing/**/*.h",
# "Classes/Utility/FLEXMacros.h", "Classes/Utility/Categories/*.h",
# "Classes/Utility/FLEXAlert.h", "Classes/Utility/FLEXResources.h"
rm -rf Classes/Headers
mkdir -p Classes/Headers
# Include all headers in these folders
generate_headers "" # Top-level headers
generate_headers "Manager"
generate_headers "Toolbar"
generate_headers "Utility/Categories"
generate_headers "Core"
generate_headers "Core/Controllers"
generate_headers "Core/Views"
generate_headers "Core/Views/Cells"
generate_headers "ObjectExplorers"
generate_headers "ObjectExplorers/Sections"
generate_headers_recursive "Utility/Runtime/Objc"
# Include only headers in these specific folders,
# such as those with subfolders that should not be linked
makeheader "Classes/Utility/FLEXMacros.h"
makeheader "Classes/Utility/FLEXAlert.h"
makeheader "Classes/Utility/FLEXResources.h"
makeheader "Classes/ObjectExplorers/Sections/Shortcuts/FLEXShortcut.h"
makeheader "Classes/ObjectExplorers/Sections/Shortcuts/FLEXShortcutsSection.h"
makeheader "Classes/GlobalStateExplorers/Globals/FLEXGlobalsEntry.h"
# Print all folders in Classes for use in Package.swift
for folder in `find "Classes" -type d`; do
echo ".headerSearchPath(\"${folder#Classes/}\"),"
done