
    Je                        d Z ddlZddlZddlmZmZ ddlmZmZm	Z	 ddl
m
Z
 	 ddlmZ dZdd	lmZ dd
lmZ ddlmZmZmZ h dZe
j0                  e
j2                  hZd Zd Z G d d      Z G d de      Zy# e$ r dZY Ww xY w)zCode snippets editor extension.    N)QTextCursorQColor)QtQMutexQMutexLocker)diff_match_patch)indexTF)to_text_string)EditorExtension)build_snippet_astnodestokenize>   intname
whitespacec                     d| _         | S )zDInidicate that a modification function should not be called on undo.T)no_undo)fs    K/usr/lib/python3/dist-packages/spyder/plugins/editor/extensions/snippets.pyr   r   "   s    AIH    c                 B     t        j                          fd       }|S )z,Prevent concurrent access to snippets rtree.c                     | j                   j                  sy t        sy t        | j                        5  t        d      s| j                           | g|i |cd d d        S # 1 sw Y   y xY w)Nr   )editorcode_snippetsrtree_availabler   modification_lockhasattrupdate_undo_stack)selfargskwargsr   s      r   wrapperzlock.<locals>.wrapper*   sd    {{(($001 	,1i(&&(T+D+F+	, 	, 	,s   (A''A0)	functoolswraps)r   r"   s   ` r   lockr%   (   s%    __Q, , Nr   c                       e Zd ZdZddZd Zy)SnippetSearcherVisitorz3Traverse and extract information from snippets AST.c                 f    || _         || _        d| _        d| _        || _        i | _        i | _        y Nr   )linecolumnline_offsetcolumn_offsetnode_numbersnippet_mapposition_map)r   r*   r+   r.   s       r   __init__zSnippetSearcherVisitor.__init__:   s8    	&r   c                 V   t        |t        j                        rH|j                  }| j                  j                  |g       }|j                  |       || j                  |<   |j                  r;|j                  |f| j                  | j                  <   | xj                  dz  c_
        y y )N   )
isinstancer   TabstopSnippetNodenumberr/   getappendmark_for_positionpositionr0   r.   )r   nodesnippet_numbernumber_snippetss       r   visitzSnippetSearcherVisitor.visitC   s    dE445![[N"..22>2FO""4(/>D^,!!37==$2GDd../! "r   N)r   )__name__
__module____qualname____doc__r1   r>    r   r   r'   r'   7   s    ="r   r'   c                       e Zd ZdZd Zd Zd Zeed               Z	eed               Z
eed               Zd Zed	        Zd
 Zd Zd Zd Zd Zd Zed        Zd Zd Zd Zd ZddZd Zd Zd Zd Zy)SnippetsExtensionzECodeEditor extension on charge of autocompletion and snippet display.c                 b   t        j                  |        d| _        d| _        d| _        d| _        d | _        d | _        d | _        t               | _
        t               | _        t               | _        i | _        i | _        g | _        g | _        t"        rt        j$                         | _        y y )NFr   )r   r1   is_snippet_activeinserting_snippetactive_snippetr.   r	   aststarting_positionr   r   
event_lockupdate_locknode_positionsnippets_map
undo_stack
redo_stackr   Indexr   s    r   r1   zSnippetsExtension.__init__Q   s      &!&!& 
!%!' (!8DJ r   c                    |r| j                   j                  j                  | j                         | j                   j                  j                  | j
                         | j                   j                  j                  | j                         | j                   j                  j                  | j                         | j                   j                  j                  | j                         | j                   j                  j                  | j                         | j                   j                  j                  | j                         | j                   j                  j                  | j                          | j                   j"                  j                  | j$                         y	 | j                   j                  j'                  | j                         | j                   j                  j'                  | j
                         | j                   j                  j'                  | j                         | j                   j                  j'                  | j                         | j                   j                  j'                  | j                         | j                   j                  j'                  | j                         | j                   j                  j'                  | j                         | j                   j                  j'                  | j                          | j                   j"                  j'                  | j$                         y# t(        $ r Y yw xY w)z*Connect/disconnect sig_key_pressed signal.N)r   sig_key_pressedconnect_on_key_pressedsig_insert_completioninsert_snippetsig_cursor_position_changedcursor_changedsig_text_was_inserted_redraw_snippetssig_will_insert_text_process_textsig_will_paste_textsig_will_remove_selectionremove_selectionsig_undo_undosig_redo_redo
disconnect	TypeError)r   states     r   on_state_changedz"SnippetsExtension.on_state_changedd   sB   KK''//0D0DEKK--55d6I6IJKK33;;##%KK--55d6K6KLKK,,44T5G5GHKK++33D4F4FGKK1199%%'KK  ((4KK  ((4++66t7K7KL11<<'')77BB'')11<<))+00;;D<N<NO//::4;M;MN55@@))+$$//

;$$//

; s   -F'M 	M! M!c                     t        j                  | j                        }|| j                  | j                  f}| j
                  j                  d|       y r)   )copydeepcopyrK   rL   rJ   rQ   insert)r   ast_copyinfos      r   r   z#SnippetsExtension.update_undo_stack   s@    ==*$00$2E2EFq$'r   c                    t        | j                        dk(  r| j                          | j                  rMd}| j                  j
                  }|D ]-  }|j                  D ]  \  }}|t        v s|t        |      z  } / t        | j                        dkD  rt        |      D ]  }t        | j                        dk(  r n| j                  j                  d      }t        j                  | j                        }|| j                  | j                  f}	| j                  j!                  d|	       |\  | _        | _        | _         | j#                          | j                  j%                  d       | j'                          y y y Nr   r   )lenrQ   resetrH   r   patchdiffsVALID_UPDATESrangepoprm   rn   rK   rL   rJ   rR   ro   _update_astclear_extra_selectionsdraw_snippets)
r   num_popsrv   rw   opdata_rq   rp   	redo_infos
             r   re   zSnippetsExtension._undo   sS    t1$JJL!!HKK%%E ."'++ .JR]* CI-.. 4??#a'x 	1A4??+q0??..q1D#}}TXX6H!)4+A+A!%!4!4!6IOO**1i8,0*TXt5(	1   "22?C""$ ( "r   c                    | j                   rMd}| j                  j                  }|D ]-  }|j                  D ]  \  }}|t        v s|t        |      z  } / t        | j                        dkD  rt        |      D ]  }t        | j                        dk(  r n| j                  j                  d      }t        j                  | j                        }|| j                  | j                  f}	| j                  j                  d|	       |\  | _        | _        | _         | j!                          | j                  j#                  d       | j%                          y y y rs   )rH   r   rv   rw   rx   rt   rR   ry   rz   rm   rn   rK   rL   rJ   rQ   ro   r{   r|   r}   )
r   r~   rv   rw   r   r   r   rq   rp   	undo_infos
             r   rg   zSnippetsExtension._redo   s9    !!HKK%%E ."'++ .JR]* CI-.. 4??#a'x 	1A4??+q0??..q1D#}}TXX6H!)4+A+A!%!4!4!6IOO**1i8,0*TXt5(	1   "22?C""$ ( "r   c                 t    | j                   r,| j                  j                  d       | j                          y y )Nr   )rH   r   r|   r}   rT   s    r   r^   z"SnippetsExtension._redraw_snippets   s0     !!KK..?  "r   c                    |j                         ry t        | j                        5  |j                         }t	        |j                               }| j                  rT| j                  j                         \  }}| j                  ||      \  }}}|t        j                  k(  r\|j                          | j                  dz   t        | j                        z  }	| j!                  |	       |	dk(  r| j#                          n|t        j$                  k(  r!| j#                          |j                          n~t        |      dkD  rp|dv}
|| j                  j&                  v}|| j                  j(                  v}|
xr |xr |}|0||dk(  r| j#                          n|s|dk(  r| j+                  |       d d d        y # 1 sw Y   y xY w)Nr3   r   >   ()[]{}
)
isAcceptedr   rM   keyr
   textrH   r   get_cursor_line_column_find_node_by_positionr   Key_TabacceptrJ   rt   rP   select_snippetru   
Key_Escapeauto_completion_characterssignature_completion_charactersr`   )r   eventr   r   r*   r+   r;   snippet__next_snippet	not_bracenot_completionnot_signaturevalids                 r   rX   z!SnippetsExtension._on_key_pressed   s   $//*  	5))+C!%**,/D%%#{{AACf$($?$?&%"!gr"**$LLN%)%8%81%<$'(9(9$:%;L''5#q(

BMM)JJLLLNY] $,J JIDKK$J$JJ # DKK$O$OO " &J.J]E'"?ddl JJL"ddl ..t4A 	5  	5  	5s   FF;;Gc                    | j                   rv| j                  j                         \  }}|dk7  r| j                  |||       n(|dk(  r| j	                          n| j                  ||       | j                          g | _        y y )Nr   r   )rH   r   r   insert_textru   delete_textr{   rR   )r   r   r*   r+   s       r   r`   zSnippetsExtension._process_text   sr    !!;;==?LD&t|  tV4

  v. DO "r   c                 0   | j                   j                         }| j                   j                         \  }}|r| j                  ||       y | j	                  ||      \  }}}|j
                  }	t        |	      dk(  r|	d   \  }
}|
|f|
|ff}	|j
                  d   d   }|||fk(  r|j                  }|j                  }|j                  }t        |j                        }|d | t        |j                  j                        z   ||dz   d  z   }||_        t        |      dkD  r||dz
     }| j                  ||||       |}| j                  D ]3  }||kD  s	| j                  |   }|D ]  }|j                  }||_        |} 5 y | j                  ||||       y Nr3   r   )r   has_selected_textget_selection_start_end_remove_selectionr   r:   rt   r6   index_in_parentparentlisttokensplaceholder_delete_tokenrP   )r   r*   r+   r   startendr;   r   	text_noderO   xyfirst_text_positionr<   snippet_positiontext_parentparent_tokensdelete_tokennext_numbercurrent_numbersnippet_nodessnippet_nodes                         r   r   zSnippetsExtension.delete_text   s    KK99;[[88:
s""5#.#'#>#>tV#L gy}" #DAqVaV,M'003A64.0$^^N&66!..K !3!34M*+<,<=!'"5"5"<"<=>*+;a+?+@ABM "/K=!A%,-=-AB ""<dFK(K"&"3"3 5!N2$($5$5n$EM(5 5)5)<)<.9+&455 tYf=r   c                    |j                   }t        |j                        }|j                  }t	        |      dk(  r|dkD  r|dz   t	        |      k  r||dz
     }||dz      }	d}
|j
                  rvt        |t        j                        s| j                          y |j                  t        v r9|j                  |	j                  k(  r |j                  |	j                  z   |_        d}
|d | |||
z   d  z   }nR|j                  |       n?|\  }}|||fk(  r||dz
     }|j                  }|d d }d}d}t	        |      dk(  r*|dz
  dkD  r	||dz
     }nd}|j                  |dz
         d}n||_        |r|j
                  r|j                  t        v r|j                  |j                  k(  r|j                  |j                  z   |_        |j                  ||z
         nk|||fk(  r9|j                  }|d d }t	        |      dk(  r|j                  |       n3||_        n+|\  }}||z
  }|j                  }|d | ||dz   d  z   }||_        t	        |      dk(  rt        j                         g}||_        y )Nr3   r      rG   TF)r:   r   r   r   rt   r9   r4   r   LeafNoderu   r   MERGE_ALLOWEDvaluerz   )r   r;   r   r*   r+   rO   text_node_tokens
node_index	left_node
right_nodeoffset
node_startnode_endprevious_tokenprevious_valuemergediff
node_valuer   r   s                       r   r   zSnippetsExtension._delete_token#  s   	 0 01))
}"A~*q.37G3H"H,Z!^<	-j1n=
..%i@

 ~~6$>>Z__< )*2B2B B &O%&F$[j1$Z&%8%9:; !
 !$$Z0#0 JdF^+!1*q.!A!/!5!5!/!4~&!+!A~))9*q.)I %$((a8D+9N(--995#yyN,?,??$2$8$84::$E !/ 4 0 4 4Z$5F GdF^+!ZZ
'_
z?a'$((4!+DJ!1z!ZZ
'.D1HI1FF
'
 A% % 01+	r   c                 L	   | j                   j                         }| j                   j                         \  }}|r	 | j                  ||       |\  }}| j                  ||      \  }}}	|||	| j                          y t        |      }
|
D cg c],  }t        j                  |j                  |j                        . }}|D ]  }|j                  ||f        |j                  dk(  rt        j                  | }||_        y |j                   }t#        |      dk(  r|d   \  }}	 ||f||dz   ff}|\  }}|j&                  }t)        |	j*                        }||f|k(  rd}d}|d   }|d   }|dkD  rmt#        |      dkD  r_||dz
     }|j,                  rK|j                  t.        v r9|j                  |j                  k(  r d}|j                  |j                  z   |_        |j,                  rK|j                  t.        v r9|j                  |j                  k(  r d}|j                  |j                  z   |_        |d ||z
   |z   |||z   d  z   }||	_        y ||f|k(  rd}d}|d   }|d   }|dk\  rp|t#        |      dz
  k  r_||dz      }|j,                  rK|j                  t.        v r9|j                  |j                  k(  r d}|j                  |j                  z   |_        |j,                  rK|j                  t.        v r9|j                  |j                  k(  r d}|j                  |j                  z   |_        |d ||z
   |z   |||z   d  z   }||	_        y |\  }}||z
  }|j                  }|d | } ||dz   d  }!|d | }"||d  }#|d   }|d   }d}$|j,                  r7|j                  t.        v r%||j                  k(  rd}$|"|j                  z   |_        |$s/| j1                  t        j                  |j                  |"             d}%|j,                  r7|j                  t.        v r%||j                  k(  rd}%|j                  |#z   |_        |%s0|!j3                  dt        j                  |j                  |#             | |z   |!z   }||	_        y # t        $ r Y y w xY wc c}w # t$        $ r Y y w xY w)NEPSILONr3   r   rG   r   FT)r   r   r   r   	Exceptionr   ru   r   r   r   tokenr   compute_positionr   TextNoder   r:   rt   ri   r   r   r   r9   r   r8   ro   )&r   r   r*   r+   r   r   r   r;   r   r   r   ttoken_nodesr   new_text_noder:   r   r   
leaf_startleaf_endr   r   left_offsetright_offsetfirst_token
last_tokenprevious_node	next_noder   	start_posr   r   first_tokenssecond_tokens
first_partsecond_part
left_mergeright_merges&                                         r   r   zSnippetsExtension.insert_textf  s    KK99;[[88:
s&&uc2 !LD&#'#>#>tV#L gy<7?i.?JJL$AGHAu~~aggqww7HH  	3E""D&>2	3 99	!!NNK8M"/G==x=AA;DAqFQAJ/  (
H))
	 0 01&>Z'KL%a.K$RJA~#&6"7!"; 0a @00"''=8&++}/A/AA*+K - 3 3k6G6G G (- ++??m3!$))3'(&,,tzz9 #( !!:*{":; l!:!;<= ~ ,	u F^x'KL%a.K$RJQ:4D0E0I#I,Z!^<	//!-7%??inn<+,L * 0 09?? B ', ,,##}4"''4994&' JJ):):: $) !!:*{":; l!:!;<= J ,	? &LAyI%DJJE+KZ8L,Z!^_=MuJ,K%a.K$RJJ,,##}4"dii/%)
,69J9J,J)##ENN499j$IJK++??m3!TYY.&*+5+;+;k+I
($$Qtyy+(NO+k9MI+	k   I   s)   R 1R'R 	RR	R#"R#c                    g | _         |j                  }|j                  }t        |      dk(  r|d   \  }}	||	f||	dz   fg}|\  }
}|j                  }|j
                  }t        |j                        }|d | }||dz   d  }|
||fk(  rd}t        |      dk(  r}|j                  d   }d}t        |t        j                        r;t        |j
                  j                        t        |j                  dd        z   }g }nt        |j                        }g }|s&t        |t        j                        r|t        |j                        z  }n|j                  |       |j                         j                  |      s|j                  |       n|||fk(  r#|j                  |       |j                  |       n|
\  }}||z
  }|d | }||d  }t        j                  |j                   |      }t        j                  |j                   |      }|j                  |       |j                  |       |j                  |       ||z   }||_        y )Nr3   r   FT)rR   r   r:   rt   r   r   r   r   r4   r   SnippetASTNoder   r8   r   
startswithr   r   )r   leafr   new_noder*   r+   r   leaf_positionr   r   r   r   
leaf_indexr   text_tokensr   r   single_tokenpossible_snippetr   r   r   r   r   
first_nodesecond_nodes                             r   _insert_snippet_at_nodez)SnippetsExtension._insert_snippet_at_node  s2   

}" #DAqVaQZ0M,
H))
));--.";J/#JNO4$' L;1$#+??1#5 #.0D0DE -99@@AX__QR012 ! %'M#'#8L$&Mh7 D$99L ''1}}11%8 ''-$'%)%LAyI%DuJ,K		:>J..K@K
+),"]2(r   c                    |\  }}|\  }}t        | j                        }| j                  |   \  }}	i }
|D ]  }|\  \  }	}\  }}||f|
|<    g }||fg}t        ||dz         D ]k  }|
|   \  }}t        |      dk(  r||fg}||k  r|j	                  ||f       n"||k(  r|j	                  |t        ||      f       |j	                  |       g }m |S r   )minrO   ry   rt   r8   )r   r   r   
start_linestart_columnend_line
end_columnroot_colroot_positionr   line_limitssegmentr*   polygon	seg_startseg_ends                   r   _region_to_polygonz$SnippetsExtension._region_to_polygon  s   #( 
L"*t))*--h7q$ 	-G&-#JQs!&K	- -.*hl3 		D!,T!2Iw7|q  ),-hg/!c':&>?@NN7#G		 r   c                    ||}}d }|||j                   |j                   kD  r*|(|j                  }|j                   |j                   kD  r|(|	 |S |j                   |j                   kD  r*|(|j                  }|j                   |j                   kD  r|(|	 |S t        |      t        |      k(  rt        |t        j
                        r|}	 |S |j                  }|j                  }|||S N)depthr   idr4   r   r   )r   
start_nodeend_noder   r   ancestors         r   _find_lowest_common_ancestorz.SnippetsExtension._find_lowest_common_ancestor4  s    *H:	#
(>//J$4$449N%,,	 //J$4$449N     ##ioo5*'..
 ##ioo5* !  )}:.i)=)=>(H  "((I#**J) #
(>* r   c                 (    | j                  ||       y r  )r   )r   selection_startselection_ends      r   rc   z"SnippetsExtension.remove_selectionN  s    >r   c                     | j                   | \  }}} | j                   | \  }}}| j                  ||      }|| j                          y | j                  ||      }|D ]h  }|\  \  }}	\  }}
t	        |t                     }t        | j                  j                  |            }|	}|D ]  }| j                  |   \  }}|j                  r#||
k\  r u|j                  }t        |t        j                        rt        |      dk(  s`|d   }|d   \  }}||k(  rG|j                   j#                          t        j$                  t        j&                               |_        ||k(  s||
k  s|j#                          |j(                  }t        |j*                        }|j-                  |j.                         ||_        |j0                  }d}| j2                  D ]&  }||kD  s	| j2                  |   }||z
  |_        |dz  }( ]t        |t        j$                        rt        |      dk(  s|d   d   \  }}||k(  s||
k  s|j#                          |}|j(                  |j(                  }t        |t        j$                        st        |j(                  j*                        }|j-                  |j.                         ||_        +t        |t        j&                        sGt        |      dk(  r|d   \  }}||f||dz   ff}|\  \  }}\  }}||k(  rn||
k  rG|j(                  }t        |j*                        }|j-                  |j.                         ||_        |}|
|z
  }|j4                  }||d  |_        ||z   }||k  s||z
  }|
|z
  }|j4                  }|d | ||d  z   |_        |||z
  z   } k | j7                          y r   )r   r	  ru   r  sumtupler   r	   intersectionrO   	to_deleter:   r4   r   r   rt   r   deleter   r   r   r   rz   r   r6   rP   r   r{   )r   r  r  r  r   r  r  polyr   r   r   bboxnodes_spannedcurrent_positionnode_idr;   rO   r   r   node_parentr   r<   r   numr   	leaf_lineleaf_colr   
start_diffend_diffs                                 r   r   z#SnippetsExtension._remove_selectionR  s   6466H
Aq444mD!Q44ZJJJL&&F I	HG18.Q:w(D !8!8!>?M+( DH,,W54>>#z1 $dE$8$89=)Q.(5a(8/<Q/?,
H(G3 ,,335/4~~enn>N/OD,'+;;':5 $.2kk04$/$6$618 - 1 1$2F2F G5B 215'(+/+<+< !2C'*^';262C2CC2H9G$9N(,		!2
  enn5=)Q.1>q1A!1D.X%)99':5 $3; 0#';;#:26++K'1+u~~'N8<,0KK,>,>9@(5(9(9$:N:N(O=J(:enn5=)Q..;A.>+	8&1Ix!|3L)N5B2OQ
]a':5#z1*.++K,01C1C,DM)--d.B.BC1>K./7,#-#8D)-J)3DE):DJ/9D/@,#&66%5
%B
#-#8%)ZZ
&0*&=&0&;'<
 -:0EF )GDHI	HT 	r   c                    |j                   | _         | j                  j                  |j                         |j                  D ]  }|j                  |   \  }}t	        |t
              r6|D ]0  }t        d |D              }| j                  j                  ||       2 [t	        |t              slt        |      dk(  r|dz  }t        d |D              }| j                  j                  ||        y )Nc              3   .   K   | ]  }|D ]  }|   y wr  rC   .0poscoors      r   	<genexpr>z9SnippetsExtension.update_position_tree.<locals>.<genexpr>  s     #LS#LD#LD#L   r3   r   c              3   .   K   | ]  }|D ]  }|   y wr  rC   r   s      r   r$  z9SnippetsExtension.update_position_tree.<locals>.<genexpr>  s      J#c Jd J Jr%  )
r.   rO   updater0   r4   r   r  r	   ro   rt   )r   visitorrO   r:   r   r   s         r   update_position_treez&SnippetsExtension.update_position_tree  s    "..!!'"6"67$11 
	;M!..}=KHa(D)' >G##LG#LLGJJ%%mW=> He,x=A%'!|H  J JJ

!!-:
	;r   c                 6   ||fdz  }t        | j                  j                  |            }d\  }}}t        |      dkD  r|D ]  }| j                  |   d   }t        |t        j                        r|}2t        |t        j                        r	|dk7  sR|}Ut        |t        j                        sp|j                  dk(  s n |Jt        |      }	t        |j                  D 
cg c]  }
t        |
       c}
      }|	|vr|j                  d   }|||fS c c}
w )Nr   )NNNr   rG   r   )r   r	   r  rt   rO   r4   r   r   r   r   r   r  setr   )r   r*   colpointnode_numberscurrent_nodenearest_textnearest_snippetr.   r  r   text_idss               r   r   z(SnippetsExtension._find_node_by_position  s   saDJJ33E:;6F3lO|q + 	#11+>rBlE,@,@A&2Oenn="a''3enn=#((I5	 #&G<3F3FG%BuIGHHh&+2226_l:: Hs   %Dc                    t         sy | j                  rd| _        y | j                  ||      \  }}}|B| j                  j                  xs | j                  j
                  }|s| j                          y y ||j                  | _        y y )NF)	r   rI   r   r   
is_undoing
is_redoingru   r6   rJ   )r   r*   r,  r;   r1  r   ignores          r   r\   z SnippetsExtension.cursor_changed  s    !!%*D"#'#>#>tS#I oq<[[++Et{{/E/EF

  *&5&<&<# +r   c                    d| _         d | _        i | _        i | _        |s*d | _        g | _        g | _        d| _        d| _        d | _	        t        rt        j                         | _        | j                  j                  d       y )Nr   FrG   r   )r.   r	   rO   rP   rK   rQ   rR   rH   rJ   rL   r   rS   r   r|   )r   partial_resets     r   ru   zSnippetsExtension.reset  ss    
DH DO DO%*D""$D%)D"DJ**?;r   c           	      F   | j                   j                         }| j                  D ]  }| j                  |   }|D ]  }t        | j                   j	                               }|j
                  }t        |j
                  t              rt        |j
                        g}|D ]w  }|d   \  }}	|d   \  }
}|d   |d   k(  r|dz  }|j                  |      }|j                  |j                                |j                  t        j                         |j                  t        j                  |	       |j                  |
      }|j                  |j                         t        j                         |j                  t        j                  t        j                         |j                  t        j                  |t        j                         t        | j                   j                         }| j                   j#                  dt        |      |       z   y )	Nr   rG   r3   nmoder;  r=  r   )outline_color)r   documentrP   r   
textCursorr:   r4   r  r   findBlockByNumbersetPositionmovePositionStartOfBlockNextCharacter
KeepAnchorr   comment_colorhighlight_selection)r   r@  r<   r   r;   cursorr:   pathr   r   r   r   start_block	end_blockcolors                  r   r}   zSnippetsExtension.draw_snippets  s   ;;'')"// 	IN --n=M% I$T[[%;%;%=>==dmmU3 $T]] 34H$ ID/3Aw,J+/8(HjAw$r(*"a
"*"<"<Z"HK&&{';';'=>''(@(@A''#11\ ( C ( : :8 DI&&!**,k.D.DF''#00{7M7M ( O''#11Z(33 ( 5 #4;;#<#<=EKK33O4?4GBG 4 I)II	Ir   c                 t   | j                   j                         }| j                   j                         }|| j                  vr3d}|| j                  vr#t	        | j                  j                               }| j                  |   d   }|| _        |j                  }t        |t              rt        |      g}|d   d   \  }}|d   d   \  }}	|d   d   |d   d   k(  r|j                         dk7  r|	dz  }	|j                  |      }
|j                  |
j                                |j                  t        j                          |j                  t        j"                  |       |j                  |      }|j                  |j                         t        j$                         |j                  t        j                   t        j$                         |j                  t        j"                  |	t        j$                         | j                   j'                  |       | j                   j)                          y )Nr   rG    r3   r:  r<  r>  )r   rA  r@  rP   maxkeysrJ   r:   r4   r  r   r   rB  rC  rD  r   rE  rF  rG  setTextCursorrequest_signature)r   r<   rJ  r@  r;   rO   r   r   r   r   rL  rM  s               r   r   z SnippetsExtension.select_snippet  s   '');;'')!2!22NT%6%66!$T%6%6%;%;%=!>  03,mU+!-01M#0#3A#6 
L,R04*A-"3B"77yy{b a
00<;//12K445%% 	 	7..x8	 +"8"8	:$$;+A+A 	 	C%%'' 	 	) 	!!&)%%'r   c                    | j                   | j                  d       d| _        | j                  j	                  | j                          | j                   \  }}t        ||| j                        }| j                  j                  |       |j                  | _	        | j                  |       | j                  j                  d       | j                          y y )NT)r8  r   )rL   ru   rH   rK   r   r'   r.   r   r/   rP   r)  r   r|   r}   )r   r   r   r(  s       r   r{   zSnippetsExtension._update_ast2  s    !!-JJTJ*%)D"HH%%d&<&<='+'='=$J,L$*:*:<GHHOOG$ ' 3 3D%%g.KK..?  .r   c                    | j                   j                         \  }}t        ||| j                        }t	        |      }|j                  ||f       |j                  |       d| _        | j                   j                  |j                         d       | j                   j                  sy t        sy d}| j                  r(t        | j                        5  | j                  ||      \  }}}	|d}|j                   }
|
dz   }|j"                  }|D ]  }||   }|D ]	  }||_         |dz  } | j$                  D ]*  }||
kD  s	| j$                  |   }|D ]	  }||_         |dz  }, | j'                          | j)                  |||||       | j+                          t-        |      dkD  r| j/                  |
dz          | j1                          n|| j3                          d d d        |r| j3                          || _        |j"                  | _        t-        | j$                        dkD  rDd| _        ||f| _        | j9                  |       | j1                          | j/                  d       y | j3                          y y # 1 sw Y   xY w)NTF)will_insert_textr3   r   )r<   )r   r   r'   r.   r   r   r   rI   r   r   r   r   rH   r   r   r   r6   r/   rP   r   r   r{   rt   r   r}   ru   rK   rL   r)  )r   r   r*   r+   r(  rK   new_snippetr   snippet_rootr   root_numberr   r/   r<   r   r   s                   r   rZ   z SnippetsExtension.insert_snippet@  s   {{99;f(vt7G7GH%dF^,

7!%
UC{{((!!d445 !(,(C(C&)"%lA+"'K"."5"5K"-/K")"5"5K*5 )(3N(C,9 >L2=L/>#q(	)
 +/*;*; -)K7,0,=,=n,MM0= B6A 3B'1,K- **,00lCv?$$&;'!+++;?+K&&(%JJL9!< JJLDH ' 3 3D4$$%))-&*.&))'2""$##1#5 

 =! !s   A+JBJJN)F)r?   r@   rA   rB   r1   rk   r   r%   r   re   rg   r^   rX   r`   r   r   r   r   r  r	  rc   r   r)  r   r\   ru   r}   r   r{   rZ   rC   r   r   rE   rE   N   s    O'&@(
 
%  
%2 
%  
%. 
!  
!
$5L 
! 
!)>VA,F~,@4)l04 
? 
?Rh;;0="< IB!(F!=r   rE   )rB   rm   r#   
qtpy.QtGuir   r   qtpy.QtCorer   r   r   r   rtreer	   r   r   spyder.py3compatr
   spyder.api.editorextensionr   spyder.utils.snippets.astr   r   r   r   DIFF_DELETEDIFF_INSERTrx   r   r%   r'   rE   rC   r   r   <module>rc     s    &   + 0 0 -O
 , 6 H H .!--/?/K/KL" ".o os  Os   A: :BB