mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-26 20:09:22 +00:00

## Summary This PR adds support for control flow for match statement. It also adds the necessary infrastructure required for narrowing constraints in case blocks and implements the logic for `PatternMatchSingleton` which is either `None` / `True` / `False`. Even after this the inferred type doesn't get simplified completely, there's a TODO for that in the test code. ## Test Plan Add test cases for control flow for (a) when there's a wildcard pattern and (b) when there isn't. There's also a test case to verify the narrowing logic. --------- Co-authored-by: Carl Meyer <carl@astral.sh>
39 lines
923 B
Rust
39 lines
923 B
Rust
use ruff_db::files::File;
|
|
use ruff_python_ast as ast;
|
|
|
|
use crate::ast_node_ref::AstNodeRef;
|
|
use crate::db::Db;
|
|
use crate::semantic_index::expression::Expression;
|
|
use crate::semantic_index::symbol::{FileScopeId, ScopeId};
|
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
pub(crate) enum Constraint<'db> {
|
|
Expression(Expression<'db>),
|
|
Pattern(PatternConstraint<'db>),
|
|
}
|
|
|
|
#[salsa::tracked]
|
|
pub(crate) struct PatternConstraint<'db> {
|
|
#[id]
|
|
pub(crate) file: File,
|
|
|
|
#[id]
|
|
pub(crate) file_scope: FileScopeId,
|
|
|
|
#[no_eq]
|
|
#[return_ref]
|
|
pub(crate) subject: AstNodeRef<ast::Expr>,
|
|
|
|
#[no_eq]
|
|
#[return_ref]
|
|
pub(crate) pattern: AstNodeRef<ast::Pattern>,
|
|
|
|
#[no_eq]
|
|
count: countme::Count<PatternConstraint<'static>>,
|
|
}
|
|
|
|
impl<'db> PatternConstraint<'db> {
|
|
pub(crate) fn scope(self, db: &'db dyn Db) -> ScopeId<'db> {
|
|
self.file_scope(db).to_scope_id(db, self.file(db))
|
|
}
|
|
}
|