Xin Zhao
d2e52d12e1
grammars: Add semantic token rule for Python constants (#59811)
# Objective
In Python, using variables in all uppercase letters signals that the
variable is a constant. In Zed's built-in Python grammar, this
convention is respected. Similarly, the `ty` language server has a rule
for this:
https://github.com/astral-sh/ruff/blob/e39ded7e89f503d892217364f924b38362fb9a66/crates/ty_ide/src/semantic_tokens.rs#L264-L267
https://github.com/astral-sh/ruff/blob/e39ded7e89f503d892217364f924b38362fb9a66/crates/ty_ide/src/semantic_tokens.rs#L356-L358
It returns a `"readonly"` token modifier if an item is determined to be
a constant. However, this specific modifier is not currently respected
in Zed. Consequently, when using `ty` as the language server (which is
expected to be a common setup in the near future, similar to `ruff` and
`uv`), and enable semantic token highlighting, these constants are
highlighted as normal variables.
## Solution
- Added a new semantic token rule in
`crates/grammars/src/python/semantic_token_rules.json` to provide
highlighting for constants.
## Testing
- This change primarily affects the UI and has been tested locally. A
before-and-after comparison is provided below in the Showcase section.
## Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content adheres to Zed's UI standards
([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
and
[icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md)
guidelines)
- [ ] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
## Showcase
<details>
<summary>Click to view showcase</summary>
| Before | After |
| :---: | :---: |
| <img width="441" height="208" alt="highlight_before"
src="https://github.com/user-attachments/assets/64cc28ba-32b6-4620-a212-8f7d43f54821"
/> | <img width="441" height="208" alt="highlight_after"
src="https://github.com/user-attachments/assets/133919fd-03c8-4f6c-9bf9-9efa2610f050"
/> |
| <img width="498" height="145" alt="highlight_tree_before"
src="https://github.com/user-attachments/assets/b79f4036-65e4-4e4e-b0e9-e653529e114d"
/> | <img width="498" height="145" alt="highlight_tree_after"
src="https://github.com/user-attachments/assets/e0c3ae74-46b4-4d06-895b-51da69d410c5"
/> |
</details>
---
Release Notes:
- Improved semantic highlighting for Python constants when using the
`ty` language server.
2026-06-24 15:37:58 +00:00
..
2026-06-24 15:25:44 +00:00
2026-06-22 09:04:29 +00:00
2026-06-09 20:13:13 +00:00
2026-05-15 12:01:31 +00:00
2026-06-24 15:19:59 +00:00
2026-06-22 11:36:15 +00:00
2026-06-23 15:20:21 +00:00
2026-06-08 14:57:47 +00:00
2026-06-24 15:25:44 +00:00
2026-06-18 20:51:36 +00:00
2026-06-16 13:06:20 +00:00
2026-06-08 09:37:00 +00:00
2026-06-05 16:49:42 +00:00
2026-06-08 14:48:37 +00:00
2026-05-01 22:33:54 +00:00
2026-06-07 16:55:18 +00:00
2026-06-02 13:29:23 +00:00
2026-06-18 02:47:10 +00:00
2026-06-01 04:40:13 +00:00
2026-06-09 20:13:13 +00:00
2026-06-23 09:13:28 +00:00
2026-05-29 15:58:02 +00:00
2026-06-22 14:57:34 +00:00
2026-06-23 05:53:33 +00:00
2026-02-25 08:12:04 +01:00
2026-06-09 19:12:34 +00:00
2026-06-22 16:45:50 +00:00
2026-06-16 13:06:20 +00:00
2026-06-04 22:52:29 +00:00
2026-06-23 09:13:28 +00:00
2026-06-23 09:33:47 +00:00
2026-06-05 10:32:57 +00:00
2026-06-23 09:33:47 +00:00
2026-06-05 10:32:57 +00:00
2026-05-29 07:06:57 +00:00
2026-06-15 03:26:51 +00:00
2026-05-19 17:45:07 +00:00
2026-06-04 22:52:29 +00:00
2026-05-28 15:00:31 +00:00
2026-06-22 12:29:02 +00:00
2026-06-17 18:29:21 +00:00
2026-04-02 17:06:57 -03:00
2026-05-15 11:12:41 +00:00
2026-06-15 10:55:39 +00:00
2026-04-29 10:27:47 +00:00
2026-04-24 10:29:51 +00:00
2026-05-13 23:35:10 +00:00
2026-06-23 09:33:47 +00:00
2026-06-02 13:29:23 +00:00
2026-06-23 09:33:47 +00:00
2026-06-05 11:17:44 +00:00
2026-04-30 11:10:14 +00:00
2026-06-23 21:47:54 +00:00
2026-06-23 21:47:54 +00:00
2026-06-09 15:52:27 +00:00
2026-06-22 16:45:50 +00:00
2026-06-04 22:52:29 +00:00
2026-06-20 22:40:15 +00:00
2026-06-24 14:49:03 +00:00
2026-06-05 19:24:28 +00:00
2026-06-23 09:33:47 +00:00
2026-04-07 12:28:19 -03:00
2026-02-28 21:47:30 -05:00
2026-06-24 15:32:41 +00:00
2026-02-19 18:57:49 +01:00
2026-02-28 22:42:19 -05:00
2026-06-08 19:47:30 +00:00
2026-06-04 11:01:48 +00:00
2026-06-07 16:39:58 +00:00
2026-06-07 16:39:58 +00:00
2026-06-23 09:33:47 +00:00
2026-06-17 22:42:46 +00:00
2026-04-18 06:34:19 +00:00
2026-05-04 06:30:47 +00:00
2026-06-23 09:33:47 +00:00
2026-06-22 00:37:28 +00:00
2026-02-19 18:57:49 +01:00
2026-06-12 12:27:28 +00:00
2026-06-12 12:27:28 +00:00
2026-06-22 00:37:28 +00:00
2026-06-15 08:48:19 +00:00
2026-06-23 12:15:46 +00:00
2026-06-16 17:42:36 +00:00
2026-06-16 13:06:20 +00:00
2026-06-24 14:18:04 +00:00
2026-06-16 13:47:55 +00:00
2026-06-24 14:00:13 +00:00
2026-06-17 07:57:05 +00:00
2026-03-24 11:05:12 +00:00
2026-04-24 08:58:26 +00:00
2026-06-16 13:47:55 +00:00
2026-06-16 13:47:55 +00:00
2026-06-02 12:03:05 +00:00
2026-06-08 23:09:47 +00:00
2026-06-16 13:47:55 +00:00
2026-06-24 15:37:58 +00:00
2026-06-16 13:47:55 +00:00
2026-06-24 01:42:52 +00:00
2026-06-24 01:42:52 +00:00
2026-06-08 21:24:44 +00:00
2026-04-22 22:22:10 +00:00
2026-06-12 12:27:28 +00:00
2026-06-22 18:20:57 +00:00
2026-05-05 22:41:13 +00:00
2026-04-29 10:27:47 +00:00
2026-06-08 15:46:15 +00:00
2026-06-19 17:43:07 +00:00
2026-06-02 13:59:39 +00:00
2026-04-02 12:52:42 +00:00
2026-06-23 09:21:31 +00:00
2026-06-23 21:47:54 +00:00
2026-06-23 23:01:58 +00:00
2026-06-23 21:47:54 +00:00
2026-03-25 12:07:34 -06:00
2026-06-23 09:33:47 +00:00
2026-06-10 09:28:16 +00:00
2026-06-24 08:04:40 +00:00
2026-06-23 09:33:47 +00:00
2026-06-23 09:13:28 +00:00
2026-06-02 13:29:23 +00:00
2026-06-08 21:24:36 +00:00
2026-06-24 10:22:36 +00:00
2026-06-18 12:48:18 +00:00
2026-06-22 15:42:12 +00:00
2026-05-04 22:51:56 +00:00
2026-06-02 12:03:05 +00:00
2026-06-02 13:29:23 +00:00
2026-06-15 11:03:26 +00:00
2026-02-20 13:36:04 +00:00
2026-05-27 04:39:26 +00:00
2026-05-29 07:06:57 +00:00
2026-05-14 21:03:56 +00:00
2026-06-23 09:21:31 +00:00
2026-06-23 09:33:47 +00:00
2026-06-23 21:47:54 +00:00
2026-06-23 09:33:47 +00:00
2026-06-23 23:01:58 +00:00
2026-06-22 18:12:49 +00:00
2026-06-23 09:33:47 +00:00
2026-06-15 11:03:26 +00:00
2026-05-12 15:52:52 +00:00
2026-05-14 16:30:08 +00:00
2026-06-23 15:31:18 +00:00
2026-06-10 12:02:29 +00:00
2026-06-13 05:21:05 +00:00
2026-06-23 11:10:05 +00:00
2026-05-05 22:41:13 +00:00
2026-06-23 15:11:27 +00:00
2026-06-23 09:33:47 +00:00
2026-06-05 19:46:05 +00:00
2026-06-23 09:13:28 +00:00
2026-06-23 14:40:13 +00:00
2026-05-15 21:17:43 +00:00
2026-06-23 05:53:33 +00:00
2026-04-16 16:36:09 -07:00
2026-06-23 05:53:33 +00:00
2026-06-23 09:33:47 +00:00
2026-05-08 21:03:40 +00:00
2026-05-27 10:31:53 +00:00
2026-06-05 10:32:57 +00:00
2026-06-24 15:19:59 +00:00
2026-06-08 15:44:17 +00:00
2026-03-27 14:41:25 +01:00
2026-06-24 13:15:12 +00:00
2026-03-18 12:05:57 -07:00
2026-06-19 17:43:07 +00:00
2026-06-23 21:47:54 +00:00
2026-03-25 12:07:34 -06:00
2026-06-23 09:33:47 +00:00
2026-06-24 05:43:59 +00:00
2026-05-05 16:25:56 +00:00
2026-06-23 14:40:13 +00:00
2026-04-29 10:27:47 +00:00
2026-06-23 09:33:47 +00:00
2026-04-24 10:29:51 +00:00
2026-05-27 19:33:04 +00:00
2026-05-27 10:31:53 +00:00
2026-03-29 14:43:05 +00:00
2026-03-31 08:06:37 -06:00
2026-05-04 06:30:47 +00:00
2026-06-23 09:33:47 +00:00
2026-06-09 22:46:22 +00:00
2026-06-23 09:33:47 +00:00
2026-06-23 18:44:42 +00:00
2026-06-12 12:27:28 +00:00
2026-06-09 20:13:13 +00:00
2026-06-08 14:59:39 +00:00
2026-03-27 14:41:25 +01:00
2026-03-27 14:41:25 +01:00
2026-06-23 09:33:47 +00:00
2026-05-21 22:16:01 +00:00
2026-05-28 19:43:30 +00:00
2026-06-18 20:51:36 +00:00
2026-06-23 09:33:47 +00:00
2026-06-24 12:29:42 +00:00
2026-06-23 15:31:18 +00:00
2026-05-29 07:06:57 +00:00
2026-06-08 14:59:39 +00:00
2026-06-23 05:53:33 +00:00
2026-06-23 11:39:52 +00:00
2026-03-19 12:53:26 -04:00
2026-05-27 10:31:53 +00:00
2026-06-09 12:06:49 +00:00
2026-03-27 14:41:25 +01:00
2026-05-01 22:33:54 +00:00
2026-06-23 05:53:33 +00:00
2026-06-19 20:49:58 +00:00
2026-02-19 18:57:49 +01:00
2026-05-29 16:28:27 +00:00
2026-06-24 01:42:52 +00:00
2026-06-19 17:43:07 +00:00
2026-04-02 17:06:57 -03:00
2026-04-02 17:06:57 -03:00
2026-06-22 16:45:50 +00:00
2026-03-03 08:37:58 +00:00
2026-05-28 20:19:17 +00:00
2026-05-28 20:19:17 +00:00