Example #1
0
 def __init__(self, prefix=None):
     self.prefix = prefix or ''
     self.templates = Templates(__file__, filters=self)
Example #2
0
class Generator(object):
    def __init__(self, prefix=None):
        self.prefix = prefix or ''
        self.templates = Templates(__file__, filters=self)

    def generate(self, package, dst):
        for file in package.files:
            for type0 in file.types:
                name = self.objc_name(type0)
                template_h, template_m = self._template_names(type0)
                self._generate(type0, dst, '%s.h' % name, template_h)
                self._generate(type0, dst, '%s.m' % name, template_m)

    def _generate(self, type0, dst, filename, tmpl):
        name = self.objc_name(type0)
        code = self.templates.render(tmpl, definition=type0, name=name, generated_by=GENERATED_BY)
        write_file(dst, filename, code)
    
    def _template_names(self, type0):
        if type0.is_struct:
            return 'struct_h.jinja2', 'struct_m.jinja2'
        elif type0.is_interface:
            return 'interface_h.jinja2', 'interface_m.jinja2'
        elif type0.is_enum:
            return 'enum_h.jinja2', 'enum_m.jinja2'

    def objc_name(self, type0):
        name = self.prefix + type0.name
        if type0.is_struct and not type0.is_exception:
            suffix = STRUCT_SUFFIX
        elif type0.is_interface:
            suffix = INTERFACE_SUFFIX
        else:
            suffix = None
        
        if not suffix or name.lower().endswith(suffix.lower()):
            return name

        return name + suffix

    def objc_type(self, type0):
        '''Return an objective-c type.'''
        if type0 in _TYPES:
            return _TYPES[type0]

        if type0.is_list:
            return 'NSArray *'
        elif type0.is_set:
            return 'NSSet *'
        elif type0.is_map:
            return 'NSDictionary *'
        elif type0.is_enum:
            return '%s ' % self.objc_name(type0)

        return '%s *' % (self.objc_name(type0))

    def objc_reflex(self, type0):
        '''Return an objective-c reflection type.'''
        if type0 in _REFLEX_TYPES:
            return _REFLEX_TYPES[type0]

        if type0.is_list:
            return '[PDList listWithItem:%s]' % self.objc_reflex(type0.element)
        elif type0.is_set:
            return '[PDSet setWithItem:%s]' % self.objc_reflex(type0.element)
        elif type0.is_map:
            key = self.objc_reflex(type0.key)
            value = self.objc_reflex(type0.value)
            return '[PDMap mapWithKey:%s value:%s]' % (key, value)
        elif type0.is_enum:
            return '%sEnum.class' % self.objc_name(type0)
        
        return '%s.class' % self.objc_name(type0)
    
    def objc_signature(self, method):
        '''Return a method signature.'''
        s = []
        if method.is_last:
            s.append('- (RACSignal *)')
        else:
            s.append('- (%s)' % self.objc_type(method.result))
        s.append(method.name)
        
        is_first = True
        colon_index = 0
        for arg in method.args:
            if is_first:
                s.append('With')
                s.append(upper_first(arg.name))
                s.append(':')
                colon_index = ''.join(s).index(':')
                is_first = False
            else:
                s.append('\n')
                spaces = max(colon_index - len(arg.name), 0)
                s.append(' ' * spaces)
                s.append(arg.name)
                s.append(':')

            s.append('(%s)' % self.objc_type(arg.type).strip())
            s.append(arg.name)
        
        return ''.join(s)
    
    def objc_selector(self, method):
        s = [method.name]
        
        is_first = True
        for arg in method.args:
            if is_first:
                s.append('With')
                s.append(upper_first(arg.name))
                is_first = False
            else:
                s.append(arg.name)
            s.append(':')
        
        return ''.join(s)
                    
    def objc_method_options(self, method):
        s = []
        if method.is_get:
            s.append('PDMethodGet')
        elif method.is_post:
            s.append('PDMethodPost')
        if method.is_request:
            s.append('|PDMethodRequest')
        return ''.join(s)