Skip to content

Commit 301847b

Browse files
elazargJukkaL
authored andcommitted
NewType+namedtuple: common method for typeinfo (#2089)
1 parent 15fb8b7 commit 301847b

File tree

2 files changed

+17
-28
lines changed

2 files changed

+17
-28
lines changed

mypy/nodes.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2037,16 +2037,6 @@ def deserialize(cls, data: JsonDict) -> 'TypeInfo':
20372037
return ti
20382038

20392039

2040-
def namedtuple_type_info(tup: 'mypy.types.TupleType', names: 'SymbolTable',
2041-
defn: ClassDef, module_name: str) -> TypeInfo:
2042-
info = TypeInfo(names, defn, module_name)
2043-
info.tuple_type = tup
2044-
info.bases = [tup.fallback]
2045-
info.is_named_tuple = True
2046-
info.mro = [info] + tup.fallback.type.mro
2047-
return info
2048-
2049-
20502040
class SymbolTableNode:
20512041
# Kind of node. Possible values:
20522042
# - LDEF: local definition (of any kind)

mypy/semanal.py

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@
6363
YieldFromExpr, NamedTupleExpr, NonlocalDecl,
6464
SetComprehension, DictionaryComprehension, TYPE_ALIAS, TypeAliasExpr,
6565
YieldExpr, ExecStmt, Argument, BackquoteExpr, ImportBase, AwaitExpr,
66-
IntExpr, FloatExpr, UnicodeExpr,
67-
Expression, EllipsisExpr, namedtuple_type_info,
66+
IntExpr, FloatExpr, UnicodeExpr, EllipsisExpr,
6867
COVARIANT, CONTRAVARIANT, INVARIANT, UNBOUND_IMPORTED, LITERAL_YES,
6968
)
7069
from mypy.visitor import NodeVisitor
@@ -1413,13 +1412,7 @@ def check_newtype_args(self, name: str, call: CallExpr, context: Context) -> Opt
14131412
return None if has_failed else old_type
14141413

14151414
def build_newtype_typeinfo(self, name: str, old_type: Type, base_type: Instance) -> TypeInfo:
1416-
class_def = ClassDef(name, Block([]))
1417-
class_def.fullname = self.qualified_name(name)
1418-
1419-
symbols = SymbolTable()
1420-
info = TypeInfo(symbols, class_def, self.cur_mod_id)
1421-
info.mro = [info] + base_type.type.mro
1422-
info.bases = [base_type]
1415+
info = self.basic_new_typeinfo(name, base_type)
14231416
info.is_newtype = True
14241417

14251418
# Add __init__ method
@@ -1434,7 +1427,7 @@ def build_newtype_typeinfo(self, name: str, old_type: Type, base_type: Instance)
14341427
name=name)
14351428
init_func = FuncDef('__init__', args, Block([]), typ=signature)
14361429
init_func.info = info
1437-
symbols['__init__'] = SymbolTableNode(MDEF, init_func)
1430+
info.names['__init__'] = SymbolTableNode(MDEF, init_func)
14381431

14391432
return info
14401433

@@ -1690,6 +1683,15 @@ def fail_namedtuple_arg(self, message: str,
16901683
self.fail(message, context)
16911684
return [], [], False
16921685

1686+
def basic_new_typeinfo(self, name: str, basetype_or_fallback: Instance) -> TypeInfo:
1687+
class_def = ClassDef(name, Block([]))
1688+
class_def.fullname = self.qualified_name(name)
1689+
1690+
info = TypeInfo(SymbolTable(), class_def, self.cur_mod_id)
1691+
info.mro = [info] + basetype_or_fallback.type.mro
1692+
info.bases = [basetype_or_fallback]
1693+
return info
1694+
16931695
def build_namedtuple_typeinfo(self, name: str, items: List[str],
16941696
types: List[Type]) -> TypeInfo:
16951697
strtype = self.named_type('__builtins__.str') # type: Type
@@ -1704,20 +1706,17 @@ def build_namedtuple_typeinfo(self, name: str, items: List[str],
17041706
# but it can't be expressed. 'new' and 'len' should be callable types.
17051707
iterable_type = self.named_type_or_none('typing.Iterable', [AnyType()])
17061708
function_type = self.named_type('__builtins__.function')
1707-
fullname = self.qualified_name(name)
17081709

1709-
symbols = SymbolTable()
1710-
class_def = ClassDef(name, Block([]))
1711-
class_def.fullname = fullname
1712-
info = namedtuple_type_info(TupleType(types, fallback), symbols,
1713-
class_def, self.cur_mod_id)
1710+
info = self.basic_new_typeinfo(name, fallback)
1711+
info.is_named_tuple = True
1712+
info.tuple_type = TupleType(types, fallback)
17141713

17151714
def add_field(var: Var, is_initialized_in_class: bool = False,
17161715
is_property: bool = False) -> None:
17171716
var.info = info
17181717
var.is_initialized_in_class = is_initialized_in_class
17191718
var.is_property = is_property
1720-
symbols[var.name()] = SymbolTableNode(MDEF, var)
1719+
info.names[var.name()] = SymbolTableNode(MDEF, var)
17211720

17221721
vars = [Var(item, typ) for item, typ in zip(items, types)]
17231722
for var in vars:
@@ -1744,7 +1743,7 @@ def add_method(funcname: str, ret: Type, args: List[Argument], name=None,
17441743
func = FuncDef(funcname, args, Block([]), typ=signature)
17451744
func.info = info
17461745
func.is_class = is_classmethod
1747-
symbols[funcname] = SymbolTableNode(MDEF, func)
1746+
info.names[funcname] = SymbolTableNode(MDEF, func)
17481747

17491748
add_method('_replace', ret=this_type,
17501749
args=[Argument(var, var.type, EllipsisExpr(), ARG_NAMED) for var in vars])

0 commit comments

Comments
 (0)