class documentation

class VariableRenameVisitor(TraverserVisitor): (source)

View In Hierarchy

Rename variables to allow redefinition of variables. For example, consider this code: x = 0 f(x) x = "a" g(x) It will be transformed like this: x' = 0 f(x') x = "a" g(x) There will be two independent variables (x' and x) that will have separate inferred types. The publicly exposed variant will get the non-suffixed name. This is the last definition at module top level and the first definition (argument) within a function. Renaming only happens for assignments within the same block. Renaming is performed before semantic analysis, immediately after parsing. The implementation performs a rudimentary static analysis. The analysis is overly conservative to keep things simple.

Method __init__ Undocumented
Method analyze_lvalue Process assignment; in particular, keep track of (re)defined names.
Method clear Undocumented
Method current_block Undocumented
Method enter_block Undocumented
Method enter_loop Undocumented
Method enter_scope Undocumented
Method enter_try Undocumented
Method flush_refs Rename all references within the current scope.
Method handle_arg Store function argument.
Method handle_def Store new name definition.
Method handle_ref Store reference to defined name.
Method handle_refine Store assignment to an existing name (that replaces previous value, if any).
Method is_nested Undocumented
Method record_assignment Record assignment to given name and return True if it defines a new variable.
Method reject_redefinition_of_vars_in_loop Reject redefinition of variables in the innermost loop.
Method reject_redefinition_of_vars_in_scope Make it impossible to redefine defined variables in the current scope.
Method visit_assignment_stmt Undocumented
Method visit_block Undocumented
Method visit_break_stmt Undocumented
Method visit_capture_pattern Undocumented
Method visit_class_def Undocumented
Method visit_continue_stmt Undocumented
Method visit_for_stmt Undocumented
Method visit_func_def Undocumented
Method visit_import Undocumented
Method visit_import_from Undocumented
Method visit_match_stmt Undocumented
Method visit_mypy_file Rename variables within a file.
Method visit_name_expr Undocumented
Method visit_try_stmt Undocumented
Method visit_while_stmt Undocumented
Method visit_with_stmt Undocumented
Instance Variable block_id Undocumented
Instance Variable block_loop_depth Undocumented
Instance Variable blocks Undocumented
Instance Variable disallow_redef_depth Undocumented
Instance Variable loop_depth Undocumented
Instance Variable num_reads Undocumented
Instance Variable refs Undocumented
Instance Variable scope_kinds Undocumented
Instance Variable var_blocks Undocumented

Inherited from TraverserVisitor:

Method visit_as_pattern Undocumented
Method visit_assert_stmt Undocumented
Method visit_assert_type_expr Undocumented
Method visit_assignment_expr Undocumented
Method visit_await_expr Undocumented
Method visit_call_expr Undocumented
Method visit_cast_expr Undocumented
Method visit_class_pattern Undocumented
Method visit_comparison_expr Undocumented
Method visit_conditional_expr Undocumented
Method visit_decorator Undocumented
Method visit_del_stmt Undocumented
Method visit_dict_expr Undocumented
Method visit_dictionary_comprehension Undocumented
Method visit_expression_stmt Undocumented
Method visit_func Undocumented
Method visit_generator_expr Undocumented
Method visit_if_stmt Undocumented
Method visit_index_expr Undocumented
Method visit_lambda_expr Undocumented
Method visit_list_comprehension Undocumented
Method visit_list_expr Undocumented
Method visit_mapping_pattern Undocumented
Method visit_member_expr Undocumented
Method visit_op_expr Undocumented
Method visit_operator_assignment_stmt Undocumented
Method visit_or_pattern Undocumented
Method visit_overloaded_func_def Undocumented
Method visit_raise_stmt Undocumented
Method visit_return_stmt Undocumented
Method visit_reveal_expr Undocumented
Method visit_sequence_pattern Undocumented
Method visit_set_comprehension Undocumented
Method visit_set_expr Undocumented
Method visit_slice_expr Undocumented
Method visit_star_expr Undocumented
Method visit_starred_pattern Undocumented
Method visit_super_expr Undocumented
Method visit_tuple_expr Undocumented
Method visit_type_application Undocumented
Method visit_unary_expr Undocumented
Method visit_value_pattern Undocumented
Method visit_yield_expr Undocumented
Method visit_yield_from_expr Undocumented

Inherited from NodeVisitor (via TraverserVisitor):

Method visit__promote_expr Undocumented
Method visit_bytes_expr Undocumented
Method visit_complex_expr Undocumented
Method visit_ellipsis Undocumented
Method visit_enum_call_expr Undocumented
Method visit_float_expr Undocumented
Method visit_global_decl Undocumented
Method visit_import_all Undocumented
Method visit_int_expr Undocumented
Method visit_namedtuple_expr Undocumented
Method visit_newtype_expr Undocumented
Method visit_nonlocal_decl Undocumented
Method visit_paramspec_expr Undocumented
Method visit_pass_stmt Undocumented
Method visit_placeholder_node Undocumented
Method visit_singleton_pattern Undocumented
Method visit_str_expr Undocumented
Method visit_temp_node Undocumented
Method visit_type_alias Undocumented
Method visit_type_alias_expr Undocumented
Method visit_type_var_expr Undocumented
Method visit_type_var_tuple_expr Undocumented
Method visit_typeddict_expr Undocumented
Method visit_var Undocumented
def __init__(self): (source)
def analyze_lvalue(self, lvalue: Lvalue, is_nested: bool = False): (source)

Process assignment; in particular, keep track of (re)defined names. Args: is_nested: True for non-outermost Lvalue in a multiple assignment such as "x, y = ..."

def clear(self): (source)

Undocumented

def current_block(self) -> int: (source)

Undocumented

@contextmanager
def enter_block(self) -> Iterator[None]: (source)

Undocumented

@contextmanager
def enter_loop(self) -> Iterator[None]: (source)

Undocumented

@contextmanager
def enter_scope(self, kind: int) -> Iterator[None]: (source)

Undocumented

@contextmanager
def enter_try(self) -> Iterator[None]: (source)

Undocumented

def flush_refs(self): (source)

Rename all references within the current scope. This will be called at the end of a scope.

def handle_arg(self, name: str): (source)

Store function argument.

def handle_def(self, expr: NameExpr): (source)

Store new name definition.

def handle_ref(self, expr: NameExpr): (source)

Store reference to defined name.

def handle_refine(self, expr: NameExpr): (source)

Store assignment to an existing name (that replaces previous value, if any).

def is_nested(self) -> int: (source)

Undocumented

def record_assignment(self, name: str, can_be_redefined: bool) -> bool: (source)

Record assignment to given name and return True if it defines a new variable. Args: can_be_redefined: If True, allows assignment in the same block to redefine this name (if this is a new definition)

def reject_redefinition_of_vars_in_loop(self): (source)

Reject redefinition of variables in the innermost loop. If there is an early exit from a loop, there may be ambiguity about which value may escape the loop. Example where this matters: while f(): x = 0 if g(): break x = '' # Error -- not a redefinition reveal_type(x) # int This method ensures that the second assignment to 'x' doesn't introduce a new variable.

def reject_redefinition_of_vars_in_scope(self): (source)

Make it impossible to redefine defined variables in the current scope. This is used if we encounter a function definition that can make it ambiguous which definition is live. Example: x = 0 def f() -> int: return x x = '' # Error -- cannot redefine x across function definition

def visit_assignment_stmt(self, s: AssignmentStmt): (source)
def visit_block(self, block: Block): (source)
def visit_break_stmt(self, stmt: BreakStmt): (source)
def visit_capture_pattern(self, p: AsPattern): (source)

Undocumented

def visit_class_def(self, cdef: ClassDef): (source)
def visit_continue_stmt(self, stmt: ContinueStmt): (source)
def visit_for_stmt(self, stmt: ForStmt): (source)
def visit_func_def(self, fdef: FuncDef): (source)
def visit_import(self, imp: Import): (source)
def visit_import_from(self, imp: ImportFrom): (source)
def visit_match_stmt(self, s: MatchStmt): (source)
def visit_mypy_file(self, file_node: MypyFile): (source)

Rename variables within a file. This is the main entry point to this class.

def visit_name_expr(self, expr: NameExpr): (source)
def visit_try_stmt(self, stmt: TryStmt): (source)
def visit_while_stmt(self, stmt: WhileStmt): (source)
def visit_with_stmt(self, stmt: WithStmt): (source)
block_id: int = (source)

Undocumented

block_loop_depth: dict[int, int] = (source)

Undocumented

Undocumented

disallow_redef_depth: int = (source)

Undocumented

loop_depth: int = (source)

Undocumented

num_reads: list[dict[str, int]] = (source)

Undocumented

Undocumented

scope_kinds: list[int] = (source)

Undocumented

var_blocks: list = (source)

Undocumented