Share common IGListDiffable plugin methods

Summary: This will enable future reuse.

Reviewed By: calimarkus

Differential Revision: D10370258

fbshipit-source-id: 20a7569dc2b8b5222edbd29d2773a088c06b7622
This commit is contained in:
Chris McGrath 2018-10-22 18:37:30 -07:00 committed by Facebook Github Bot
parent c907d22acd
commit a30e87f5b0
2 changed files with 123 additions and 117 deletions

View file

@ -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<string>('IGListDiffable'),
code: ['return [self isEqual:object];'],
comments:[],
compilerAttributes:[],
keywords: [
{
name: 'isEqualToDiffableObject',
argument: Maybe.Just<ObjC.KeywordArgument>({
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};

View file

@ -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<string>('IGListDiffable'),
code: ['return [self isEqual:object];'],
comments:[],
compilerAttributes:[],
keywords: [
{
name: 'isEqualToDiffableObject',
argument: Maybe.Just<ObjC.KeywordArgument>({
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)
];
},