Preserve dangling f-string comments

<!--
Thank you for contributing to Ruff! To help us out with reviewing, please consider the following:

- Does this pull request include a summary of the change? (See below.)
- Does this pull request include a descriptive title?
- Does this pull request include references to any relevant issues?
-->

## Summary

This PR fixes the issue where the FString formatting dropped dangling comments between the string parts.

```python
result_f = (
    f'  File "{__file__}", line {lineno_f+1}, in f\n'
    '    f()\n'
    # XXX: The following line changes depending on whether the tests
    # are run through the interactive interpreter or with -m
    # It also varies depending on the platform (stack size)
    # Fortunately, we don't care about exactness here, so we use regex
    r'  \[Previous line repeated (\d+) more times\]' '\n'
    'RecursionError: maximum recursion depth exceeded\n'
)
```

The solution here isn't ideal because it re-introduces the `enclosing_parent` on `DecoratedComment` but it is the easiest fix that I could come up. 
I didn't spend more time finding another solution becaues I think we have to re-write most of the fstring formatting with the upcoming Python 3.12 support (because lexing the individual parts as we do now will no longer work).

closes #6440

<!-- What's the purpose of the change? What does it do, and why? -->

## Test Plan

`cargo test`

The child PR testing that all comments are formatted should now pass
This commit is contained in:
Micha Reiser 2023-08-10 09:11:25 +02:00 committed by GitHub
parent ac5c8bb3b6
commit e2f7862404
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 105 additions and 32 deletions

View file

@ -0,0 +1,64 @@
---
source: crates/ruff_python_formatter/tests/fixtures.rs
input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/fstring.py
---
## Input
```py
(
f'{one}'
f'{two}'
)
rf"Not-so-tricky \"quote"
# Regression test for fstrings dropping comments
result_f = (
'Traceback (most recent call last):\n'
f' File "{__file__}", line {lineno_f+5}, in _check_recursive_traceback_display\n'
' f()\n'
f' File "{__file__}", line {lineno_f+1}, in f\n'
' f()\n'
f' File "{__file__}", line {lineno_f+1}, in f\n'
' f()\n'
f' File "{__file__}", line {lineno_f+1}, in f\n'
' f()\n'
# XXX: The following line changes depending on whether the tests
# are run through the interactive interpreter or with -m
# It also varies depending on the platform (stack size)
# Fortunately, we don't care about exactness here, so we use regex
r' \[Previous line repeated (\d+) more times\]' '\n'
'RecursionError: maximum recursion depth exceeded\n'
)
```
## Output
```py
(f"{one}" f"{two}")
rf'Not-so-tricky "quote'
# Regression test for fstrings dropping comments
result_f = (
"Traceback (most recent call last):\n"
f' File "{__file__}", line {lineno_f+5}, in _check_recursive_traceback_display\n'
" f()\n"
f' File "{__file__}", line {lineno_f+1}, in f\n'
" f()\n"
f' File "{__file__}", line {lineno_f+1}, in f\n'
" f()\n"
f' File "{__file__}", line {lineno_f+1}, in f\n'
" f()\n"
# XXX: The following line changes depending on whether the tests
# are run through the interactive interpreter or with -m
# It also varies depending on the platform (stack size)
# Fortunately, we don't care about exactness here, so we use regex
r" \[Previous line repeated (\d+) more times\]"
"\n"
"RecursionError: maximum recursion depth exceeded\n"
)
```

View file

@ -1,25 +0,0 @@
---
source: crates/ruff_python_formatter/tests/fixtures.rs
input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/joined_string.py
---
## Input
```py
(
f'{one}'
f'{two}'
)
rf"Not-so-tricky \"quote"
```
## Output
```py
(f"{one}" f"{two}")
rf'Not-so-tricky "quote'
```