use crate::ast_node_ref::AstNodeRef;
use crate::db::Db;
use crate::scope::ScopeId;
use crate::{Program, ProgramFile};
use ruff_db::PythonFile;
use ruff_db::files::File;
use ruff_python_ast as ast;
use salsa;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, get_size2::GetSize)]
pub enum ExpressionKind {
Normal,
TypeExpression,
}
#[salsa::tracked(debug, heap_size=ruff_memory_usage::heap_size)]
pub struct Expression<'db> {
#[returns(copy)]
pub scope_id: ScopeId<'db>,
#[no_eq]
#[tracked]
#[returns(ref)]
pub node_ref: AstNodeRef<ast::Expr>,
#[no_eq]
#[tracked]
#[returns(clone)]
pub assigned_to: Option<AstNodeRef<ast::StmtAssign>>,
#[returns(copy)]
pub kind: ExpressionKind,
}
impl get_size2::GetSize for Expression<'_> {}
impl<'db> Expression<'db> {
pub fn scope(self, db: &'db dyn Db) -> ScopeId<'db> {
self.scope_id(db)
}
pub fn file(self, db: &'db dyn Db) -> File {
self.scope_id(db).file(db)
}
pub fn python_file(self, db: &'db dyn Db) -> PythonFile<'db> {
self.scope_id(db).python_file(db)
}
pub fn program_file(self, db: &'db dyn Db) -> ProgramFile<'db> {
self.scope_id(db).program_file(db)
}
pub fn program(self, db: &'db dyn Db) -> Program<'db> {
self.scope_id(db).program(db)
}
}