Skip to content

Commit 1623477

Browse files
author
Johan Dahlin
committed
Specify types directly when creating AST nodes.
1 parent 21b419e commit 1623477

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

mypyc/irbuild/builder.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@
1919
from mypy.nodes import (
2020
MypyFile, SymbolNode, Statement, OpExpr, IntExpr, NameExpr, LDEF, Var, UnaryExpr,
2121
CallExpr, IndexExpr, Expression, MemberExpr, RefExpr, Lvalue, TupleExpr,
22-
TypeInfo, Decorator, OverloadedFuncDef, StarExpr, GDEF, ARG_POS, ARG_NAMED,
23-
ComparisonExpr
22+
TypeInfo, Decorator, OverloadedFuncDef, StarExpr, GDEF, ARG_POS, ARG_NAMED
2423
)
2524
from mypy.types import (
2625
Type, Instance, TupleType, UninhabitedType, get_proper_type
@@ -40,7 +39,7 @@
4039
from mypyc.ir.rtypes import (
4140
RType, RTuple, RInstance, int_rprimitive, dict_rprimitive,
4241
none_rprimitive, is_none_rprimitive, object_rprimitive, is_object_rprimitive,
43-
str_rprimitive, bool_rprimitive,
42+
str_rprimitive,
4443
)
4544
from mypyc.ir.func_ir import FuncIR, INVALID_FUNC_DEF
4645
from mypyc.ir.class_ir import ClassIR, NonExtClassInfo
@@ -835,8 +834,6 @@ def node_type(self, node: Expression) -> RType:
835834
# TODO: Don't special case IntExpr
836835
return int_rprimitive
837836
if node not in self.types:
838-
if isinstance(node, (ComparisonExpr, OpExpr)):
839-
return bool_rprimitive
840837
return object_rprimitive
841838
mypy_type = self.types[node]
842839
return self.type_to_rtype(mypy_type)

mypyc/irbuild/expression.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
and mypyc.irbuild.builder.
55
"""
66

7-
from typing import List, Optional, Union
7+
from typing import List, Optional, Union, cast
88

99
from mypy.nodes import (
1010
Expression, NameExpr, MemberExpr, SuperExpr, CallExpr, UnaryExpr, OpExpr, IndexExpr,
@@ -13,12 +13,13 @@
1313
SetComprehension, DictionaryComprehension, SliceExpr, GeneratorExpr, CastExpr, StarExpr,
1414
Var, RefExpr, MypyFile, TypeInfo, TypeApplication, LDEF, ARG_POS
1515
)
16-
from mypy.types import TupleType, get_proper_type
16+
from mypy.types import TupleType, get_proper_type, Instance
1717

1818
from mypyc.ir.ops import (
1919
Value, TupleGet, TupleSet, PrimitiveOp, BasicBlock, OpDescription, Assign
2020
)
21-
from mypyc.ir.rtypes import RTuple, object_rprimitive, is_none_rprimitive
21+
from mypyc.ir.rtypes import RTuple, object_rprimitive, is_none_rprimitive, \
22+
bool_rprimitive
2223
from mypyc.ir.func_ir import FUNC_CLASSMETHOD, FUNC_STATICMETHOD
2324
from mypyc.primitives.registry import name_ref_ops
2425
from mypyc.primitives.generic_ops import iter_op
@@ -368,10 +369,19 @@ def transform_comparison_expr(builder: IRBuilder, e: ComparisonExpr) -> Value:
368369
bin_op = 'and'
369370
cmp_op = '!='
370371
lhs = e.operands[0]
371-
exprs = (ComparisonExpr([cmp_op], [lhs, item]) for item in items)
372-
or_expr = next(exprs) # type: Expression
372+
mypy_file = builder.graph['builtins'].tree
373+
assert mypy_file is not None
374+
bool_type = Instance(cast(TypeInfo, mypy_file.names['bool'].node), [])
375+
exprs = []
376+
for item in items:
377+
expr = ComparisonExpr([cmp_op], [lhs, item])
378+
builder.types[expr] = bool_type
379+
exprs.append(expr)
380+
381+
or_expr = exprs.pop(0) # type: Expression
373382
for expr in exprs:
374383
or_expr = OpExpr(bin_op, or_expr, expr)
384+
builder.types[or_expr] = bool_type
375385
return builder.accept(or_expr)
376386
# x in [y]/(y) -> x == y
377387
# x not in [y]/(y) -> x != y

0 commit comments

Comments
 (0)