B
    ›³ëb4#  ã               @   sÀ   d Z ddlZddlZddlmZ ddlZddlZddlm	Z	 ddl
mZmZmZ ddlZdd„ Zdd	„ Zej d
d¡ZejjeeejjjejjjdZG dd„ dƒZdd„ Zdd„ Zdd„ ZdS )zÕSCons.Tool.javac

Tool-specific initialization for javac.

There normally shouldn't be any need to import this module directly.
It will usually be imported through the generic SCons.Tool.Tool()
selection method.

é    N)ÚOrderedDict)Ú_my_normcase)Úparse_java_fileÚget_java_install_dirsÚget_java_include_pathsc             C   s   t j | ¡ t jd¡S )z1Turn a string (path name) into a Java class name.Ú.)ÚosÚpathÚnormpathÚreplaceÚsep)r	   © r   ú/lib/python3.7/site-packages/SCons/Tool/javac.pyÚ	classname-   s    r   c                sÊ  |  dd¡}|  dd¡}| d  tjjj¡ | d }|d  ¡  ¡ }t|tjjj	ƒr`|j
 ¡ }n,t|tjjjƒrz| ¡ }ntj d|j ¡‚g }t|ƒ‰xÀ|D ]¸}	|	 ¡  ¡ }	t|	tjjj	ƒrÊ| |	¡ qžt|	tjjjƒrDtƒ }
|	 ¡ ‰ ‡ ‡fdd„}x*t ˆ  ¡ ¡D ]\}}}||
||ƒ qW |	 ||
¡ | t|
 ¡ ƒ¡ qžtj d|	j ¡‚qžW |  d	d
¡}g }xT|D ]J}g }d}d}| ¡ s"t| ¡  ¡ |ƒ\}}|r"d}|rÎ| d  |¡}|tj }n| d }d}xF|D ]>}| 	|| ¡}||j_||j_t|| ƒ|j_ | |¡ qàW |r–|j!dt"|ƒ … }|r\| d  |¡ 	|| ¡}n| d  	|| ¡}||j_|j
|j_t|ƒ|j_ | |¡ x|D ]}| #|g¡ qœW | |¡ qrW ||fS )zaCreate and return lists of source java files
    and their corresponding target class files.
    Ú
JAVASUFFIXz.javaÚJAVACLASSSUFFIXz.classr   z)Java source must be File or Dir, not '%s'c                sL   t ‡fdd„|D ƒƒ}ˆ |¡‰ ‡ fdd„|D ƒ}x|D ]}d| |< q8W d S )Nc                s   g | ]}t |ƒ ˆ ¡r|‘qS r   )r   Úendswith)Ú.0Ún)Újsr   r   ú
<listcomp>M   s    z>emit_java_classes.<locals>.find_java_files.<locals>.<listcomp>c                s   g | ]}ˆ   |¡‘qS r   )ÚFile)r   Úf)Úmydirr   r   r   P   s    T)ÚsortedÚDir)ÚargÚdirpathÚ	filenamesZ
java_filesZ
java_pathsZjp)Údirnoder   )r   r   Úfind_java_filesL   s
    

z*emit_java_classes.<locals>.find_java_filesÚJAVAVERSIONz1.4TNFÚ )$ÚgetZmust_be_sameÚSConsÚNodeÚFSr   ZrentryZdisambiguateÚ
isinstancer   ÚdirZrdirZErrorsZ	UserErrorÚ	__class__r   Úappendr   r   ÚwalkZget_abspathÚextendÚlistÚkeysZ
is_derivedr   Zrfiler   Z
attributesZjava_classdirZjava_sourcedirr   Zjava_classnameÚnameÚlenZset_specific_source)ÚtargetÚsourceÚenvÚjava_suffixZclass_suffixZclassdirÚsZ	sourcedirZslistÚentryÚresultr    r   Zdirnamesr   ÚversionZ
full_tlistr   ZtlistZsource_file_basedZpkg_dirÚclassesÚdÚpÚcÚtÚbaser   )r   r   r   Úemit_java_classes1   sv    






r?   z	$JAVACCOMz$JAVACCOMSTR)ÚactionÚemitterZtarget_factoryZsource_factoryc               @   s"   e Zd ZdZddd„Zdd„ ZdS )Úpathoptz‚
    Callable object for generating javac-style path options from
    a construction variable (e.g. -classpath, -sourcepath).
    Nc             C   s   || _ || _|| _d S )N)ÚoptÚvarÚdefault)ÚselfrC   rD   rE   r   r   r   Ú__init__   s    zpathopt.__init__c             C   s~   || j  }|r tj |¡s |g}| jrN|| j }|rNtj |¡sF|g}|| }|rvtj |¡}| jtj 	t
t|ƒ¡gS g S d S )N)rD   r$   ÚUtilÚis_ListrE   ZflattenrC   r   ÚpathsepÚjoinÚmapÚstr)rF   r1   r2   r3   Zfor_signaturer	   rE   r   r   r   Ú__call__•   s    

zpathopt.__call__)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rG   rN   r   r   r   r   rB   ‹   s   
rB   c       
      O   s   t j |¡s|g}t j |¡s$|g}||d gt|ƒt|ƒ   }|  d¡}g }xªt||ƒD ]œ\}}t|t jjj	ƒr”t|t jjj
ƒrŒ| j}	qà| j}	nLtj |¡r¨| j}	n8tj |¡r¼| j}	n$|t|ƒ d… |krÚ| j}	n| j}	| |	||f|ž|Ž¡ q\W |S )zX
    A pseudo-Builder wrapper around the separate JavaClass{File,Dir}
    Builders.
    éÿÿÿÿz$JAVASUFFIXN)r$   rH   rI   r0   ÚsubstÚzipr'   r%   r&   ZBaser   ZJavaClassFileZJavaClassDirr   r	   ÚisfileÚisdirr,   )
r3   r1   r2   ÚargsÚkwr4   r7   r=   r5   Úbr   r   r   ÚJava¥   s*    
r[   c          
   C   s  t j | ¡}t j | ¡}t j | ¡}| dt¡ | |  d¡t¡ t|_|  	t
¡ |  dd¡}| d dkr¦td|d}t jj| d|d}|r´tj |¡}|  d	|¡ nt j | d¡}| jdt j d
¡t| ||ƒddg g g d t| d< d| d< d| d< d| d< d| d< d| d< d| d< dS )zDAdd Builders and construction variables for javac to an Environment.Nz$JAVASUFFIXr!   ZPLATFORMZwin32)r8   Újavac)Zdefault_pathsÚPATHr"   z.classz.java)ZJAVACZ
JAVACFLAGSZJAVAINCLUDESr   r   ZJAVABOOTCLASSPATHZJAVACLASSPATHZJAVASOURCEPATHZ_javapathoptz7${_javapathopt("-bootclasspath", "JAVABOOTCLASSPATH")} Z_JAVABOOTCLASSPATHz/${_javapathopt("-classpath", "JAVACLASSPATH")} Z_JAVACLASSPATHzK${_javapathopt("-sourcepath", "JAVASOURCEPATH", "_JAVASOURCEPATHDEFAULT")} Z_JAVASOURCEPATHz#${TARGET.attributes.java_sourcedir}Z_JAVASOURCEPATHDEFAULTzv$JAVAC $JAVACFLAGS $_JAVABOOTCLASSPATH $_JAVACLASSPATH -d ${TARGET.attributes.java_classdir} $_JAVASOURCEPATH $SOURCESZ	_JAVACCOMz(${TEMPFILE('$_JAVACCOM','$JAVACCOMSTR')}ZJAVACCOM)r$   ZToolZCreateJavaFileBuilderZCreateJavaClassFileBuilderZCreateJavaClassDirBuilderZadd_emitterr?   rT   rA   Z	AddMethodr[   r#   r   Zfind_program_pathr   r	   ÚdirnameZAppendENVPathZ
SetDefaultrH   ZCLVarr   rB   )r3   Z	java_fileZ
java_classZjava_class_dirr8   Úpathsr\   Zjavac_bin_dirr   r   r   ÚgenerateÉ   s>    


r`   c             C   s   dS )Né   r   )r3   r   r   r   Úexistsó   s    rb   )rR   r   Úos.pathÚcollectionsr   ZSCons.Actionr$   ZSCons.BuilderZSCons.Node.FSr   ZSCons.Tool.JavaCommonr   r   r   Z
SCons.Utilr   r?   ZActionZ
JavaActionZBuilderr%   r&   ZEntryZJavaBuilderrB   r[   r`   rb   r   r   r   r   Ú<module>    s&   S$*