
    Je                     `    d Z ddlZddlZddlmZ  G d d      Z G d de      Zd Zd	 Z	d
 Z
y)zGeneral editor panel utilities.    N)IntervalTreec                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)FoldingRegionz1Internal representation of a code folding region.c                     || _         || _        t        t        j                               | _        d | _        d| _        g | _        d| _	        d | _
        y )Nr   F)text
fold_rangestruuiduuid4idindexnestingchildrenstatusparent)selfr   r   s      D/usr/lib/python3/dist-packages/spyder/plugins/editor/panels/utils.py__init__zFoldingRegion.__init__   sE    	$djjl#
    c                     | j                   D ]	  }d |_         g | _         | j                  #| j                  j                  |        d | _        y y N)r   r   remove_node)r   childs     r   deletezFoldingRegion.delete    sM    ]] 	 EEL	  ;;"KK##D)DK #r   c                 r   | |_         | j                  dz   |_        | j                  D cg c]  }|j                  d    }}|j                  d   }t	        j
                  ||      }||_        | j                  |d  D ]  }|xj                  dz  c_         | j                  j                  ||       y c c}w )N   r   )r   r   r   r   bisectbisect_leftr   insert)r   nodecchildren_ranges
node_range	new_indexr   s          r   add_nodezFoldingRegion.add_node)   s    ||a'48MMBq1<<?BB__Q'
&&
C	
]]9:. 	EKK1K	Y- Cs   B4c                 f   | j                   |j                  dz   d  D ]  }|xj                  dz  c_         	 | j                   j                  |j                         t	        | j                   | j                   dd        D ]   \  }}|j                  |j                  k  r J  y # t        $ r Y Rw xY w)Nr   )r   r   pop
IndexErrorzip)r   r    r   idxnext_idxs        r   r   zFoldingRegion.remove_node4   s    ]]4::>?3 	EKK1K		MMdjj) !ab0AB 	.MC99x~~---	.  		s   %B$ $	B0/B0c                 f   |j                   | _         |j                  | _        |j                  | _        |j                  | _        |j                  | _        |j
                  | _        | j                  D ]	  }| |_         | j                  '| j                  j                  | j                  |        y y r   )r   r   r   r   r   r   replace_node)r   r    r   s      r   
clone_nodezFoldingRegion.clone_node?   s    ''ZZ
||kkkk]] 	 EEL	  ;;"KK$$TZZ6 #r   c                 0    || j                   |<   | |_        y r   )r   r   )r   r   r    s      r   r-   zFoldingRegion.replace_nodeM   s    #er   c                     t        |       S r   )r	   r   s    r   __repr__zFoldingRegion.__repr__Q   s    4yr   c                 z    dj                  | j                  | j                  | j                  | j                        S )Nz({0}, {1}, {2}, {3}))formatr   r   r   r   r1   s    r   __str__zFoldingRegion.__str__T   s.    %,,OOTYY> 	>r   N)__name__
__module____qualname____doc__r   r   r%   r   r.   r-   r2   r5    r   r   r   r      s-    ;	.	.7>r   r   c                   "    e Zd ZdZd Zd Zd Zy)FoldingStatusz
    Code folding status storage.

    This dictionary subclass is used to update and get the status of a
    folding region without having to deal with the internal representation.
    c                 j    t         j                  |       }|D cg c]  }|j                   c}S c c}w r   )dictvaluesr   )r   r?   xs      r   r?   zFoldingStatus.valuesa   s(    T""()Q)))s   0c                 F    t         j                  | |      }|j                  S r   )r>   __getitem__r   )r   keyvalues      r   rB   zFoldingStatus.__getitem__e   s      s+||r   c                     t        |t              rt        j                  | ||       y t        j	                  | |      }||_        y r   )
isinstancer   r>   __setitem__rB   r   )r   rC   rD   regions       r   rG   zFoldingStatus.__setitem__i   s7    e]+T3.%%dC0F!FMr   N)r6   r7   r8   r9   r?   rB   rG   r:   r   r   r<   r<   Y   s    *"r   r<   c                 &   d}|j                   \  }}| j                  4|s2| j                   \  }}||k  r| j                  } nd}| j                  |s2|j                  "|j                  j                  |       d|_        | j                  |       |S )z:Build code folding tree representation from interval tree.FNT)r   r   r   r%   )r   r    matchstart__
parent_ends         r   merge_intervalrN   q   s    EIE2
--
#E**J]]FE --
#E {{%
OODKr   c                    ddl }g }| D ]8  \  }}}||kD  s|dz  }|dz  }t        |||f      }|j                  |||f       : t        j                  |      }	|	|z
  }
||	z
  }t        |
      t        |      kD  }t        t        |            }t        t        |
            }t        |d      }t        |d      }d}|||j                  }|j                  }|j                  j                  |j                  |j                        }|dk\  r*|j                  |       t        |d      }t        |d      }n5|r|dz  }t        |d      }n!|j                          |dz  }t        |d      }|||2|0|j                  }|j                          |dz  }t        |d      }|0|||dz  }t        |d      }||dkD  r"t        |	      }|j                  t         |       |	|fS )z;Compare previous and current code folding tree information.r   Nr   g?)data_reducerdata_initializer)textdistancer   appendr   from_tupleslenitersortednextdatahammingnormalized_similarityr   r.   r   merge_overlapsrN   )rangescurrent_treerootrR   folding_rangesstarting_lineending_liner   folding_reprtreechangesdeletedadding_foldingdeleted_iterchanges_iterdeleted_entrychanged_entry
non_mergeddeleted_entry_ichanged_entry_idist	tree_copys                         r   merge_foldingrq      s;    N,2 N({D&QM1K({/KLL!!=+|"LMN ##N3D\!GT!G\CL0Nw(Lw(Lt,Mt,MJ

#(A',,',,##99  /"6"68 4<&&7 t4M t4Ma
 $\4 8  &&(a
 $\4 8) 
#(A,  '+00O""$!OJ t4M '  '!OJ t4M ' A~ &	  '! 	! 	# :r   c                 H   | j                   D cg c]  }|ddf	 }}t        i       }i }i }i }|g k7  ra|j                  d      \  }}}	|j                  \  }
}|||
<   |||
<   |	||
<   |||
<   |j                   D cg c]
  }||dz   |
f c}|z   }|g k7  ra||||fS c c}w c c}w )Nr   r   )r   r<   r'   r   )r_   r@   queuefolding_statusfolding_regionsfolding_nestingfolding_levelsr    folding_levelfolding_nestrK   ends               r   collect_folding_regionsr|      s    !%/AaBZ/E/"2&NOON
2+,1IIaL)m\__
s!$ -u!- $u8<F1!]Q&.FN 2+ O^^KK 0 Gs   B9B)r9   r   r
   intervaltreer   r   r>   r<   rN   rq   r|   r:   r   r   <module>r~      sB    &   &
C> C>L"D "0&AHLr   