Skip to content

Commit be111a9

Browse files
Extract analyze_member_access helper into helpers module (#3339)
* Extract analyze_member_access helper into helpers module * [pre-commit.ci] auto fixes from pre-commit.com hooks --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 95e1a87 commit be111a9

2 files changed

Lines changed: 34 additions & 12 deletions

File tree

mypy_django_plugin/lib/helpers.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from django.db.models.fields.reverse_related import ForeignObjectRel
77
from mypy import checker
88
from mypy.checker import TypeChecker
9+
from mypy.checkmember import analyze_member_access as _mypy_analyze_member_access
910
from mypy.maptype import map_instance_to_supertype
1011
from mypy.mro import calculate_mro
1112
from mypy.nodes import (
@@ -57,10 +58,13 @@
5758
)
5859
from mypy.types import Type as MypyType
5960
from mypy.typevars import fill_typevars, fill_typevars_with_any
61+
from mypy.version import __version__ as mypy_version
6062
from typing_extensions import Self
6163

6264
from mypy_django_plugin.lib import fullnames
6365

66+
mypy_version_info = tuple(map(int, mypy_version.partition("+")[0].split(".")))
67+
6468
if TYPE_CHECKING:
6569
from collections.abc import Iterable, Iterator, Mapping
6670

@@ -789,3 +793,31 @@ def merge_extra_attrs(
789793
immutable=new_immutable,
790794
mod_name=None,
791795
)
796+
797+
798+
def analyze_member_access(
799+
name: str,
800+
typ: MypyType,
801+
context: Context,
802+
*,
803+
is_lvalue: bool,
804+
is_super: bool,
805+
is_operator: bool,
806+
original_type: MypyType,
807+
chk: TypeChecker,
808+
) -> MypyType:
809+
# TODO: [mypy 1.16+] Remove this workaround for passing `msg` to `analyze_member_access()`.
810+
extra: dict[str, Any] = {}
811+
if mypy_version_info < (1, 16):
812+
extra["msg"] = chk.msg
813+
return _mypy_analyze_member_access(
814+
name,
815+
typ,
816+
context,
817+
is_lvalue=is_lvalue,
818+
is_super=is_super,
819+
is_operator=is_operator,
820+
original_type=original_type,
821+
chk=chk,
822+
**extra,
823+
)
Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
11
from __future__ import annotations
22

3-
from typing import TYPE_CHECKING, Any
3+
from typing import TYPE_CHECKING
44

5-
from mypy.checkmember import analyze_member_access
65
from mypy.errorcodes import ATTR_DEFINED
76
from mypy.nodes import CallExpr, MemberExpr
87
from mypy.types import AnyType, Instance, TypeOfAny
98
from mypy.types import Type as MypyType
10-
from mypy.version import __version__ as mypy_version
119

1210
from mypy_django_plugin.lib import helpers
1311

1412
if TYPE_CHECKING:
1513
from mypy.plugin import AttributeContext
1614

17-
mypy_version_info = tuple(map(int, mypy_version.partition("+")[0].split(".")))
18-
1915

2016
def resolve_str_promise_attribute(ctx: AttributeContext) -> MypyType:
2117
if isinstance(ctx.context, MemberExpr):
@@ -30,12 +26,7 @@ def resolve_str_promise_attribute(ctx: AttributeContext) -> MypyType:
3026
assert str_info is not None
3127
str_type = Instance(str_info, [])
3228

33-
# TODO: [mypy 1.16+] Remove this workaround for passing `msg` to `analyze_member_access()`.
34-
extra: dict[str, Any] = {}
35-
if mypy_version_info < (1, 16):
36-
extra["msg"] = ctx.api.msg
37-
38-
return analyze_member_access(
29+
return helpers.analyze_member_access(
3930
method_name,
4031
str_type,
4132
ctx.context,
@@ -45,5 +36,4 @@ def resolve_str_promise_attribute(ctx: AttributeContext) -> MypyType:
4536
is_operator=False,
4637
original_type=ctx.type,
4738
chk=helpers.get_typechecker_api(ctx),
48-
**extra,
4939
)

0 commit comments

Comments
 (0)