use crate::Program;
use ruff_db::PythonFile;
use ruff_db::files::File;
use ruff_db::parsed::ParsedModuleRef;
use ruff_python_ast::{self as ast, AnyNodeRef};
use ruff_text_size::{Ranged, TextRange};
use crate::Db;
use crate::EvaluationMode;
use crate::ProgramFile;
use crate::ast_node_ref::AstNodeRef;
use crate::expression::Expression;
use crate::scope::{FileScopeId, ScopeId};
#[salsa::tracked(debug, heap_size=ruff_memory_usage::heap_size)]
pub struct Unpack<'db> {
#[returns(copy)]
pub program_file: ProgramFile<'db>,
#[returns(copy)]
pub(crate) value_file_scope: FileScopeId,
#[returns(copy)]
pub(crate) target_file_scope: FileScopeId,
#[no_eq]
#[tracked]
#[returns(ref)]
pub(crate) _target: AstNodeRef<ast::Expr>,
#[returns(copy)]
pub value: UnpackValue<'db>,
}
impl get_size2::GetSize for Unpack<'_> {}
impl<'db> Unpack<'db> {
pub fn file(self, db: &'db dyn Db) -> File {
self.program_file(db).file(db)
}
pub fn python_file(self, db: &'db dyn Db) -> PythonFile<'db> {
self.program_file(db).python_file(db)
}
pub fn target<'ast>(self, db: &'db dyn Db, parsed: &'ast ParsedModuleRef) -> &'ast ast::Expr {
self._target(db).node(parsed)
}
pub fn target_scope(self, db: &'db dyn Db) -> ScopeId<'db> {
self.target_file_scope(db)
.to_scope_id(db, self.program_file(db))
}
pub fn program(self, db: &'db dyn Db) -> Program<'db> {
self.target_scope(db).program(db)
}
pub fn range(self, db: &'db dyn Db, module: &ParsedModuleRef) -> TextRange {
self.target(db, module).range()
}
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, get_size2::GetSize, salsa::SalsaValue)]
pub struct UnpackValue<'db> {
kind: UnpackKind,
expression: Expression<'db>,
}
impl<'db> UnpackValue<'db> {
pub(crate) fn new(kind: UnpackKind, expression: Expression<'db>) -> Self {
Self { kind, expression }
}
pub const fn expression(self) -> Expression<'db> {
self.expression
}
pub fn as_any_node_ref<'ast>(
self,
db: &'db dyn Db,
module: &'ast ParsedModuleRef,
) -> AnyNodeRef<'ast> {
self.expression().node_ref(db).node(module).into()
}
pub const fn kind(self) -> UnpackKind {
self.kind
}
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, get_size2::GetSize)]
pub enum UnpackKind {
Iterable { mode: EvaluationMode },
ContextManager { mode: EvaluationMode },
Assign,
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, get_size2::GetSize)]
pub enum UnpackPosition {
First,
Other,
}