1212import lark
1313import lark .visitors
1414
15+ from ._report import ContextReporter
1516from ._utils import DocstubError
1617
1718logger : Final = logging .getLogger (__name__ )
@@ -152,7 +153,7 @@ def sub_expressions(self):
152153
153154 Returns
154155 -------
155- names : list of Expr or {1}
156+ names : list of Self
156157 """
157158 cls = type (self )
158159 for child in self .children :
@@ -188,7 +189,7 @@ def format_tree(self):
188189
189190 def print_tree (self ):
190191 """Print full hierarchy as a tree."""
191- print (self .format_tree ())
192+ print (self .format_tree ()) # noqa: T201
192193
193194 def __repr__ (self ) -> str :
194195 return f"<{ type (self ).__name__ } : '{ self .as_code ()} ' rule='{ self .rule } '>"
@@ -209,40 +210,25 @@ class BlacklistedQualname(DocstubError):
209210
210211@lark .visitors .v_args (tree = True )
211212class DoctypeTransformer (lark .visitors .Transformer ):
212- def start (self , tree ):
213+ def __init__ (self , * , reporter = None ):
213214 """
214215 Parameters
215216 ----------
216- tree : lark.Tree
217-
218- Returns
219- -------
220- out : Expr
217+ reporter : ~.ContextReporter
221218 """
222- return Expr ( rule = "start" , children = tree . children )
219+ self . reporter = reporter or ContextReporter ( logger = logger )
223220
224- def qualname (self , tree ):
221+ def start (self , tree ):
225222 """
226223 Parameters
227224 ----------
228225 tree : lark.Tree
229226
230227 Returns
231228 -------
232- out : Term
229+ out : Expr
233230 """
234- children = tree .children
235- _qualname = "." .join (children )
236-
237- if _qualname in BLACKLISTED_QUALNAMES :
238- raise BlacklistedQualname (_qualname )
239-
240- _qualname = Term (
241- _qualname ,
242- kind = TermKind .NAME ,
243- pos = (tree .meta .start_pos , tree .meta .end_pos ),
244- )
245- return _qualname
231+ return Expr (rule = "start" , children = tree .children )
246232
247233 def qualname (self , tree ):
248234 """
@@ -381,11 +367,11 @@ def natlang_literal(self, tree):
381367 out = self ._format_subscription (items , rule = "natlang_literal" )
382368
383369 if len (tree .children ) == 1 :
384- logger . warning (
385- "natural language literal with one item `%s`, "
386- "consider using `%s` to improve readability " ,
370+ details = ( "Consider using `%s` to improve readability" , "" . join ( out ))
371+ self . reporter . warn (
372+ "Natural language literal with one item: `{%s}` " ,
387373 tree .children [0 ],
388- "" . join ( out ) ,
374+ details = details ,
389375 )
390376 return out
391377
@@ -524,16 +510,14 @@ def _format_subscription(self, sequence, *, rule):
524510 return expr
525511
526512
527- _transformer : Final = DoctypeTransformer ()
528-
529-
530- def parse_doctype (doctype ):
513+ def parse_doctype (doctype , * , reporter = None ):
531514 """Turn a type description in a docstring into a type annotation.
532515
533516 Parameters
534517 ----------
535518 doctype : str
536519 The doctype to parse.
520+ reporter : ~.ContextReporter, optional
537521
538522 Returns
539523 -------
@@ -553,5 +537,6 @@ def parse_doctype(doctype):
553537 <Expr: 'ndarray[float | int]' rule='start'>
554538 """
555539 tree = _lark .parse (doctype )
556- expression = _transformer .transform (tree = tree )
540+ transformer = DoctypeTransformer (reporter = reporter )
541+ expression = transformer .transform (tree = tree )
557542 return expression
0 commit comments