Add dangling comment handling to dictionary key-value pairs (#7495)

## Summary

This PR fixes a formatting instability by changing the comment handling
around the `:` in a dictionary to mirror that of the `:` in a lambda: we
treat comments around the `:` as dangling, then format them after the
`:`.

Closes https://github.com/astral-sh/ruff/issues/7458.

## Test Plan

`cargo test`

No change in similarity.

Before:

| project | similarity index | total files | changed files |

|--------------|------------------:|------------------:|------------------:|
| cpython | 0.76083 | 1789 | 1631 |
| django | 0.99983 | 2760 | 36 |
| transformers | 0.99956 | 2587 | 404 |
| twine | 1.00000 | 33 | 0 |
| typeshed | 0.99983 | 3496 | 18 |
| warehouse | 0.99929 | 648 | 16 |
| zulip | 0.99969 | 1437 | 21 |

After:

| project | similarity index | total files | changed files |

|--------------|------------------:|------------------:|------------------:|
| cpython | 0.76083 | 1789 | 1631 |
| django | 0.99983 | 2760 | 36 |
| transformers | 0.99956 | 2587 | 404 |
| twine | 1.00000 | 33 | 0 |
| typeshed | 0.99983 | 3496 | 18 |
| warehouse | 0.99929 | 648 | 16 |
| zulip | 0.99969 | 1437 | 21 |
This commit is contained in:
Charlie Marsh 2023-09-19 15:17:21 -04:00 committed by GitHub
parent b792140579
commit e07670ad97
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 567 additions and 77 deletions

View file

@ -65,13 +65,88 @@ a = {
x={ # dangling end of line comment
}
# Comments between keys and values.
query = {
"must":
# queries => map(pluck("fragment")) => flatten()
[
clause
for kf_pair in queries
for clause in kf_pair["fragment"]
],
}
query = {
"must": # queries => map(pluck("fragment")) => flatten()
[
clause
for kf_pair in queries
for clause in kf_pair["fragment"]
],
}
query = {
"must": (
# queries => map(pluck("fragment")) => flatten()
[
clause
for kf_pair in queries
for clause in kf_pair["fragment"]
]
)
}
query = {
"must": ( # queries => map(pluck("fragment")) => flatten()
[
clause
for kf_pair in queries
for clause in kf_pair["fragment"]
]
)
}
query = {
"must": (
# queries => map(pluck("fragment")) => flatten()
[
clause
for kf_pair in queries
for clause in kf_pair["fragment"]
]
)
}
query = {
(
"must" # queries => map(pluck("fragment")) => flatten()
) : [
clause
for kf_pair in queries
for clause in kf_pair["fragment"]
]
}
query = {
(
"must"
# queries => map(pluck("fragment")) => flatten()
) : [
clause
for kf_pair in queries
for clause in kf_pair["fragment"]
]
}
```
## Output
```py
# before
{ # open
key: value # key # colon # value
key: # key
# colon
value # value
} # close
# after
@ -135,6 +210,51 @@ a = {
x = { # dangling end of line comment
}
# Comments between keys and values.
query = {
"must":
# queries => map(pluck("fragment")) => flatten()
[clause for kf_pair in queries for clause in kf_pair["fragment"]],
}
query = {
"must": # queries => map(pluck("fragment")) => flatten()
[clause for kf_pair in queries for clause in kf_pair["fragment"]],
}
query = {
"must": (
# queries => map(pluck("fragment")) => flatten()
[clause for kf_pair in queries for clause in kf_pair["fragment"]]
)
}
query = {
"must": ( # queries => map(pluck("fragment")) => flatten()
[clause for kf_pair in queries for clause in kf_pair["fragment"]]
)
}
query = {
"must": (
# queries => map(pluck("fragment")) => flatten()
[clause for kf_pair in queries for clause in kf_pair["fragment"]]
)
}
query = {
(
"must" # queries => map(pluck("fragment")) => flatten()
): [clause for kf_pair in queries for clause in kf_pair["fragment"]]
}
query = {
(
"must"
# queries => map(pluck("fragment")) => flatten()
): [clause for kf_pair in queries for clause in kf_pair["fragment"]]
}
```

View file

@ -115,6 +115,74 @@ a = {
aaaaaaaaaaaaaaaaaaaaa = {
k: o for o in self.registry.values if o.__class__ is not ModelAdmin
}
# Comments between keys and values.
query = {
key:
# queries => map(pluck("fragment")) => flatten()
[
clause
for kf_pair in queries
for clause in kf_pair["fragment"]
]
for key, queries in self._filters.items()
}
query = {
key: # queries => map(pluck("fragment")) => flatten()
[
clause
for kf_pair in queries
for clause in kf_pair["fragment"]
]
for key, queries in self._filters.items()
}
query = {
key: (
# queries => map(pluck("fragment")) => flatten()
[
clause
for kf_pair in queries
for clause in kf_pair["fragment"]
]
)
for key, queries in self._filters.items()
}
query = {
key: ( # queries => map(pluck("fragment")) => flatten()
[
clause
for kf_pair in queries
for clause in kf_pair["fragment"]
]
)
for key, queries in self._filters.items()
}
query = {
(
key
# queries => map(pluck("fragment")) => flatten()
): [
clause
for kf_pair in queries
for clause in kf_pair["fragment"]
]
for key, queries in self._filters.items()
}
query = {
(
key # queries => map(pluck("fragment")) => flatten()
): [
clause
for kf_pair in queries
for clause in kf_pair["fragment"]
]
for key, queries in self._filters.items()
}
```
## Output
@ -290,6 +358,50 @@ a = {
aaaaaaaaaaaaaaaaaaaaa = {
k: o for o in self.registry.values if o.__class__ is not ModelAdmin
}
# Comments between keys and values.
query = {
key:
# queries => map(pluck("fragment")) => flatten()
[clause for kf_pair in queries for clause in kf_pair["fragment"]]
for key, queries in self._filters.items()
}
query = {
key: # queries => map(pluck("fragment")) => flatten()
[clause for kf_pair in queries for clause in kf_pair["fragment"]]
for key, queries in self._filters.items()
}
query = {
key: (
# queries => map(pluck("fragment")) => flatten()
[clause for kf_pair in queries for clause in kf_pair["fragment"]]
)
for key, queries in self._filters.items()
}
query = {
key: ( # queries => map(pluck("fragment")) => flatten()
[clause for kf_pair in queries for clause in kf_pair["fragment"]]
)
for key, queries in self._filters.items()
}
query = {
(
key
# queries => map(pluck("fragment")) => flatten()
): [clause for kf_pair in queries for clause in kf_pair["fragment"]]
for key, queries in self._filters.items()
}
query = {
(
key # queries => map(pluck("fragment")) => flatten()
): [clause for kf_pair in queries for clause in kf_pair["fragment"]]
for key, queries in self._filters.items()
}
```