U
    Zf&                     @   s   d dl mZmZmZmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZmZmZ d dlmZ d dlmZmZmZmZ dZdeZdZd	ZG d
d deZdS )    )absolute_importdivisionprint_functionunicode_literals)contextmanager)is_list_typeis_map_typeis_struct_typeis_union_typeis_nullable_typeis_user_defined_typeis_void_typeunwrap_nullable)CodeBackend)fmt_camel_upper	fmt_classfmt_class_prefix
fmt_importzs///
/// Copyright (c) 2016 Dropbox, Inc. All rights reserved.
///
/// Auto-generated by Stone, do not modify.
///

z{}z(no description).z/// c                   @   s   e Zd ZdZedd Zed$ddZed%ddZed	d
 Zed&ddZ	dd Z
dd Zdd Zdd Zdd Zd'ddZdd Zdd Zd d! Zd"d# ZdS )(ObjCBaseBackendz3Wrapper class over Stone generator for Obj C logic.c              	   c   s4   | j d|ddd |   d V  W 5 Q R X d S )Nz@implementation {} z@endr   delimZdent)blockformatemit)self
class_name r   8/tmp/pip-unpacked-wheel-vqb3mfeu/stone/backends/obj_c.pyblock_m,   s    zObjCBaseBackend.block_mNc              	   c   s   t |stdt| |sxg }|jr@t|r@|t|j nt|rT|d n
|d |rrdd	|nd}n.|jrt|st|jnd}d|d	|}| j
dt||dd	d
 |   d V  W 5 Q R X d S )Nz"Expected user-defined type, got %rNSObject : {}, r   
 : {} <{}>@interface {}{}r   r   r   )r   AssertionErrortypeparent_typer	   appendr   r
   r   joinr   r   )r   	data_typeprotocol
extensionsextend_suffixbaser   r   r   block_h_from_data_type5   sB    


 z&ObjCBaseBackend.block_h_from_data_typec           	   
   c   s   |s
dg}|s d d|}nd d|t|}|r>dnd}| j| ||ddd	f |r| jd
dd0 | d |D ]\}}| d || q~W 5 Q R X | d |   d V  W 5 Q R X d S )Nr!   r"   r#   r$   z@interface {}{} {{r%   r   r   r   r   )r   r   )r   z
@protectedz{} _{};})r   r*   r   r   r   )	r   r   r,   r-   Z	protectedr.   Zbase_interface_str
field_nameZ
field_typer   r   r   block_hT   s*    


zObjCBaseBackend.block_hc              	   c   s*   |  d d V  W 5 Q R X | d d S )Nz	if (self)zreturn self;)r   r   )r   r   r   r   
block_initq   s    zObjCBaseBackend.block_initvoidFc              	   c   sX   |d k	r|ng }|sdnd}|r$dnd}| ||||}| | d V  W 5 Q R X d S )N-+z{} ({}){}:{}z	{} ({}){})r   r   )r   funcargsreturn_typeZ
class_funcmodifierZbase_string	signaturer   r   r   
block_funcw   s    zObjCBaseBackend.block_funcc                 C   s   t |ts|g}|}|D ]}|t| |jr@|t|j t|rp| rp| D ]\}}|t| qX|jD ]N}t	|j
\}}t|st|rt|r|jn|j
}qt|rv|t| qvq|rtt|}|  |S )zNEmits all necessary implementation file imports for the given Stone data type.)
isinstancelistr)   r   r(   r	   Zhas_enumerated_subtypesZget_all_subtypes_with_tags
all_fieldsr   r+   r   r   value_data_typer   setsort)r   
data_typesZdefault_importsimport_classesr+   _subtypefieldr   r   r   _get_imports_m   s6    

zObjCBaseBackend._get_imports_mc                 C   s   t |ts|g}g }|D ]p}t|r2|t| |jD ]N}t|j\}}t|sZt	|rpt	|rh|j
n|j}qJt|r8|t| q8qtt|}|  |S )zFEmits all necessary header file imports for the given Stone data type.)r>   r?   r   r)   r   r@   r   r+   r   r   rA   rB   rC   )r   rD   rE   r+   rH   rF   r   r   r   _get_imports_h   s$    

zObjCBaseBackend._get_imports_hc                 C   s>   t t|}|  |D ]}| d| q|r:|   d S )Nz
@class {};)r?   rB   rC   r   r   r   rE   Zimport_classr   r   r   _generate_imports_h   s    z#ObjCBaseBackend._generate_imports_hc                 C   s8   t t|}|  |D ]}| t| q|   d S N)r?   rB   rC   r   r   rK   r   r   r   _generate_imports_m   s
    z#ObjCBaseBackend._generate_imports_mc                 C   sJ   |  d |    |  d |jr>t|s>|  tt|j |    d S )Nz!#import <Foundation/Foundation.h>z"#import "DBSerializableProtocol.h")r   r(   r
   r   r   )r   r+   r   r   r   _generate_init_imports_h   s    

z(ObjCBaseBackend._generate_init_imports_hTc           	         s   g   fdd}|j D ]}|r6t|j\}}|| nn|rt|j\}}t|sXt|rb|| nBt|s|jD ]2}t|j\}}t|st|st|rp|| qp||j	 ||j
 q S )Nc                    sJ   t | \} }t| r,t| r,t | j\} }qt| sFt| rF |  d S rM   )r   r   r+   r   r   r)   )r+   rF   resultr   r   _unpack_and_store_data_type   s    zQObjCBaseBackend._get_namespace_route_imports.<locals>._unpack_and_store_data_type)Zroutesr   Zarg_data_typer
   r   r   r@   r+   r	   Zresult_data_typeZerror_data_type)	r   	namespaceZinclude_route_argsZinclude_route_deep_argsrR   Zrouter+   rF   rH   r   rP   r   _get_namespace_route_imports   s,    	





z,ObjCBaseBackend._get_namespace_route_importsc                 C   s   |r|  |d S dS dS )dReturns an Obj C appropriate name for a constructor based on
        the name of the first argument.r   initDefaultN)_cstor_name_from_field)r   fieldsr   r   r   _cstor_name_from_fields  s    z'ObjCBaseBackend._cstor_name_from_fieldsc                 C   s   d t|jS )zgReturns an Obj C appropriate name for a constructor based on
        the name of the supplied argument.
initWith{})r   r   name)r   rH   r   r   r   rW   	  s    z&ObjCBaseBackend._cstor_name_from_fieldc                 C   s"   |rd t|d d S dS dS )rU   rZ   r   rV   N)r   r   )r   Zfields_namesr   r   r   _cstor_name_from_fields_names  s    z-ObjCBaseBackend._cstor_name_from_fields_namesc                 C   s   dd |j D S )z8Returns whether the given struct has any default values.c                 S   s    g | ]}|j st|jr|qS r   )Zhas_defaultr   r+   ).0fr   r   r   
<listcomp>  s    
z8ObjCBaseBackend._struct_has_defaults.<locals>.<listcomp>)r@   )r   structr   r   r   _struct_has_defaults  s    z$ObjCBaseBackend._struct_has_defaults)N)NNN)Nr5   F)TF)__name__
__module____qualname____doc__r   r    r0   r3   r4   r=   rI   rJ   rL   rN   rO   rT   rY   rW   r\   ra   r   r   r   r   r   (   s8   
   
  	#
	  
$r   N)
__future__r   r   r   r   
contextlibr   Zstone.irr   r   r	   r
   r   r   r   r   Zstone.backendr   Zstone.backends.obj_c_helpersr   r   r   r   Zstone_warningr   Zbase_file_commentZundocumentedZcomment_prefixr   r   r   r   r   <module>   s   (	
