Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions crates/cairo-lang-compiler/src/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ use anyhow::{Result, anyhow, bail};
use cairo_lang_defs::db::{init_defs_group, init_external_files};
use cairo_lang_diagnostics::Maybe;
use cairo_lang_filesystem::cfg::CfgSet;
use cairo_lang_filesystem::db::{CORELIB_VERSION, FilesGroup, init_dev_corelib, init_files_group};
use cairo_lang_filesystem::db::{
CORELIB_VERSION, FileContentStorage, FileContentView, FilesGroup, init_dev_corelib,
init_files_group, register_files_group_view,
};
use cairo_lang_filesystem::detect::detect_corelib;
use cairo_lang_filesystem::flag::{Flag, FlagsGroup};
use cairo_lang_filesystem::ids::{CrateId, FlagLongId};
Expand Down Expand Up @@ -69,9 +72,15 @@ fn estimate_code_size(
#[derive(Clone)]
pub struct RootDatabase {
storage: salsa::Storage<RootDatabase>,
file_contents: FileContentStorage,
}
#[salsa::db]
impl salsa::Database for RootDatabase {}
impl FileContentView for RootDatabase {
fn file_content_storage(&self) -> Option<&FileContentStorage> {
Some(&self.file_contents)
}
}
impl CloneableDatabase for RootDatabase {
fn dyn_clone(&self) -> Box<dyn CloneableDatabase> {
Box::new(self.clone())
Expand All @@ -80,7 +89,8 @@ impl CloneableDatabase for RootDatabase {

impl RootDatabase {
fn new(default_plugin_suite: PluginSuite, optimizations: Optimizations) -> Self {
let mut res = Self { storage: Default::default() };
let mut res = Self { storage: Default::default(), file_contents: Default::default() };
register_files_group_view(&res);
init_external_files(&mut res);
init_files_group(&mut res);
init_lowering_group(&mut res, optimizations, Some(estimate_code_size));
Expand All @@ -103,7 +113,7 @@ impl RootDatabase {

/// Snapshots the db for read only.
pub fn snapshot(&self) -> RootDatabase {
RootDatabase { storage: self.storage.clone() }
RootDatabase { storage: self.storage.clone(), file_contents: self.file_contents.clone() }
}
}

Expand Down
28 changes: 19 additions & 9 deletions crates/cairo-lang-compiler/src/project.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@ use cairo_lang_defs::db::DefsGroup;
use cairo_lang_defs::ids::ModuleId;
use cairo_lang_filesystem::db::{
CORELIB_CRATE_NAME, CrateConfiguration, CrateIdentifier, CrateSettings, FilesGroup,
set_generated_file_content_for_input,
};
use cairo_lang_filesystem::ids::{CrateId, CrateInput, CrateLongId, Directory, SmolStrId};
use cairo_lang_filesystem::{override_file_content, set_crate_config};
use cairo_lang_filesystem::set_crate_config;
pub use cairo_lang_project::*;
use cairo_lang_utils::Intern;
use salsa::Database;
Expand Down Expand Up @@ -55,17 +56,26 @@ pub fn setup_single_file_project(
Ok(crate_id.long(db).clone().into_crate_input(db))
} else {
// If file_stem is not lib, create a fake lib file.
let crate_id = CrateId::plain(db, SmolStrId::from(db, file_stem));
set_crate_config!(
{
let crate_id = CrateId::plain(db, SmolStrId::from(db, file_stem));
set_crate_config!(
db,
crate_id,
Some(CrateConfiguration::default_for_root(Directory::Real(file_dir.to_path_buf())))
);
}
let file_input = {
let crate_id = CrateId::plain(db, SmolStrId::from(db, file_stem));
let module_id = ModuleId::CrateRoot(crate_id);
let file_id = db.module_main_file(module_id).unwrap();
db.file_input(file_id).clone()
};
set_generated_file_content_for_input(
db,
crate_id,
Some(CrateConfiguration::default_for_root(Directory::Real(file_dir.to_path_buf())))
file_input,
Some(format!("mod {file_stem};").into()),
);
let crate_id = CrateId::plain(db, SmolStrId::from(db, file_stem));
let module_id = ModuleId::CrateRoot(crate_id);
let file_id = db.module_main_file(module_id).unwrap();
override_file_content!(db, file_id, Some(format!("mod {file_stem};").into()));
let crate_id = CrateId::plain(db, SmolStrId::from(db, file_stem));
Ok(crate_id.long(db).clone().into_crate_input(db))
}
}
Expand Down
32 changes: 24 additions & 8 deletions crates/cairo-lang-defs/src/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ use std::fmt::Write as _;
use std::sync::Arc;

use cairo_lang_debug::debug::DebugWithDb;
use cairo_lang_filesystem::db::{CrateConfiguration, FilesGroup, init_files_group};
use cairo_lang_filesystem::db::{
CrateConfiguration, FileContentStorage, FileContentView, FilesGroup, init_files_group,
override_file_content_for_input, register_files_group_view,
};
use cairo_lang_filesystem::ids::{CrateId, Directory, FileLongId, SmolStrId};
use cairo_lang_filesystem::{override_file_content, set_crate_config};
use cairo_lang_filesystem::set_crate_config;
use cairo_lang_parser::db::ParserGroup;
use cairo_lang_syntax::node::helpers::QueryAttrs;
use cairo_lang_syntax::node::kind::SyntaxKind;
Expand All @@ -28,13 +31,20 @@ use crate::plugin::{
#[derive(Clone)]
pub struct DatabaseForTesting {
storage: salsa::Storage<DatabaseForTesting>,
file_contents: FileContentStorage,
}
#[salsa::db]
impl salsa::Database for DatabaseForTesting {}
impl FileContentView for DatabaseForTesting {
fn file_content_storage(&self) -> Option<&FileContentStorage> {
Some(&self.file_contents)
}
}

impl Default for DatabaseForTesting {
fn default() -> Self {
let mut res = Self { storage: Default::default() };
let mut res = Self { storage: Default::default(), file_contents: Default::default() };
register_files_group_view(&res);
init_external_files(&mut res);
init_files_group(&mut res);
init_defs_group(&mut res);
Expand Down Expand Up @@ -109,9 +119,12 @@ pub fn setup_test_module(db: &mut dyn Database, content: &str) {
let crate_id = get_crate_id(db);
let directory = Directory::Real("src".into());
set_crate_config!(db, crate_id, Some(CrateConfiguration::default_for_root(directory)));
let crate_id = get_crate_id(db);
let file = db.module_main_file(ModuleId::CrateRoot(crate_id)).unwrap();
override_file_content!(db, file, Some(content.into()));
let file_input = {
let crate_id = get_crate_id(db);
let file = db.module_main_file(ModuleId::CrateRoot(crate_id)).unwrap();
db.file_input(file).clone()
};
override_file_content_for_input(db, file_input, Some(content.into()));
let crate_id = get_crate_id(db);
let file = db.module_main_file(ModuleId::CrateRoot(crate_id)).unwrap();
let syntax_diagnostics = db.file_syntax_diagnostics(file).format(db);
Expand Down Expand Up @@ -148,8 +161,11 @@ fn test_module_file() {

macro_rules! set_file_content {
($db:expr, $path:expr, $content:expr) => {
let file_id = FileLongId::OnDisk($path.into()).intern($db);
override_file_content!($db, file_id, Some($content.into()));
let file_input = {
let file_id = FileLongId::OnDisk($path.into()).intern($db);
$db.file_input(file_id).clone()
};
override_file_content_for_input($db, file_input, Some($content.into()));
};
}

Expand Down
39 changes: 28 additions & 11 deletions crates/cairo-lang-doc/src/tests/test_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ use anyhow::{Result, anyhow};
use cairo_lang_defs::db::{DefsGroup, init_defs_group};
use cairo_lang_defs::ids::ModuleId;
use cairo_lang_filesystem::db::{
CrateConfiguration, FilesGroup, init_dev_corelib, init_files_group,
CrateConfiguration, FileContentStorage, FileContentView, FilesGroup, init_dev_corelib,
init_files_group, override_file_content_for_input, register_files_group_view,
};
use cairo_lang_filesystem::detect::detect_corelib;
use cairo_lang_filesystem::ids::{CrateId, Directory, FileLongId, SmolStrId};
use cairo_lang_filesystem::{override_file_content, set_crate_config};
use cairo_lang_filesystem::set_crate_config;
use cairo_lang_parser::db::ParserGroup;
use cairo_lang_semantic::db::{PluginSuiteInput, init_semantic_group};
use cairo_lang_semantic::plugin::PluginSuite;
Expand All @@ -17,13 +18,20 @@ use salsa::Database;
#[derive(Clone)]
pub struct TestDatabase {
storage: salsa::Storage<TestDatabase>,
file_contents: FileContentStorage,
}
#[salsa::db]
impl salsa::Database for TestDatabase {}
impl FileContentView for TestDatabase {
fn file_content_storage(&self) -> Option<&FileContentStorage> {
Some(&self.file_contents)
}
}

impl Default for TestDatabase {
fn default() -> Self {
let mut res = Self { storage: Default::default() };
let mut res = Self { storage: Default::default(), file_contents: Default::default() };
register_files_group_view(&res);
init_files_group(&mut res);
init_defs_group(&mut res);
init_semantic_group(&mut res);
Expand All @@ -49,9 +57,12 @@ pub fn setup_test_module(db: &mut dyn Database, content: &str) {
let crate_id = test_crate_id(db);
let directory = Directory::Real("src".into());
set_crate_config!(db, crate_id, Some(CrateConfiguration::default_for_root(directory)));
let crate_id = test_crate_id(db);
let file = db.module_main_file(ModuleId::CrateRoot(crate_id)).unwrap();
override_file_content!(db, file, Some(content.into()));
let file_input = {
let crate_id = test_crate_id(db);
let file = db.module_main_file(ModuleId::CrateRoot(crate_id)).unwrap();
db.file_input(file).clone()
};
override_file_content_for_input(db, file_input, Some(content.into()));
let crate_id = test_crate_id(db);
let file = db.module_main_file(ModuleId::CrateRoot(crate_id)).unwrap();
let syntax_diagnostics = db.file_syntax_diagnostics(file).format(db);
Expand All @@ -66,12 +77,18 @@ pub fn setup_test_module_without_syntax_diagnostics(db: &mut dyn Database, conte
let crate_id = test_crate_id(db);
let directory = Directory::Real("src".into());
set_crate_config!(db, crate_id, Some(CrateConfiguration::default_for_root(directory)));
let crate_id = test_crate_id(db);
let file = db.module_main_file(ModuleId::CrateRoot(crate_id)).unwrap();
override_file_content!(db, file, Some(content.into()));
let file_input = {
let crate_id = test_crate_id(db);
let file = db.module_main_file(ModuleId::CrateRoot(crate_id)).unwrap();
db.file_input(file).clone()
};
override_file_content_for_input(db, file_input, Some(content.into()));
}

pub fn set_file_content(db: &mut TestDatabase, path: &str, content: &str) {
let file_id = FileLongId::OnDisk(path.into()).intern(db);
override_file_content!(db, file_id, Some(content.into()));
let file_input = {
let file_id = FileLongId::OnDisk(path.into()).intern(db);
db.file_input(file_id).clone()
};
override_file_content_for_input(db, file_input, Some(content.into()));
}
Loading
Loading