
    G@d                     n    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
dS )zGeneral editor panel utilities.    N)IntervalTreec                   B    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )FoldingRegionz1Internal representation of a code folding region.c                     || _         || _        t          t          j                              | _        d | _        d| _        g | _        d| _	        d | _
        d S )Nr   F)text
fold_rangestruuiduuid4idindexnestingchildrenstatusparent)selfr   r   s      Blib/python3.11/site-packages/spyder/plugins/editor/panels/utils.py__init__zFoldingRegion.__init__   sL    	$djll##
    c                     | j         D ]	}d |_        
g | _         | j        #| j                            |            d | _        d S d S N)r   r   remove_node)r   childs     r   deletezFoldingRegion.delete    sT    ] 	  	 EELL;"K##D)))DKKK #"r   c                     | |_         | j        dz   |_        d | j        D             }|j        d         }t	          j        ||          }||_        | j        |d          D ]}|xj        dz  c_        | j                            ||           d S )N   c                 (    g | ]}|j         d          S )r   )r   ).0cs     r   
<listcomp>z*FoldingRegion.add_node.<locals>.<listcomp>,   s    BBBq1<?BBBr   r   )r   r   r   r   bisectbisect_leftr   insert)r   nodechildren_ranges
node_range	new_indexr   s         r   add_nodezFoldingRegion.add_node)   s    |a'BBDMBBB_Q'
&
CC	
]9::. 	 	EKK1KKKY-----r   c                 0   | j         |j        dz   d          D ]}|xj        dz  c_        	 | j                             |j                   n# t          $ r Y nw xY wt	          | j         | j         dd                    D ]\  }}|j        |j        k     sJ d S )Nr   )r   r   pop
IndexErrorzip)r   r$   r   idxnext_idxs        r   r   zFoldingRegion.remove_node4   s    ]4:>??3 	 	EKK1KKK	Mdj)))) 	 	 	D	 abb0ABB 	. 	.MC9x~-----	. 	.s   A 
AAc                 
   |j         | _         |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        | j        D ]	}| |_        
| j        "| j                            | j        |            d S d S r   )r   r   r   r   r   r   replace_node)r   r$   r   s      r   
clone_nodezFoldingRegion.clone_node?   s    'Z
|kk] 	  	 EELL;"K$$TZ66666 #"r   c                 (    || j         |<   | |_        d S r   )r   r   )r   r   r$   s      r   r0   zFoldingRegion.replace_nodeM   s    #er   c                      t          |           S r   )r	   r   s    r   __repr__zFoldingRegion.__repr__Q   s    4yyr   c                 Z    d                     | j        | j        | j        | j                  S )Nz({0}, {1}, {2}, {3}))formatr   r   r   r   r4   s    r   __str__zFoldingRegion.__str__T   s+    %,,OTY> > 	>r   N)__name__
__module____qualname____doc__r   r   r(   r   r1   r0   r5   r8    r   r   r   r      s        ;;    	. 	. 	.	. 	. 	.7 7 7    > > > > >r   r   c                   $    e Zd ZdZd Zd Zd ZdS )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                 N    t                               |           }d |D             S )Nc                     g | ]	}|j         
S r=   )r   r   xs     r   r    z(FoldingStatus.values.<locals>.<listcomp>c   s    )))Q)))r   )dictvalues)r   rE   s     r   rE   zFoldingStatus.valuesa   s'    T""))&))))r   c                 F    t                               | |          }|j        S r   )rD   __getitem__r   )r   keyvalues      r   rG   zFoldingStatus.__getitem__e   s      s++|r   c                     t          |t                    rt                              | ||           d S t                              | |          }||_        d S r   )
isinstancer   rD   __setitem__rG   r   )r   rH   rI   regions       r   rL   zFoldingStatus.__setitem__i   sR    e]++ 	"T3.....%%dC00F!FMMMr   N)r9   r:   r;   r<   rE   rG   rL   r=   r   r   r?   r?   Y   sK         * * *  " " " " "r   r?   c                     d}|j         \  }}| j        %|s#| j         \  }}||k    r| j        } nd}| j        |#|j        !|j                            |           d|_        |                     |           |S )z:Build code folding tree representation from interval tree.FNT)r   r   r   r(   )r   r$   matchstart__
parent_ends         r   merge_intervalrS   q   s    EIE2
-
#E
#*J]FFE -
#E
# {%%%
OODKr   c                 @   ddl }g }| D ]@\  }}}||k    r4|dz  }|dz  }t          |||f          }|                    |||f           At          j        |          }	|	|z
  }
||	z
  }t          |
          t          |          k    }t          t          |                    }t          t          |
                    }t          |d          }t          |d          }d}|||j	        }|j	        }|j
                            |j        |j                  }|dk    r6|                    |           t          |d          }t          |d          }nA|r|dz  }t          |d          }n)|                                 |dz  }t          |d          }|||4|2|j	        }|                                 |dz  }t          |d          }|2|||dz  }t          |d          }||dk    r+t          |	          }|                    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   r1   r   merge_overlapsrS   )rangescurrent_treerootrW   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_foldingrv      s    N,2 N N({D&&QM1K({/KLLL!!=+|"LMMM#N33D\!GT!G\\CLL0Nw((Lw((Lt,,Mt,,MJ

#(A',',#99 /"68 8 4<<&&777 t44M t44MM 9a
 $\4 8 8  &&(((a
 $\4 8 8) 
#(A,  '+0O""$$$!OJ t44M '  '!OJ t44M ' A~~ &&	  '! 	! 	# 	# 	# :r   c                   	
 d | j         D             }t          i           }i }i }i }|g k    rT|                    d          \  }	}|j        \  
}||
<   	|
<   ||
<   ||
<   	
fd|j         D             |z   }|g k    T||||fS )Nc                     g | ]}|d dfS )r   r=   rB   s     r   r    z+collect_folding_regions.<locals>.<listcomp>   s    ///AaBZ///r   r   c                      g | ]
}|d z   fS )r   r=   )r   rC   folding_levelrP   s     r   r    z+collect_folding_regions.<locals>.<listcomp>   s%    FFF1!]Q&.FFFr   )r   r?   r*   r   )rd   queuefolding_statusfolding_regionsfolding_nestingfolding_levelsr$   folding_nestendr{   rP   s            @@r   collect_folding_regionsr      s    /////E"2&&NOON
2++,1IIaLL)m\_
s!$ -u!- $uFFFFFFFFN 2++ O^^KKr   )r<   r!   r
   intervaltreer   r   rD   r?   rS   rv   r   r=   r   r   <module>r      s    & %   & % % % % %
C> C> C> C> C> C> C> C>L" " " " "D " " "0  &A A AHL L L L Lr   