MCPcopy Index your code
hub / github.com/python/mypy / RefInfoVisitor

Class RefInfoVisitor

mypy/refinfo.py:29–67  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

27
28
29class RefInfoVisitor(TraverserVisitor):
30 def __init__(self, type_map: dict[Expression, Type]) -> None:
31 super().__init__()
32 self.type_map = type_map
33 self.data: list[dict[str, object]] = []
34
35 def visit_name_expr(self, expr: NameExpr) -> None:
36 super().visit_name_expr(expr)
37 self.record_ref_expr(expr)
38
39 def visit_member_expr(self, expr: MemberExpr) -> None:
40 super().visit_member_expr(expr)
41 self.record_ref_expr(expr)
42
43 def visit_func_def(self, func: FuncDef) -> None:
44 if func.expanded:
45 for item in func.expanded:
46 if isinstance(item, FuncDef):
47 super().visit_func_def(item)
48 else:
49 super().visit_func_def(func)
50
51 def record_ref_expr(self, expr: RefExpr) -> None:
52 fullname = None
53 if expr.kind != LDEF and "." in expr.fullname:
54 fullname = expr.fullname
55 elif isinstance(expr, MemberExpr):
56 typ = self.type_map.get(expr.expr)
57 sym = None
58 if isinstance(expr.expr, RefExpr):
59 sym = expr.expr.node
60 if typ:
61 tfn = type_fullname(typ, sym)
62 if tfn:
63 fullname = f"{tfn}.{expr.name}"
64 if not fullname:
65 fullname = f"*.{expr.name}"
66 if fullname is not None:
67 self.data.append({"line": expr.line, "column": expr.column, "target": fullname})
68
69
70def type_fullname(typ: Type, node: SymbolNode | None = None) -> str | None:

Callers 1

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…