visitor.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. """Generic abstract syntax tree node visitor"""
  2. from __future__ import annotations
  3. from abc import abstractmethod
  4. from typing import TYPE_CHECKING, Generic, TypeVar
  5. from mypy_extensions import mypyc_attr, trait
  6. if TYPE_CHECKING:
  7. # break import cycle only needed for mypy
  8. import mypy.nodes
  9. import mypy.patterns
  10. T = TypeVar("T")
  11. @trait
  12. @mypyc_attr(allow_interpreted_subclasses=True)
  13. class ExpressionVisitor(Generic[T]):
  14. @abstractmethod
  15. def visit_int_expr(self, o: mypy.nodes.IntExpr) -> T:
  16. pass
  17. @abstractmethod
  18. def visit_str_expr(self, o: mypy.nodes.StrExpr) -> T:
  19. pass
  20. @abstractmethod
  21. def visit_bytes_expr(self, o: mypy.nodes.BytesExpr) -> T:
  22. pass
  23. @abstractmethod
  24. def visit_float_expr(self, o: mypy.nodes.FloatExpr) -> T:
  25. pass
  26. @abstractmethod
  27. def visit_complex_expr(self, o: mypy.nodes.ComplexExpr) -> T:
  28. pass
  29. @abstractmethod
  30. def visit_ellipsis(self, o: mypy.nodes.EllipsisExpr) -> T:
  31. pass
  32. @abstractmethod
  33. def visit_star_expr(self, o: mypy.nodes.StarExpr) -> T:
  34. pass
  35. @abstractmethod
  36. def visit_name_expr(self, o: mypy.nodes.NameExpr) -> T:
  37. pass
  38. @abstractmethod
  39. def visit_member_expr(self, o: mypy.nodes.MemberExpr) -> T:
  40. pass
  41. @abstractmethod
  42. def visit_yield_from_expr(self, o: mypy.nodes.YieldFromExpr) -> T:
  43. pass
  44. @abstractmethod
  45. def visit_yield_expr(self, o: mypy.nodes.YieldExpr) -> T:
  46. pass
  47. @abstractmethod
  48. def visit_call_expr(self, o: mypy.nodes.CallExpr) -> T:
  49. pass
  50. @abstractmethod
  51. def visit_op_expr(self, o: mypy.nodes.OpExpr) -> T:
  52. pass
  53. @abstractmethod
  54. def visit_comparison_expr(self, o: mypy.nodes.ComparisonExpr) -> T:
  55. pass
  56. @abstractmethod
  57. def visit_cast_expr(self, o: mypy.nodes.CastExpr) -> T:
  58. pass
  59. @abstractmethod
  60. def visit_assert_type_expr(self, o: mypy.nodes.AssertTypeExpr) -> T:
  61. pass
  62. @abstractmethod
  63. def visit_reveal_expr(self, o: mypy.nodes.RevealExpr) -> T:
  64. pass
  65. @abstractmethod
  66. def visit_super_expr(self, o: mypy.nodes.SuperExpr) -> T:
  67. pass
  68. @abstractmethod
  69. def visit_unary_expr(self, o: mypy.nodes.UnaryExpr) -> T:
  70. pass
  71. @abstractmethod
  72. def visit_assignment_expr(self, o: mypy.nodes.AssignmentExpr) -> T:
  73. pass
  74. @abstractmethod
  75. def visit_list_expr(self, o: mypy.nodes.ListExpr) -> T:
  76. pass
  77. @abstractmethod
  78. def visit_dict_expr(self, o: mypy.nodes.DictExpr) -> T:
  79. pass
  80. @abstractmethod
  81. def visit_tuple_expr(self, o: mypy.nodes.TupleExpr) -> T:
  82. pass
  83. @abstractmethod
  84. def visit_set_expr(self, o: mypy.nodes.SetExpr) -> T:
  85. pass
  86. @abstractmethod
  87. def visit_index_expr(self, o: mypy.nodes.IndexExpr) -> T:
  88. pass
  89. @abstractmethod
  90. def visit_type_application(self, o: mypy.nodes.TypeApplication) -> T:
  91. pass
  92. @abstractmethod
  93. def visit_lambda_expr(self, o: mypy.nodes.LambdaExpr) -> T:
  94. pass
  95. @abstractmethod
  96. def visit_list_comprehension(self, o: mypy.nodes.ListComprehension) -> T:
  97. pass
  98. @abstractmethod
  99. def visit_set_comprehension(self, o: mypy.nodes.SetComprehension) -> T:
  100. pass
  101. @abstractmethod
  102. def visit_dictionary_comprehension(self, o: mypy.nodes.DictionaryComprehension) -> T:
  103. pass
  104. @abstractmethod
  105. def visit_generator_expr(self, o: mypy.nodes.GeneratorExpr) -> T:
  106. pass
  107. @abstractmethod
  108. def visit_slice_expr(self, o: mypy.nodes.SliceExpr) -> T:
  109. pass
  110. @abstractmethod
  111. def visit_conditional_expr(self, o: mypy.nodes.ConditionalExpr) -> T:
  112. pass
  113. @abstractmethod
  114. def visit_type_var_expr(self, o: mypy.nodes.TypeVarExpr) -> T:
  115. pass
  116. @abstractmethod
  117. def visit_paramspec_expr(self, o: mypy.nodes.ParamSpecExpr) -> T:
  118. pass
  119. @abstractmethod
  120. def visit_type_var_tuple_expr(self, o: mypy.nodes.TypeVarTupleExpr) -> T:
  121. pass
  122. @abstractmethod
  123. def visit_type_alias_expr(self, o: mypy.nodes.TypeAliasExpr) -> T:
  124. pass
  125. @abstractmethod
  126. def visit_namedtuple_expr(self, o: mypy.nodes.NamedTupleExpr) -> T:
  127. pass
  128. @abstractmethod
  129. def visit_enum_call_expr(self, o: mypy.nodes.EnumCallExpr) -> T:
  130. pass
  131. @abstractmethod
  132. def visit_typeddict_expr(self, o: mypy.nodes.TypedDictExpr) -> T:
  133. pass
  134. @abstractmethod
  135. def visit_newtype_expr(self, o: mypy.nodes.NewTypeExpr) -> T:
  136. pass
  137. @abstractmethod
  138. def visit__promote_expr(self, o: mypy.nodes.PromoteExpr) -> T:
  139. pass
  140. @abstractmethod
  141. def visit_await_expr(self, o: mypy.nodes.AwaitExpr) -> T:
  142. pass
  143. @abstractmethod
  144. def visit_temp_node(self, o: mypy.nodes.TempNode) -> T:
  145. pass
  146. @trait
  147. @mypyc_attr(allow_interpreted_subclasses=True)
  148. class StatementVisitor(Generic[T]):
  149. # Definitions
  150. @abstractmethod
  151. def visit_assignment_stmt(self, o: mypy.nodes.AssignmentStmt) -> T:
  152. pass
  153. @abstractmethod
  154. def visit_for_stmt(self, o: mypy.nodes.ForStmt) -> T:
  155. pass
  156. @abstractmethod
  157. def visit_with_stmt(self, o: mypy.nodes.WithStmt) -> T:
  158. pass
  159. @abstractmethod
  160. def visit_del_stmt(self, o: mypy.nodes.DelStmt) -> T:
  161. pass
  162. @abstractmethod
  163. def visit_func_def(self, o: mypy.nodes.FuncDef) -> T:
  164. pass
  165. @abstractmethod
  166. def visit_overloaded_func_def(self, o: mypy.nodes.OverloadedFuncDef) -> T:
  167. pass
  168. @abstractmethod
  169. def visit_class_def(self, o: mypy.nodes.ClassDef) -> T:
  170. pass
  171. @abstractmethod
  172. def visit_global_decl(self, o: mypy.nodes.GlobalDecl) -> T:
  173. pass
  174. @abstractmethod
  175. def visit_nonlocal_decl(self, o: mypy.nodes.NonlocalDecl) -> T:
  176. pass
  177. @abstractmethod
  178. def visit_decorator(self, o: mypy.nodes.Decorator) -> T:
  179. pass
  180. # Module structure
  181. @abstractmethod
  182. def visit_import(self, o: mypy.nodes.Import) -> T:
  183. pass
  184. @abstractmethod
  185. def visit_import_from(self, o: mypy.nodes.ImportFrom) -> T:
  186. pass
  187. @abstractmethod
  188. def visit_import_all(self, o: mypy.nodes.ImportAll) -> T:
  189. pass
  190. # Statements
  191. @abstractmethod
  192. def visit_block(self, o: mypy.nodes.Block) -> T:
  193. pass
  194. @abstractmethod
  195. def visit_expression_stmt(self, o: mypy.nodes.ExpressionStmt) -> T:
  196. pass
  197. @abstractmethod
  198. def visit_operator_assignment_stmt(self, o: mypy.nodes.OperatorAssignmentStmt) -> T:
  199. pass
  200. @abstractmethod
  201. def visit_while_stmt(self, o: mypy.nodes.WhileStmt) -> T:
  202. pass
  203. @abstractmethod
  204. def visit_return_stmt(self, o: mypy.nodes.ReturnStmt) -> T:
  205. pass
  206. @abstractmethod
  207. def visit_assert_stmt(self, o: mypy.nodes.AssertStmt) -> T:
  208. pass
  209. @abstractmethod
  210. def visit_if_stmt(self, o: mypy.nodes.IfStmt) -> T:
  211. pass
  212. @abstractmethod
  213. def visit_break_stmt(self, o: mypy.nodes.BreakStmt) -> T:
  214. pass
  215. @abstractmethod
  216. def visit_continue_stmt(self, o: mypy.nodes.ContinueStmt) -> T:
  217. pass
  218. @abstractmethod
  219. def visit_pass_stmt(self, o: mypy.nodes.PassStmt) -> T:
  220. pass
  221. @abstractmethod
  222. def visit_raise_stmt(self, o: mypy.nodes.RaiseStmt) -> T:
  223. pass
  224. @abstractmethod
  225. def visit_try_stmt(self, o: mypy.nodes.TryStmt) -> T:
  226. pass
  227. @abstractmethod
  228. def visit_match_stmt(self, o: mypy.nodes.MatchStmt) -> T:
  229. pass
  230. @trait
  231. @mypyc_attr(allow_interpreted_subclasses=True)
  232. class PatternVisitor(Generic[T]):
  233. @abstractmethod
  234. def visit_as_pattern(self, o: mypy.patterns.AsPattern) -> T:
  235. pass
  236. @abstractmethod
  237. def visit_or_pattern(self, o: mypy.patterns.OrPattern) -> T:
  238. pass
  239. @abstractmethod
  240. def visit_value_pattern(self, o: mypy.patterns.ValuePattern) -> T:
  241. pass
  242. @abstractmethod
  243. def visit_singleton_pattern(self, o: mypy.patterns.SingletonPattern) -> T:
  244. pass
  245. @abstractmethod
  246. def visit_sequence_pattern(self, o: mypy.patterns.SequencePattern) -> T:
  247. pass
  248. @abstractmethod
  249. def visit_starred_pattern(self, o: mypy.patterns.StarredPattern) -> T:
  250. pass
  251. @abstractmethod
  252. def visit_mapping_pattern(self, o: mypy.patterns.MappingPattern) -> T:
  253. pass
  254. @abstractmethod
  255. def visit_class_pattern(self, o: mypy.patterns.ClassPattern) -> T:
  256. pass
  257. @trait
  258. @mypyc_attr(allow_interpreted_subclasses=True)
  259. class NodeVisitor(Generic[T], ExpressionVisitor[T], StatementVisitor[T], PatternVisitor[T]):
  260. """Empty base class for parse tree node visitors.
  261. The T type argument specifies the return type of the visit
  262. methods. As all methods defined here return None by default,
  263. subclasses do not always need to override all the methods.
  264. TODO: make the default return value explicit, then turn on
  265. empty body checking in mypy_self_check.ini.
  266. """
  267. # Not in superclasses:
  268. def visit_mypy_file(self, o: mypy.nodes.MypyFile) -> T:
  269. pass
  270. # TODO: We have a visit_var method, but no visit_typeinfo or any
  271. # other non-Statement SymbolNode (accepting those will raise a
  272. # runtime error). Maybe this should be resolved in some direction.
  273. def visit_var(self, o: mypy.nodes.Var) -> T:
  274. pass
  275. # Module structure
  276. def visit_import(self, o: mypy.nodes.Import) -> T:
  277. pass
  278. def visit_import_from(self, o: mypy.nodes.ImportFrom) -> T:
  279. pass
  280. def visit_import_all(self, o: mypy.nodes.ImportAll) -> T:
  281. pass
  282. # Definitions
  283. def visit_func_def(self, o: mypy.nodes.FuncDef) -> T:
  284. pass
  285. def visit_overloaded_func_def(self, o: mypy.nodes.OverloadedFuncDef) -> T:
  286. pass
  287. def visit_class_def(self, o: mypy.nodes.ClassDef) -> T:
  288. pass
  289. def visit_global_decl(self, o: mypy.nodes.GlobalDecl) -> T:
  290. pass
  291. def visit_nonlocal_decl(self, o: mypy.nodes.NonlocalDecl) -> T:
  292. pass
  293. def visit_decorator(self, o: mypy.nodes.Decorator) -> T:
  294. pass
  295. def visit_type_alias(self, o: mypy.nodes.TypeAlias) -> T:
  296. pass
  297. def visit_placeholder_node(self, o: mypy.nodes.PlaceholderNode) -> T:
  298. pass
  299. # Statements
  300. def visit_block(self, o: mypy.nodes.Block) -> T:
  301. pass
  302. def visit_expression_stmt(self, o: mypy.nodes.ExpressionStmt) -> T:
  303. pass
  304. def visit_assignment_stmt(self, o: mypy.nodes.AssignmentStmt) -> T:
  305. pass
  306. def visit_operator_assignment_stmt(self, o: mypy.nodes.OperatorAssignmentStmt) -> T:
  307. pass
  308. def visit_while_stmt(self, o: mypy.nodes.WhileStmt) -> T:
  309. pass
  310. def visit_for_stmt(self, o: mypy.nodes.ForStmt) -> T:
  311. pass
  312. def visit_return_stmt(self, o: mypy.nodes.ReturnStmt) -> T:
  313. pass
  314. def visit_assert_stmt(self, o: mypy.nodes.AssertStmt) -> T:
  315. pass
  316. def visit_del_stmt(self, o: mypy.nodes.DelStmt) -> T:
  317. pass
  318. def visit_if_stmt(self, o: mypy.nodes.IfStmt) -> T:
  319. pass
  320. def visit_break_stmt(self, o: mypy.nodes.BreakStmt) -> T:
  321. pass
  322. def visit_continue_stmt(self, o: mypy.nodes.ContinueStmt) -> T:
  323. pass
  324. def visit_pass_stmt(self, o: mypy.nodes.PassStmt) -> T:
  325. pass
  326. def visit_raise_stmt(self, o: mypy.nodes.RaiseStmt) -> T:
  327. pass
  328. def visit_try_stmt(self, o: mypy.nodes.TryStmt) -> T:
  329. pass
  330. def visit_with_stmt(self, o: mypy.nodes.WithStmt) -> T:
  331. pass
  332. def visit_match_stmt(self, o: mypy.nodes.MatchStmt) -> T:
  333. pass
  334. # Expressions (default no-op implementation)
  335. def visit_int_expr(self, o: mypy.nodes.IntExpr) -> T:
  336. pass
  337. def visit_str_expr(self, o: mypy.nodes.StrExpr) -> T:
  338. pass
  339. def visit_bytes_expr(self, o: mypy.nodes.BytesExpr) -> T:
  340. pass
  341. def visit_float_expr(self, o: mypy.nodes.FloatExpr) -> T:
  342. pass
  343. def visit_complex_expr(self, o: mypy.nodes.ComplexExpr) -> T:
  344. pass
  345. def visit_ellipsis(self, o: mypy.nodes.EllipsisExpr) -> T:
  346. pass
  347. def visit_star_expr(self, o: mypy.nodes.StarExpr) -> T:
  348. pass
  349. def visit_name_expr(self, o: mypy.nodes.NameExpr) -> T:
  350. pass
  351. def visit_member_expr(self, o: mypy.nodes.MemberExpr) -> T:
  352. pass
  353. def visit_yield_from_expr(self, o: mypy.nodes.YieldFromExpr) -> T:
  354. pass
  355. def visit_yield_expr(self, o: mypy.nodes.YieldExpr) -> T:
  356. pass
  357. def visit_call_expr(self, o: mypy.nodes.CallExpr) -> T:
  358. pass
  359. def visit_op_expr(self, o: mypy.nodes.OpExpr) -> T:
  360. pass
  361. def visit_comparison_expr(self, o: mypy.nodes.ComparisonExpr) -> T:
  362. pass
  363. def visit_cast_expr(self, o: mypy.nodes.CastExpr) -> T:
  364. pass
  365. def visit_assert_type_expr(self, o: mypy.nodes.AssertTypeExpr) -> T:
  366. pass
  367. def visit_reveal_expr(self, o: mypy.nodes.RevealExpr) -> T:
  368. pass
  369. def visit_super_expr(self, o: mypy.nodes.SuperExpr) -> T:
  370. pass
  371. def visit_assignment_expr(self, o: mypy.nodes.AssignmentExpr) -> T:
  372. pass
  373. def visit_unary_expr(self, o: mypy.nodes.UnaryExpr) -> T:
  374. pass
  375. def visit_list_expr(self, o: mypy.nodes.ListExpr) -> T:
  376. pass
  377. def visit_dict_expr(self, o: mypy.nodes.DictExpr) -> T:
  378. pass
  379. def visit_tuple_expr(self, o: mypy.nodes.TupleExpr) -> T:
  380. pass
  381. def visit_set_expr(self, o: mypy.nodes.SetExpr) -> T:
  382. pass
  383. def visit_index_expr(self, o: mypy.nodes.IndexExpr) -> T:
  384. pass
  385. def visit_type_application(self, o: mypy.nodes.TypeApplication) -> T:
  386. pass
  387. def visit_lambda_expr(self, o: mypy.nodes.LambdaExpr) -> T:
  388. pass
  389. def visit_list_comprehension(self, o: mypy.nodes.ListComprehension) -> T:
  390. pass
  391. def visit_set_comprehension(self, o: mypy.nodes.SetComprehension) -> T:
  392. pass
  393. def visit_dictionary_comprehension(self, o: mypy.nodes.DictionaryComprehension) -> T:
  394. pass
  395. def visit_generator_expr(self, o: mypy.nodes.GeneratorExpr) -> T:
  396. pass
  397. def visit_slice_expr(self, o: mypy.nodes.SliceExpr) -> T:
  398. pass
  399. def visit_conditional_expr(self, o: mypy.nodes.ConditionalExpr) -> T:
  400. pass
  401. def visit_type_var_expr(self, o: mypy.nodes.TypeVarExpr) -> T:
  402. pass
  403. def visit_paramspec_expr(self, o: mypy.nodes.ParamSpecExpr) -> T:
  404. pass
  405. def visit_type_var_tuple_expr(self, o: mypy.nodes.TypeVarTupleExpr) -> T:
  406. pass
  407. def visit_type_alias_expr(self, o: mypy.nodes.TypeAliasExpr) -> T:
  408. pass
  409. def visit_namedtuple_expr(self, o: mypy.nodes.NamedTupleExpr) -> T:
  410. pass
  411. def visit_enum_call_expr(self, o: mypy.nodes.EnumCallExpr) -> T:
  412. pass
  413. def visit_typeddict_expr(self, o: mypy.nodes.TypedDictExpr) -> T:
  414. pass
  415. def visit_newtype_expr(self, o: mypy.nodes.NewTypeExpr) -> T:
  416. pass
  417. def visit__promote_expr(self, o: mypy.nodes.PromoteExpr) -> T:
  418. pass
  419. def visit_await_expr(self, o: mypy.nodes.AwaitExpr) -> T:
  420. pass
  421. def visit_temp_node(self, o: mypy.nodes.TempNode) -> T:
  422. pass
  423. # Patterns
  424. def visit_as_pattern(self, o: mypy.patterns.AsPattern) -> T:
  425. pass
  426. def visit_or_pattern(self, o: mypy.patterns.OrPattern) -> T:
  427. pass
  428. def visit_value_pattern(self, o: mypy.patterns.ValuePattern) -> T:
  429. pass
  430. def visit_singleton_pattern(self, o: mypy.patterns.SingletonPattern) -> T:
  431. pass
  432. def visit_sequence_pattern(self, o: mypy.patterns.SequencePattern) -> T:
  433. pass
  434. def visit_starred_pattern(self, o: mypy.patterns.StarredPattern) -> T:
  435. pass
  436. def visit_mapping_pattern(self, o: mypy.patterns.MappingPattern) -> T:
  437. pass
  438. def visit_class_pattern(self, o: mypy.patterns.ClassPattern) -> T:
  439. pass