# grammars: Add semantic token rule for Python constants \(\#59811\) · gitcafe/zed

[View on GitCafe](https://git.cafe/gitcafe/zed/commit/e0878c49896a36e4f5b8b14f1c9ac36e2ee00c85)

Repository: [gitcafe/zed](https://git.cafe/gitcafe/zed)

Visibility: public

Requested revision: e0878c49896a36e4f5b8b14f1c9ac36e2ee00c85

Requested commit: e0878c49896a36e4f5b8b14f1c9ac36e2ee00c85

Commit: e0878c49896a36e4f5b8b14f1c9ac36e2ee00c85

Tree: 14b370538f3fbea96320e5273f9df0cc41f887fe

Author: Xin Zhao

Committer: GitHub

## Message

```
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.
```

## Parents

- [10f501d7007c7a104456d8d0750e92eb0d25e328](https://git.cafe/gitcafe/zed/commit/10f501d7007c7a104456d8d0750e92eb0d25e328?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zed/tree/e0878c49896a36e4f5b8b14f1c9ac36e2ee00c85?format=markdown)
