class VariableRenameVisitor(TraverserVisitor): (source)
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 | rename_refs |
Undocumented |
Method | visit_assignment_stmt |
Undocumented |
Method | visit_block |
Undocumented |
Method | visit_break_stmt |
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_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_assert_stmt |
Undocumented |
Method | visit_assignment_expr |
Undocumented |
Method | visit_await_expr |
Undocumented |
Method | visit_backquote_expr |
Undocumented |
Method | visit_call_expr |
Undocumented |
Method | visit_cast_expr |
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_exec_stmt |
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_member_expr |
Undocumented |
Method | visit_op_expr |
Undocumented |
Method | visit_operator_assignment_stmt |
Undocumented |
Method | visit_overloaded_func_def |
Undocumented |
Method | visit_print_stmt |
Undocumented |
Method | visit_raise_stmt |
Undocumented |
Method | visit_return_stmt |
Undocumented |
Method | visit_reveal_expr |
Undocumented |
Method | visit_set_comprehension |
Undocumented |
Method | visit_set_expr |
Undocumented |
Method | visit_slice_expr |
Undocumented |
Method | visit_star_expr |
Undocumented |
Method | visit_super_expr |
Undocumented |
Method | visit_tuple_expr |
Undocumented |
Method | visit_type_application |
Undocumented |
Method | visit_unary_expr |
Undocumented |
Method | visit_yield_expr |
Undocumented |
Method | visit_yield_from_expr |
Undocumented |
Process assignment; in particular, keep track of (re)defined names.
Parameters | |
lvalue:Lvalue | Undocumented |
is_nested:bool | Undocumented |
Parameters | |
expr:NameExpr | Undocumented |
Record assignment to given name and return True if it defines a new variable.
Parameters | |
name:str | Undocumented |
can_be_redefined:bool | Undocumented |
Returns | |
bool | Undocumented |
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():
breakx = '' # Error -- not a redefinition
reveal_type(x) # int
This method ensures that the second assignment to 'x' doesn't introduce a new variable.
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
Rename variables within a file.
This is the main entry point to this class.
Parameters | |
file_node:MypyFile | Undocumented |