
    G@d}                         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dS )zGenerate Docstring.    N)OrderedDict)QTextCursor)Qt)QMenu)CONF)to_text_stringc                     t          | t                    r5ddg}|                                 } |D ]}|                     |          r dS dS )z@Return True if text is the beginning of the function definition.defz	async defTF)
isinstancestrlstrip
startswith)textfunction_prefixprefixs      Jlib/python3.11/site-packages/spyder/plugins/editor/extensions/docstring.pyis_start_of_functionr      sa    $  +.{{}}% 	 	Fv&& tt 5    c                 b    d}t          j        d|           }|r|                    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   $   s6     F
(8T
"
"C
 1Mr   c                    |                      dd                               dd          } g d}dgdz  }t          t          |                    D ]*}||         | v r|                     ||                   ||<   +t	          |          dk    r|                     d          |                     d          k    pW|                     d	          |                     d
          k    p+|                     d          |                     d          k    S ||                    t	          |                             }||                    t	          |                             }t          |          }|| ||z   d         v rP| d|         | ||z   d         | ||z   d                             |          |z   d         z   } t          |           S |dk    r| d|         } |                     d          |                     d          k    pW|                     d	          |                     d
          k    p+|                     d          |                     d          k    S dS )=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"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'll++,A	QBDRMBQBx$q2vww-QVWW(;(;A(>(>(C(D(DEE"4(((	qBQBx

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

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

34::c??2	4 ur   c                 <   g d}g d}dgdz  }t          t          |                    D ]*}||         | v r|                     ||                   ||<   +t          |          dk    rd| v S ||                    t          |                             }||                    t          |                             }|| |dz   d         v rP| d|         | |dz   d         | |dz   d                             |          dz   d         z   } t	          |           S dS )	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'll++,ADQLBQBx$q1uvv,tAEFF|'9'9!'<'<q'@'A'ABB &&&ur   c                    |                      dd                               dd          } g d}dgdz  }t          t          |                    D ]*}||         | v r|                     ||                   ||<   +t	          |          dk    rt          |           S ||                    t	          |                             }||                    t	          |                             }t          |          }|| ||z   d         v rP| d|         | ||z   d         | ||z   d                             |          |z   d         z   } t          |           S dS )	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   sU   <<r""**5"55D%%%FgkG3v;; / /!9F1I..GAJ
7||u &&&w}}S\\**+Ac'll++,A	QBDRMBQBx$q2vww-QVWW(;(;A(>(>(C(D(DEE%%%ur   c                     t          |                     dd                              dd          ddd                   S )r   r    r   r!   N)r6   r0   )r   s    r   is_in_scope_backwardrG   u   s@    UB''r2244R4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dS )DocstringWriterExtensionz2Class for insert docstring template automatically.c                 >    || _         d| _        d| _        d| _        dS )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                 >    g d}|                                  |v rdS dS )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.     <;;;;==...4ur   c                    d                     |                                          }|                    d          s.|                    d          s|                    d          rd|v rdS |                    d          rz|dk    rs|}| j                                        }t          |                    |dz
                      }t          |dz
  d	d	          D ]}d                     t          |	                                
                                                                                    }|                    d
          st          |          r%|                    d
          r
|dd	         }||z   }n n&|dk    r|                    t
          j                   t          |          rC|                    d          p-|                    d          p|                    d          od|v S dS dS )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"7#,,T22 	#,,T22 	 %--c22 	 ,,,4$--c22 	{Q3M'0022H **;?;;= =F;?B33 	C 	Cggc&,,.."5"5"7"788>>@@AA<<%% )=m)L)L ||D)) '!#2#h$'-$7MME66''(ABBB#M22 !**400 ,!**400,"++C00 +]*	 u5r   c                    | j                                         }t          |                    | j        dz
                      }d}d}d}|                                dz   }| j                                         }||z
  dz   }d}	t          t          |d                    D ]N}
t          |
                                                                                                          }|r$t          |          s dS t          |          }d}nlt          |          }||k    r|                                dk    r dS t          |          r dS |                                dk    rt!          |          s dS t#          |          dk    r|d         d	k    r
|dd         }||z  }|	dz  }	|                     |||	z   dz
            r||	fc S |                    t          j                   PdS )
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CE E 	((**Q.*5577&4q8&'#L"--.. 	7 	7B%fllnn&9&9&;&;<<CCEEH  +H55  44(22 %'11
,,1A1AR1G1G44'11  44NN$$**/	:: +448}}q  Xb\T%9%9#CRC=!I'1,'11k,GG!KM M > "===== 56666tr   c                    | j                                         }d}d}|                                dz   }d}t          t	          |d                    D ]}|                                                                dk    r dS |                    t          j                   t          |                                
                                                                          }|r|                     ||dz
            s dS d}n|                     |||z
  dz
            r dS t          |          dk    r|d         d	k    r
|dd         }||z   }|dz  }t          |          r||fc S dS )
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   s   !,,..	((**Q.&'#K,,-- 	> 	>B||~~))++q00tt 9:::&v||~~':':'<'<==DDFFI 99!;?4 4  44 %33{-HH1LN N tt9~~!!imt&;&;%crcN	!I-I'1,'#I.. > "=====> tr   c                 T   | j                                         }|                                dz   }| j                                         }g }t	          ||z
  dz             D ]}t          |                                                                          }t          |          }|	                                dk    rn"t          |          t          |          k    r n5|                    |           |                    t          j                   d                    |          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7	+59:: 	7 	7B!&,,.."5"5"7"788D$T**Kzz||r!![!!S%5%555T""" 56666yy###r   c                    | j                             dd          }|                     |          r.| j                                         }|                                }|d         }t          j        dd          }|                     ||          }|r| j                             |           | j                                         }|	                    |t          j                   |                    t          j                   |                    t          j        t          j                   |                                 | j                             |           dS dS )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C**>:: 	%0022F((H"2&E!Xh0@AAN00GGI 
 ,,Y777)4466""8[-CDDD##K$9:::##K$9$/$:< < <%%''' ..v666tur   c                    |                                  }| j        }|rJ|\  }}| j        |z   dz
  }|                                }|                                dz   }||z
  }|dk    r2t          |          D ]!}	|                    t          j                   "n>t          t          |                    D ]!}	|                    t          j
                   "|                    t          j        t          j                   |                    |           t          |          }
|                    d                    |
|j                             |                                  dS dS )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  sz   ==??! 	#-3*I*$($;$7%8:;%<  &&((F!'!3!3!5!5!9),>>Fzz-- ? ?B''(=>>>>?  F,, C CB''(ABBBB 5{7MNNN  (((	**F{11&&:MNNOOO  """""'	# 	#r   c                    |                                  }|i|\  }}| j                                        }t          |          D ]!}|                    t
          j                   "| j                            |           | j                                        }|                                dz   | _	        | 
                                 dS )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D.4+B+%0022F788 ? ?##K$=>>>>**6222!,,.."("4"4"6"6":6688888r   c                    d}|dz  | _         |dk    rd| _        nd| _        |                                 }|r|\  }}t                      }|                    |           |j        r|                     |j                  }|r|                    |           |dk    r| 	                    |          }n7|dk    r| 
                    |          }n|dk    r|                     |          }|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D 	E!LHb$I)))! 
E 2293HII	 4((333z)) $ 8 8 C CII,, $ 9 9) D DII,, $ 9 9) D DIr   c                    d}|j         }|j        }|j        }t          |          dk    r|d         dv r	|d= |d= |d= |j        | j        j        z   }|j        | j        j        dz  z   }|d                    |          z  }t          |          dk    r0|d                    |          z  }|d                    |          z  }d}t          |||          D ]\  }	}
}|d                    ||	          z  }|
r|d	                    |
          z  }n|d
z  }|r|dz  }|d                    |          z  }|r8|	                    | j
        | j                  }|d                    |          z  }|dz  }||z  }|j        rp|d                    |          z  }|d                    |          z  }|j        D ]3}|d                    ||          z  }|d                    |          z  }4|dz  }|dz  }|j        rd                    |          }nd                    |          }|j        }|r0d                    |||          }|d                    |          z  }n|dz   |z   dz   }|                    d
          }|dz   |                                z   }	 |                     |j        |||||          }n-# t$          t&          f$ r d                    ||          }Y nw xY w||z  }|d                    || j
                  z  }|S )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  s   	+	+	-
y>>A)A,/"A"A!!1'$*:*GG'$*:*G!*KKX__W---	y>>A)00999I+227;;;I-0I1;.= .= 	 	)Hh		(((;;;H #DKK111F" )L(*11':::H D%--dk4;LMM	188CCCHHX	 	,,W555I,,W555I'2 @ @
X__WjAAA	/66w???		IT	 	@-44W==FF/66w??F ) ?  	E%__VW-BD DN077@@@NN"),="="G#-444HHK"),>">""$$#%E!%!H!H2F')<k" " 
+ E E E!,!3!3FG!D!DE 	^#	Z&&w<<<	s   J= ='K'&K'c                 (   d}|j         }|j        }|j        }t          |          dk    r|d         dv r	|d= |d= |d= |j        | j        j        z   }|j        | j        j        dz  z   }|d                    |          z  }t          |          dk    r|d                    |          z  }d}t          |||          D ]\  }	}
}|d                    ||	          z  }|dz  }|
r|d	                    |
          z  }n|d
z  }|r|dz  }|dz  }|dz  }|r9|	                    | j
        | j                  }|d                    |          z  }|dz  }||z  }|j        rE|d                    |          z  }|j        D ] }|d                    ||          z  }|dz  }!|dz  }|dz  }|j        rd                    |          }nd                    |          }|j        }|rd                    |||          }nq|dz   }|                    d
          }|dz   dz   }	 |                     |j        |||||          }n-# t"          t$          f$ r d                    ||          }Y nw xY w||z  }|d                    || j
                  z  }|S )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  sT   
+	+	-
y>>A)A,/"A"A!!1'$*:*GG'$*:*G!*KKhoog...
y>>A.//888J-0I1;.= .= 	! 	!)Hh	w999HOH #DKK111F" )L(H'H !%--dk4;LMM	077	BBBD h
 	.//888J'2 / /
hoogzBBB
..

$Jd
 	4"))'22FF#**733F ) ?  	E3::!68 8NN #*,I"I-444HHK"),<"<&#'E!%!H!H2F')<k" " 
+ E E E!,!3!3FG!D!DE 	n$
j''===
s   "I 'I,+I,c                    d}|j         }|j        }|j        }t          |          dk    r|d         dv r	|d= |d= |d= |j        | j        j        z   }|d                    |          z  }d}t          |||          D ]\  }}	}
|d                    ||          z  }|
r9|
	                    | j
        | j                  }
|d                    |
          z  }n|dz  }|d                    ||          z  }|	r|d	                    |	          z  }n|d
z  }|
r|dz  }|dz  }||z  }|j        r#|j        D ]}|d                    ||          z  }|j        rd                    |          }nd                    |          }|j        }|r/d                    |          }|d                    ||          z  }n-d                    |          }|d                    |          z  }||z  }|d                    || 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$  s   
+	+	-
y>>A)A,/"A"A!!1'$*:*GGhoog...
-0I1;.= .= 	 	)Hh	299'8LLLH !%--dk4;LMM	077	BBBD --gx@@@H #DKK111F" )L(HHh
 	O'2 O O
;BB7CMO O O

  	2 ''00FF!((11F ) ?  	?/66v>>Nn33G4IK K KNN 066v>>N.55g>>>Nn$
j''===
r   c                 ^   g }g }d}d}dddd}t          |           D ]\  }}|s||                                v s||k    r|                    |           |};|rr|||         k    rf|                                }|sO|s&|dk    rd}n|d	k    rd
}n|dk    r||z
  dk    rd}nd}|                    | ||dz            |df           d}d}t	          |          dk    r,|dk    r	|dk    rd}|dk    r	|dk    rd}|dk    r|dk    r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  s    3S11'77 	- 	-NC! -i8==??&B&B L00$$S)))( -)x/E"E"E)--//	$ &' 	7'3..+3LL)S00+3LL)S00"Y!33/7/6%,,'	#'(9:%q*+ + + $(L#%L]##q((3&&9+;+;#,LL!S((Y#-=-=#+LL!S((Y#-=-=#,L 	1/000- 	C 	CL3^3\BNNr   c                    |                      | d                   t          |           k    }t          h d                    |           g          r&|r$|                    | d         dd                   S h dt          fd| D                       r|S t          d | D                       r|                    d	          S d
dh                    |           r|                    d          S 	 d | D              d}| D ]'}	 t          |           # t          $ r |dz   }Y $w xY w|dk    r|                    d          S |t          |           k    r|                    d          S |                    d          S # t          $ r Y nw xY wh d                    |           r7|r5t          d | D                       r|                    | 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-   ~c                 H    g | ]t          fd D                       S )c                     g | ]}|v S  r  ).0py_char
return_vals     r   
<listcomp>zMDocstringWriterExtension.parse_return_elements.<locals>.<listcomp>.<listcomp>  s    CCCwW
*CCCr   )any)r  r  py_charss    @r   r  zBDocstringWriterExtension.parse_return_elements.<locals>.<listcomp>  sG     5 5 5 CCCC(CCCDD 5 5 5r   c                     g | ]
}d |v pd|v S )r&   r%   r  r  r  s     r   r  zBDocstringWriterExtension.parse_return_elements.<locals>.<listcomp>  s7     5 5 5 z!7TZ%7 5 5 5r   r   TrueFalseboolc                 ,    g | ]}t          |          S r  )floatr	  s     r   r  zBDocstringWriterExtension.parse_return_elements.<locals>.<listcomp>  s     CCC:U:CCCr   intr  numeric>   r   NonerO   c                     g | ]}d |vS ).r  r	  s     r   r  zBDocstringWriterExtension.parse_return_elements.<locals>.<listcomp>  s-     > > >' J. > > >r   )return_name)	r5   r2   all
issupersetr   r  r  r   
isdisjoint)return_vals_groupr   r   r   all_eqnum_not_intr  r  s          @r   parse_return_elementsz.DocstringWriterExtension.parse_return_elements  s    $))*;A*>??*++,888CC!# # $ % % 	8)/	8&---a026 . 8 8 8    5 5 5 5"35 5 5 6 6 	 5 5"35 5 5 6 6 	A&--%-@@@G''(9:: 	B&--&-AAA	CC1BCCCCK/ 2 2
2
OOOO! 2 2 2"-/KKK2a*11e1DDD$5 6 666*11g1FFF*11i1HHH 	 	 	D	 $##../@AA 	Pf 	P > >+<> > > ? ?	P '--:KA:N-OOOsB   7F
 
DF
 D,)F
 +D,,F
 (F
 4F
 

FFc           	      d   d |D             }|s||z   dz   S d |D             }d |D             }g }|D ]>}		 |                      |	          }
n# t          $ r Y %w xY w|                    |
           ?|s|z   S g g }}|D ]0}	d|	v r|                    |	          n|                    |	           1|r|r|z   S |rFd |D             }|                    |d                   t	          |          k    r|z   S |d         }nd}t	          |          t	          |          k    r1|d	                    fd
t          |          D                       z   S t          d |D              }g }|D ]-}|                    |                     |||                     .|d	                    |          z   S )z<Generate the Returns section of a function/method docstring.c                 "    g | ]}|r|d k    
|S )r  r  r	  s     r   r  zODocstringWriterExtension._generate_docstring_return_section.<locals>.<listcomp>  s8     A A A
&A+5+?+? $+?+?+?r   zNone.c                 ^    g | ]*}|                     d                               d          +S )z ()	
r@   )rl   rk   r	  s     r   r  zODocstringWriterExtension._generate_docstring_return_section.<locals>.<listcomp>  sD     : : :' $)))44;;C@@ : : :r   c                 :    g | ]}t          j        d d|          S )z(["'])(?:(?=(\\?))\2.)*?\1z"string")r   subr	  s     r   r  zODocstringWriterExtension._generate_docstring_return_section.<locals>.<listcomp>  s<     : : :'  B *J8 8 : : :r   r@   c                 >    g | ]}|                     d           dz   S )r@   r   )r5   r	  s     r   r  zODocstringWriterExtension._generate_docstring_return_section.<locals>.<listcomp>  s;     : : : * ',,S11A5 : : :r   r   r   r}   c                     g | ]}S r  r  )r  rt   r   s     r   r  zODocstringWriterExtension._generate_docstring_return_section.<locals>.<listcomp>  s    ;;;;;;r   c                 L    g | ]!}d  |                     d          D             "S )c                 6    g | ]}|                                 S r  rl   )r  return_elements     r   r  zZDocstringWriterExtension._generate_docstring_return_section.<locals>.<listcomp>.<listcomp>  s0     $ $ $^!!## $ $ $r   r@   )rZ   r	  s     r   r  zODocstringWriterExtension._generate_docstring_return_section.<locals>.<listcomp>  sO     $0 $0 $0 $ $c""$ $ $$0 $0 $0r   )	r   r   r~   r5   r2   rY   r1   r   r  )rO   return_valsr   r   r   r   r   non_none_valsunambiguous_valsr  cleaned_valsingle_vals
tuple_valsnum_elementsreturn_vals_groupedreturn_elements_outr  s        `           r   r   z;DocstringWriterExtension._generate_docstring_return_section  s   A Ak A A A 	-F?W,,: :+8: : :: :+8: : : ' 	1 	1J"CCJOO   ##K0000 	(K'' #%bZ* 	2 	2J.1Z.?.?Zz***$$Z00 	(: 	(K''  	: :.8: : :L!!,q/22c,6G6GGG++'?LLL   C$6$666DII;;;;u\':':;;;= = = = " $0 $0 /$0 $0 $0 1 !!4 	9 	9&&**+<+>+>+68 89 9 9 9 		"56666s   A
AAN)__name__
__module____qualname____doc__rP   staticmethodrS   rf   rw   r{   r   r   r   r   r   r   r   r   r   r  r   r  r   r   rI   rI   {   s<       <<' ' '   \# # #J/ / /b! ! !F$ $ $,  2# # #29 9 9"  >Q Q QfP P Pd? ? ?B * * \*X - - \-^?7 ?7 ?7 ?7 ?7r   rI   c                   b    e Zd ZdZd Zed             Zed             Zd Zd Z	d Z
d Zd	 Zd
S )r   zParse function definition text.c                     d| _         d| _        d| _        d| _        g | _        g | _        g | _        d| _        g | _        d| _	        d| _
        dS )r  Fr   N)r   rn   	args_textro   r   r   r   r   r   r   r   )rO   s    r   rP   zFunctionInfo.__init__  sY     %)"$&!r   c                 `    |                                 D ]\  }}|| cxk     r|k     rn  dS dS )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  sU     $);;== 	 	Hi(....Y.....tt / ur   c                     i }d}t          |           D ]8\  }}|du r|dk    s|dk    rd}|}|}||k    r| |dz
           dk    r|||<   d}9|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     #'oo 		0 		0NC"e++##yC'7'7*.'%E"H%%$sQw-4*?*?$'CM*/' 	M;c(mmKLLL
r   c                    i }g }t          |          D ]\  }}||k    r,|                     ||          s|                    |           7||k    r_|                     ||          sIt          |          dk    rt	          dt          |          z             |||                                <   t          |          dk    r1t	          dt          |                                          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_quoter@  pstackr   r   s	            r   _find_bracket_positionz#FunctionInfo._find_bracket_position4  s    'oo 		( 		(NCL((--c9== )c""""m++--c9== ,v;;!##$9CHHDF F F$'FJJLL!v;;??1C

4E4EEG G G 
r   c                 0   |D ]}d}d}d}d}|                     d          }|                     d          }|dk    rd}|dk    r|sd}n||k    rd}|r]|r[|d|                                         }	||dz   |                                         }||dz   d                                         }n|s>|r<|d|                                         }	||dz   d                                         }nT|r>|s<|d|                                         }	||dz   d                                         }n|                                }	| j                            |	           | j                            |           | j                            |           dS )	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  s    "	2 "	2CHIHIII2~~ 	2~~  $#HH**#H 'X 'q{+1133y1}Y67==??	A/5577		 '8 'q{+1133y1}~~.4466 '8 'q{+1133	A/5577		99;;%%h///%%h///&&y1111E"	2 "	2r   c                    g }d}d}	 |                      |          }|                     |dd|          }|                     |dd|          }|                     |dd|          }n# t          $ r Y dS w xY w	 |                    d
|          }	|	dk    rn|	dz   }|                     |	|          sB|                     |	|          s,|                     |	|          s|                     |	|          r||                    |||	                    |	dz   }|t          |          k     r|                    ||d                    |S )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+   NTr@   rF   r   )rC  rI  r   rK  r>  r~   r2   )
rO   r7  rL  idx_find_startidx_arg_startrG  	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>@ @JJ 	 	 	44		*!sN;;IB&]N$$Y	:: )))Y??)))Z@@ )))Y?? Y}Y'>?@@@%MM	*" 3y>>))Y}~~6777s   AA& &
A43A4c                    |                                   t          |          sdS t          |          | _        |                                }t          j        d|          }|r||                    d                              d          | _        t          | j                  rd| j        z   dz   | _        |
                    |                    d                    }nd| _        t          |          }|                    d          dz   }|
                    d||          }|||         | _        |                     | j                  }|d| _        |                     |           dS dS )	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   rK  r7  rZ  r   rR  )rO   r   return_type_retext_endpos_args_startpos_args_endrL  s          r   r   zFunctionInfo.parse_def  sb   #D)) 	F%d++zz||2D: : 		!)7)=)=a)@)@)F)Fw)O)OD& :;; $44s: * zz."6"6q"9"9::HH)-D&4yyH3!+zz#~x@@n\9:00@@	  DM--i88888 ! r   c                 *   t          j        d|          }t          |          dk    r<d |D             | _        t	          t          j        | j                            | _        t          j        d|          }|rd| _        d}|	                    d          }d}d	}|D ]}|
                                }|du rt          j        ||          rd}|r||z  }	 |                     |          }	|d
         dk    r|dd
         }e|                     |dd|	           |                     |dd|	           |                     |dd|	           n# t          $ r Y w xY wt          j        |d	|          }
| j                            |
           d}d	}dS )zParse the function body text.z[ \t]raise ([a-zA-Z0-9_]*)r   c                 6    g | ]}|                                 S r  r%  )r  xs     r   r  z+FunctionInfo.parse_body.<locals>.<listcomp>  s     ;;;Qqwwyy;;;r   z[ \t]yield Tzreturn |yield r}   Fr   rF   rX   Nr*   r)   r.   r-   r,   r+   )r   findallr2   r   listr   fromkeysr\  r   rZ   rl   r   rC  rI  r   r   r   r~   )rO   r   re_raisere_yieldpattern_return	line_listis_found_returnline_return_tmplinerG  return_values              r   r   zFunctionInfo.parse_body  s   :;TBBx==1;;(;;;DO #;#7#H#HIIDO9^T22 	"!DN +JJt$$	 	% 	%D::<<D%''8ND11 +&*O %4' $ 9 9/ J JI&r*d22*9#2#*> //c09; ; ;//c09; ; ;//c09; ; ; ;!   H  "vnb/JJ)00>>>"'"$=	% 	%s   +EAE
EEN)r0  r1  r2  r3  rP   r4  r>  rC  rI  rR  rZ  r   r   r  r   r   r   r     s        ))     \   \*  6$2 $2 $2L) ) )V 9  9  9D2% 2% 2% 2% 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                 f    t          t          |                               |           || _        dS )zInit QMenu.N)superrq  rP   rK   )rO   rK   	__class__s     r   rP   zQMenuOnlyForEnter.__init__  s0    &&//<<<&r   c                    |                                 }|t          j        t          j        fvr0| j                            |           |                                  dS t          t          |                               |           dS )z+Close the instance if key is not enter key.N)	keyr   	Key_Enter
Key_ReturnrK   keyPressEventclosers  rq  )rO   eventrv  rt  s      r   ry  zQMenuOnlyForEnter.keyPressEvent  sq    iikkr|R]333**5111JJLLLLL#T**88?????r   )r0  r1  r2  r3  rP   ry  __classcell__)rt  s   @r   rq  rq    sd         ' ' ' ' '
@ @ @ @ @ @ @ @ @r   rq  )r3  r   collectionsr   
qtpy.QtGuir   qtpy.QtCorer   qtpy.QtWidgetsr   spyder.config.managerr   spyder.py3compatr   r   r   r6   rA   rD   rG   objectrI   r   rq  r  r   r   <module>r     s     
			 # # # # # # # " " " " "                   ' & & & & & + + + + + +
 
 
    6  &  (: : :F
7 F
7 F
7 F
7 F
7v F
7 F
7 F
7Rp% p% p% p% p%6 p% p% p%f@ @ @ @ @ @ @ @ @ @r   