From a30e87f5b0cd6ed7dffc3613af7d06bfd121ed05 Mon Sep 17 00:00:00 2001 From: Chris McGrath Date: Mon, 22 Oct 2018 18:37:30 -0700 Subject: [PATCH] Share common IGListDiffable plugin methods Summary: This will enable future reuse. Reviewed By: calimarkus Differential Revision: D10370258 fbshipit-source-id: 20a7569dc2b8b5222edbd29d2773a088c06b7622 --- .../src/plugins/iglistdiffable-utils.ts | 120 ++++++++++++++++++ remodel-plugin/src/plugins/iglistdiffable.ts | 120 +----------------- 2 files changed, 123 insertions(+), 117 deletions(-) create mode 100644 remodel-plugin/src/plugins/iglistdiffable-utils.ts diff --git a/remodel-plugin/src/plugins/iglistdiffable-utils.ts b/remodel-plugin/src/plugins/iglistdiffable-utils.ts new file mode 100644 index 00000000..bb7d26f4 --- /dev/null +++ b/remodel-plugin/src/plugins/iglistdiffable-utils.ts @@ -0,0 +1,120 @@ +import Maybe = require('../maybe'); +import ObjC = require('../objc'); +import ObjCTypeUtils = require('../objc-type-utils'); +import ObjectSpec = require('../object-spec'); +import ObjectSpecCodeUtils = require('../object-spec-code-utils'); + +function isEqualToDiffableObjectMethod():ObjC.Method { + return { + preprocessors:[], + belongsToProtocol:Maybe.Just('IGListDiffable'), + code: ['return [self isEqual:object];'], + comments:[], + compilerAttributes:[], + keywords: [ + { + name: 'isEqualToDiffableObject', + argument: Maybe.Just({ + name: 'object', + modifiers: [ObjC.KeywordArgumentModifier.Nullable()], + type: { + name: 'id', + reference: 'id' + } + }) + } + ], + returnType: { type: Maybe.Just({ + name: 'BOOL', + reference: 'BOOL' + }), modifiers: [] } + } +} + +function functionReturnValueForIvarWithFunctionName(iVarString:string, functionToCall:string):string { + return functionToCall + '(' + iVarString + ')'; +} + +function formattedStringValueForIvarWithFormatSpecifier(iVarString:string, stringFormatSpecifier:string, optionalCast:string=null):string { + var castString:string = (optionalCast === null ? "" : "(" + optionalCast + ")"); + return "[NSString stringWithFormat:@\"" + stringFormatSpecifier + "\", " + castString + iVarString + "]"; +} + +function objectValueForAttribute(attribute:ObjectSpec.Attribute):string { + const iVarString:string = ObjectSpecCodeUtils.ivarForAttribute(attribute); + const type:ObjC.Type = ObjectSpecCodeUtils.computeTypeOfAttribute(attribute); + + return ObjCTypeUtils.matchType({ + id: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%@"); + }, + NSObject: function() { + return iVarString; + }, + BOOL: function() { + return iVarString + " ? @\"YES\" : @\"NO\""; + }, + NSInteger: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%lld", "long long"); + }, + NSUInteger: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%llu", "unsigned long long"); + }, + double: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%lf"); + }, + float: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%f"); + }, + CGFloat: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%f"); + }, + NSTimeInterval: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%lf"); + }, + uintptr_t: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%ld"); + }, + uint32_t: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%u"); + }, + uint64_t: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%llu"); + }, + int32_t: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%d"); + }, + int64_t: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%lld"); + }, + SEL: function() { + return functionReturnValueForIvarWithFunctionName(iVarString, "NSStringFromSelector"); + }, + NSRange: function() { + return functionReturnValueForIvarWithFunctionName(iVarString, "NSStringFromRange"); + }, + CGRect: function() { + return functionReturnValueForIvarWithFunctionName(iVarString, "NSStringFromCGRect"); + }, + CGPoint: function() { + return functionReturnValueForIvarWithFunctionName(iVarString, "NSStringFromCGPoint"); + }, + CGSize: function() { + return functionReturnValueForIvarWithFunctionName(iVarString, "NSStringFromCGSize"); + }, + UIEdgeInsets: function() { + return functionReturnValueForIvarWithFunctionName(iVarString, "NSStringFromUIEdgeInsets"); + }, + Class: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%@"); + }, + dispatch_block_t: function() { + return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%@"); + }, + unmatchedType: function() { + return "self"; + } + }, type); +} + +export {isEqualToDiffableObjectMethod, objectValueForAttribute}; diff --git a/remodel-plugin/src/plugins/iglistdiffable.ts b/remodel-plugin/src/plugins/iglistdiffable.ts index b1b432da..f12c7530 100644 --- a/remodel-plugin/src/plugins/iglistdiffable.ts +++ b/remodel-plugin/src/plugins/iglistdiffable.ts @@ -11,125 +11,11 @@ import Code = require('../code'); import Error = require('../error'); import FileWriter = require('../file-writer'); import FunctionUtils = require('../function-utils'); +import IGListDiffableUtils = require ('./iglistdiffable-utils'); import Maybe = require('../maybe'); import ObjC = require('../objc'); -import ObjCTypeUtils = require('../objc-type-utils'); import ObjectSpec = require('../object-spec'); import ObjectSpecUtils = require('../object-spec-utils'); -import ObjectSpecCodeUtils = require('../object-spec-code-utils'); - -function isEqualToDiffableObjectMethod():ObjC.Method { - return { - preprocessors:[], - belongsToProtocol:Maybe.Just('IGListDiffable'), - code: ['return [self isEqual:object];'], - comments:[], - compilerAttributes:[], - keywords: [ - { - name: 'isEqualToDiffableObject', - argument: Maybe.Just({ - name: 'object', - modifiers: [ObjC.KeywordArgumentModifier.Nullable()], - type: { - name: 'id', - reference: 'id' - } - }) - } - ], - returnType: { type: Maybe.Just({ - name: 'BOOL', - reference: 'BOOL' - }), modifiers: [] } - } -} - -function formattedStringValueForIvarWithFormatSpecifier(iVarString:string, stringFormatSpecifier:string, optionalCast:string=null):string { - var castString:string = (optionalCast === null ? "" : "(" + optionalCast + ")"); - return "[NSString stringWithFormat:@\"" + stringFormatSpecifier + "\", " + castString + iVarString + "]"; -} - -function functionReturnValueForIvarWithFunctionName(iVarString:string, functionToCall:string):string { - return functionToCall + '(' + iVarString + ')'; -} - -function objectValueForAttribute(attribute:ObjectSpec.Attribute):string { - const iVarString:string = ObjectSpecCodeUtils.ivarForAttribute(attribute); - const type:ObjC.Type = ObjectSpecCodeUtils.computeTypeOfAttribute(attribute); - - return ObjCTypeUtils.matchType({ - id: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%@"); - }, - NSObject: function() { - return iVarString; - }, - BOOL: function() { - return iVarString + " ? @\"YES\" : @\"NO\""; - }, - NSInteger: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%lld", "long long"); - }, - NSUInteger: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%llu", "unsigned long long"); - }, - double: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%lf"); - }, - float: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%f"); - }, - CGFloat: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%f"); - }, - NSTimeInterval: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%lf"); - }, - uintptr_t: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%ld"); - }, - uint32_t: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%u"); - }, - uint64_t: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%llu"); - }, - int32_t: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%d"); - }, - int64_t: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%lld"); - }, - SEL: function() { - return functionReturnValueForIvarWithFunctionName(iVarString, "NSStringFromSelector"); - }, - NSRange: function() { - return functionReturnValueForIvarWithFunctionName(iVarString, "NSStringFromRange"); - }, - CGRect: function() { - return functionReturnValueForIvarWithFunctionName(iVarString, "NSStringFromCGRect"); - }, - CGPoint: function() { - return functionReturnValueForIvarWithFunctionName(iVarString, "NSStringFromCGPoint"); - }, - CGSize: function() { - return functionReturnValueForIvarWithFunctionName(iVarString, "NSStringFromCGSize"); - }, - UIEdgeInsets: function() { - return functionReturnValueForIvarWithFunctionName(iVarString, "NSStringFromUIEdgeInsets"); - }, - Class: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%@"); - }, - dispatch_block_t: function() { - return formattedStringValueForIvarWithFormatSpecifier(iVarString, "%@"); - }, - unmatchedType: function() { - return "self"; - } - }, type); -} function diffIdentiferAttributeFilter(attribute:ObjectSpec.Attribute, index, array):boolean { return (attribute.annotations["diffIdentifier"] != null); @@ -139,7 +25,7 @@ function diffIdentifierMethodImplementation(objectType:ObjectSpec.Type):string[] const diffIdentifierAttributes:ObjectSpec.Attribute[] = objectType.attributes.filter(diffIdentiferAttributeFilter); if (diffIdentifierAttributes.length > 0) { // use first marked attribute as identifier, if available - return ['return ' + objectValueForAttribute(diffIdentifierAttributes[0]) + ';'] + return ['return ' + IGListDiffableUtils.objectValueForAttribute(diffIdentifierAttributes[0]) + ';'] } else { // fallback/default to self return ['return self;']; @@ -207,7 +93,7 @@ export function createPlugin():ObjectSpec.Plugin { }, instanceMethods: function(objectType:ObjectSpec.Type):ObjC.Method[] { return [ - isEqualToDiffableObjectMethod(), + IGListDiffableUtils.isEqualToDiffableObjectMethod(), diffIdentifierMethod(objectType) ]; },