Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c4ab46e

Browse files
authored
Cache information about whether file is typeshed file (#16351)
We used to check if a file is in typeshed a lot. This seems to speed up self-check by about 2%, and this should also speed up tests a bit.
1 parent f33c9a3 commit c4ab46e

4 files changed

Lines changed: 15 additions & 15 deletions

File tree

mypy/checker.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@
222222
from mypy.types_utils import is_overlapping_none, remove_optional, store_argument_type, strip_type
223223
from mypy.typetraverser import TypeTraverserVisitor
224224
from mypy.typevars import fill_typevars, fill_typevars_with_any, has_no_typevars
225-
from mypy.util import is_dunder, is_sunder, is_typeshed_file
225+
from mypy.util import is_dunder, is_sunder
226226
from mypy.visitor import NodeVisitor
227227

228228
T = TypeVar("T")
@@ -400,7 +400,7 @@ def __init__(
400400
self.pass_num = 0
401401
self.current_node_deferred = False
402402
self.is_stub = tree.is_stub
403-
self.is_typeshed_stub = is_typeshed_file(options.abs_custom_typeshed_dir, path)
403+
self.is_typeshed_stub = tree.is_typeshed_file(options)
404404
self.inferred_attribute_types = None
405405

406406
# If True, process function definitions. If False, don't. This is used

mypy/nodes.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
import mypy.strconv
2929
from mypy.options import Options
30-
from mypy.util import short_type
30+
from mypy.util import is_typeshed_file, short_type
3131
from mypy.visitor import ExpressionVisitor, NodeVisitor, StatementVisitor
3232

3333
if TYPE_CHECKING:
@@ -283,6 +283,7 @@ class MypyFile(SymbolNode):
283283
"is_partial_stub_package",
284284
"plugin_deps",
285285
"future_import_flags",
286+
"_is_typeshed_file",
286287
)
287288

288289
__match_args__ = ("name", "path", "defs")
@@ -319,6 +320,7 @@ class MypyFile(SymbolNode):
319320
plugin_deps: dict[str, set[str]]
320321
# Future imports defined in this file. Populated during semantic analysis.
321322
future_import_flags: set[str]
323+
_is_typeshed_file: bool | None
322324

323325
def __init__(
324326
self,
@@ -346,6 +348,7 @@ def __init__(
346348
self.is_cache_skeleton = False
347349
self.is_partial_stub_package = False
348350
self.future_import_flags = set()
351+
self._is_typeshed_file = None
349352

350353
def local_definitions(self) -> Iterator[Definition]:
351354
"""Return all definitions within the module (including nested).
@@ -371,6 +374,12 @@ def is_package_init_file(self) -> bool:
371374
def is_future_flag_set(self, flag: str) -> bool:
372375
return flag in self.future_import_flags
373376

377+
def is_typeshed_file(self, options: Options) -> bool:
378+
# Cache result since this is called a lot
379+
if self._is_typeshed_file is None:
380+
self._is_typeshed_file = is_typeshed_file(options.abs_custom_typeshed_dir, self.path)
381+
return self._is_typeshed_file
382+
374383
def serialize(self) -> JsonDict:
375384
return {
376385
".class": "MypyFile",

mypy/semanal.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -283,14 +283,7 @@
283283
)
284284
from mypy.types_utils import is_invalid_recursive_alias, store_argument_type
285285
from mypy.typevars import fill_typevars
286-
from mypy.util import (
287-
correct_relative_import,
288-
is_dunder,
289-
is_typeshed_file,
290-
module_prefix,
291-
unmangle,
292-
unnamed_function,
293-
)
286+
from mypy.util import correct_relative_import, is_dunder, module_prefix, unmangle, unnamed_function
294287
from mypy.visitor import NodeVisitor
295288

296289
T = TypeVar("T")
@@ -777,9 +770,7 @@ def file_context(
777770
self.cur_mod_id = file_node.fullname
778771
with scope.module_scope(self.cur_mod_id):
779772
self._is_stub_file = file_node.path.lower().endswith(".pyi")
780-
self._is_typeshed_stub_file = is_typeshed_file(
781-
options.abs_custom_typeshed_dir, file_node.path
782-
)
773+
self._is_typeshed_stub_file = file_node.is_typeshed_file(options)
783774
self.globals = file_node.names
784775
self.tvar_scope = TypeVarLikeScope()
785776

mypy/semanal_main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ def check_type_arguments(graph: Graph, scc: list[str], errors: Errors) -> None:
380380
analyzer = TypeArgumentAnalyzer(
381381
errors,
382382
state.options,
383-
is_typeshed_file(state.options.abs_custom_typeshed_dir, state.path or ""),
383+
state.tree.is_typeshed_file(state.options),
384384
state.manager.semantic_analyzer.named_type,
385385
)
386386
with state.wrap_context():

0 commit comments

Comments
 (0)