uv
508a6bc9 - Encode mutually-incompatible pairs of markers (#9444)

Commit
1 year ago
Encode mutually-incompatible pairs of markers (#9444) ## Summary This is an alternative to #9344. If accepted, I need to audit the codebase and call sites to apply it everywhere, but the basic idea is: rather than encoding mutually-incompatible pairs of markers in the representation itself, we have an additional method on `MarkerTree` that expands the false-y definition to take into account assumptions about which markers can be true alongside others. We then check if the the current marker implies that at least one of them is true. So, for example, we know that `sys_platform == 'win32'` and `platform_system == 'Darwin'` are mutually exclusive. When given a marker expression like `python_version >= '3.7'`, we test if `python_version >= '3.7'` and `sys_platform != 'win32' or platform_system != 'Darwin'` are disjoint, i.e., if the following can't be satisfied: ``` python_version >= '3.7' and (sys_platform != 'win32' or platform_system != 'Darwin') ``` Since, if this can't be satisfied, it implies that the left-hand expression requires `sys_platform == 'win32'` and `platform_system == 'Darwin'` to be true at the same time. I think the main downsides here are: 1. We can't _simplify_ markers based on these implications. So we'd still write markers like `sys_platform == 'win32' and platform_system != 'Darwin'`, even though we know the latter expression is redundant. 2. It might be expensive? I'm not sure. I don't think we test for falseness _that_ often though. Closes #7760. Closes #9275.
Author
Parents
Loading