| #!/usr/bin/env python |
| # |
| # Copyright (c) 2014, 2016 Apple Inc. All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions |
| # are met: |
| # 1. Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # 2. Redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution. |
| # |
| # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' |
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS |
| # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| # THE POSSIBILITY OF SUCH DAMAGE. |
| |
| import logging |
| try: |
| from .generator import Generator, ucfirst |
| from .models import PrimitiveType, ObjectType, ArrayType, EnumType, AliasedType, Frameworks |
| except ValueError: |
| from generator import Generator, ucfirst |
| from models import PrimitiveType, ObjectType, ArrayType, EnumType, AliasedType, Frameworks |
| |
| log = logging.getLogger('global') |
| |
| |
| def join_type_and_name(type_str, name_str): |
| if type_str.endswith('*'): |
| return type_str + name_str |
| return type_str + ' ' + name_str |
| |
| |
| def strip_block_comment_markers(str): |
| return str.replace('/*', '').replace('*/', '') |
| |
| |
| def remove_duplicate_from_str(str, possible_duplicate): |
| return str.replace(possible_duplicate + possible_duplicate, possible_duplicate) |
| |
| |
| _OBJC_IDENTIFIER_RENAME_MAP = { |
| 'this': 'thisObject', # Debugger.CallFrame.this |
| 'description': 'stringRepresentation', # Runtime.RemoteObject.description |
| 'id': 'identifier', # Page.Frame.id, Runtime.ExecutionContextDescription.id, Debugger.BreakpointAction.id |
| } |
| |
| _OBJC_IDENTIFIER_REVERSE_RENAME_MAP = dict((v, k) for k, v in _OBJC_IDENTIFIER_RENAME_MAP.items()) |
| |
| |
| class ObjCTypeCategory: |
| Simple = 0 |
| String = 1 |
| Object = 2 |
| Array = 3 |
| |
| @staticmethod |
| def category_for_type(_type): |
| if (isinstance(_type, PrimitiveType)): |
| if _type.raw_name() is 'string': |
| return ObjCTypeCategory.String |
| if _type.raw_name() in ['object', 'any']: |
| return ObjCTypeCategory.Object |
| if _type.raw_name() is 'array': |
| return ObjCTypeCategory.Array |
| return ObjCTypeCategory.Simple |
| if (isinstance(_type, ObjectType)): |
| return ObjCTypeCategory.Object |
| if (isinstance(_type, ArrayType)): |
| return ObjCTypeCategory.Array |
| if (isinstance(_type, AliasedType)): |
| return ObjCTypeCategory.category_for_type(_type.aliased_type) |
| if (isinstance(_type, EnumType)): |
| return ObjCTypeCategory.category_for_type(_type.primitive_type) |
| return None |
| |
| # Almost all Objective-C class names require the use of a prefix that depends on the |
| # target framework's 'objc_prefix' setting. So, most helpers are instance methods. |
| |
| class ObjCGenerator(Generator): |
| # Do not use a dynamic prefix for RWIProtocolJSONObject since it's used as a common |
| # base class and needs a consistent Objective-C prefix to be in a reusable framework. |
| OBJC_HELPER_PREFIX = 'RWI' |
| OBJC_SHARED_PREFIX = 'Protocol' |
| OBJC_STATIC_PREFIX = '%s%s' % (OBJC_HELPER_PREFIX, OBJC_SHARED_PREFIX) |
| |
| def __init__(self, *args, **kwargs): |
| Generator.__init__(self, *args, **kwargs) |
| |
| # The 'protocol name' is used to prefix filenames for a protocol group (a set of domains generated together). |
| def protocol_name(self): |
| protocol_group = self.model().framework.setting('objc_protocol_group', '') |
| return '%s%s' % (protocol_group, ObjCGenerator.OBJC_SHARED_PREFIX) |
| |
| # The 'ObjC prefix' is used to prefix Objective-C class names and enums with a |
| # framework-specific prefix. It is separate from filename prefixes. |
| def objc_prefix(self): |
| framework_prefix = self.model().framework.setting('objc_prefix', None) |
| if not framework_prefix: |
| return '' |
| else: |
| return '%s%s' % (framework_prefix, ObjCGenerator.OBJC_SHARED_PREFIX) |
| |
| # Adjust identifier names that collide with ObjC keywords. |
| |
| @staticmethod |
| def identifier_to_objc_identifier(name): |
| return _OBJC_IDENTIFIER_RENAME_MAP.get(name, name) |
| |
| @staticmethod |
| def objc_identifier_to_identifier(name): |
| return _OBJC_IDENTIFIER_REVERSE_RENAME_MAP.get(name, name) |
| |
| # Generate ObjC types, command handlers, and event dispatchers for a subset of domains. |
| |
| DOMAINS_TO_GENERATE = ['CSS', 'DOM', 'DOMDebugger', 'DOMStorage', 'Network', 'Security', 'Page', 'Automation', 'GenericTypes'] |
| |
| def should_generate_types_for_domain(self, domain): |
| if not len(self.type_declarations_for_domain(domain)): |
| return False |
| |
| if self.model().framework is Frameworks.Test: |
| return True |
| |
| whitelist = set(ObjCGenerator.DOMAINS_TO_GENERATE) |
| whitelist.update(set(['Console', 'Debugger', 'Runtime'])) |
| return domain.domain_name in whitelist |
| |
| def should_generate_commands_for_domain(self, domain): |
| if not len(self.commands_for_domain(domain)): |
| return False |
| |
| if self.model().framework is Frameworks.Test: |
| return True |
| |
| whitelist = set(ObjCGenerator.DOMAINS_TO_GENERATE) |
| return domain.domain_name in whitelist |
| |
| def should_generate_events_for_domain(self, domain): |
| if not len(self.events_for_domain(domain)): |
| return False |
| |
| if self.model().framework is Frameworks.Test: |
| return True |
| |
| whitelist = set(ObjCGenerator.DOMAINS_TO_GENERATE) |
| whitelist.add('Console') |
| return domain.domain_name in whitelist |
| |
| # ObjC enum and type names. |
| |
| def objc_name_for_type(self, type): |
| name = type.qualified_name().replace('.', '') |
| name = remove_duplicate_from_str(name, type.type_domain().domain_name) |
| return '%s%s' % (self.objc_prefix(), name) |
| |
| def objc_enum_name_for_anonymous_enum_declaration(self, declaration): |
| domain_name = declaration.type.type_domain().domain_name |
| name = '%s%s' % (domain_name, declaration.type.raw_name()) |
| name = remove_duplicate_from_str(name, domain_name) |
| return '%s%s' % (self.objc_prefix(), name) |
| |
| def objc_enum_name_for_anonymous_enum_member(self, declaration, member): |
| domain_name = member.type.type_domain().domain_name |
| name = '%s%s%s' % (domain_name, declaration.type.raw_name(), ucfirst(member.member_name)) |
| name = remove_duplicate_from_str(name, domain_name) |
| return '%s%s' % (self.objc_prefix(), name) |
| |
| def objc_enum_name_for_anonymous_enum_parameter(self, domain, event_or_command_name, parameter): |
| domain_name = domain.domain_name |
| name = '%s%s%s' % (domain_name, ucfirst(event_or_command_name), ucfirst(parameter.parameter_name)) |
| name = remove_duplicate_from_str(name, domain_name) |
| return '%s%s' % (self.objc_prefix(), name) |
| |
| def objc_enum_name_for_non_anonymous_enum(self, _type): |
| domain_name = _type.type_domain().domain_name |
| name = _type.qualified_name().replace('.', '') |
| name = remove_duplicate_from_str(name, domain_name) |
| return '%s%s' % (self.objc_prefix(), name) |
| |
| # Miscellaneous name handling. |
| |
| @staticmethod |
| def variable_name_prefix_for_domain(domain): |
| domain_name = domain.domain_name |
| if domain_name.startswith('DOM'): |
| return 'dom' + domain_name[3:] |
| if domain_name.startswith('CSS'): |
| return 'css' + domain_name[3:] |
| return domain_name[:1].lower() + domain_name[1:] |
| |
| # Type basics. |
| |
| @staticmethod |
| def objc_accessor_type_for_raw_name(raw_name): |
| if raw_name in ['string', 'array']: |
| return 'copy' |
| if raw_name in ['integer', 'number', 'boolean']: |
| return 'assign' |
| if raw_name in ['any', 'object']: |
| return 'retain' |
| return None |
| |
| @staticmethod |
| def objc_type_for_raw_name(raw_name): |
| if raw_name is 'string': |
| return 'NSString *' |
| if raw_name is 'array': |
| return 'NSArray *' |
| if raw_name is 'integer': |
| return 'int' |
| if raw_name is 'number': |
| return 'double' |
| if raw_name is 'boolean': |
| return 'BOOL' |
| if raw_name in ['any', 'object']: |
| return '%sJSONObject *' % ObjCGenerator.OBJC_STATIC_PREFIX |
| return None |
| |
| @staticmethod |
| def objc_class_for_raw_name(raw_name): |
| if raw_name is 'string': |
| return 'NSString' |
| if raw_name is 'array': |
| return 'NSArray' |
| if raw_name in ['integer', 'number', 'boolean']: |
| return 'NSNumber' |
| if raw_name in ['any', 'object']: |
| return '%sJSONObject' % ObjCGenerator.OBJC_STATIC_PREFIX |
| return None |
| |
| # FIXME: Can these protocol_type functions be removed in favor of C++ generators functions? |
| |
| @staticmethod |
| def protocol_type_for_raw_name(raw_name): |
| if raw_name is 'string': |
| return 'String' |
| if raw_name is 'integer': |
| return 'int' |
| if raw_name is 'number': |
| return 'double' |
| if raw_name is 'boolean': |
| return 'bool' |
| if raw_name in ['any', 'object']: |
| return 'JSON::Object' |
| return None |
| |
| @staticmethod |
| def protocol_type_for_type(_type): |
| if (isinstance(_type, AliasedType)): |
| _type = _type.aliased_type |
| if (isinstance(_type, PrimitiveType)): |
| return ObjCGenerator.protocol_type_for_raw_name(_type.raw_name()) |
| if (isinstance(_type, EnumType)): |
| return ObjCGenerator.protocol_type_for_type(_type.primitive_type) |
| if (isinstance(_type, ObjectType)): |
| return 'Inspector::Protocol::%s::%s' % (_type.type_domain().domain_name, _type.raw_name()) |
| if (isinstance(_type, ArrayType)): |
| sub_type = ObjCGenerator.protocol_type_for_type(_type.element_type) |
| return 'JSON::ArrayOf<%s>' % sub_type |
| return None |
| |
| @staticmethod |
| def is_type_objc_pointer_type(_type): |
| if (isinstance(_type, AliasedType)): |
| _type = _type.aliased_type |
| if (isinstance(_type, PrimitiveType)): |
| return _type.raw_name() in ['string', 'array', 'any', 'object'] |
| if (isinstance(_type, EnumType)): |
| return False |
| if (isinstance(_type, ObjectType)): |
| return True |
| if (isinstance(_type, ArrayType)): |
| return True |
| return None |
| |
| def objc_class_for_type(self, _type): |
| if (isinstance(_type, AliasedType)): |
| _type = _type.aliased_type |
| if (isinstance(_type, PrimitiveType)): |
| return ObjCGenerator.objc_class_for_raw_name(_type.raw_name()) |
| if (isinstance(_type, EnumType)): |
| return ObjCGenerator.objc_class_for_raw_name(_type.primitive_type.raw_name()) |
| if (isinstance(_type, ObjectType)): |
| return self.objc_name_for_type(_type) |
| if (isinstance(_type, ArrayType)): |
| sub_type = strip_block_comment_markers(self.objc_class_for_type(_type.element_type)) |
| return 'NSArray/*<%s>*/' % sub_type |
| return None |
| |
| def objc_class_for_array_type(self, _type): |
| if isinstance(_type, AliasedType): |
| _type = _type.aliased_type |
| if isinstance(_type, ArrayType): |
| return self.objc_class_for_type(_type.element_type) |
| return None |
| |
| def objc_accessor_type_for_member(self, member): |
| return self.objc_accessor_type_for_member_internal(member.type) |
| |
| def objc_accessor_type_for_member_internal(self, _type): |
| if (isinstance(_type, AliasedType)): |
| _type = _type.aliased_type |
| if (isinstance(_type, PrimitiveType)): |
| return self.objc_accessor_type_for_raw_name(_type.raw_name()) |
| if (isinstance(_type, EnumType)): |
| return 'assign' |
| if (isinstance(_type, ObjectType)): |
| return 'retain' |
| if (isinstance(_type, ArrayType)): |
| return 'copy' |
| return None |
| |
| def objc_type_for_member(self, declaration, member): |
| return self.objc_type_for_member_internal(member.type, declaration, member) |
| |
| def objc_type_for_member_internal(self, _type, declaration, member): |
| if (isinstance(_type, AliasedType)): |
| _type = _type.aliased_type |
| if (isinstance(_type, PrimitiveType)): |
| return self.objc_type_for_raw_name(_type.raw_name()) |
| if (isinstance(_type, EnumType)): |
| if (_type.is_anonymous): |
| return self.objc_enum_name_for_anonymous_enum_member(declaration, member) |
| return self.objc_enum_name_for_non_anonymous_enum(_type) |
| if (isinstance(_type, ObjectType)): |
| return self.objc_name_for_type(_type) + ' *' |
| if (isinstance(_type, ArrayType)): |
| sub_type = strip_block_comment_markers(self.objc_class_for_type(_type.element_type)) |
| return 'NSArray/*<%s>*/ *' % sub_type |
| return None |
| |
| def objc_type_for_param(self, domain, event_or_command_name, parameter, respect_optional=True): |
| objc_type = self.objc_type_for_param_internal(parameter.type, domain, event_or_command_name, parameter) |
| if respect_optional and parameter.is_optional: |
| if objc_type.endswith('*'): |
| return objc_type + '*' |
| return objc_type + ' *' |
| return objc_type |
| |
| def objc_type_for_param_internal(self, _type, domain, event_or_command_name, parameter): |
| if (isinstance(_type, AliasedType)): |
| _type = _type.aliased_type |
| if (isinstance(_type, PrimitiveType)): |
| return self.objc_type_for_raw_name(_type.raw_name()) |
| if (isinstance(_type, EnumType)): |
| if _type.is_anonymous: |
| return self.objc_enum_name_for_anonymous_enum_parameter(domain, event_or_command_name, parameter) |
| return self.objc_enum_name_for_non_anonymous_enum(_type) |
| if (isinstance(_type, ObjectType)): |
| return self.objc_name_for_type(_type) + ' *' |
| if (isinstance(_type, ArrayType)): |
| sub_type = strip_block_comment_markers(self.objc_class_for_type(_type.element_type)) |
| return 'NSArray/*<%s>*/ *' % sub_type |
| return None |
| |
| # ObjC <-> Protocol conversion for commands and events. |
| # - convert a command call parameter received from Protocol to ObjC for handler |
| # - convert a command return parameter in callback block from ObjC to Protocol to send |
| # - convert an event parameter from ObjC API to Protocol to send |
| |
| def objc_protocol_export_expression_for_variable(self, var_type, var_name): |
| category = ObjCTypeCategory.category_for_type(var_type) |
| if category in [ObjCTypeCategory.Simple, ObjCTypeCategory.String]: |
| if isinstance(var_type, EnumType): |
| return 'toProtocolString(%s)' % var_name |
| return var_name |
| if category is ObjCTypeCategory.Object: |
| return '[%s toJSONObject]' % var_name |
| if category is ObjCTypeCategory.Array: |
| protocol_type = ObjCGenerator.protocol_type_for_type(var_type.element_type) |
| objc_class = self.objc_class_for_type(var_type.element_type) |
| if protocol_type == 'JSON::ArrayOf<String>': |
| return 'toJSONStringArrayArray(%s)' % var_name |
| if protocol_type is 'String' and objc_class is 'NSString': |
| return 'toJSONStringArray(%s)' % var_name |
| if protocol_type is 'int' and objc_class is 'NSNumber': |
| return 'toJSONIntegerArray(%s)' % var_name |
| if protocol_type is 'double' and objc_class is 'NSNumber': |
| return 'toJSONDoubleArray(%s)' % var_name |
| return 'toJSONObjectArray(%s)' % var_name |
| |
| def objc_protocol_import_expression_for_member(self, name, declaration, member): |
| if isinstance(member.type, EnumType): |
| if member.type.is_anonymous: |
| return 'fromProtocolString<%s>(%s)' % (self.objc_enum_name_for_anonymous_enum_member(declaration, member), name) |
| return 'fromProtocolString<%s>(%s)' % (self.objc_enum_name_for_non_anonymous_enum(member.type), name) |
| return self.objc_protocol_import_expression_for_variable(member.type, name) |
| |
| def objc_protocol_import_expression_for_parameter(self, name, domain, event_or_command_name, parameter): |
| if isinstance(parameter.type, EnumType): |
| if parameter.type.is_anonymous: |
| return 'fromProtocolString<%s>(%s)' % (self.objc_enum_name_for_anonymous_enum_parameter(domain, event_or_command_name, parameter), name) |
| return 'fromProtocolString<%s>(%s)' % (self.objc_enum_name_for_non_anonymous_enum(parameter.type), name) |
| return self.objc_protocol_import_expression_for_variable(parameter.type, name) |
| |
| def objc_protocol_import_expression_for_variable(self, var_type, var_name): |
| category = ObjCTypeCategory.category_for_type(var_type) |
| if category in [ObjCTypeCategory.Simple, ObjCTypeCategory.String]: |
| return var_name |
| if category is ObjCTypeCategory.Object: |
| objc_class = self.objc_class_for_type(var_type) |
| return '[[[%s alloc] initWithJSONObject:%s] autorelease]' % (objc_class, var_name) |
| if category is ObjCTypeCategory.Array: |
| objc_class = self.objc_class_for_type(var_type.element_type) |
| if objc_class is 'NSString': |
| return 'toObjCStringArray(%s)' % var_name |
| if objc_class is 'NSNumber': # FIXME: Integer or Double? |
| return 'toObjCIntegerArray(%s)' % var_name |
| return 'toObjCArray<%s>(%s)' % (objc_class, var_name) |
| |
| # ObjC <-> JSON object conversion for types getters/setters. |
| # - convert a member setter from ObjC API to JSON object setter |
| # - convert a member getter from JSON object to ObjC API |
| |
| def objc_to_protocol_expression_for_member(self, declaration, member, sub_expression): |
| category = ObjCTypeCategory.category_for_type(member.type) |
| if category in [ObjCTypeCategory.Simple, ObjCTypeCategory.String]: |
| if isinstance(member.type, EnumType): |
| return 'toProtocolString(%s)' % sub_expression |
| return sub_expression |
| if category is ObjCTypeCategory.Object: |
| return sub_expression |
| if category is ObjCTypeCategory.Array: |
| objc_class = self.objc_class_for_type(member.type.element_type) |
| if objc_class is 'NSString': |
| return 'toJSONStringArray(%s)' % sub_expression |
| if objc_class is 'NSNumber': |
| protocol_type = ObjCGenerator.protocol_type_for_type(member.type.element_type) |
| if protocol_type is 'double': |
| return 'toJSONDoubleArray(%s)' % sub_expression |
| return 'toJSONIntegerArray(%s)' % sub_expression |
| return 'toJSONObjectArray(%s)' % sub_expression |
| |
| def protocol_to_objc_expression_for_member(self, declaration, member, sub_expression): |
| category = ObjCTypeCategory.category_for_type(member.type) |
| if category in [ObjCTypeCategory.Simple, ObjCTypeCategory.String]: |
| if isinstance(member.type, EnumType): |
| if member.type.is_anonymous: |
| return 'fromProtocolString<%s>(%s).value()' % (self.objc_enum_name_for_anonymous_enum_member(declaration, member), sub_expression) |
| return 'fromProtocolString<%s>(%s).value()' % (self.objc_enum_name_for_non_anonymous_enum(member.type), sub_expression) |
| return sub_expression |
| if category is ObjCTypeCategory.Object: |
| raise Exception("protocol_to_objc_expression_for_member does not support an Object type. See: protocol_to_objc_code_block_for_object_member") |
| if category is ObjCTypeCategory.Array: |
| protocol_type = ObjCGenerator.protocol_type_for_type(member.type.element_type) |
| objc_class = self.objc_class_for_type(member.type.element_type) |
| if objc_class is 'NSString': |
| return 'toObjCStringArray(%s)' % sub_expression |
| if objc_class is 'NSNumber': |
| protocol_type = ObjCGenerator.protocol_type_for_type(member.type.element_type) |
| if protocol_type is 'double': |
| return 'toObjCDoubleArray(%s)' % sub_expression |
| return 'toObjCIntegerArray(%s)' % sub_expression |
| return 'toObjCArray<%s>(%s)' % (objc_class, sub_expression) |
| |
| def protocol_to_objc_code_block_for_object_member(self, declaration, member, sub_expression): |
| objc_class = self.objc_class_for_type(member.type) |
| lines = [] |
| lines.append(' %sJSONObject *object = %s;' % (ObjCGenerator.OBJC_STATIC_PREFIX, sub_expression)) |
| lines.append(' if (!object)') |
| lines.append(' return nil;') |
| lines.append(' return [[%s alloc] initWithJSONObject:[%s toJSONObject].get()];' % (objc_class, sub_expression)) |
| return '\n'.join(lines) |
| |
| def payload_to_objc_expression_for_member(self, declaration, member): |
| _type = member.type |
| if isinstance(_type, AliasedType): |
| _type = _type.aliased_type |
| if isinstance(_type, PrimitiveType): |
| sub_expression = 'payload[@"%s"]' % member.member_name |
| raw_name = _type.raw_name() |
| if raw_name is 'boolean': |
| return '[%s boolValue]' % sub_expression |
| if raw_name is 'integer': |
| return '[%s integerValue]' % sub_expression |
| if raw_name is 'number': |
| return '[%s doubleValue]' % sub_expression |
| if raw_name in ['any', 'object', 'array', 'string']: |
| return sub_expression # The setter will check the incoming value. |
| return None |
| if isinstance(member.type, EnumType): |
| sub_expression = 'payload[@"%s"]' % member.member_name |
| if member.type.is_anonymous: |
| return 'fromProtocolString<%s>(%s)' % (self.objc_enum_name_for_anonymous_enum_member(declaration, member), sub_expression) |
| else: |
| return 'fromProtocolString<%s>(%s)' % (self.objc_enum_name_for_non_anonymous_enum(member.type), sub_expression) |
| if isinstance(_type, ObjectType): |
| objc_class = self.objc_class_for_type(member.type) |
| return '[[%s alloc] initWithPayload:payload[@"%s"]]' % (objc_class, member.member_name) |
| if isinstance(_type, ArrayType): |
| element_type = member.type.element_type |
| if isinstance(element_type, EnumType): |
| element_type = element_type.primitive_type |
| |
| # In this case, there is no conversion that needs to be done, the array already contains an ObjC type. |
| if isinstance(element_type, PrimitiveType): |
| return 'payload[@"%s"]' % member.member_name |
| else: |
| objc_class = self.objc_class_for_type(element_type) |
| return 'objcArrayFromPayload<%s>(payload[@"%s"])' % (objc_class, member.member_name) |
| |
| # JSON object setter/getter selectors for types. |
| |
| @staticmethod |
| def objc_setter_method_for_member(declaration, member): |
| return ObjCGenerator.objc_setter_method_for_member_internal(member.type, declaration, member) |
| |
| @staticmethod |
| def objc_setter_method_for_member_internal(_type, declaration, member): |
| if (isinstance(_type, AliasedType)): |
| _type = _type.aliased_type |
| if (isinstance(_type, PrimitiveType)): |
| raw_name = _type.raw_name() |
| if raw_name is 'boolean': |
| return 'setBool' |
| if raw_name is 'integer': |
| return 'setInteger' |
| if raw_name is 'number': |
| return 'setDouble' |
| if raw_name is 'string': |
| return 'setString' |
| if raw_name in ['any', 'object']: |
| return 'setObject' |
| if raw_name is 'array': |
| return 'setJSONArray' |
| return None |
| if (isinstance(_type, EnumType)): |
| return 'setString' |
| if (isinstance(_type, ObjectType)): |
| return 'setObject' |
| if (isinstance(_type, ArrayType)): |
| return 'setJSONArray' |
| return None |
| |
| @staticmethod |
| def objc_getter_method_for_member(declaration, member): |
| return ObjCGenerator.objc_getter_method_for_member_internal(member.type, declaration, member) |
| |
| @staticmethod |
| def objc_getter_method_for_member_internal(_type, declaration, member): |
| if (isinstance(_type, AliasedType)): |
| _type = _type.aliased_type |
| if (isinstance(_type, PrimitiveType)): |
| raw_name = _type.raw_name() |
| if raw_name is 'boolean': |
| return 'boolForKey' |
| if raw_name is 'integer': |
| return 'integerForKey' |
| if raw_name is 'number': |
| return 'doubleForKey' |
| if raw_name is 'string': |
| return 'stringForKey' |
| if raw_name in ['any', 'object']: |
| return 'objectForKey' |
| if raw_name is 'array': |
| return 'JSONArrayForKey' |
| return None |
| if (isinstance(_type, EnumType)): |
| return 'stringForKey' |
| if (isinstance(_type, ObjectType)): |
| return 'objectForKey' |
| if (isinstance(_type, ArrayType)): |
| return 'JSONArrayForKey' |
| return None |