Fix fmt:off with trailing child comment (#8234)

This commit is contained in:
Micha Reiser 2023-10-26 10:03:34 +09:00 committed by GitHub
parent 3c3d9ab173
commit 6983d96d27
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 87 additions and 7 deletions

View file

@ -0,0 +1,8 @@
# Regression test for https://github.com/astral-sh/ruff/issues/8211
# fmt: off
from dataclasses import dataclass
if True:
if False:
x: int # Optional[int]

View file

@ -0,0 +1,8 @@
# Regression test for https://github.com/astral-sh/ruff/issues/8211
# fmt: off
from dataclasses import dataclass
@dataclass
class A:
x: int # Optional[int]

View file

@ -536,7 +536,7 @@ impl<'ast> IntoFormat<PyFormatContext<'ast>> for Suite {
}
/// A statement representing a docstring.
#[derive(Copy, Clone)]
#[derive(Copy, Clone, Debug)]
pub(crate) struct DocstringStmt<'a>(&'a Stmt);
impl<'a> DocstringStmt<'a> {
@ -589,7 +589,7 @@ impl Format<PyFormatContext<'_>> for DocstringStmt<'_> {
}
/// A Child of a suite.
#[derive(Copy, Clone)]
#[derive(Copy, Clone, Debug)]
pub(crate) enum SuiteChildStatement<'a> {
/// A docstring documenting a class or function definition.
Docstring(DocstringStmt<'a>),

View file

@ -327,7 +327,7 @@ fn write_suppressed_statements<'a>(
for range in CommentRangeIter::in_suppression(comments.trailing(statement), source) {
match range {
// All leading comments are suppressed
// All trailing comments are suppressed
// ```python
// statement
// # suppressed
@ -394,10 +394,14 @@ fn write_suppressed_statements<'a>(
statement = SuiteChildStatement::Other(next_statement);
leading_node_comments = comments.leading(next_statement);
} else {
let end = comments
.trailing(statement)
.last()
.map_or(statement.end(), Ranged::end);
let mut nodes =
std::iter::successors(Some(AnyNodeRef::from(statement.statement())), |statement| {
statement.last_child_in_body()
});
let end = nodes
.find_map(|statement| comments.trailing(statement).last().map(Ranged::end))
.unwrap_or(statement.end());
FormatVerbatimStatementRange {
verbatim_range: TextRange::new(format_off_comment.end(), end),

View file

@ -0,0 +1,30 @@
---
source: crates/ruff_python_formatter/tests/fixtures.rs
input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/fmt_off_unclosed_deep_nested_trailing_comment.py
---
## Input
```py
# Regression test for https://github.com/astral-sh/ruff/issues/8211
# fmt: off
from dataclasses import dataclass
if True:
if False:
x: int # Optional[int]
```
## Output
```py
# Regression test for https://github.com/astral-sh/ruff/issues/8211
# fmt: off
from dataclasses import dataclass
if True:
if False:
x: int # Optional[int]
```

View file

@ -0,0 +1,30 @@
---
source: crates/ruff_python_formatter/tests/fixtures.rs
input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/fmt_on_off/fmt_off_unclosed_trailing_comment.py
---
## Input
```py
# Regression test for https://github.com/astral-sh/ruff/issues/8211
# fmt: off
from dataclasses import dataclass
@dataclass
class A:
x: int # Optional[int]
```
## Output
```py
# Regression test for https://github.com/astral-sh/ruff/issues/8211
# fmt: off
from dataclasses import dataclass
@dataclass
class A:
x: int # Optional[int]
```