
    Je}                         d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ d	 Zd
 Zd Zd Zd Zd Z G d de      Z G d de      Z G d de	      Zy)zGenerate Docstring.    N)OrderedDict)QTextCursor)Qt)QMenu)CONF)to_text_stringc                     t        | t              r.ddg}| j                         } |D ]  }| j                  |      s y y)z@Return True if text is the beginning of the function definition.defz	async defTF)
isinstancestrlstrip
startswith)textfunction_prefixprefixs      L/usr/lib/python3/dist-packages/spyder/plugins/editor/extensions/docstring.pyis_start_of_functionr      sD    $ +.{{}% 	Fv&	     c                 \    d}t        j                  d|       }|r|j                  d      }|S )z|Get indent of text.

    https://stackoverflow.com/questions/2268532/grab-a-lines-whitespace-
    indention-with-python
     z(\s*)   )rematchgroup)r   indentrets      r   
get_indentr   $   s.     F
((8T
"C
1Mr   c                    | j                  dd      j                  dd      } g d}dgdz  }t        t        |            D ]!  }||   | v s| j                  ||         ||<   # t	        |      dk(  rm| j                  d      | j                  d      k7  xsH | j                  d	      | j                  d
      k7  xs# | j                  d      | j                  d      k7  S ||j                  t	        |               }||j                  t	        |               }t        |      }|| ||z   d v r4| d| | ||z   d | ||z   d j                  |      |z   d z   } t        |       S |dk(  rr| d| } | j                  d      | j                  d      k7  xsH | j                  d	      | j                  d
      k7  xs# | j                  d      | j                  d      k7  S y)=Check if the next empty line could be part of the definition.\"r   \''''"""'"@B    )(][}{N   F)replacerangelenindexmincountis_in_scope_forwardr   scopesindicesisplss          r   r6   r6   3   s   <<r"**5"5D%FgkG3v; /!9F1I.GAJ/ 7|u

34::c?2 3

34::c?23

34::c?2	4 	w}}S\*+Ac'l+,A	QBDRMBQx$q2vw-QVW(;(;A(>(C(DEE"4((	qBQx

34::c?2 3

34::c?23

34::c?2	4 r   c                    g d}g d}dgdz  }t        t        |            D ]!  }||   | v s| j                  ||         ||<   # t        |      dk(  rd| v S ||j                  t        |               }||j                  t        |               }|| |dz   d v r4| d| | |dz   d | |dz   d j                  |      dz   d z   } t	        |       S y)	z$Check if the return type is a tuple.r*   r,   r.   )r)   r+   r-   r'   r(   ,r   NF)r1   r2   r3   r4   is_tuple_brackets)r   r8   complementsr9   r:   r;   r<   s          r   rA   rA   N   s    F!KgkG3v; /!9F1I.GAJ/ 7|ud{GMM#g,/0Ac'l+,ADQLBQx$q1uv,tAEF|'9'9!'<q'@'ABB &&r   c                    | j                  dd      j                  dd      } g d}dgdz  }t        t        |            D ]!  }||   | v s| j                  ||         ||<   # t	        |      dk(  rt        |       S ||j                  t	        |               }||j                  t	        |               }t        |      }|| ||z   d v r4| d| | ||z   d | ||z   d j                  |      |z   d z   } t        |       S y)	z%Check if the return type is a string.r    r   r!   r"   r'   r(   NF)r0   r1   r2   r3   r4   rA   is_tuple_stringsr7   s          r   rD   rD   a   s   <<r"**5"5D%FgkG3v; /!9F1I.GAJ/ 7|u &&w}}S\*+Ac'l+,A	QBDRMBQx$q2vw-QVW(;(;A(>(C(DEE%%r   c                 d    t        | j                  dd      j                  dd      ddd         S )r   r    r   r!   N)r6   r0   )r   s    r   is_in_scope_backwardrG   u   s3    UB''r24R48: :r   c                       e Zd ZdZd Zed        Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zed        Zed        Zd Zy)DocstringWriterExtensionz2Class for insert docstring template automatically.c                 <    || _         d| _        d| _        d| _        y)z/Initialize and Add code_editor to the variable.r$   r#   N)code_editorquote3quote3_otherline_number_cursor)selfrK   s     r   __init__z!DocstringWriterExtension.__init__~   s!    &!"&r   c                 2    g d}| j                         |v ryy)z4Return True if there are only triple quotes in text.)r$   zr"""r#   zr'''TF)r   )r   docstring_triggerss     r   is_beginning_triple_quotesz3DocstringWriterExtension.is_beginning_triple_quotes   s     <;;=..r   c                 V   dj                  |j                               }|j                  d      s&|j                  d      s|j                  d      rd|v ry|j                  d      r@|dkD  r:|}| j                  j	                         }t        |j                  |dz
              }t        |dz
  d	d	      D ]  }dj                  t        |j                         j                               j                               }|j                  d
      st        |      r|j                  d
      r|dd	 }||z   }n n'|dk7  s|j                  t
        j                          t        |      r=|j                  d      xs* |j                  d      xs |j                  d      xr d|v S yy)z:Return True if text is the end of the function definition.r   ):z]::z->Tr      rF   \Nr   F)joinsplitendswithrK   documentr   findBlockByNumberr1   r   blockr   rG   movePositionPreviousBlockr   )	rO   r   line_numbertext_without_whitespacecomplete_textr\   cursorr:   txts	            r   is_end_of_function_definitionz6DocstringWriterExtension.is_end_of_function_definition   s   "$''$**,"7#,,T2#,,T2$--c2,,$--c2{Q3M''002H **;?;=F;?B3 	Cggc&,,."5"5"78>>@A<<%)=m)L||D)!#2h$'-$7M6''(A(AB	C $M2!**40 ,!**40,"++C0 +]*	 r   c                 D   | j                   j                         }t        |j                  | j                  dz
              }d}d}d}|j                         dz   }| j                   j                         }||z
  dz   }d}	t        t        |d            D ]	  }
t        |j                         j                               j                         }|rt        |      s yt        |      }d}nRt        |      }||k  r|j                         dk7  r yt        |      r y|j                         dk(  rt!        |      s yt#        |      dkD  r|d   d	k(  r|dd }||z  }|	dz  }	| j%                  |||	z   dz
        r||	fc S |j'                  t        j(                          y)
z>Get func def when the cursor is located on the first def line.r   r   Tr      NFrF   rX   )rK   r\   r   r]   rN   blockNumber
blockCountr1   r4   r   r^   r   rstripr   r   stripr6   r2   rf   r_   	NextBlock)rO   r\   rd   	func_textfunc_indentis_first_linera   number_of_linesremain_linesnumber_of_lines_of_function__cur_text
cur_indents                r   'get_function_definition_from_first_linez@DocstringWriterExtension.get_function_definition_from_first_line   s   ##,,.&&t'>'>'BCE 	((*Q.**557&4q8&'#L"-. 	7B%flln&9&9&;<CCEH+H5(2 %'1
,1AR1G'1NN$*/	:8}q Xb\T%9#CR=!I'1,'11k,GG!KM "=== 5 56;	7> r   c                 d   | j                   j                         }d}d}|j                         dz   }d}t        t	        |d            D ]  }|j                         j                         dk(  r y|j                  t        j                         t        |j                         j                               j                         }|r| j                  ||dz
        s yd}n| j                  |||z
  dz
        r yt        |      dkD  r|d   d	k(  r|dd }||z   }|dz  }t        |      s||fc S  y)
z@Get func def when the cursor is located below the last def line.r   Tr   r   rh   NFrF   rX   )rK   
textCursorri   r1   r4   r^   r_   r   r`   r   r   rk   rf   r2   r   )rO   rd   rn   rp   ra   rs   rt   	prev_texts           r   ,get_function_definition_from_below_last_linezEDocstringWriterExtension.get_function_definition_from_below_last_line   s8   !!,,.	((*Q.&'#K,- 	>B||~))+q0 9 9:&v||~':':'<=DDFI99!;?4 %33{-HH1LN9~!imt&;%crN	!I-I'1,'#I. "===/	>2 r   c                     | j                   j                         }|j                         dz   }| j                   j                         }g }t	        ||z
  dz         D ]  }t        |j                         j                               }t        |      }|j                         dk(  rnt        |      t        |      k  r n2|j                  |       |j                  t        j                          dj                  |      S )zGet the function body text.r   r   
)rK   ry   ri   rj   r1   r   r^   r   r   rl   r2   appendr_   r   rm   rY   )	rO   ro   rd   ra   rq   	body_listrt   r   text_indents	            r   get_function_bodyz*DocstringWriterExtension.get_function_body  s    !!,,.((*Q.**557	+59: 	7B!&,,."5"5"78D$T*Kzz|r![!S%55T" 5 56	7 yy##r   c                    | j                   j                  dd      }| j                  |      r'| j                   j                         }|j	                         }|d   }t        j                  dd      }| j                  ||      }|r| j                   j                  |       | j                   j                         }|j                  |t        j                         |j                  t        j                         |j                  t        j                  t        j                         |j                          | j                   j!                  |       yy)zWrite docstring to editor.solrd   rF   editordocstring_typeTF)rK   get_textrS   ry   positionr   get_generate_docstringinsert_textsetPositionr   
KeepAnchorr_   rm   	EndOfLineclearSelectionsetTextCursor)rO   line_to_cursorrd   prev_posquoter   	docstrings          r   write_docstringz(DocstringWriterExtension.write_docstring  s   ))225(C**>:%%002F(H"2&E!XXh0@AN00GI  ,,Y7))446""8[-C-CD##K$9$9:##K$9$9$/$:$:<%%'  ..v6r   c                    | j                         }| j                  }|r2|\  }}| j                  |z   dz
  }|j                         }|j	                         dz   }||z
  }|dkD  r0t        |      D ]!  }	|j                  t        j                         # n8t        t        |            D ]!  }	|j                  t        j                         # |j                  t        j                  t        j                         |j                  |       t        |      }
|j                  dj!                  |
|j"                               | j%                          yy)z,Write docstring to editor at mouse position.r   r   z
{}{}"""N)rw   rK   rN   ry   ri   r1   r_   r   rm   absr`   r   
MoveAnchorr   r   r   formatindent_charsr   )rO   resultr   rn   number_of_line_funcline_number_functionrd   rN   offsetrt   r   s              r   )write_docstring_at_first_line_of_functionzBDocstringWriterExtension.write_docstring_at_first_line_of_function6  s8   ==?!!-3*I*$($;$;$7%8:;%<  &&(F!'!3!3!5!9),>>Fz- ?B''(=(=>?  F, CB''(A(ABC 5 5{7M7MN  (	*F{11&&:M:MNO  "' r   c                 ~   | j                         }|i|\  }}| j                  j                         }t        |      D ]!  }|j	                  t
        j                         # | j                  j                  |       | j                  j                         }|j                         dz   | _	        | j                          y)z5Write docstring to editor by shortcut of code editor.Nr   )r{   rK   ry   r1   r_   r   r`   r   ri   rN   r   )rO   r   rt   rs   rd   s        r   write_docstring_for_shortcutz5DocstringWriterExtension.write_docstring_for_shortcutO  s     BBD.4+B+%%002F78 ?##K$=$=>? **62!!,,."("4"4"6":668r   c                    d}|dz  | _         |dk(  rd| _        nd| _        | j                         }|r|\  }}t               }|j	                  |       |j
                  rt| j                  |j                        }|r|j                  |       |dk(  r| j                  |      }|S |dk(  r| j                  |      }|S |dk(  r| j                  |      }|S )	zGenerate docstring.Nr/   r&   r#   r$   Numpydoc	Googledoc	Sphinxdoc)rL   rM   r{   FunctionInfo	parse_defhas_infor   ro   
parse_body_generate_numpy_doc_generate_google_doc_generate_sphinx_doc)	rO   doc_typer   r   r   func_defrt   	func_info	func_bodys	            r   r   z,DocstringWriterExtension._generate_docstring`  s    	aiC< %D %DBBD!LHb$I)!! 2293H3HI	((3z) $ 8 8 CI  , $ 9 9) DI  , $ 9 9) DIr   c                     d}|j                   }|j                  }|j                  }t        |      dkD  r|d   dv r	|d= |d= |d= |j                  | j
                  j                  z   }|j                  | j
                  j                  dz  z   }|dj                  |      z  }t        |      dkD  r(|dj                  |      z  }|dj                  |      z  }d}t        |||      D ]  \  }	}
}|dj                  ||	      z  }|
r|d	j                  |
      z  }n|d
z  }|r|dz  }|dj                  |      z  }|r:|j                  | j                  | j                        }|dj                  |      z  }|dz  } ||z  }|j                  rg|dj                  |      z  }|dj                  |      z  }|j                  D ]+  }|dj                  ||      z  }|dj                  |      z  }- |dz  }|dz  }|j                  rdj                  |      }ndj                  |      }|j                  }|r(dj                  |||      }|dj                  |      z  }nT|dz   |z   dz   }|j                  d
      }|dz   |j                         z   }	 | j!                  |j"                  |||||      }||z  }|dj                  || j                        z  }|S # t$        t&        f$ r dj                  ||      }Y Iw xY w)z#Generate a docstring of numpy type.r   r   rO   clsrW   
{}
z
{}Parametersz
{}----------
z{}{} : {}TYPE
, optionalz
{}DESCRIPTION.z The default is {}.r}   z	
{}Raisesz	
{}------
{}{}z{0}Yields
{0}------
z{0}Returns
{0}-------
z{}{}{}z{return_type}
zDESCRIPTION.return_typez{return_name} : 	{}{}None.

{}{})arg_name_listarg_type_listarg_value_listr2   ro   rK   r   r   zipr0   rL   rM   
raise_list	has_yieldreturn_type_annotatedr   "_generate_docstring_return_sectionreturn_value_in_body
ValueError
IndexError)rO   r   	numpy_doc	arg_names	arg_types
arg_valuesindent1indent2arg_textarg_namearg_type	arg_value
raise_typeheaderr   return_sectionreturn_element_typeplaceholderreturn_element_names                      r   r   z,DocstringWriterExtension._generate_numpy_doc  sc   	++	++	--
y>A)A,/"A!!1''$*:*:*G*GG''$*:*:*G*G!*KKX__W--	y>A)0099I+227;;I-0I1;.= 	)Hh		(((;;HDKK11F"L(*11'::H%--dkk4;L;LM	188CCH#	& 	X	,,W55I,,W55I'22 @
X__WjAA	/66w??	@ IT	-44W=F/66w?F ) ? ? %__VW-BDN077@@N"),="="G#-444HK"),>">""$#%E!%!H!H22F')<k" 	^#	Z&&w<<	 
+ E!,!3!3FG!DEs    K !K=<K=c                 :   d}|j                   }|j                  }|j                  }t        |      dkD  r|d   dv r	|d= |d= |d= |j                  | j
                  j                  z   }|j                  | j
                  j                  dz  z   }|dj                  |      z  }t        |      dkD  r|dj                  |      z  }d}t        |||      D ]  \  }	}
}|dj                  ||	      z  }|dz  }|
r|d	j                  |
      z  }n|d
z  }|r|dz  }|dz  }|dz  }|r;|j                  | j                  | j                        }|dj                  |      z  }|dz  } ||z  }|j                  rD|dj                  |      z  }|j                  D ]  }|dj                  ||      z  }|dz  } |dz  }|dz  }|j                  rdj                  |      }ndj                  |      }|j                  }|rdj                  |||      }n@|dz   }|j                  d
      }|dz   dz   }	 | j                  |j                   |||||      }||z  }|dj                  || j                        z  }|S # t"        t$        f$ r dj                  ||      }Y Iw xY w)z$Generate a docstring of google type.r   r   r   rW   r   z

{0}Args:
z{}{} r*   r   r   r   rU   z DESCRIPTION.z Defaults to {}.
r}   z
{0}Raises:r   z: DESCRIPTION.z
{}Yields:
z{}Returns:
z{}{}{}: DESCRIPTION.z{return_type}: DESCRIPTION.r   z{return_name} z(TYPE): DESCRIPTION.r   r   )r   r   r   r2   ro   rK   r   r   r   r0   rL   rM   r   r   r   r   r   r   r   )rO   r   
google_docr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                      r   r   z-DocstringWriterExtension._generate_google_doc  s   
++	++	--
y>A)A,/"A!!1''$*:*:*G*GG''$*:*:*G*G!*KKhoog..
y>A.//88J-0I1;.= 	!)Hh	w99HOHDKK11F"L(H'H%--dkk4;L;LM	077	BBD )	!, 	h
.//88J'22 /
hoogzBB
..
/ $Jd
"))'2F#**73F ) ? ? 3::!68N #*,I"I-444HK"),<"<&#'E!%!H!H22F')<k" 	n$
j''==
 
+ E!,!3!3FG!DEs   0 I6 6!JJc                    d}|j                   }|j                  }|j                  }t        |      dkD  r|d   dv r	|d= |d= |d= |j                  | j
                  j                  z   }|dj                  |      z  }d}t        |||      D ]  \  }}	}
|dj                  ||      z  }|
r;|
j                  | j                  | j                        }
|dj                  |
      z  }n|dz  }|dj                  ||      z  }|	r|d	j                  |	      z  }n|d
z  }|
r|dz  }|dz  } ||z  }|j                  r&|j                  D ]  }|dj                  ||      z  } |j                  rdj                  |      }ndj                  |      }|j                  }|r'dj                  |      }|dj                  ||      z  }n%dj                  |      }|dj                  |      z  }||z  }|dj                  || j                        z  }|S )z$Generate a docstring of sphinx type.r   r   r   r   z{}:param {}: DESCRIPTIONz, defaults to {}
r}   z{}:type {}: r   r   r   z{}:raises {}: DESCRIPTION
z	{}:yield:z
{}:return:z{} DESCRIPTION
z{}:rtype: {}z{}:rtype: TYPEr   )r   r   r   r2   ro   rK   r   r   r   r0   rL   rM   r   r   r   )rO   r   
sphinx_docr   r   r   r   r   r   r   r   r   r   r   r   s                  r   r   z-DocstringWriterExtension._generate_sphinx_doc$  sU   
++	++	--
y>A)A,/"A!!1''$*:*:*G*GGhoog..
-0I1;.= 	)Hh	299'8LLH%--dkk4;L;LM	077	BBD --gx@@HDKK11F"L(H'	* 	h
'22 O
;BB7CMO O
O  ''0F!((1F ) ? ? /66v>Nn33G4IK KN 066v>N.55g>>Nn$
j''==
r   c                    g }g }d}d}dddd}t        |       D ]  \  }}|s||j                         v s||k(  r|j                  |       |}3|r^|||   k(  rV|j                         }|rP|s"|dk(  rd}n|d	k(  rd
}n|dk(  r||z
  dk  rd}nd}|j                  | ||dz    |df       d}d}t	        |      dk(  s|dk(  r|dk(  rd}|dk(  r|dk(  rd}|dk(  s|dk(  sd} |rt        d      |D ]  }	 | j                  |	 }  | S )z4Get the locations of top-level brackets in a string.Nr   r)   r+   r-   r?   r*   z(None)r,   [list]r.   r   {dict}{set}r@   (tuple)rV   z[slice]zBracket mismatch)	enumeratekeysr~   popr2   r   r0   )
string_toparsebracket_stackreplace_args_listbracket_typeliteral_typebracketsidx	character	begin_idxreplace_argss
             r    find_top_level_bracket_locationsz9DocstringWriterExtension.find_top_level_bracket_locationse  sx    3S1'7 	-NC!i8==?&B L0$$S)()x/E"E)--/	$''3.+3L)S0+3L)S0"Y!3/7/6%,,'	#':%q*+ $(L#%L]#q(3&9+;#,L!S(Y#-=#+L!S(Y#-=#,L;	-> /00- 	CL3^33\BN	Cr   c                    | j                  | d         t        |       k(  }t        h dj                  |       g      r|r|j	                  | d   dd       S h d}t        | D cg c]  }t        |D cg c]  }||v  c}       c}}      r|S t        | D cg c]  }d|v xs d|v  c}      r|j	                  d	      S d
dhj                  |       r|j	                  d      S 	 | D cg c]  }t        |       c} d}| D ]  }	 t        |        |dk(  r|j	                  d      S |t        |       k(  r|j	                  d      S |j	                  d      S c c}w c c}}w c c}w c c}w # t        $ r |dz   }Y w xY w# t        $ r Y nw xY wh dj                  |       r8|r6t        | D cg c]  }d|v nc c}w c}      r|j	                  | d         S |S )z;Return the appropriate text for a group of return elements.r   >   r   r   r   r   r   rF   r   >   * #%&r*   r)   +r@   -/rV   ;<=>@r,   r+   ^r.   |r-   ~r&   r%   r   TrueFalseboolintfloatnumeric>   r   NonerO   .)return_name)
r5   r2   all
issupersetr   anyr  r  r   
isdisjoint)	return_vals_groupr   r   r   all_eqpy_chars
return_valpy_charnum_not_ints	            r   parse_return_elementsz.DocstringWriterExtension.parse_return_elements  sH    $))*;A*>?*+,8CC!# $ %)/&---a026 . 8 8 "35 (CwW
*CD 5 6"35 z!7TZ%77 5 6&--%-@@G''(9:&--&-AA	1BC:U:CK/ 2
2
O2
 a*11e1DD$5 66*11g1FF*11i1HH1 D 55 D
 " 2"-/K2  		 $../@Af+<>' J. > > ?&--:KA:N-OOsx   &E'
4E"?	E'
E-+F /E2
F E7F 0F F "E'
2F 7FF FF 	FF8Gc                 P   |D cg c]  }|r|dk7  r| }}|s||z   dz   S |D cg c]"  }|j                  d      j                  d      $ }}|D cg c]  }t        j                  dd|       }}g }	|D ]%  }	 | j	                  |      }
|	j                  |
       ' |	s||z   S g g }}|	D ](  }d|v r|j                  |      n|j                  |       * |r|r||z   S |rL|D cg c]  }|j                  d      dz    }}|j                  |d         t        |      k7  r||z   S |d   }nd}t        |	      t        |      k7  r+|d	j                  t        |      D cg c]  }| c}      z   S t        |	D cg c]/  }|j                  d      D cg c]  }|j                          c}1 c}} }g }|D ]%  }|j                  | j                  ||||             ' |d	j                  |      z   S c c}w c c}w c c}w # t
        $ r Y w xY wc c}w c c}w c c}w c c}}w )
z<Generate the Returns section of a function/method docstring.r  zNone.z ()	
r@   z(["'])(?:(?=(\\?))\2.)*?\1z"string"r   r   r}   )rl   rk   r   subr   r   r~   r5   r2   rY   r1   r   rZ   r  )rO   return_valsr   r   r   r   r   r  non_none_valsunambiguous_valscleaned_valsingle_vals
tuple_valsnum_elementsrt   return_elementreturn_vals_groupedreturn_elements_outr  s                      r   r   z;DocstringWriterExtension._generate_docstring_return_section  s    7B A
&:+? $ A AF?W,, ,9:' $)))4;;C@ : : ,9:'  B *J8 : : ' 	1J"CCJO ##K0	1  K'' #%bZ* 	2J.1Z.?Zz*$$Z0	2 :K'' .8: * ',,S1A5 :L :!!,q/2c,6GG++'?LL  C$66DII',\':;;= = = " /$0  c"$^!!# $$0 1 !!4 	9&&**+<+>+>+689	9 		"5666sA::   : <$$0sF   G4'G9G>:H%H	H
;H"
H*H"
	HHH"
N)__name__
__module____qualname____doc__rP   staticmethodrS   rf   rw   r{   r   r   r   r   r   r   r   r   r   r  r    r   r   rI   rI   {   s    <'  #J/b!F$,2#29">QfPd?B * *X - -^?7r   rI   c                   T    e Zd ZdZd Zed        Zed        Zd Zd Z	d Z
d Zd	 Zy
)r   zParse function definition text.c                     d| _         d| _        d| _        d| _        g | _        g | _        g | _        d| _        g | _        d| _	        d| _
        y)r  Fr   N)r   rn   	args_textro   r   r   r   r   r   r   r   )rO   s    r   rP   zFunctionInfo.__init__  sU     %)"$&!r   c                 R    |j                         D ]  \  }}|| cxk  r|k  s y  y)z?Return True if the character is in pairs of brackets or quotes.TF)items)pos_charpairspos_left	pos_rights       r   is_char_in_pairszFunctionInfo.is_char_in_pairs  s8     $);;= 	Hi(.Y. /	 r   c                     i }d}t        |       D ]4  \  }}|du r|dk(  s|dk(  sd}|}|}|k(  s"| |dz
     dk7  s.||<   d}6 |rt        dt              z         |S )z5Return the start and end position of pairs of quotes.Fr%   r&   Tr   rX   zNo matching close quote at: )r   r   r   )r   posis_found_left_quoter   r   r   left_poss          r   _find_quote_positionz!FunctionInfo._find_quote_position  s     #'o 		0NC"e+#yC'7*.'%E"H%$sQw-4*?$'CM*/'		0 ;c(mKLL
r   c                    i }g }t        |      D ]  \  }}||k(  r$| j                  ||      s|j                  |       /||k(  s5| j                  ||      rHt        |      dk(  rt	        dt        |      z         |||j                         <    t        |      dkD  r%t	        dt        |j                               z         |S )zReturn the start and end position of pairs of brackets.

        https://stackoverflow.com/questions/29991917/
        indices-of-matching-parentheses-in-python
        r   zNo matching closing parens at: zNo matching opening parens at: )r   r.  r~   r2   r   r   r   )	rO   r   bracket_leftbracket_right	pos_quoter0  pstackr   r   s	            r   _find_bracket_positionz#FunctionInfo._find_bracket_position4  s     'o 		(NCL(--c9=c"m+--c9=v;!#$9CHDF F$'FJJL!		( v;?1C

4EEG G 
r   c                    |D ]F  }d}d}d}d}|j                  d      }|j                  d      }|dkD  rd}|dkD  r|sd}n||kD  rd}|rB|r@|d| j                         }	||dz   | j                         }||dz   d j                         }nl|s,|r*|d| j                         }	||dz   d j                         }n>|r,|s*|d| j                         }	||dz   d j                         }n|j                         }	| j                  j                  |	       | j                  j                  |       | j
                  j                  |       I y)	z)Split argument text to name, type, value.NFrV   r   rF   Tr   r   )findrl   r   r~   r   r   )
rO   	args_listargr   r   has_type	has_value	pos_colon	pos_equalr   s
             r   split_arg_to_name_type_valuez)FunctionInfo.split_arg_to_name_type_valueO  sa    "	2CHIHIII2~ 	2~ #H*#HXq+113y1}Y7==?	A/557	8q+113y1}~.4468q+113	A/557	99;%%h/%%h/&&y1E"	2r   c                    g }d}d}	 | j                  |      }| j                  |dd|      }| j                  |dd|      }| j                  |dd|      }	 |j                  d	|      }	|	d
k(  rnh|	dz   }| j	                  |	|      s6| j	                  |	|      s$| j	                  |	|      s| j	                  |	|      rg|j                  |||	        |	dz   }|t        |      k  r|j                  ||d        |S # t        $ r Y yw xY w)zSplit the text including multiple arguments to list.

        This function uses a comma to separate arguments and ignores a comma in
        brackets and quotes.
        r   r*   r)   r.   r-   r,   r+   Nr@   rF   r   )r3  r9  r   r;  r.  r~   r2   )
rO   r'  r<  idx_find_startidx_arg_startr7  	pos_round	pos_curly
pos_square	pos_commas
             r   split_args_text_to_listz$FunctionInfo.split_args_text_to_listu  s?    			11)<I33IsC4=?I33IsC4=?I44YS5>@J
 !sN;IB&]N$$Y	:)))Y?)))Z@)))Y?Y}Y?@%MM " 3y>)Y}~67/  		s   AC: :	DDc                    | j                          t        |      syt        |      | _        |j	                         }t        j                  d|      }|rr|j                  d      j	                  d      | _        t        | j                        rd| j                  z   dz   | _        |j                  |j                  d            }nd| _        t        |      }|j                  d      dz   }|j                  d||      }||| | _        | j                  | j                        }|d| _        | j!                  |       yy)	z#Parse the function definition text.Nz#->[ ]*([\"\'a-zA-Z0-9_,()\[\] ]*):$r   z ()\r*   r)   r   T)rP   r   r   ro   rl   r   searchr   r   rD   rfindr2   r;  r'  rJ  r   rB  )rO   r   return_type_retext_endpos_args_startpos_args_endr<  s          r   r   zFunctionInfo.parse_def  s   #D)%d+zz|2D:)7)=)=a)@)F)Fw)OD& : :;$444s: * zz."6"6q"9:H)-D&4yH3!+zz#~x@n\:00@	  DM--i8 !r   c                    t        j                  d|      }t        |      dkD  rP|D cg c]  }|j                          c}| _        t        t        j                  | j                              | _        t        j                  d|      }|rd| _	        d}|j                  d      }d}d}|D ]  }	|	j                         }	|du rt        j                  ||	      rd}|s2||	z  }	 | j                  |      }
|d	   d
k(  r|dd	 }W| j                  |dd|
       | j                  |dd|
       | j                  |dd|
       t        j                  |d|      }| j                   j#                  |       d}d} yc c}w # t        $ r Y w xY w)zParse the function body text.z[ \t]raise ([a-zA-Z0-9_]*)r   z[ \t]yield Tzreturn |yield r}   Fr   rF   rX   Nr*   r)   r.   r-   r,   r+   )r   findallr2   rl   r   listr   fromkeysrL  r   rZ   r   r3  r9  r   r  r   r~   )rO   r   re_raisexre_yieldpattern_return	line_listis_found_returnline_return_tmpliner7  return_values               r   r   zFunctionInfo.parse_body  s   ::;TBx=12:;Qqwwy;DO #;#7#7#HIDO99^T2!DN +JJt$	 	%D::<D%'88ND1&*O4' $ 9 9/ JI&r*d2*9#2*> //c09;//c09;//c09;
  "vvnb/J))00>"'"$=	%! <N " s   E9%E><E>>	F
	F
N)r  r   r!  r"  rP   r#  r.  r3  r9  rB  rJ  r   r   r$  r   r   r   r     sN    )    *6$2L)V 9D2%r   r   c                   ,     e Zd ZdZ fdZ fdZ xZS )QMenuOnlyForEnterzThe class executes the selected action when "enter key" is input.

    If a input of keyboard is not the "enter key", the menu is closed and
    the input is inserted to code editor.
    c                 :    t         t        |   |       || _        y)zInit QMenu.N)superr`  rP   rK   )rO   rK   	__class__s     r   rP   zQMenuOnlyForEnter.__init__  s    /<&r   c                     |j                         }|t        j                  t        j                  fvr,| j                  j                  |       | j                          yt        t        |   |       y)z+Close the instance if key is not enter key.N)	keyr   	Key_Enter
Key_ReturnrK   keyPressEventcloserb  r`  )rO   eventre  rc  s      r   rh  zQMenuOnlyForEnter.keyPressEvent  sP    iikr||R]]33**51JJL#T8?r   )r  r   r!  r"  rP   rh  __classcell__)rc  s   @r   r`  r`    s    '
@ @r   r`  )r"  r   collectionsr   
qtpy.QtGuir   qtpy.QtCorer   qtpy.QtWidgetsr   spyder.config.managerr   spyder.py3compatr   r   r   r6   rA   rD   rG   objectrI   r   r`  r$  r   r   <module>rs     so     
 # #    ' +
6&(:F
7v F
7Rp%6 p%f@ @r   