Skip to content

Conversation

@sharkdp
Copy link
Contributor

@sharkdp sharkdp commented Jul 22, 2025

Summary

Detect illegal attribute accesses in Literal[X.Y] annotations if X is not an enum class.

Test Plan

New Markdown test

@sharkdp sharkdp added the ty Multi-file analysis & type inference label Jul 22, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Jul 22, 2025

mypy_primer results

No ecosystem changes detected ✅
No memory usage changes detected ✅

@sharkdp sharkdp force-pushed the david/illegal-attribute-access-literal branch from 0700d53 to 85cd2c6 Compare July 22, 2025 07:47
@sharkdp sharkdp force-pushed the david/illegal-attribute-access-literal branch from 85cd2c6 to e36e3ce Compare July 22, 2025 08:11
@AlexWaygood
Copy link
Member

AlexWaygood commented Jul 22, 2025

+ error[invalid-type-form] bidict/_typing.py:22:28: Type arguments for `Literal` must be `None`, a literal value (int, bool, str, or bytes), or an enum value

I see the error has gone away from the primer diff on the latest version of this PR, but FWIW I think "enum member" would be clearer than "enum value" in this error message. (I know that this issue predates this PR!)

@sharkdp sharkdp closed this Jul 22, 2025
@sharkdp sharkdp reopened this Jul 22, 2025
Copy link
Member

@AlexWaygood AlexWaygood left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I apply this diff to your branch then I get some pull-types panics on the literal.md mdtest:

diff --git a/crates/ty_python_semantic/resources/mdtest/annotations/literal.md b/crates/ty_python_semantic/resources/mdtest/annotations/literal.md
index 0c266868e1..6e480724cb 100644
--- a/crates/ty_python_semantic/resources/mdtest/annotations/literal.md
+++ b/crates/ty_python_semantic/resources/mdtest/annotations/literal.md
@@ -5,7 +5,7 @@
 ## Parameterization
 
 ```py
-from typing import Literal
+from typing import Literal, Any
 from enum import Enum
 
 mode: Literal["w", "r"]
@@ -57,9 +57,12 @@ invalid4: Literal[
 
 class NotAnEnum:
     x: int = 1
+    y: list[Any] = []
 
 # error: [invalid-type-form]
 invalid5: Literal[NotAnEnum.x]
+invalid6: Literal[NotAnEnum.y[0]]
+invalid7: Literal[NotAnEnum["x"].value]
 ```

@sharkdp
Copy link
Contributor Author

sharkdp commented Jul 22, 2025

I think "enum member" would be clearer than "enum value" in this error message

👍 #19482

@sharkdp
Copy link
Contributor Author

sharkdp commented Jul 22, 2025

If I apply this diff to your branch then I get some pull-types panics on the literal.md mdtest:

I can't see how this would be related to this PR, and in fact, I can also reproduce this on main. Will look into it or open a ticket.

@sharkdp sharkdp merged commit 215a1c5 into main Jul 22, 2025
73 checks passed
@sharkdp sharkdp deleted the david/illegal-attribute-access-literal branch July 22, 2025 09:42
dcreager added a commit that referenced this pull request Jul 22, 2025
* main: (76 commits)
  Move fix suggestion to subdiagnostic (#19464)
  [ty] Implement non-stdlib stub mapping for classes and functions (#19471)
  [ty] Disallow illegal uses of `ClassVar` (#19483)
  [ty] Disallow `Final` in function parameter/return-type annotations (#19480)
  [ty] Extend `Final` test suite (#19476)
  [ty] Minor change to diagnostic message for invalid Literal uses (#19482)
  [ty] Detect illegal non-enum attribute accesses in Literal annotation (#19477)
  [ty] Reduce size of `TypeInference` (#19435)
  Run MD tests for Markdown-only changes (#19479)
  Revert "[ty] Detect illegal non-enum attribute accesses in Literal annotation"
  [ty] Detect illegal non-enum attribute accesses in Literal annotation
  [ty] Added semantic token support for more identifiers (#19473)
  [ty] Make tuple subclass constructors sound (#19469)
  [ty] Pass down specialization to generic dataclass bases (#19472)
  [ty] Garbage-collect reachability constraints (#19414)
  [ty] Implicit instance attributes declared `Final` (#19462)
  [ty] Expansion of enums into unions of literals (#19382)
  [ty] Avoid rechecking the entire project when changing the opened files (#19463)
  [ty] Add warning for unknown `TY_MEMORY_REPORT` value (#19465)
  [ty] Sync vendored typeshed stubs (#19461)
  ...
dcreager added a commit that referenced this pull request Jul 22, 2025
* main:
  [ty] Use `ThinVec` for sub segments in `PlaceExpr` (#19470)
  [ty] Splat variadic arguments into parameter list (#18996)
  [`flake8-pyi`] Skip fix if all `Union` members are `None` (`PYI016`)  (#19416)
  Skip notebook with errors in ecosystem check (#19491)
  [ty] Consistent use of American english (in rules) (#19488)
  [ty] Support iterating over enums (#19486)
  Fix panic for illegal `Literal[…]` annotations with inner subscript expressions (#19489)
  Move fix suggestion to subdiagnostic (#19464)
  [ty] Implement non-stdlib stub mapping for classes and functions (#19471)
  [ty] Disallow illegal uses of `ClassVar` (#19483)
  [ty] Disallow `Final` in function parameter/return-type annotations (#19480)
  [ty] Extend `Final` test suite (#19476)
  [ty] Minor change to diagnostic message for invalid Literal uses (#19482)
  [ty] Detect illegal non-enum attribute accesses in Literal annotation (#19477)
  [ty] Reduce size of `TypeInference` (#19435)
  Run MD tests for Markdown-only changes (#19479)
  Revert "[ty] Detect illegal non-enum attribute accesses in Literal annotation"
  [ty] Detect illegal non-enum attribute accesses in Literal annotation
  [ty] Added semantic token support for more identifiers (#19473)
  [ty] Make tuple subclass constructors sound (#19469)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ty Multi-file analysis & type inference

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants