Fix unresolved placeholder error during serialization (#1161)

This fixes an error that occured during state serialization. Completely
unsure how to reproduce this in a test but it resolves a long-standing
prolem in our project at work at least.
This commit is contained in:
Sigurd Ljødal
2022-09-23 20:35:23 +02:00
committed by GitHub
parent 3bc8278424
commit 02999f3e86

View File

@@ -16,6 +16,7 @@ from mypy.nodes import (
Var, Var,
) )
from mypy.plugin import AttributeContext, DynamicClassDefContext, SemanticAnalyzerPluginInterface from mypy.plugin import AttributeContext, DynamicClassDefContext, SemanticAnalyzerPluginInterface
from mypy.semanal import has_placeholder
from mypy.types import AnyType, CallableType, Instance, ProperType from mypy.types import AnyType, CallableType, Instance, ProperType
from mypy.types import Type as MypyType from mypy.types import Type as MypyType
from mypy.types import TypeOfAny from mypy.types import TypeOfAny
@@ -246,7 +247,10 @@ def create_manager_info_from_from_queryset_call(
else: else:
manager_name = f"{base_manager_info.name}From{queryset_info.name}" manager_name = f"{base_manager_info.name}From{queryset_info.name}"
try:
new_manager_info = create_manager_class(api, base_manager_info, name or manager_name, call_expr.line) new_manager_info = create_manager_class(api, base_manager_info, name or manager_name, call_expr.line)
except helpers.IncompleteDefnException:
return None
popuplate_manager_from_queryset(new_manager_info, queryset_info) popuplate_manager_from_queryset(new_manager_info, queryset_info)
@@ -272,6 +276,10 @@ def create_manager_class(
base_manager_instance = fill_typevars(base_manager_info) base_manager_instance = fill_typevars(base_manager_info)
assert isinstance(base_manager_instance, Instance) assert isinstance(base_manager_instance, Instance)
# If any of the type vars are undefined we need to defer. This is handled by the caller
if any(has_placeholder(type_var) for type_var in base_manager_info.defn.type_vars):
raise helpers.IncompleteDefnException
manager_info = helpers.create_type_info(name, api.cur_mod_id, bases=[base_manager_instance]) manager_info = helpers.create_type_info(name, api.cur_mod_id, bases=[base_manager_instance])
manager_info.line = line manager_info.line = line
manager_info.type_vars = base_manager_info.type_vars manager_info.type_vars = base_manager_info.type_vars