B
    0a                  @   s   d dl mZ d dl mZ d dl mZ d dl mZ d dlZd dlZd dlZddlm	Z	 e
d\ZZZG d	d
 d
eZG dd deZdddZdddZdddZdddZdd ZdddZd ddZdS )!    )absolute_import)division)print_function)unicode_literalsN   )utils   c               @   sn   e Zd ZdZdZd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S )PositionzU
    Represents a position in the source file which we
    want to inform about.
    )filenamelinecolumnNc             C   s   || _ || _|| _d S )N)r
   r   r   )selfr
   r   r    r   3/usr/lib/gobject-introspection/giscanner/message.py__init__/   s    zPosition.__init__c             C   s"   || j | j| jf|j |j|jfS )N)r
   r   r   )r   otheropr   r   r   _compare4   s    zPosition._comparec             C   s   |  |tjS )N)r   operatorlt)r   r   r   r   r   __lt__8   s    zPosition.__lt__c             C   s   |  |tjS )N)r   r   gt)r   r   r   r   r   __gt__;   s    zPosition.__gt__c             C   s   |  |tjS )N)r   r   ge)r   r   r   r   r   __ge__>   s    zPosition.__ge__c             C   s   |  |tjS )N)r   r   le)r   r   r   r   r   __le__A   s    zPosition.__le__c             C   s   |  |tjS )N)r   r   eq)r   r   r   r   r   __eq__D   s    zPosition.__eq__c             C   s   |  |tjS )N)r   r   ne)r   r   r   r   r   __ne__G   s    zPosition.__ne__c             C   s   t | j| j| jfS )N)hashr
   r   r   )r   r   r   r   __hash__J   s    zPosition.__hash__c             C   s$   dt j| j| jpd| jpdf S )Nz<Position %s:%d:%d>)ospathbasenamer
   r   r   )r   r   r   r   __repr__M   s    zPosition.__repr__c             C   s~   t j| j}t j|}t j||f}|r<t j||}| jd k	rXd|| j| jf S | jd k	rpd|| jf S d|f S d S )Nz%s:%d:%dz%s:%dz%s:)r$   r%   realpathr
   commonprefixrelpathr   r   )r   cwdr
   Zcommon_prefixr   r   r   formatR   s    

zPosition.format)NNN)__name__
__module____qualname____doc__	__slots__r   r   r   r   r   r   r   r    r"   r'   r,   r   r   r   r   r	   '   s   
r	   c               @   sZ   e Zd ZdZdddZedd Zdd Zdd	 Zd
d Z	dddZ
dddZdd ZdS )MessageLoggerNc             C   s:   |d krt j}t | _|| _|| _g | _d| _d| _	d S )Nr   )
sysstderrr$   getcwd_cwd_output
_namespace_enable_warnings_warning_count_error_count)r   	namespaceoutputr   r   r   r   d   s    
zMessageLogger.__init__c             O   s   | j d kr| ||| _ | j S )N)	_instance)clsargskwargsr   r   r   getn   s    
zMessageLogger.getc             C   s
   || _ d S )N)r9   )r   Z	log_typesr   r   r   enable_warningst   s    zMessageLogger.enable_warningsc             C   s   | j S )N)r:   )r   r   r   r   get_warning_countw   s    zMessageLogger.get_warning_countc             C   s   | j S )N)r;   )r   r   r   r   get_error_countz   s    zMessageLogger.get_error_countc       
      C   s  t d |  jd7  _|| jkr&dS t|tkr:t|}t|trJ|g}|sXtdg}x0|dd D ] }| j	
d|j| jdf  qfW |d j| jd}|tkrd}	n(|tkrd	}	|  jd7  _n|tkrd
}	|dk	r|dk	rd||d| d f }|r0| jrd||	| jj||f }nd||	||f }n,| jrNd||	| jj|f }nd||	|f }| j	
| |tkrt d t|dS )z
        Log a warning, using optional file positioning information.
        If the warning is related to a ast.Node type, see log_node().
        Zwarningr   Nz	<unknown>r#   z%s:
)r+   WarningErrorZFatalz%s
%s
%s ^z%s: %s: %s: %s: %s
z%s: %s: %s: %s
z%s: %s: %s
fatal)r   Zbreak_on_debug_flagr:   r9   typesetlist
isinstancer	   r7   writer,   r6   WARNINGERRORr;   FATALr8   name
SystemExit)
r   log_typetext	positionsprefix
marker_posmarker_linepositionZlast_positionZ
error_typer   r   r   log}   sH    



 

zMessageLogger.logc             C   s   |rn,t |ddr|j}n|r,|jr,|j}nt }|rNdt |d|j|f }n"|spt|drpd|jj|j|f }| ||| dS )aR  
        Log a warning, using information about file positions from
        the given node.  The optional context argument, if given, should be
        another ast.Node type which will also be displayed.  If no file position
        information is available from the node, the position data from the
        context will be used.
        file_positionsNz%s: %ssymbolrS   z
(%s)%s: %s)getattrr]   rL   rS   hasattr	__class__r-   r\   )r   rU   noderV   contextrW   r   r   r   log_node   s    
zMessageLogger.log_nodec             C   s    | j |||jd|jf d dS )z1Log a warning in the context of the given symbol.zsymbol='%s')rX   N)r\   r[   Zident)r   rU   r^   rV   r   r   r   
log_symbol   s    zMessageLogger.log_symbol)NN)NNNN)NN)r-   r.   r/   r>   r   classmethodrB   rC   rD   rE   r\   rd   re   r   r   r   r   r2   a   s   


7
r2   c             C   s    t  }|j| ||||d d S )N)rc   rW   )r2   rB   rd   )rU   rb   rV   rc   rW   mlr   r   r   rd      s    rd   c             C   s    t  }|t| |||| d S )N)r2   rB   r\   rP   )rV   rW   rX   rY   rZ   rg   r   r   r   warn   s    rh   c             C   s   t t| |||d d S )N)rc   rW   )rd   rP   )rb   rV   rc   rW   r   r   r   	warn_node   s    ri   c             C   s   t t| |||d d S )N)rc   rW   )rd   rQ   )rb   rV   rc   rW   r   r   r   
error_node   s    rj   c             C   s   t  }|t| | d S )N)r2   rB   re   rP   )r^   rV   rg   r   r   r   warn_symbol   s    rk   c             C   s    t  }|t| |||| d S )N)r2   rB   r\   rQ   )rV   rW   rX   rY   rZ   rg   r   r   r   error   s    rl   c             C   s    t  }|t| |||| d S )N)r2   rB   r\   rR   )rV   rW   rX   rY   rZ   rg   r   r   r   rJ      s    rJ   )NN)NNNN)NN)NN)NNNN)NNNN)Z
__future__r   r   r   r   r$   r3   r    r   rangerP   rQ   rR   objectr	   r2   rd   rh   ri   rj   rk   rl   rJ   r   r   r   r   <module>   s"   :q




