Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion personal_python_ast_optimizer/parser/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,21 +137,24 @@ class OptimizationsConfig(_Config):
"vars_to_fold",
"enums_to_fold",
"functions_safe_to_exclude_in_test_expr",
"remove_typing_cast",
"remove_unused_imports",
"fold_constants",
"assume_this_machine",
)

def __init__( # noqa: PLR0913
self,
*,
vars_to_fold: dict[
str, str | bytes | bool | int | float | complex | None | EllipsisType
]
| None = None,
enums_to_fold: Iterable[EnumType] | None = None,
functions_safe_to_exclude_in_test_expr: set[str] | None = None,
fold_constants: bool = True,
remove_unused_imports: bool = True,
remove_typing_cast: bool = True,
fold_constants: bool = False,
assume_this_machine: bool = False,
) -> None:
self.vars_to_fold: dict[
Expand All @@ -167,6 +170,7 @@ def __init__( # noqa: PLR0913
or default_functions_safe_to_exclude_in_test_expr
)
self.remove_unused_imports: bool = remove_unused_imports
self.remove_typing_cast: bool = remove_typing_cast
self.assume_this_machine: bool = assume_this_machine
self.fold_constants: bool = fold_constants

Expand Down
8 changes: 8 additions & 0 deletions personal_python_ast_optimizer/parser/skipper.py
Original file line number Diff line number Diff line change
Expand Up @@ -587,6 +587,14 @@ def visit_Call(self, node: ast.Call) -> ast.AST | None:
if function_call_key in machine_dependent_functions:
return ast.Constant(machine_dependent_functions[function_call_key])

if (
self.optimizations_config.remove_typing_cast
and isinstance(node.func, ast.Name)
and node.func.id == "cast"
and len(node.args) == 2 # noqa: PLR2004
):
return self.generic_visit(node.args[1])

return self.generic_visit(node)

def visit_Constant(self, node: ast.Constant) -> ast.Constant:
Expand Down
5 changes: 4 additions & 1 deletion tests/parser/test_constant_folding.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import pytest

from personal_python_ast_optimizer.parser.config import OptimizationsConfig
from tests.utils import BeforeAndAfter, run_minifier_and_assert_correct

_binary_op_folding_cases = [
Expand All @@ -15,7 +16,9 @@

@pytest.mark.parametrize("before_and_after", _binary_op_folding_cases)
def test_binary_op_folding(before_and_after: BeforeAndAfter):
run_minifier_and_assert_correct(before_and_after)
run_minifier_and_assert_correct(
before_and_after, optimizations_config=OptimizationsConfig(fold_constants=True)
)


def test_string_folding():
Expand Down
35 changes: 34 additions & 1 deletion tests/parser/test_functions.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
from personal_python_ast_optimizer.parser.config import TokenTypesConfig
from personal_python_ast_optimizer.parser.config import (
OptimizationsConfig,
TokenTypesConfig,
)
from tests.utils import BeforeAndAfter, run_minifier_and_assert_correct


Expand Down Expand Up @@ -76,3 +79,33 @@ def test_overload(a: float) -> int: do_something()
before_and_after,
token_types_config=TokenTypesConfig(skip_overload_functions=True),
)


def test_typing_cast_remove():
before_and_after = BeforeAndAfter(
"""
from typing import cast

a = cast(str, 1)
""",
"a=1",
)
run_minifier_and_assert_correct(
before_and_after,
optimizations_config=OptimizationsConfig(remove_typing_cast=True),
)


def test_typing_cast():
before_and_after = BeforeAndAfter(
"""
from typing import cast

a = cast(str, 1)
""",
"from typing import cast\na=cast(str,1)",
)
run_minifier_and_assert_correct(
before_and_after,
optimizations_config=OptimizationsConfig(remove_typing_cast=False),
)
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
6.1.3
7.0.0