o
    Hi>                     @   s0  d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 dd Z
d	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Z d5d6 Z!d7d8 Z"d9d: Z#d;d< Z$d=d> Z%dS )?u   
通过遍历所有工程文件获取属性、文件夹名、枚举、代理、block、常量、方法等信息，
并赋值给oc_util.py中的class Folder()和class FileInfo()
    N)oc_util)oc_yaml)oc_tool)custom_corec                  C   s   t d t  tj} t d|   t|  t| }t dt| d t d t| t d t| t d t	| t d t
| t d	 t| t d
 t| t d t| t d t d t| t d t| t d t  dS )uO   
    初始化函数，扫描项目中的所有文件并提取相关信息
    u!   开始扫描项目文件内容...u   项目路径：   找到 u    个Objective-C文件u=   
================ 第一阶段: 提取属性 ================uC   
================ 第二阶段: 提取实例变量 ================u=   
================ 第三阶段: 提取常量 ================u=   
================ 第四阶段: 提取枚举 ================u=   
================ 第五阶段: 提取代理 ================u<   
================ 第六阶段: 提取Block ================uC   
================ 第七阶段: 提取局部变量 ================u=   
================ 第八阶段: 提取类名 ================u=   
================ 第九阶段: 提取方法 ================uD   
================ 第十阶段: 提取c语言方法 ================u   文件内容扫描完成N)printinitialize_new_listsr   path_mix_projectget_project_folder_namesget_project_oc_fileslenprocess_propertiesprocess_instance_variablesprocess_constantsprocess_enumsprocess_delegatesprocess_blocksprocess_local_variablesprocess_methodsprocess_c_methodsprint_statistics)project_pathoc_files r   [/data/storage/obfuscation/tool/ObjectiveC/oc_custom/custom_h_search_file_content_message.pyinit   s8   
r   c                   C   s   t tjds
g tj_t tjdsg tj_t tjdsg tj_t tjds(g tj_t tjds2g tj_t tjds<g tj_t tjdsFg tj_	t tjdsPg tj_
t tjd	sZg tj_g tj_g tj_g tj_g tj_g tj_g tj_g tj_g tj_g tj_d
S )u    初始化所有需要的new_listproperty_name_old_listenum_old_listblock_old_listconstant_old_listdelegate_old_listmethod_old_listlocal_variable_old_listc_method_old_listclass_name_old_listN)hasattrr   class_oc_filer   r   r   r   r    r!   r"   r#   r$   property_name_new_listenum_new_listblock_new_listconstant_new_listdelegate_new_listmethod_new_listlocal_variable_new_listc_method_new_listclass_name_new_listr   r   r   r   r   E   s6   r   c                 C   sn   g }t | D ] \}}}|D ]}t|rq|drq|tjv r!q|| qq|t_t	dt
| d |S )u'   获取项目中的所有文件夹名称.r   u    个文件夹)oswalkshould_ignore_folder
startswithr   list_folder_ignore_allappendr   list_folder_namer   r   )r   folder_namesrootdirs_dir_namer   r   r   r
   f   s   

r
   c                 C   s&   g d}|D ]
}|  |r dS qdS )u$   判断是否应该忽略此文件夹z
.frameworkz.bundlez	.xcassetsz.lprojz
.xcodeprojz.xcworkspaceTFendswith)folder_nameignore_extensionsextr   r   r   r3      s   
r3   c           
      C   s   g }t | D ]j\}}}dd |D |dd< |D ]W}|ds*|ds*|drpt j||}d}tjD ]}d| d|v sH|d| rLd	} nq6|rPq|tjv rVq|| t j	|d
 }	|	t
jjvrpt
jj|	 qq|S )u,   获取项目中的所有Objective-C源文件c                    s:   g | ]  t jv s d st fdddD s qS )r0   c                 3   s    | ]}  |V  qd S Nr>   ).0rB   dr   r   	<genexpr>   s    z2get_project_oc_files.<locals>.<listcomp>.<genexpr>r=   )r   r5   r4   any)rD   r   rE   r   
<listcomp>   s
    
z(get_project_oc_files.<locals>.<listcomp>Nz.mz.hz.mmF/Tr   )r1   r2   r?   pathjoinr   r5   list_not_extract_content_filer6   splitextr   r&   all_file_name_list)
r   r   r9   r:   files	file_name	file_pathshould_ignoreignore_folder	base_namer   r   r   r      s.   
 

r   c                 C   s   t dt|  d| d | D ]E}z"t|dddd}| }W d   n1 s)w   Y  || W q tyT } zt d	| d
| dt|  W Y d}~qd}~ww t | d|  d dS )u   
    通用的文件处理函数

    Args:
        oc_files: 文件列表
        extractor_func: 提取函数
        item_type: 项目类型名称（用于日志）
        count_func: 获取处理结果数量的函数
    u   开始处理 u    个文件的z...rzutf-8ignore)encodingerrorsNu   处理文件 u    的u   时出错: u   处理完成，共     个)r   r   openread	Exceptionstr)r   extractor_func	item_type
count_funcrR   fcontenter   r   r   _process_files_with_extractor   s   

*re   c                 C      t | tddd  dS )u!   单独处理所有文件的属性   属性c                   S      t tjjS rC   r   r   r&   r   r   r   r   r   <lambda>       z$process_properties.<locals>.<lambda>N)re   extract_propertiesr   r   r   r   r         r   c                 C   rf   )u'   单独处理所有文件的实例变量u   实例变量c                   S   rh   rC   ri   r   r   r   r   rj      rk   z,process_instance_variables.<locals>.<lambda>N)re   extract_instance_variablesrm   r   r   r   r      rn   r   c                 C   rf   )u!   单独处理所有文件的常量   常量c                   S   rh   rC   )r   r   r&   r   r   r   r   r   rj      rk   z#process_constants.<locals>.<lambda>N)re   extract_constantsrm   r   r   r   r      rn   r   c                 C   rf   )u!   单独处理所有文件的方法   方法c                   S   rh   rC   )r   r   r&   r!   r   r   r   r   rj      rk   z!process_methods.<locals>.<lambda>N)re   extract_methodsrm   r   r   r   r      rn   r   c                 C   rf   )u(   单独处理所有文件的c语言方法   c语言方法c                   S   rh   rC   )r   r   r&   r#   r   r   r   r   rj      rk   z#process_c_methods.<locals>.<lambda>N)re   extract_c_methodsrm   r   r   r   r      s   r   c                 C   rf   )u!   单独处理所有文件的枚举   枚举c                   S   rh   rC   )r   r   r&   r   r   r   r   r   rj     rk   zprocess_enums.<locals>.<lambda>N)re   extract_enumsrm   r   r   r   r      rn   r   c                 C   rf   )u!   单独处理所有文件的代理   代理c                   S   rh   rC   )r   r   r&   r    r   r   r   r   rj     rk   z#process_delegates.<locals>.<lambda>N)re   extract_delegatesrm   r   r   r   r     rn   r   c                 C   rf   )u    单独处理所有文件的BlockBlockc                   S   rh   rC   )r   r   r&   r   r   r   r   r   rj     rk   z process_blocks.<locals>.<lambda>N)re   extract_blocksrm   r   r   r   r     rn   r   c                 C   rf   )u'   单独处理所有文件的局部变量   局部变量c                   S   rh   rC   )r   r   r&   r"   r   r   r   r   rj     rk   z)process_local_variables.<locals>.<lambda>N)re   extract_local_variablesrm   r   r   r   r     rn   r   c                 C   rf   )u!   单独处理所有文件的类名   类名c                   S   rh   rC   )r   r   r&   r$   r   r   r   r   rj   &  rk   z$process_class_name.<locals>.<lambda>N)re   extract_class_namerm   r   r   r   process_class_name   rn   r   c                 C   s  t | \}}|D ]M}|tjjv rq	td|}t|dkr2tjd|d 	 |dd    q	| d| }|tjjvrbtjj| | d| }tjj
| tjj| tjj| ||d\}}|r|tjjvrtjj| td|p|}	tjj
|	 tjj| tjj|	 |r|tjjvrtjj| td|p|}
tjj
|
 tjj| tjj|
 |d 	 |dd  }d| }|tjjvrtjj| |d 	 |dd  }tjj
d|  tjj| tjjd|  d| }|tjjvr4tjj| tjj
d|  tjj| tjjd|  |tjjvrWtjj| tjj
| tjj| tjj| q	dS )	u   提取文件中的属性定义rg   r   set   N:)NNr;   )r   process_property_contentr   r&   r   random_one_new_namer   list_ignore_keywordr6   upperr'   total_wordsget)rc   unique_propertiesproperty_custom_accessorsproperty_namenew_property_nameparam_stylenew_param_stylecustom_settercustom_gettercustom_setter_newcustom_getter_newcapitalizedsetter_namenew_capitalized	ivar_namer   r   r   rl   ,  sb   

&

rl   c              	   C   s  t | }|D ]8}|r@td|r@|tjjv r#td| d q|drL|dd }|tjjv s?| d| tjjv rKtd| d| d	 qnd| }|tjjv rctd| d
| d	 qt	d|}t
|dkrtjd|d  |dd    q|dr|dd }z)tjj|}|t
tjjk rtjj| }d| }td| d| d|  W n	 ty   Y nw | d| }|tjjvrtjj| | d| }	tjj|	 tjj| tjj|	 d| }
|
tjjvrtjj|
 d| }tjj| tjj|
 tjj| |tjjvr@tjj| tjj| tjj| tjj| qdS )u!   提取类扩展中的实例变量z^\w+$u   实例变量 u+    已经在属性处理中被处理，跳过r;   r   Nr   u    对应的属性 u    已经被处理，跳过u    对应的带下划线版本 rg   r   r   u    使用对应属性     的混淆名称: z->)r   "process_instance_variables_contentrematchr   r&   r   r   r4   r   r   r   r6   r   indexr'   
ValueErrorr   )rc   	all_ivarsoriginal_ivarr   underscore_namenew_name
prop_indexproperty_new_namer   r   arrow_stylenew_arrow_styler   r   r   ro   v  sl   




&



ro   c                 C   t   t | }|D ]0}|tjjvr7td|}t|dkrqtjj| tjj| tjj	| tjj	| qdS )u   提取文件中的枚举定义rv   r   N)
r   process_enums_contentr   r&   r   r   r   r6   r(   r   )rc   	all_enums	enum_namer   r   r   r   rw        

rw   c                 C   r   )u   提取文件中的代理定义rx   r   N)
r   process_delegates_contentr   r&   r    r   r   r6   r+   r   )rc   all_delegatesdelegate_namer   r   r   r   ry     r   ry   c                 C   r   )u#   提取文件中的block类型定义rz   r   N)
r   process_blocks_contentr   r&   r   r   r   r6   r)   r   )rc   
all_blocks
block_namer   r   r   r   r{     r   r{   c                 C   r   )u   提取文件中的常量定义rp   r   N)
r   process_constants_contentr   r&   r   r   r   r6   r*   r   )rc   all_constantsconstant_namer   r   r   r   rq     r   rq   c                 C   s   t | }|D ]`}|tjjvrgtd|}t|dkrq| d| }|tjjvrKtjj| | d| }tjj| tjj	| tjj	| tjj| tjj| tjj	| tjj	| qdS )u   提取文件中的局部变量r|   r   r   N)
r   process_local_variables_contentr   r&   r"   r   r   r6   r-   r   )rc   all_local_varsvar_namer   r   r   r   r   r   r}     s&   

r}   c                 C   r   )u   提取文件中的类名r~   r   N)
r   process_class_name_contentr   r&   r$   r   r   r6   r/   r   )rc   all_class_names
class_namer   r   r   r   r   9  r   r   c                 C   st   t | }|D ]0}|tjjvr7td|}t|dkrqtjj| tjj| tjj	| tjj	| qd S )Nrt   r   )
r   process_c_method_contentr   r&   r#   r   r   r6   r.   r   )rc   all_c_methodsc_method_namer   r   r   r   ru   M  s   

ru   c                 C   sr  t | }|D ]}|tjjv rqtd|}t|dkrq|drdt|dkrd|d  |dd  }|tjjv rdtjj	|}dtjj
| d  tjj
| dd   }td| d	| d
|  | d| }|tjjvrtjj| | d| }tjj
| tjj| tjj| |tjjvrtjj| tjj
| tjj| tjj| qdS )u   提取文件中的方法定义rr   r   r         Nr   u   方法 u,    是setter方法，使用对应getter方法 r   r   )r   process_methods_contentr   r&   r!   r   r   r4   lowerr   r,   r   r   r6   r   )rc   all_methodsmethod_namenew_method_namer   r   r   r   r   r   r   rs   `  s6   

.rs   c                 C   s   t | |dkr
dS d}| dkr#|dr#t|dkr#d}|dd }t|}d}tjD ]}||r7|} nq,|t| }|d  }t ||| }t 	|| sXt
| |S || S )u   生成一个新的随机名称F rr   r   r   Nr   )r   is_word_can_mixr4   r   r   list_keep_wordr?   isupperrandom_one_stringis_name_legalr   )describeold_nameprefixcount	keep_wordwordisFirstr   r   r   r   r     s(   


r   c                   C   s  t d t dttjj dttjj d t dttjj dttjj d ttjjttjjkrHt dttjj dttjj  t dttjj dttjj	 d ttjjttjj	kryt d	ttjj dttjj	  t d
ttjj
 dttjj d ttjj
ttjjkrt dttjj
 dttjj  t dttjj dttjj d ttjjttjjkrt dttjj dttjj  t dttjj dttjj d ttjjttjjkrt dttjj dttjj  t dttjj dttjj d ttjjttjjkr?t dttjj dttjj  t dttjj dttjj d ttjjttjjkrqt dttjj dttjj  t dttjj d dS )u   打印扫描结果统计u   
扫描结果统计:u   文件名: u    个 (混淆后 u    个)u   属性名: u0   警告：属性新旧列表数量不一致! 旧:u   , 新:u   枚举: u0   警告：枚举新旧列表数量不一致! 旧:zBlock: u/   警告：Block新旧列表数量不一致! 旧:u   常量: u0   警告：常量新旧列表数量不一致! 旧:u   代理: u0   警告：代理新旧列表数量不一致! 旧:u   方法: u0   警告：方法新旧列表数量不一致! 旧:u   局部变量: u6   警告：局部变量新旧列表数量不一致! 旧:u   总关键词: rZ   N)r   r   r   r&   file_name_old_listfile_name_new_listr   r'   r   r(   r   r)   r   r*   r    r+   r!   r,   r"   r-   r   r   r   r   r   r     s0   &&$&$&$&$&$&$&$r   )&__doc__r1   r   yaml
ObjectiveCr   r   r   ObjectiveC.oc_customr   r   r   r
   r3   r   re   r   r   r   r   r   r   r   r   r   r   rl   ro   rw   ry   r{   rq   r}   r   ru   rs   r   r   r   r   r   r   <module>   sH    8!
(				
				JU.&