mirror of
https://github.com/SoPat712/YTLitePlus.git
synced 2025-11-01 13:23:37 -04:00
109 lines
4.9 KiB
Objective-C
109 lines
4.9 KiB
Objective-C
//
|
|
// FLEXRuntimeUtility.h
|
|
// Flipboard
|
|
//
|
|
// Created by Ryan Olson on 6/8/14.
|
|
// Copyright (c) 2020 FLEX Team. All rights reserved.
|
|
//
|
|
|
|
#import "FLEXRuntimeConstants.h"
|
|
|
|
#define PropertyKey(suffix) kFLEXPropertyAttributeKey##suffix : @""
|
|
#define PropertyKeyGetter(getter) kFLEXPropertyAttributeKeyCustomGetter : NSStringFromSelector(@selector(getter))
|
|
#define PropertyKeySetter(setter) kFLEXPropertyAttributeKeyCustomSetter : NSStringFromSelector(@selector(setter))
|
|
|
|
/// Takes: min iOS version, property name, target class, property type, and a list of attributes
|
|
#define FLEXRuntimeUtilityTryAddProperty(iOS_atLeast, name, cls, type, ...) ({ \
|
|
if (@available(iOS iOS_atLeast, *)) { \
|
|
NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithDictionary:@{ \
|
|
kFLEXPropertyAttributeKeyTypeEncoding : @(type), \
|
|
__VA_ARGS__ \
|
|
}]; \
|
|
[FLEXRuntimeUtility \
|
|
tryAddPropertyWithName:#name \
|
|
attributes:attrs \
|
|
toClass:cls \
|
|
]; \
|
|
} \
|
|
})
|
|
|
|
/// Takes: min iOS version, property name, target class, property type, and a list of attributes
|
|
#define FLEXRuntimeUtilityTryAddNonatomicProperty(iOS_atLeast, name, cls, type, ...) \
|
|
FLEXRuntimeUtilityTryAddProperty(iOS_atLeast, name, cls, @encode(type), PropertyKey(NonAtomic), __VA_ARGS__);
|
|
/// Takes: min iOS version, property name, target class, property type (class name), and a list of attributes
|
|
#define FLEXRuntimeUtilityTryAddObjectProperty(iOS_atLeast, name, cls, type, ...) \
|
|
FLEXRuntimeUtilityTryAddProperty(iOS_atLeast, name, cls, FLEXEncodeClass(type), PropertyKey(NonAtomic), __VA_ARGS__);
|
|
|
|
extern NSString * const FLEXRuntimeUtilityErrorDomain;
|
|
|
|
typedef NS_ENUM(NSInteger, FLEXRuntimeUtilityErrorCode) {
|
|
// Start at a random value instead of 0 to avoid confusion with an absent code
|
|
FLEXRuntimeUtilityErrorCodeDoesNotRecognizeSelector = 0xbabe,
|
|
FLEXRuntimeUtilityErrorCodeInvocationFailed,
|
|
FLEXRuntimeUtilityErrorCodeArgumentTypeMismatch
|
|
};
|
|
|
|
@interface FLEXRuntimeUtility : NSObject
|
|
|
|
// General Helpers
|
|
+ (BOOL)pointerIsValidObjcObject:(const void *)pointer;
|
|
/// Unwraps raw pointers to objects stored in NSValue, and re-boxes C strings into NSStrings.
|
|
+ (id)potentiallyUnwrapBoxedPointer:(id)returnedObjectOrNil type:(const FLEXTypeEncoding *)returnType;
|
|
/// Some fields have a name in their encoded string (e.g. \"width\"d)
|
|
/// @return the offset to skip the field name, 0 if there is no name
|
|
+ (NSUInteger)fieldNameOffsetForTypeEncoding:(const FLEXTypeEncoding *)typeEncoding;
|
|
/// Given name "foo" and type "int" this would return "int foo", but
|
|
/// given name "foo" and type "T *" it would return "T *foo"
|
|
+ (NSString *)appendName:(NSString *)name toType:(NSString *)typeEncoding;
|
|
|
|
/// @return The class hierarchy for the given object or class,
|
|
/// from the current class to the root-most class.
|
|
+ (NSArray<Class> *)classHierarchyOfObject:(id)objectOrClass;
|
|
|
|
/// Used to describe an object in brief within an explorer row
|
|
+ (NSString *)summaryForObject:(id)value;
|
|
+ (NSString *)safeClassNameForObject:(id)object;
|
|
+ (NSString *)safeDescriptionForObject:(id)object;
|
|
+ (NSString *)safeDebugDescriptionForObject:(id)object;
|
|
|
|
+ (BOOL)safeObject:(id)object isKindOfClass:(Class)cls;
|
|
+ (BOOL)safeObject:(id)object respondsToSelector:(SEL)sel;
|
|
|
|
// Property Helpers
|
|
+ (BOOL)tryAddPropertyWithName:(const char *)name
|
|
attributes:(NSDictionary<NSString *, NSString *> *)attributePairs
|
|
toClass:(__unsafe_unretained Class)theClass;
|
|
+ (NSArray<NSString *> *)allPropertyAttributeKeys;
|
|
|
|
// Method Helpers
|
|
+ (NSArray *)prettyArgumentComponentsForMethod:(Method)method;
|
|
|
|
// Method Calling/Field Editing
|
|
+ (id)performSelector:(SEL)selector onObject:(id)object;
|
|
+ (id)performSelector:(SEL)selector
|
|
onObject:(id)object
|
|
withArguments:(NSArray *)arguments
|
|
error:(NSError * __autoreleasing *)error;
|
|
+ (id)performSelector:(SEL)selector
|
|
onObject:(id)object
|
|
withArguments:(NSArray *)arguments
|
|
allowForwarding:(BOOL)mightForwardMsgSend
|
|
error:(NSError * __autoreleasing *)error;
|
|
|
|
+ (NSString *)editableJSONStringForObject:(id)object;
|
|
+ (id)objectValueFromEditableJSONString:(NSString *)string;
|
|
+ (NSValue *)valueForNumberWithObjCType:(const char *)typeEncoding fromInputString:(NSString *)inputString;
|
|
+ (void)enumerateTypesInStructEncoding:(const char *)structEncoding
|
|
usingBlock:(void (^)(NSString *structName,
|
|
const char *fieldTypeEncoding,
|
|
NSString *prettyTypeEncoding,
|
|
NSUInteger fieldIndex,
|
|
NSUInteger fieldOffset))typeBlock;
|
|
+ (NSValue *)valueForPrimitivePointer:(void *)pointer objCType:(const char *)type;
|
|
|
|
#pragma mark - Metadata Helpers
|
|
|
|
+ (NSString *)readableTypeForEncoding:(NSString *)encodingString;
|
|
|
|
@end
|