Skip to content

Commit 5a8cd80

Browse files
authored
[mypyc] Optimize TYPE_CHECKING to False at Runtime (#16263)
Fixes [mypyc/mypyc#902](mypyc/mypyc#902) This PR finds references of `typing.TYPE_CHECKING` or `typing_extensions.TYPE_CHECKING` and optimizes them to `False` in mypyc.
1 parent a91151c commit 5a8cd80

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

mypyc/irbuild/expression.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ def transform_name_expr(builder: IRBuilder, expr: NameExpr) -> Value:
126126
return builder.true()
127127
if fullname == "builtins.False":
128128
return builder.false()
129+
if fullname in ("typing.TYPE_CHECKING", "typing_extensions.TYPE_CHECKING"):
130+
return builder.false()
129131

130132
math_literal = transform_math_literal(builder, fullname)
131133
if math_literal is not None:
@@ -185,6 +187,10 @@ def transform_name_expr(builder: IRBuilder, expr: NameExpr) -> Value:
185187

186188

187189
def transform_member_expr(builder: IRBuilder, expr: MemberExpr) -> Value:
190+
# Special Cases
191+
if expr.fullname in ("typing.TYPE_CHECKING", "typing_extensions.TYPE_CHECKING"):
192+
return builder.false()
193+
188194
# First check if this is maybe a final attribute.
189195
final = builder.get_final_ref(expr)
190196
if final is not None:

mypyc/test-data/irbuild-basic.test

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3688,3 +3688,33 @@ def f(arg):
36883688
arg :: __main__.A
36893689
L0:
36903690
return arg
3691+
3692+
[case testTypeCheckingFlag]
3693+
from typing import TYPE_CHECKING, List
3694+
3695+
def f(arg: List[int]) -> int:
3696+
if TYPE_CHECKING:
3697+
from collections.abc import Sized
3698+
s: Sized = arg
3699+
return len(s)
3700+
3701+
[out]
3702+
def f(arg):
3703+
arg :: list
3704+
r0 :: bool
3705+
r1 :: int
3706+
r2 :: bit
3707+
s :: object
3708+
r3 :: int
3709+
L0:
3710+
r0 = 0 << 1
3711+
r1 = extend r0: builtins.bool to builtins.int
3712+
r2 = r1 != 0
3713+
if r2 goto L1 else goto L2 :: bool
3714+
L1:
3715+
goto L3
3716+
L2:
3717+
L3:
3718+
s = arg
3719+
r3 = CPyObject_Size(s)
3720+
return r3

0 commit comments

Comments
 (0)