From 67fd2fc73f87a0806e189e735bf509f34e3ec857 Mon Sep 17 00:00:00 2001 From: Jasper Blues Date: Sun, 2 Feb 2014 10:34:42 +0800 Subject: [PATCH] Change [TyphoonParameterInjectedWithStringRepresentation resolveTypeWith:instanceOrClass] to just resolveType --- .idea/codeStyleSettings.xml | 46 ++++++++++++++-- .../Initializer/TyphoonInitializer.h | 2 + .../Initializer/TyphoonInitializer.m | 5 ++ ...arameterInjectedWithStringRepresentation.h | 2 +- ...arameterInjectedWithStringRepresentation.m | 19 +++---- .../TyphoonDefinition+InstanceBuilder.h | 2 + .../TyphoonDefinition+InstanceBuilder.m | 11 +++- .../TyphoonComponentFactory+InstanceBuilder.m | 55 +++++++++---------- Tests/Tests.xcodeproj/project.pbxproj | 4 +- 9 files changed, 97 insertions(+), 49 deletions(-) diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml index 5d82d926e..368e864ee 100644 --- a/.idea/codeStyleSettings.xml +++ b/.idea/codeStyleSettings.xml @@ -3,7 +3,37 @@ diff --git a/Source/Definition/Initializer/TyphoonInitializer.h b/Source/Definition/Initializer/TyphoonInitializer.h index 59f6d1035..71d384d27 100644 --- a/Source/Definition/Initializer/TyphoonInitializer.h +++ b/Source/Definition/Initializer/TyphoonInitializer.h @@ -62,6 +62,8 @@ typedef enum - (id)initWithSelector:(SEL)initializer isClassMethodStrategy:(TyphoonComponentInitializerIsClassMethod)isClassMethod; +- (TyphoonDefinition*)definition; + - (NSArray*)injectedParameters; /* ====================================================================================================================================== */ diff --git a/Source/Definition/Initializer/TyphoonInitializer.m b/Source/Definition/Initializer/TyphoonInitializer.m index 71426a505..5897eff4e 100644 --- a/Source/Definition/Initializer/TyphoonInitializer.m +++ b/Source/Definition/Initializer/TyphoonInitializer.m @@ -60,6 +60,11 @@ - (void)dealloc /* ====================================================================================================================================== */ #pragma mark - Interface Methods +- (TyphoonDefinition*)definition +{ + return _definition; +} + - (NSArray*)injectedParameters { return [_injectedParameters copy]; diff --git a/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.h b/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.h index 0d9260fee..4bade8027 100644 --- a/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.h +++ b/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.h @@ -41,6 +41,6 @@ * - requiredType is set * - The parameter is an object type. (If the parameter is an object type, classOrProtocol must be set explicitly). */ -- (TyphoonTypeDescriptor*)resolveTypeWith:(id)classOrInstance; +- (TyphoonTypeDescriptor*)resolveType; @end diff --git a/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.m b/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.m index 04c5be320..ebcdf7076 100644 --- a/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.m +++ b/Source/Definition/Initializer/TyphoonParameterInjectedWithStringRepresentation.m @@ -15,6 +15,8 @@ #import "TyphoonInitializer.h" #import "TyphoonTypeDescriptor.h" #import "TyphoonIntrospectionUtils.h" +#import "TyphoonInitializer+InstanceBuilder.h" +#import "TyphoonDefinition.h" @implementation TyphoonParameterInjectedWithStringRepresentation @@ -40,7 +42,7 @@ - (id)initWithIndex:(NSUInteger)index value:(NSString*)value requiredTypeOrNil:( /* ====================================================================================================================================== */ #pragma mark - Interface Methods -- (TyphoonTypeDescriptor*)resolveTypeWith:(id)classOrInstance +- (TyphoonTypeDescriptor*)resolveType { if (_requiredType) { @@ -48,22 +50,15 @@ - (TyphoonTypeDescriptor*)resolveTypeWith:(id)classOrInstance } else { - BOOL isClass = class_isMetaClass(object_getClass(classOrInstance)); - Class clazz; - if (isClass) - { - clazz = classOrInstance; - } - else - { - clazz = [classOrInstance class]; - } + BOOL isClass = [_initializer isClassMethod]; + Class clazz = [_initializer.definition type]; NSArray* typeCodes = [TyphoonIntrospectionUtils typeCodesForSelector:_initializer.selector ofClass:clazz isClassMethod:isClass]; if ([[typeCodes objectAtIndex:_index] isEqualToString:@"@"]) { [NSException raise:NSInvalidArgumentException - format:@"Unless the type is primitive (int, BOOL, etc), initializer injection requires the required class to be specified. Eg: "]; + format:@"Unless the type is primitive (int, BOOL, etc), initializer injection requires the required class to be specified. " + "Eg: "]; } return [TyphoonTypeDescriptor descriptorWithTypeCode:[typeCodes objectAtIndex:_index]]; } diff --git a/Source/Definition/Internal/TyphoonDefinition+InstanceBuilder.h b/Source/Definition/Internal/TyphoonDefinition+InstanceBuilder.h index 10475e99a..3a915c8e6 100644 --- a/Source/Definition/Internal/TyphoonDefinition+InstanceBuilder.h +++ b/Source/Definition/Internal/TyphoonDefinition+InstanceBuilder.h @@ -17,6 +17,8 @@ @interface TyphoonDefinition (InstanceBuilder) +- (void)setType:(Class)type; + - (NSString*)factoryReference; - (void)setFactoryReference:(NSString*)factoryReference; diff --git a/Source/Definition/Internal/TyphoonDefinition+InstanceBuilder.m b/Source/Definition/Internal/TyphoonDefinition+InstanceBuilder.m index a8c281858..128abdfcc 100644 --- a/Source/Definition/Internal/TyphoonDefinition+InstanceBuilder.m +++ b/Source/Definition/Internal/TyphoonDefinition+InstanceBuilder.m @@ -10,6 +10,7 @@ //////////////////////////////////////////////////////////////////////////////// #import "TyphoonLinkerCategoryBugFix.h" + TYPHOON_LINK_CATEGORY(TyphoonDefinition_InstanceBuilder) #import "TyphoonDefinition+InstanceBuilder.h" @@ -26,6 +27,12 @@ @implementation TyphoonDefinition (InstanceBuilder) /* ====================================================================================================================================== */ #pragma mark - Initialization & Destruction +- (void)setType:(Class)type +{ + _type = type; +} + + - (NSString*)factoryReference { return _factoryReference; @@ -47,10 +54,10 @@ - (NSSet*)componentsInjectedByValue; } -- (void)injectProperty:(SEL)selector withReference:(NSString *)reference +- (void)injectProperty:(SEL)selector withReference:(NSString*)reference { [_injectedProperties addObject:[[TyphoonPropertyInjectedByReference alloc] - initWithName:NSStringFromSelector(selector) reference:reference]]; + initWithName:NSStringFromSelector(selector) reference:reference]]; } - (NSSet*)propertiesInjectedByValue diff --git a/Source/Factory/Internal/TyphoonComponentFactory+InstanceBuilder.m b/Source/Factory/Internal/TyphoonComponentFactory+InstanceBuilder.m index e1705764c..965d94218 100644 --- a/Source/Factory/Internal/TyphoonComponentFactory+InstanceBuilder.m +++ b/Source/Factory/Internal/TyphoonComponentFactory+InstanceBuilder.m @@ -81,9 +81,8 @@ - (id)newInstanceWithDefinition:(TyphoonDefinition*)definition if (definition.factoryReference) { - // misleading - this is not the instance. this is an instance of a separate class that will create the instance of the class we care - // about. - initTarget = [self componentForKey:definition.factoryReference]; // clears currently resolving. + initTarget = [self componentForKey:definition.factoryReference]; + [definition setType:[initTarget class]]; } else if (definition.initializer.isClassMethod) { @@ -200,7 +199,7 @@ - (void)doBeforePropertyInjectionOn:(id )instance { if ([instance respondsToSelector:@selector(beforePropertiesSet)]) { - [(id )instance beforePropertiesSet]; + [(id ) instance beforePropertiesSet]; } if ([instance respondsToSelector:definition.beforePropertyInjection]) @@ -214,24 +213,25 @@ - (void)doPropertyInjection:(id )instance property TyphoonTypeDescriptor* propertyType = [instance typeForPropertyWithName:property.name]; AssertTypeDescriptionForPropertyOnInstance(propertyType, property, instance); - TyphoonPropertyInjectionLazyValue lazyValue = ^id { + TyphoonPropertyInjectionLazyValue lazyValue = ^id + { return [self valueToInjectProperty:property withType:propertyType onInstance:instance]; }; if (![instance respondsToSelector:@selector(shouldInjectProperty:withType:lazyValue:)] || - [(id )instance - shouldInjectProperty:property withType:propertyType lazyValue:lazyValue]) + [(id ) instance shouldInjectProperty:property withType:propertyType lazyValue:lazyValue]) { id valueToInject = lazyValue(); if (valueToInject) { - [(NSObject*)instance injectValue:valueToInject forPropertyName:property.name withType:propertyType]; + [(NSObject*) instance injectValue:valueToInject forPropertyName:property.name withType:propertyType]; } } } -- (id)valueToInjectProperty:(TyphoonAbstractInjectedProperty*)property withType:(TyphoonTypeDescriptor*)type onInstance:(id )instance +- (id)valueToInjectProperty:(TyphoonAbstractInjectedProperty*)property withType:(TyphoonTypeDescriptor*)type + onInstance:(id )instance { id valueToInject = nil; @@ -247,7 +247,7 @@ - (id)valueToInjectProperty:(TyphoonAbstractInjectedProperty*)property withType: } else if (property.injectionType == TyphoonPropertyInjectionTypeByReference) { - TyphoonPropertyInjectedByReference* byReference = (TyphoonPropertyInjectedByReference*)property; + TyphoonPropertyInjectedByReference* byReference = (TyphoonPropertyInjectedByReference*) property; [self evaluateCircularDependency:byReference.reference propertyName:property.name instance:instance]; if (![self propertyIsCircular:property onInstance:instance]) @@ -257,7 +257,7 @@ - (id)valueToInjectProperty:(TyphoonAbstractInjectedProperty*)property withType: } else if (property.injectionType == TyphoonPropertyInjectionTypeByFactoryReference) { - TyphoonPropertyInjectedByFactoryReference* byReference = (TyphoonPropertyInjectedByFactoryReference*)property; + TyphoonPropertyInjectedByFactoryReference* byReference = (TyphoonPropertyInjectedByFactoryReference*) property; [self evaluateCircularDependency:byReference.reference propertyName:property.name instance:instance]; if (![self propertyIsCircular:property onInstance:instance]) @@ -268,15 +268,15 @@ - (id)valueToInjectProperty:(TyphoonAbstractInjectedProperty*)property withType: } else if (property.injectionType == TyphoonPropertyInjectionTypeAsCollection) { - valueToInject = [self buildCollectionFor:(TyphoonPropertyInjectedAsCollection*)property instance:instance]; + valueToInject = [self buildCollectionFor:(TyphoonPropertyInjectedAsCollection*) property instance:instance]; } else if (property.injectionType == TyphoonPropertyInjectionTypeAsObjectInstance) { - valueToInject = ((TyphoonPropertyInjectedAsObjectInstance*)property).objectInstance; + valueToInject = ((TyphoonPropertyInjectedAsObjectInstance*) property).objectInstance; } else if (property.injectionType == TyphoonPropertyInjectionTypeAsStringRepresentation) { - TyphoonPropertyInjectedWithStringRepresentation* valueProperty = (TyphoonPropertyInjectedWithStringRepresentation*)property; + TyphoonPropertyInjectedWithStringRepresentation* valueProperty = (TyphoonPropertyInjectedWithStringRepresentation*) property; valueToInject = [self valueFromTextValue:valueProperty.textValue requiredType:type]; } @@ -284,7 +284,7 @@ - (id)valueToInjectProperty:(TyphoonAbstractInjectedProperty*)property withType: } - (void)evaluateCircularDependency:(NSString*)componentKey propertyName:(NSString*)propertyName - instance:(id )instance; + instance:(id )instance; { if ([self alreadyResolvingKey:componentKey]) { @@ -304,13 +304,13 @@ - (void)injectCircularDependenciesOn:(id )instance NSMutableDictionary* circularDependentProperties = [instance circularDependentProperties]; for (NSString* propertyName in [circularDependentProperties allKeys]) { - id propertyValue = [(NSObject*)instance valueForKey:propertyName]; + id propertyValue = [(NSObject*) instance valueForKey:propertyName]; if (!propertyValue) { NSString* componentKey = [circularDependentProperties objectForKey:propertyName]; [[_stack peekForKey:componentKey] addInstanceCompleteBlock:^(id reference) { - [(NSObject*)instance setValue:reference forKey:propertyName]; + [(NSObject*) instance setValue:reference forKey:propertyName]; }]; } @@ -321,7 +321,7 @@ - (void)doAfterPropertyInjectionOn:(id )instance w { if ([instance respondsToSelector:@selector(afterPropertiesSet)]) { - [(id )instance afterPropertiesSet]; + [(id ) instance afterPropertiesSet]; } if ([instance respondsToSelector:definition.afterPropertyInjection]) @@ -344,7 +344,7 @@ - (NSInvocation*)invocationToInit:(id)instanceOrClass withInitializer:(TyphoonIn { if (parameter.type == TyphoonParameterInjectionTypeReference) { - TyphoonParameterInjectedByReference* byReference = (TyphoonParameterInjectedByReference*)parameter; + TyphoonParameterInjectedByReference* byReference = (TyphoonParameterInjectedByReference*) parameter; if ([[_stack peekForKey:byReference.reference] isInitializingInstance]) { @@ -356,13 +356,12 @@ - (NSInvocation*)invocationToInit:(id)instanceOrClass withInitializer:(TyphoonIn } else if (parameter.type == TyphoonParameterInjectionTypeStringRepresentation) { - TyphoonParameterInjectedWithStringRepresentation* byValue = (TyphoonParameterInjectedWithStringRepresentation*)parameter; - [self setArgumentFor:invocation index:byValue.index + 2 textValue:byValue.textValue - requiredType:[byValue resolveTypeWith:instanceOrClass]]; + TyphoonParameterInjectedWithStringRepresentation* byString = (TyphoonParameterInjectedWithStringRepresentation*) parameter; + [self setArgumentFor:invocation index:byString.index + 2 textValue:byString.textValue requiredType:[byString resolveType]]; } else if (parameter.type == TyphoonParameterInjectionTypeObjectInstance) { - TyphoonParameterInjectedWithObjectInstance* byInstance = (TyphoonParameterInjectedWithObjectInstance*)parameter; + TyphoonParameterInjectedWithObjectInstance* byInstance = (TyphoonParameterInjectedWithObjectInstance*) parameter; id value = byInstance.value; BOOL isValuesIsWrapper = [value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSValue class]]; @@ -377,7 +376,7 @@ - (NSInvocation*)invocationToInit:(id)instanceOrClass withInitializer:(TyphoonIn } else if (parameter.type == TyphoonParameterInjectionTypeAsCollection) { - TyphoonParameterInjectedAsCollection* asCollection = (TyphoonParameterInjectedAsCollection*)parameter; + TyphoonParameterInjectedAsCollection* asCollection = (TyphoonParameterInjectedAsCollection*) parameter; id collection = [self buildCollectionWithValues:asCollection.values requiredType:asCollection.collectionType]; [invocation setArgument:&collection atIndex:parameter.index + 2]; } @@ -414,7 +413,7 @@ - (void)setPrimitiveArgumentForInvocation:(NSInvocation*)invocation index:(NSUIn } - (void)setArgumentFor:(NSInvocation*)invocation index:(NSUInteger)index1 textValue:(NSString*)textValue - requiredType:(TyphoonTypeDescriptor*)requiredType + requiredType:(TyphoonTypeDescriptor*)requiredType { if (requiredType.isPrimitive) { @@ -430,7 +429,7 @@ - (void)setArgumentFor:(NSInvocation*)invocation index:(NSUInteger)index1 textVa } - (id)buildCollectionFor:(TyphoonPropertyInjectedAsCollection*)propertyInjectedAsCollection - instance:(id )instance + instance:(id )instance { TyphoonCollectionType type = [propertyInjectedAsCollection resolveCollectionTypeWith:instance]; return [self buildCollectionWithValues:[propertyInjectedAsCollection values] requiredType:type]; @@ -444,13 +443,13 @@ - (id)buildCollectionWithValues:(NSArray*)values requiredType:(TyphoonCollection { if (value.type == TyphoonCollectionValueTypeByReference) { - TyphoonByReferenceCollectionValue* byReferenceValue = (TyphoonByReferenceCollectionValue*)value; + TyphoonByReferenceCollectionValue* byReferenceValue = (TyphoonByReferenceCollectionValue*) value; id reference = [self componentForKey:byReferenceValue.componentName]; [collection addObject:reference]; } else if (value.type == TyphoonCollectionValueTypeConvertedText) { - TyphoonTypeConvertedCollectionValue* typeConvertedValue = (TyphoonTypeConvertedCollectionValue*)value; + TyphoonTypeConvertedCollectionValue* typeConvertedValue = (TyphoonTypeConvertedCollectionValue*) value; TyphoonTypeDescriptor* descriptor = [TyphoonTypeDescriptor descriptorWithClassOrProtocol:typeConvertedValue.requiredType]; id converter = [[TyphoonTypeConverterRegistry shared] converterFor:descriptor]; id converted = [converter convert:typeConvertedValue.textValue]; diff --git a/Tests/Tests.xcodeproj/project.pbxproj b/Tests/Tests.xcodeproj/project.pbxproj index 3d73404d2..0afa4b33f 100644 --- a/Tests/Tests.xcodeproj/project.pbxproj +++ b/Tests/Tests.xcodeproj/project.pbxproj @@ -1843,7 +1843,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SUPPORTED_PLATFORMS = macosx; - USER_HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../\"/** \"${PROJECT_DIR}/Tests/Pods\"/**"; + USER_HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../\"/** \"${PROJECT_DIR}/Tests/Pods\"/** \"${PROJECT_DIR}/Tests/Pods\"/**"; WRAPPER_EXTENSION = octest; }; name = Debug; @@ -1880,7 +1880,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SUPPORTED_PLATFORMS = macosx; - USER_HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../\"/** \"${PROJECT_DIR}/Tests/Pods\"/**"; + USER_HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../\"/** \"${PROJECT_DIR}/Tests/Pods\"/** \"${PROJECT_DIR}/Tests/Pods\"/**"; WRAPPER_EXTENSION = octest; }; name = Release;