ķ
&^Ę[c           @   sŪ   d  Z  d d l Z d d l j Z d d l m Z m Z m Z d d l m	 Z	 d d l m
 Z
 m Z d d l m Z m Z m Z m Z d   Z e j d  Z d	   Z d
   Z d   Z d   Z d e	 j f d     YZ d S(   sL  
For the ``future`` package.

Adds this import line:

    from __future__ import division

at the top and changes any old-style divisions to be calls to
past.utils.old_div so the code runs as before on Py2.6/2.7 and has the same
behaviour on Py3.

If "from __future__ import division" is already in effect, this fixer does
nothing.
i˙˙˙˙N(   t   Leaft   Nodet   Comma(   t
   fixer_base(   t   symst   does_tree_import(   t   tokent   future_importt   touch_import_topt   wrap_in_fn_callc         C   s<   t  j } |  j | k o; |  j j | k o; |  j j | k S(   uw   
    __future__.division redefines the meaning of a single slash for division,
    so we match that and only that.
    (   R   t   SLASHt   typet   next_siblingt   prev_sibling(   t   nodet   slash(    (    sB   lib/python2.7/site-packages/libfuturize/fixes/fix_division_safe.pyt   match_division   s    	"s   ^[0-9]*[.][0-9]*$c         C   s+   t  |  j d | ! p* t  |  j | d  S(   Ni    i   (   t
   _is_floatyt   children(   R   t   div_idx(    (    sB   lib/python2.7/site-packages/libfuturize/fixes/fix_division_safe.pyt	   is_floaty$   s    c         C   s{   t  |  t  r |  d }  n  t  |  t  r; t j |  j  St  |  t  rw t  |  j d t  rw |  j d j d k Sn  t S(   Ni    u   float(	   t
   isinstancet   listR    t   const_ret   matcht   valueR   R   t   False(   t   expr(    (    sB   lib/python2.7/site-packages/libfuturize/fixes/fix_division_safe.pyR   (   s    c         C   s4   x- t  |  j  D] \ } } t |  r | Sq Wt S(   N(   t	   enumerateR   R   R   (   R   t   it   child(    (    sB   lib/python2.7/site-packages/libfuturize/fixes/fix_division_safe.pyt   find_division5   s    c         C   si   g  } xO t  |  j  D]> \ } } | | k rA | j t    q | j | j    q Wd | d _ | S(   Nu    i    (   R   R   t   appendR   t   clonet   prefix(   R   R   R   R   R   (    (    sB   lib/python2.7/site-packages/libfuturize/fixes/fix_division_safe.pyt   clone_div_operands;   s    t   FixDivisionSafec           B   s8   e  Z d  Z e j Z d Z d   Z d   Z d   Z	 RS(   i   s4   
    term<(not('/') any)+ '/' ((not('/') any))>
    c         C   s/   t  t |   j | |  d | j k |  _ d S(   sO   
        Skip this fixer if "__future__.division" is already imported.
        t   divisionN(   t   superR$   t
   start_treet   future_featurest   skip(   t   selft   treet   name(    (    sB   lib/python2.7/site-packages/libfuturize/fixes/fix_division_safe.pyR'   R   s    c         C   sS   | j  |  j j k rO t |  } | t k	 rO t | |  sL t | |  SqO n  t S(   u   
        Since the tree needs to be fixed once and only once if and only if it
        matches, we can start discarding matches after the first.
        (   R   R   t   termR   R   R   R#   (   R*   R   R   (    (    sB   lib/python2.7/site-packages/libfuturize/fixes/fix_division_safe.pyR   Y   s    c         C   s@   |  j  r d  St d |  t d d |  t d | d | j S(   Nu   divisionu
   past.utilsu   old_divt   old_divR"   (   R)   R   R   R	   R"   (   R*   R   t   results(    (    sB   lib/python2.7/site-packages/libfuturize/fixes/fix_division_safe.pyt	   transformh   s
    	(
   t   __name__t
   __module__t	   run_orderR   R
   t   _accept_typet   PATTERNR'   R   R0   (    (    (    sB   lib/python2.7/site-packages/libfuturize/fixes/fix_division_safe.pyR$   H   s   			(   t   __doc__t   ret   lib2to3.pytreet   pytreet   lib2to3.fixer_utilR    R   R   t   lib2to3R   R   R   t   libfuturize.fixer_utilR   R   R   R	   R   t   compileR   R   R   R   R#   t   BaseFixR$   (    (    (    sB   lib/python2.7/site-packages/libfuturize/fixes/fix_division_safe.pyt   <module>   s   "						