Guest User

Untitled

a guest
Oct 1st, 2024
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.72 KB | None | 0 0
  1. from mypy.nodes import (
  2. REVEAL_TYPE,
  3. AssertStmt,
  4. AssertTypeExpr,
  5. AssignmentExpr,
  6. AssignmentStmt,
  7. AwaitExpr,
  8. Block,
  9. CallExpr,
  10. CastExpr,
  11. ClassDef,
  12. ComparisonExpr,
  13. ConditionalExpr,
  14. Decorator,
  15. DelStmt,
  16. DictExpr,
  17. DictionaryComprehension,
  18. ExpressionStmt,
  19. ForStmt,
  20. FuncDef,
  21. FuncItem,
  22. GeneratorExpr,
  23. IfStmt,
  24. Import,
  25. ImportFrom,
  26. IndexExpr,
  27. LambdaExpr,
  28. ListComprehension,
  29. ListExpr,
  30. MatchStmt,
  31. MemberExpr,
  32. MypyFile,
  33. Node,
  34. OperatorAssignmentStmt,
  35. OpExpr,
  36. OverloadedFuncDef,
  37. RaiseStmt,
  38. ReturnStmt,
  39. RevealExpr,
  40. SetComprehension,
  41. SetExpr,
  42. SliceExpr,
  43. StarExpr,
  44. SuperExpr,
  45. TryStmt,
  46. TupleExpr,
  47. TypeApplication,
  48. UnaryExpr,
  49. WhileStmt,
  50. WithStmt,
  51. YieldExpr,
  52. YieldFromExpr,
  53. )
  54. from mypy.patterns import (
  55. AsPattern,
  56. ClassPattern,
  57. MappingPattern,
  58. OrPattern,
  59. SequencePattern,
  60. StarredPattern,
  61. ValuePattern,
  62. )
  63.  
  64.  
  65. # an inversion of mypy's visitor pattern to allow compatibility in mypy's compiled mode.
  66. # instead of node.accept(visitor), which breaks when the visitor is an extension of any compiled mypy visitor class,
  67. # we call traverser.visit_node(node).
  68. # Implementations for each node type are taken from mypy.traverser.TraverserVisitor, and adapted to this pattern.
  69. class DirectTraverser:
  70. # Implementation for each case taken from the accept() method for each node class
  71. def visit_node(self, node: Node) -> None:
  72. match node:
  73. case MypyFile():
  74. self.visit_mypy_file(node)
  75. case Block():
  76. self.visit_block(node)
  77. case FuncItem():
  78. self.visit_func(node)
  79. case FuncDef():
  80. self.visit_func_def(node)
  81. case OverloadedFuncDef():
  82. self.visit_overloaded_func_def(node)
  83. case ClassDef():
  84. self.visit_class_def(node)
  85. case Decorator():
  86. self.visit_decorator(node)
  87. case ExpressionStmt():
  88. self.visit_expression_stmt(node)
  89. case AssignmentStmt():
  90. self.visit_assignment_stmt(node)
  91. case OperatorAssignmentStmt():
  92. self.visit_operator_assignment_stmt(node)
  93. case WhileStmt():
  94. self.visit_while_stmt(node)
  95. case ForStmt():
  96. self.visit_for_stmt(node)
  97. case ReturnStmt():
  98. self.visit_return_stmt(node)
  99. case AssertStmt():
  100. self.visit_assert_stmt(node)
  101. case DelStmt():
  102. self.visit_del_stmt(node)
  103. case IfStmt():
  104. self.visit_if_stmt(node)
  105. case RaiseStmt():
  106. self.visit_raise_stmt(node)
  107. case TryStmt():
  108. self.visit_try_stmt(node)
  109. case WithStmt():
  110. self.visit_with_stmt(node)
  111. case MatchStmt():
  112. self.visit_match_stmt(node)
  113. case MemberExpr():
  114. self.visit_member_expr(node)
  115. case YieldFromExpr():
  116. self.visit_yield_from_expr(node)
  117. case YieldExpr():
  118. self.visit_yield_expr(node)
  119. case CallExpr():
  120. self.visit_call_expr(node)
  121. case OpExpr():
  122. self.visit_op_expr(node)
  123. case ComparisonExpr():
  124. self.visit_comparison_expr(node)
  125. case SliceExpr():
  126. self.visit_slice_expr(node)
  127. case CastExpr():
  128. self.visit_cast_expr(node)
  129. case AssertTypeExpr():
  130. self.visit_assert_type_expr(node)
  131. case RevealExpr():
  132. self.visit_reveal_expr(node)
  133. case AssignmentExpr():
  134. self.visit_assignment_expr(node)
  135. case UnaryExpr():
  136. self.visit_unary_expr(node)
  137. case ListExpr():
  138. self.visit_list_expr(node)
  139. case TupleExpr():
  140. self.visit_tuple_expr(node)
  141. case DictExpr():
  142. self.visit_dict_expr(node)
  143. case SetExpr():
  144. self.visit_set_expr(node)
  145. case IndexExpr():
  146. self.visit_index_expr(node)
  147. case GeneratorExpr():
  148. self.visit_generator_expr(node)
  149. case DictionaryComprehension():
  150. self.visit_dictionary_comprehension(node)
  151. case ListComprehension():
  152. self.visit_list_comprehension(node)
  153. case SetComprehension():
  154. self.visit_set_comprehension(node)
  155. case ConditionalExpr():
  156. self.visit_conditional_expr(node)
  157. case TypeApplication():
  158. self.visit_type_application(node)
  159. case LambdaExpr():
  160. self.visit_lambda_expr(node)
  161. case StarExpr():
  162. self.visit_star_expr(node)
  163. case AwaitExpr():
  164. self.visit_await_expr(node)
  165. case SuperExpr():
  166. self.visit_super_expr(node)
  167. case AsPattern():
  168. self.visit_as_pattern(node)
  169. case OrPattern():
  170. self.visit_or_pattern(node)
  171. case ValuePattern():
  172. self.visit_value_pattern(node)
  173. case SequencePattern():
  174. self.visit_sequence_pattern(node)
  175. case StarredPattern():
  176. self.visit_starred_pattern(node)
  177. case MappingPattern():
  178. self.visit_mapping_pattern(node)
  179. case ClassPattern():
  180. self.visit_class_pattern(node)
  181. case Import():
  182. self.visit_import(node)
  183. case ImportFrom():
  184. self.visit_import_from(node)
  185.  
  186. # if we hit a node type that TraverserVisitor doesn't implement, just pass
  187. # as the node is either effectively or explicitly a leaf node in the AST
  188. case _:
  189. pass
  190.  
  191. def visit_mypy_file(self, o: MypyFile) -> None:
  192. for d in o.defs:
  193. self.visit_node(d)
  194.  
  195. def visit_block(self, block: Block) -> None:
  196. for s in block.body:
  197. self.visit_node(s)
  198.  
  199. def visit_func(self, o: FuncItem) -> None:
  200. if o.arguments is not None:
  201. for arg in o.arguments:
  202. init = arg.initializer
  203. if init is not None:
  204. self.visit_node(init)
  205.  
  206. self.visit_node(o.body)
  207.  
  208. def visit_func_def(self, o: FuncDef) -> None:
  209. self.visit_func(o)
  210.  
  211. def visit_overloaded_func_def(self, o: OverloadedFuncDef) -> None:
  212. for item in o.items:
  213. self.visit_node(item)
  214. if o.impl:
  215. self.visit_node(o.impl)
  216.  
  217. def visit_class_def(self, o: ClassDef) -> None:
  218. for d in o.decorators:
  219. self.visit_node(d)
  220. for base in o.base_type_exprs:
  221. self.visit_node(base)
  222. if o.metaclass:
  223. self.visit_node(o.metaclass)
  224. for v in o.keywords.values():
  225. self.visit_node(v)
  226. self.visit_node(o.defs)
  227. if o.analyzed:
  228. self.visit_node(o.analyzed)
  229.  
  230. def visit_decorator(self, o: Decorator) -> None:
  231. self.visit_node(o.func)
  232. self.visit_node(o.var)
  233. for decorator in o.decorators:
  234. self.visit_node(decorator)
  235.  
  236. def visit_expression_stmt(self, o: ExpressionStmt) -> None:
  237. self.visit_node(o.expr)
  238.  
  239. def visit_assignment_stmt(self, o: AssignmentStmt) -> None:
  240. self.visit_node(o.rvalue)
  241. for l in o.lvalues:
  242. self.visit_node(l)
  243.  
  244. def visit_operator_assignment_stmt(self, o: OperatorAssignmentStmt) -> None:
  245. self.visit_node(o.rvalue)
  246. self.visit_node(o.lvalue)
  247.  
  248. def visit_while_stmt(self, o: WhileStmt) -> None:
  249. self.visit_node(o.expr)
  250. self.visit_node(o.body)
  251. if o.else_body:
  252. self.visit_node(o.else_body)
  253.  
  254. def visit_for_stmt(self, o: ForStmt) -> None:
  255. self.visit_node(o.index)
  256. self.visit_node(o.expr)
  257. self.visit_node(o.body)
  258. if o.else_body:
  259. self.visit_node(o.else_body)
  260.  
  261. def visit_return_stmt(self, o: ReturnStmt) -> None:
  262. if o.expr is not None:
  263. self.visit_node(o.expr)
  264.  
  265. def visit_assert_stmt(self, o: AssertStmt) -> None:
  266. if o.expr is not None:
  267. self.visit_node(o.expr)
  268. if o.msg is not None:
  269. self.visit_node(o.msg)
  270.  
  271. def visit_del_stmt(self, o: DelStmt) -> None:
  272. if o.expr is not None:
  273. self.visit_node(o.expr)
  274.  
  275. def visit_if_stmt(self, o: IfStmt) -> None:
  276. for e in o.expr:
  277. self.visit_node(e)
  278. for b in o.body:
  279. self.visit_node(b)
  280. if o.else_body:
  281. self.visit_node(o.else_body)
  282.  
  283. def visit_raise_stmt(self, o: RaiseStmt) -> None:
  284. if o.expr is not None:
  285. self.visit_node(o.expr)
  286. if o.from_expr is not None:
  287. self.visit_node(o.from_expr)
  288.  
  289. def visit_try_stmt(self, o: TryStmt) -> None:
  290. self.visit_node(o.body)
  291. for i in range(len(o.types)):
  292. tp = o.types[i]
  293. if tp is not None:
  294. self.visit_node(tp)
  295. self.visit_node(o.handlers[i])
  296. for v in o.vars:
  297. if v is not None:
  298. self.visit_node(v)
  299. if o.else_body is not None:
  300. self.visit_node(o.else_body)
  301. if o.finally_body is not None:
  302. self.visit_node(o.finally_body)
  303.  
  304. def visit_with_stmt(self, o: WithStmt) -> None:
  305. for i in range(len(o.expr)):
  306. self.visit_node(o.expr[i])
  307. targ = o.target[i]
  308. if targ is not None:
  309. self.visit_node(targ)
  310. self.visit_node(o.body)
  311.  
  312. def visit_match_stmt(self, o: MatchStmt) -> None:
  313. self.visit_node(o.subject)
  314. for i in range(len(o.patterns)):
  315. self.visit_node(o.patterns[i])
  316. guard = o.guards[i]
  317. if guard is not None:
  318. self.visit_node(guard)
  319. self.visit_node(o.bodies[i])
  320.  
  321. def visit_member_expr(self, o: MemberExpr) -> None:
  322. self.visit_node(o.expr)
  323.  
  324. def visit_yield_from_expr(self, o: YieldFromExpr) -> None:
  325. self.visit_node(o.expr)
  326.  
  327. def visit_yield_expr(self, o: YieldExpr) -> None:
  328. if o.expr:
  329. self.visit_node(o.expr)
  330.  
  331. def visit_call_expr(self, o: CallExpr) -> None:
  332. self.visit_node(o.callee)
  333. for a in o.args:
  334. self.visit_node(a)
  335. if o.analyzed:
  336. self.visit_node(o.analyzed)
  337.  
  338. def visit_op_expr(self, o: OpExpr) -> None:
  339. self.visit_node(o.left)
  340. self.visit_node(o.right)
  341. if o.analyzed is not None:
  342. self.visit_node(o.analyzed)
  343.  
  344. def visit_comparison_expr(self, o: ComparisonExpr) -> None:
  345. for operand in o.operands:
  346. self.visit_node(operand)
  347.  
  348. def visit_slice_expr(self, o: SliceExpr) -> None:
  349. if o.begin_index is not None:
  350. self.visit_node(o.begin_index)
  351. if o.end_index is not None:
  352. self.visit_node(o.end_index)
  353. if o.stride is not None:
  354. self.visit_node(o.stride)
  355.  
  356. def visit_cast_expr(self, o: CastExpr) -> None:
  357. self.visit_node(o.expr)
  358.  
  359. def visit_assert_type_expr(self, o: AssertTypeExpr) -> None:
  360. self.visit_node(o.expr)
  361.  
  362. def visit_reveal_expr(self, o: RevealExpr) -> None:
  363. if o.kind == REVEAL_TYPE:
  364. assert o.expr is not None
  365. self.visit_node(o.expr)
  366. else:
  367. # RevealLocalsExpr doesn't have an inner expression
  368. pass
  369.  
  370. def visit_assignment_expr(self, o: AssignmentExpr) -> None:
  371. self.visit_node(o.target)
  372. self.visit_node(o.value)
  373.  
  374. def visit_unary_expr(self, o: UnaryExpr) -> None:
  375. self.visit_node(o.expr)
  376.  
  377. def visit_list_expr(self, o: ListExpr) -> None:
  378. for item in o.items:
  379. self.visit_node(item)
  380.  
  381. def visit_tuple_expr(self, o: TupleExpr) -> None:
  382. for item in o.items:
  383. self.visit_node(item)
  384.  
  385. def visit_dict_expr(self, o: DictExpr) -> None:
  386. for k, v in o.items:
  387. if k is not None:
  388. self.visit_node(k)
  389. self.visit_node(v)
  390.  
  391. def visit_set_expr(self, o: SetExpr) -> None:
  392. for item in o.items:
  393. self.visit_node(item)
  394.  
  395. def visit_index_expr(self, o: IndexExpr) -> None:
  396. self.visit_node(o.base)
  397. self.visit_node(o.index)
  398. if o.analyzed:
  399. self.visit_node(o.analyzed)
  400.  
  401. def visit_generator_expr(self, o: GeneratorExpr) -> None:
  402. for index, sequence, conditions in zip(o.indices, o.sequences, o.condlists):
  403. self.visit_node(sequence)
  404. self.visit_node(index)
  405. for cond in conditions:
  406. self.visit_node(cond)
  407. self.visit_node(o.left_expr)
  408.  
  409. def visit_dictionary_comprehension(self, o: DictionaryComprehension) -> None:
  410. for index, sequence, conditions in zip(o.indices, o.sequences, o.condlists):
  411. self.visit_node(sequence)
  412. self.visit_node(index)
  413. for cond in conditions:
  414. self.visit_node(cond)
  415. self.visit_node(o.key)
  416. self.visit_node(o.value)
  417.  
  418. def visit_list_comprehension(self, o: ListComprehension) -> None:
  419. self.visit_node(o.generator)
  420.  
  421. def visit_set_comprehension(self, o: SetComprehension) -> None:
  422. self.visit_node(o.generator)
  423.  
  424. def visit_conditional_expr(self, o: ConditionalExpr) -> None:
  425. self.visit_node(o.cond)
  426. self.visit_node(o.if_expr)
  427. self.visit_node(o.else_expr)
  428.  
  429. def visit_type_application(self, o: TypeApplication) -> None:
  430. self.visit_node(o.expr)
  431.  
  432. def visit_lambda_expr(self, o: LambdaExpr) -> None:
  433. self.visit_func(o)
  434.  
  435. def visit_star_expr(self, o: StarExpr) -> None:
  436. self.visit_node(o.expr)
  437.  
  438. def visit_await_expr(self, o: AwaitExpr) -> None:
  439. self.visit_node(o.expr)
  440.  
  441. def visit_super_expr(self, o: SuperExpr) -> None:
  442. self.visit_node(o.call)
  443.  
  444. def visit_as_pattern(self, o: AsPattern) -> None:
  445. if o.pattern is not None:
  446. self.visit_node(o.pattern)
  447. if o.name is not None:
  448. self.visit_node(o.name)
  449.  
  450. def visit_or_pattern(self, o: OrPattern) -> None:
  451. for p in o.patterns:
  452. self.visit_node(p)
  453.  
  454. def visit_value_pattern(self, o: ValuePattern) -> None:
  455. self.visit_node(o.expr)
  456.  
  457. def visit_sequence_pattern(self, o: SequencePattern) -> None:
  458. for p in o.patterns:
  459. self.visit_node(p)
  460.  
  461. def visit_starred_pattern(self, o: StarredPattern) -> None:
  462. if o.capture is not None:
  463. self.visit_node(o.capture)
  464.  
  465. def visit_mapping_pattern(self, o: MappingPattern) -> None:
  466. for key in o.keys:
  467. self.visit_node(key)
  468. for value in o.values:
  469. self.visit_node(value)
  470. if o.rest is not None:
  471. self.visit_node(o.rest)
  472.  
  473. def visit_class_pattern(self, o: ClassPattern) -> None:
  474. self.visit_node(o.class_ref)
  475. for p in o.positionals:
  476. self.visit_node(p)
  477. for v in o.keyword_values:
  478. self.visit_node(v)
  479.  
  480. def visit_import(self, o: Import) -> None:
  481. for a in o.assignments:
  482. self.visit_node(a)
  483.  
  484. def visit_import_from(self, o: ImportFrom) -> None:
  485. for a in o.assignments:
  486. self.visit_node(a)
  487.  
Advertisement
Add Comment
Please, Sign In to add comment