mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-29 05:14:52 +00:00
[syntax-errors]: future-feature-not-defined (F407) (#20554)
<!-- Thank you for contributing to Ruff/ty! 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? (Please prefix with `[ty]` for ty pull requests.) - Does this pull request include references to any relevant issues? --> ## Summary <!-- What's the purpose of the change? What does it do, and why? --> This PR implements https://docs.astral.sh/ruff/rules/future-feature-not-defined/ (F407) as a semantic syntax error. ## Test Plan <!-- How was it tested? --> I have written inline tests as directed in #17412 --------- Signed-off-by: 11happy <soni5happy@gmail.com>
This commit is contained in:
parent
6b7a9dc2f2
commit
cfc64d1707
10 changed files with 246 additions and 45 deletions
|
@ -65,8 +65,28 @@ impl SemanticSyntaxChecker {
|
|||
names,
|
||||
..
|
||||
}) => {
|
||||
if self.seen_futures_boundary && matches!(module.as_deref(), Some("__future__")) {
|
||||
Self::add_error(ctx, SemanticSyntaxErrorKind::LateFutureImport, *range);
|
||||
if matches!(module.as_deref(), Some("__future__")) {
|
||||
for name in names {
|
||||
if !is_known_future_feature(&name.name) {
|
||||
// test_ok valid_future_feature
|
||||
// from __future__ import annotations
|
||||
|
||||
// test_err invalid_future_feature
|
||||
// from __future__ import invalid_feature
|
||||
// from __future__ import annotations, invalid_feature
|
||||
// from __future__ import invalid_feature_1, invalid_feature_2
|
||||
Self::add_error(
|
||||
ctx,
|
||||
SemanticSyntaxErrorKind::FutureFeatureNotDefined(
|
||||
name.name.to_string(),
|
||||
),
|
||||
name.range,
|
||||
);
|
||||
}
|
||||
}
|
||||
if self.seen_futures_boundary {
|
||||
Self::add_error(ctx, SemanticSyntaxErrorKind::LateFutureImport, *range);
|
||||
}
|
||||
}
|
||||
for alias in names {
|
||||
if alias.name.as_str() == "*" && !ctx.in_module_scope() {
|
||||
|
@ -978,6 +998,22 @@ impl SemanticSyntaxChecker {
|
|||
}
|
||||
}
|
||||
|
||||
fn is_known_future_feature(name: &str) -> bool {
|
||||
matches!(
|
||||
name,
|
||||
"nested_scopes"
|
||||
| "generators"
|
||||
| "division"
|
||||
| "absolute_import"
|
||||
| "with_statement"
|
||||
| "print_function"
|
||||
| "unicode_literals"
|
||||
| "barry_as_FLUFL"
|
||||
| "generator_stop"
|
||||
| "annotations"
|
||||
)
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash, get_size2::GetSize)]
|
||||
pub struct SemanticSyntaxError {
|
||||
pub kind: SemanticSyntaxErrorKind,
|
||||
|
@ -1086,6 +1122,9 @@ impl Display for SemanticSyntaxError {
|
|||
SemanticSyntaxErrorKind::MultipleStarredExpressions => {
|
||||
write!(f, "Two starred expressions in assignment")
|
||||
}
|
||||
SemanticSyntaxErrorKind::FutureFeatureNotDefined(name) => {
|
||||
write!(f, "Future feature `{name}` is not defined")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1456,6 +1495,9 @@ pub enum SemanticSyntaxErrorKind {
|
|||
/// left-hand side of an assignment. Using multiple starred expressions makes
|
||||
/// the statement invalid and results in a `SyntaxError`.
|
||||
MultipleStarredExpressions,
|
||||
|
||||
/// Represents the use of a `__future__` feature that is not defined.
|
||||
FutureFeatureNotDefined(String),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, get_size2::GetSize)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue