visitors.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. """Visitor classes pulled out from different tests
  2. These are here because we don't currently support having interpreted
  3. classes subtype compiled ones but pytest grabs the python file
  4. even if the test was compiled.
  5. """
  6. from __future__ import annotations
  7. from mypy.nodes import AssignmentStmt, CallExpr, Expression, IntExpr, NameExpr, Node, TypeVarExpr
  8. from mypy.traverser import TraverserVisitor
  9. from mypy.treetransform import TransformVisitor
  10. from mypy.types import Type
  11. # from testtypegen
  12. class SkippedNodeSearcher(TraverserVisitor):
  13. def __init__(self) -> None:
  14. self.nodes: set[Node] = set()
  15. self.ignore_file = False
  16. def visit_assignment_stmt(self, s: AssignmentStmt) -> None:
  17. if s.type or ignore_node(s.rvalue):
  18. for lvalue in s.lvalues:
  19. if isinstance(lvalue, NameExpr):
  20. self.nodes.add(lvalue)
  21. super().visit_assignment_stmt(s)
  22. def visit_name_expr(self, n: NameExpr) -> None:
  23. if self.ignore_file:
  24. self.nodes.add(n)
  25. super().visit_name_expr(n)
  26. def visit_int_expr(self, n: IntExpr) -> None:
  27. if self.ignore_file:
  28. self.nodes.add(n)
  29. super().visit_int_expr(n)
  30. def ignore_node(node: Expression) -> bool:
  31. """Return True if node is to be omitted from test case output."""
  32. # We want to get rid of object() expressions in the typing module stub
  33. # and also TypeVar(...) expressions. Since detecting whether a node comes
  34. # from the typing module is not easy, we just to strip them all away.
  35. if isinstance(node, TypeVarExpr):
  36. return True
  37. if isinstance(node, NameExpr) and node.fullname == "builtins.object":
  38. return True
  39. if isinstance(node, NameExpr) and node.fullname == "builtins.None":
  40. return True
  41. if isinstance(node, CallExpr) and (ignore_node(node.callee) or node.analyzed):
  42. return True
  43. return False
  44. # from testtransform
  45. class TypeAssertTransformVisitor(TransformVisitor):
  46. def type(self, type: Type) -> Type:
  47. assert type is not None
  48. return type