@@ -154,7 +154,7 @@ def postprocess(item: str) -> list[str]:
154154 return tokens
155155
156156
157- def _token_type (token : str , location : str | None = None ) -> str :
157+ def _token_type (token : str , debug_location : str | None = None ) -> str :
158158 def is_numeric (token : str ) -> bool :
159159 try :
160160 # use complex to make sure every numeric value is detected as literal
@@ -177,28 +177,28 @@ def is_numeric(token: str) -> bool:
177177 logger .warning (
178178 __ ('invalid value set (missing closing brace): %s' ),
179179 token ,
180- location = location ,
180+ location = debug_location ,
181181 )
182182 type_ = 'literal'
183183 elif token .endswith ('}' ):
184184 logger .warning (
185185 __ ('invalid value set (missing opening brace): %s' ),
186186 token ,
187- location = location ,
187+ location = debug_location ,
188188 )
189189 type_ = 'literal'
190190 elif token .startswith (("'" , '"' )):
191191 logger .warning (
192192 __ ('malformed string literal (missing closing quote): %s' ),
193193 token ,
194- location = location ,
194+ location = debug_location ,
195195 )
196196 type_ = 'literal'
197197 elif token .endswith (("'" , '"' )):
198198 logger .warning (
199199 __ ('malformed string literal (missing opening quote): %s' ),
200200 token ,
201- location = location ,
201+ location = debug_location ,
202202 )
203203 type_ = 'literal'
204204 elif token in {'optional' , 'default' }:
@@ -213,10 +213,10 @@ def is_numeric(token: str) -> bool:
213213 return type_
214214
215215
216- def _convert_numpy_type_spec (
216+ def _convert_type_spec (
217217 _type : str ,
218- location : str | None = None ,
219218 translations : dict [str , str ] | None = None ,
219+ debug_location : str | None = None ,
220220) -> str :
221221 if translations is None :
222222 translations = {}
@@ -240,7 +240,7 @@ def convert_obj(
240240
241241 tokens = _tokenize_type_spec (_type )
242242 combined_tokens = _recombine_set_tokens (tokens )
243- types = [(token , _token_type (token , location )) for token in combined_tokens ]
243+ types = [(token , _token_type (token , debug_location )) for token in combined_tokens ]
244244
245245 converters = {
246246 'literal' : lambda x : '``%s``' % x ,
@@ -258,15 +258,6 @@ def convert_obj(
258258 return converted
259259
260260
261- def _convert_type_spec (_type : str , translations : dict [str , str ] | None = None ) -> str :
262- """Convert type specification to reference in reST."""
263- if translations is not None and _type in translations :
264- return translations [_type ]
265- if _type == 'None' :
266- return ':py:obj:`None`'
267- return f':py:class:`{ _type } `'
268-
269-
270261class GoogleDocstring :
271262 """Convert Google style docstrings to reStructuredText.
272263
@@ -433,6 +424,20 @@ def __str__(self) -> str:
433424 """
434425 return '\n ' .join (self .lines ())
435426
427+ def _get_location (self ) -> str | None :
428+ try :
429+ filepath = inspect .getfile (self ._obj ) if self ._obj is not None else None
430+ except TypeError :
431+ filepath = None
432+ name = self ._name
433+
434+ if filepath is None and name is None :
435+ return None
436+ elif filepath is None :
437+ filepath = ''
438+
439+ return f'{ filepath } :docstring of { name } '
440+
436441 def lines (self ) -> list [str ]:
437442 """Return the parsed lines of the docstring in reStructuredText format.
438443
@@ -490,7 +495,11 @@ def _consume_field(
490495 _type , _name = _name , _type
491496
492497 if _type and self ._config .napoleon_preprocess_types :
493- _type = _convert_type_spec (_type , self ._config .napoleon_type_aliases or {})
498+ _type = _convert_type_spec (
499+ _type ,
500+ translations = self ._config .napoleon_type_aliases or {},
501+ debug_location = self ._get_location (),
502+ )
494503
495504 indent = self ._get_indent (line ) + 1
496505 _descs = [_desc , * self ._dedent (self ._consume_indented_block (indent ))]
@@ -538,7 +547,9 @@ def _consume_returns_section(
538547
539548 if _type and preprocess_types and self ._config .napoleon_preprocess_types :
540549 _type = _convert_type_spec (
541- _type , self ._config .napoleon_type_aliases or {}
550+ _type ,
551+ translations = self ._config .napoleon_type_aliases or {},
552+ debug_location = self ._get_location (),
542553 )
543554
544555 _desc = self .__class__ (_desc , self ._config ).lines ()
@@ -1202,20 +1213,6 @@ def __init__(
12021213 self ._directive_sections = ['.. index::' ]
12031214 super ().__init__ (docstring , config , app , what , name , obj , options )
12041215
1205- def _get_location (self ) -> str | None :
1206- try :
1207- filepath = inspect .getfile (self ._obj ) if self ._obj is not None else None
1208- except TypeError :
1209- filepath = None
1210- name = self ._name
1211-
1212- if filepath is None and name is None :
1213- return None
1214- elif filepath is None :
1215- filepath = ''
1216-
1217- return f'{ filepath } :docstring of { name } '
1218-
12191216 def _escape_args_and_kwargs (self , name : str ) -> str :
12201217 func = super ()._escape_args_and_kwargs
12211218
@@ -1242,10 +1239,10 @@ def _consume_field(
12421239 _type , _name = _name , _type
12431240
12441241 if self ._config .napoleon_preprocess_types :
1245- _type = _convert_numpy_type_spec (
1242+ _type = _convert_type_spec (
12461243 _type ,
1247- location = self ._get_location (),
12481244 translations = self ._config .napoleon_type_aliases or {},
1245+ debug_location = self ._get_location (),
12491246 )
12501247
12511248 indent = self ._get_indent (line ) + 1
0 commit comments