Compare commits

...

6 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
13 changed files with 269 additions and 82 deletions
+1
View File
@@ -7,6 +7,7 @@
//
#import <FLEXObjcInternal.h>
#import <FLEXSwiftInternal.h>
#import <FLEXRuntimeSafety.h>
#import <FLEXBlockDescription.h>
#import <FLEXTypeEncodingParser.h>
@@ -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/Runtime/Objc/FLEXSwiftInternal.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
@@ -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];
}
@@ -24,7 +24,7 @@
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 */; };
C3F86C322740DB9400E094BF /* FLEX in Frameworks */ = {isa = PBXBuildFile; productRef = C3F86C312740DB9400E094BF /* FLEX */; };
C3F86CD72740ED2600E094BF /* Reflex in Frameworks */ = {isa = PBXBuildFile; productRef = C3F86CD62740ED2600E094BF /* Reflex */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@@ -62,7 +62,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
C3F86C322740DB9400E094BF /* FLEX in Frameworks */,
C3F86CD72740ED2600E094BF /* Reflex in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -183,7 +183,7 @@
);
name = FLEXample;
packageProductDependencies = (
C3F86C312740DB9400E094BF /* FLEX */,
C3F86CD62740ED2600E094BF /* Reflex */,
);
productName = FLEXample;
productReference = C386D6CC2419975A00699085 /* FLEXample.app */;
@@ -215,7 +215,7 @@
);
mainGroup = C386D6C32419975A00699085;
packageReferences = (
C3F86C302740DB9400E094BF /* XCRemoteSwiftPackageReference "FLEX" */,
C3F86CD52740ED2600E094BF /* XCRemoteSwiftPackageReference "Reflex" */,
);
productRefGroup = C386D6CD2419975A00699085 /* Products */;
projectDirPath = "";
@@ -462,9 +462,9 @@
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
C3F86C302740DB9400E094BF /* XCRemoteSwiftPackageReference "FLEX" */ = {
C3F86CD52740ED2600E094BF /* XCRemoteSwiftPackageReference "Reflex" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/FLEXTool/FLEX";
repositoryURL = "file:///Users/tanner/Repos/Reflex";
requirement = {
branch = master;
kind = branch;
@@ -473,10 +473,10 @@
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
C3F86C312740DB9400E094BF /* FLEX */ = {
C3F86CD62740ED2600E094BF /* Reflex */ = {
isa = XCSwiftPackageProductDependency;
package = C3F86C302740DB9400E094BF /* XCRemoteSwiftPackageReference "FLEX" */;
productName = FLEX;
package = C3F86CD52740ED2600E094BF /* XCRemoteSwiftPackageReference "Reflex" */;
productName = Reflex;
};
/* End XCSwiftPackageProductDependency section */
};
+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 */,