diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2020-09-24 09:53:41 -0700 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2021-06-02 15:53:17 -0700 |
commit | 113a1595149b72ee0a572ed215db616c5a6d8a20 (patch) | |
tree | 2ef6d92f919aaea3fb83b06631b38ebbe56aa9ce /mesonbuild/build.py | |
parent | f8be4f8fc747772d9639fdbb6e84ddbcfb61593a (diff) | |
download | meson-113a1595149b72ee0a572ed215db616c5a6d8a20.zip meson-113a1595149b72ee0a572ed215db616c5a6d8a20.tar.gz meson-113a1595149b72ee0a572ed215db616c5a6d8a20.tar.bz2 |
use an immutable list for an lru_cached functions
When mutable items are stored in an lru cache, changing the returned
items changes the cached items as well. Therefore we want to ensure that
we're not mutating them. Using the ImmutableListProtocol allows mypy to
find mutations and reject them. This doesn't solve the problem of
mutable values inside the values, so you could have to do things like:
```python
ImmutableListProtocol[ImmutableListProtocol[str]]
```
or equally hacky. It can also be used for input types and acts a bit
like C's const:
```python
def foo(arg: ImmutableListProtocol[str]) -> T.List[str]:
arg[1] = 'foo' # works while running, but mypy errors
```
Diffstat (limited to 'mesonbuild/build.py')
-rw-r--r-- | mesonbuild/build.py | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 13eb0c1..aec9ae3 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -40,6 +40,7 @@ from .linkers import StaticLinker from .interpreterbase import FeatureNew if T.TYPE_CHECKING: + from ._typing import ImmutableListProtocol from .interpreter.interpreter import Test, SourceOutputs from .mesonlib import FileMode, FileOrString from .backend.backends import Backend @@ -909,8 +910,8 @@ class BuildTarget(Target): return self.get_transitive_link_deps() @lru_cache(maxsize=None) - def get_transitive_link_deps(self): - result = [] + def get_transitive_link_deps(self) -> 'ImmutableListProtocol[Target]': + result: T.List[Target] = [] for i in self.link_targets: result += i.get_all_link_deps() return result |