Sitelet https://github.com/starkware-libs/cairo/commit/3e3edda356882217ec114d1d86e82e033bc9ad7e
Skip to content

Commit 3e3edda

Browse files
authored
fix: include all reachable modules in cache generation via BFS over submodule and macro call edges (#9860)
1 parent aa85e35 commit 3e3edda

2 files changed

Lines changed: 59 additions & 44 deletions

File tree

  • crates
    • cairo-lang-lowering/src/cache
    • cairo-lang-semantic/src/cache

‎crates/cairo-lang-lowering/src/cache/mod.rs‎

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,20 @@ use cairo_lang_semantic::cache::{
2222
ConcreteEnumCached, ConcreteVariantCached, ConstValueIdCached, ExprVarMemberPathCached,
2323
ImplIdCached, MatchArmSelectorCached, SemanticCacheLoadingData, SemanticCacheSavingContext,
2424
SemanticCacheSavingData, SemanticConcreteFunctionWithBodyCached, SemanticFunctionIdCached,
25-
TypeIdCached, generate_crate_def_cache, generate_crate_semantic_cache,
25+
TypeIdCached, all_crate_modules_for_cache, generate_crate_def_cache,
26+
generate_crate_semantic_cache,
2627
};
2728
use cairo_lang_semantic::db::SemanticGroup;
2829
use cairo_lang_semantic::expr::inference::InferenceError;
2930
use cairo_lang_semantic::items::function_with_body::FunctionWithBodySemantic;
3031
use cairo_lang_semantic::items::imp::ImplSemantic;
31-
use cairo_lang_semantic::items::macro_call::module_macro_modules;
3232
use cairo_lang_semantic::items::trt::TraitSemantic;
3333
use cairo_lang_semantic::types::TypeInfo;
3434
use cairo_lang_syntax::node::TypedStablePtr;
3535
use cairo_lang_syntax::node::ast::{ExprPtr, FunctionWithBodyPtr, TraitItemFunctionPtr};
3636
use cairo_lang_utils::Intern;
3737
use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
3838
use id_arena::Arena;
39-
use itertools::chain;
4039
use salsa::Database;
4140
use serde::{Deserialize, Serialize};
4241
use thiserror::Error;
@@ -126,22 +125,19 @@ pub fn generate_crate_cache<'db>(
126125
db: &'db dyn Database,
127126
crate_id: CrateId<'db>,
128127
) -> Result<Vec<u8>, CrateCacheError> {
129-
let modules = db.crate_modules(crate_id);
130128
let mut function_ids = Vec::new();
131-
for module_id in modules.iter() {
132-
for module_id in chain!([module_id], module_macro_modules(db, true, *module_id)) {
133-
for free_func in db.module_free_functions_ids(*module_id)?.iter() {
134-
function_ids.push(FunctionWithBodyId::Free(*free_func));
135-
}
136-
for impl_id in db.module_impls_ids(*module_id)?.iter() {
137-
for impl_func in db.impl_functions(*impl_id)?.values() {
138-
function_ids.push(FunctionWithBodyId::Impl(*impl_func));
139-
}
129+
for module_id in all_crate_modules_for_cache(db, crate_id) {
130+
for free_func in db.module_free_functions_ids(module_id)?.iter() {
131+
function_ids.push(FunctionWithBodyId::Free(*free_func));
132+
}
133+
for impl_id in db.module_impls_ids(module_id)?.iter() {
134+
for impl_func in db.impl_functions(*impl_id)?.values() {
135+
function_ids.push(FunctionWithBodyId::Impl(*impl_func));
140136
}
141-
for trait_id in db.module_traits_ids(*module_id)?.iter() {
142-
for trait_func in db.trait_functions(*trait_id)?.values() {
143-
function_ids.push(FunctionWithBodyId::Trait(*trait_func));
144-
}
137+
}
138+
for trait_id in db.module_traits_ids(module_id)?.iter() {
139+
for trait_func in db.trait_functions(*trait_id)?.values() {
140+
function_ids.push(FunctionWithBodyId::Trait(*trait_func));
145141
}
146142
}
147143
}

‎crates/cairo-lang-semantic/src/cache/mod.rs‎

Lines changed: 46 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use cairo_lang_defs::db::DefsGroup;
1111
use cairo_lang_defs::diagnostic_utils::StableLocation;
1212
use cairo_lang_defs::ids::{
1313
EnumLongId, ExternFunctionLongId, ExternTypeLongId, FreeFunctionLongId, ImplFunctionLongId,
14-
LocalVarId, LocalVarLongId, MemberLongId, ParamId, ParamLongId, StatementConstLongId,
14+
LocalVarId, LocalVarLongId, MemberLongId, ModuleId, ParamId, ParamLongId, StatementConstLongId,
1515
StatementItemId, StatementUseLongId, StructLongId, TraitConstantId, TraitConstantLongId,
1616
TraitFunctionLongId, TraitImplId, TraitImplLongId, TraitLongId, TraitTypeId, TraitTypeLongId,
1717
VarId, VariantLongId,
@@ -29,7 +29,6 @@ use cairo_lang_syntax::node::ast::{
2929
use cairo_lang_utils::Intern;
3030
use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
3131
use cairo_lang_utils::smol_str::SmolStr;
32-
use itertools::chain;
3332
use num_bigint::BigInt;
3433
use salsa::Database;
3534
use serde::{Deserialize, Serialize};
@@ -47,7 +46,7 @@ use crate::items::imp::{
4746
NegativeImplId, NegativeImplLongId,
4847
};
4948
use crate::items::impl_alias::ImplAliasSemantic;
50-
use crate::items::macro_call::module_macro_modules;
49+
use crate::items::macro_call::MacroCallSemantic;
5150
use crate::items::module::{ModuleItemInfo, ModuleSemantic, ModuleSemanticData};
5251
use crate::items::trt::ConcreteTraitGenericFunctionLongId;
5352
use crate::items::visibility::Visibility;
@@ -125,19 +124,17 @@ pub fn generate_crate_def_cache<'db>(
125124
crate_id: cairo_lang_filesystem::ids::CrateId<'db>,
126125
ctx: &mut DefCacheSavingContext<'db>,
127126
) -> Maybe<CrateDefCache<'db>> {
128-
let modules = db.crate_modules(crate_id);
129-
130-
let mut modules_data = Vec::new();
131-
for module_id in modules.iter() {
132-
for module_id in chain!([module_id], module_macro_modules(db, true, *module_id)) {
133-
let module_data = module_id.module_data(db)?;
134-
modules_data.push((
135-
ModuleIdCached::new(*module_id, ctx),
136-
ModuleDataCached::new(db, module_data, ctx),
137-
));
138-
}
139-
}
140-
Ok(CrateDefCache::new(modules_data))
127+
Ok(CrateDefCache::new(
128+
all_crate_modules_for_cache(db, crate_id)
129+
.into_iter()
130+
.map(|module_id| {
131+
Ok((
132+
ModuleIdCached::new(module_id, ctx),
133+
ModuleDataCached::new(db, module_id.module_data(db)?, ctx),
134+
))
135+
})
136+
.collect::<Maybe<_>>()?,
137+
))
141138
}
142139

143140
/// Semantic items in the semantic cache.
@@ -154,22 +151,24 @@ pub fn generate_crate_semantic_cache<'db>(
154151
crate_id: CrateId<'db>,
155152
ctx: &mut SemanticCacheSavingContext<'db>,
156153
) -> Maybe<CrateSemanticCache> {
157-
let modules = ctx.db.crate_modules(crate_id);
154+
let all_modules = all_crate_modules_for_cache(ctx.db, crate_id);
158155

159-
let mut modules_data = Vec::new();
160-
for module_id in modules.iter() {
161-
for module_id in chain!([module_id], module_macro_modules(ctx.db, true, *module_id)) {
162-
let module_data = ctx.db.priv_module_semantic_data(*module_id)?.clone();
163-
modules_data.push((
156+
let modules_data = all_modules
157+
.iter()
158+
.map(|module_id| {
159+
Ok((
164160
ModuleIdCached::new(*module_id, &mut ctx.defs_ctx),
165-
ModuleSemanticDataCached::new(module_data, ctx),
166-
));
167-
}
168-
}
161+
ModuleSemanticDataCached::new(
162+
ctx.db.priv_module_semantic_data(*module_id)?.clone(),
163+
ctx,
164+
),
165+
))
166+
})
167+
.collect::<Maybe<_>>()?;
169168

170169
Ok(CrateSemanticCache {
171170
modules: modules_data,
172-
impl_aliases: modules
171+
impl_aliases: all_modules
173172
.iter()
174173
.flat_map(|id| match ctx.db.module_impl_aliases_ids(*id) {
175174
Err(err) => vec![Err(err)],
@@ -1960,3 +1959,23 @@ impl ConcreteTraitCached {
19601959
long_id.intern(db)
19611960
}
19621961
}
1962+
1963+
/// Returns all modules reachable from the crate root, following both submodule and macro call
1964+
/// edges. This ensures that submodules nested inside MacroCall modules are included.
1965+
pub fn all_crate_modules_for_cache<'db>(
1966+
db: &'db dyn Database,
1967+
crate_id: CrateId<'db>,
1968+
) -> Vec<ModuleId<'db>> {
1969+
let mut result = vec![ModuleId::CrateRoot(crate_id)];
1970+
let mut unprocessed = 0;
1971+
while let Some(module_id) = result.get(unprocessed).copied() {
1972+
unprocessed += 1;
1973+
if let Ok(submodule_ids) = db.module_submodules_ids(module_id) {
1974+
result.extend(submodule_ids.iter().map(|id| ModuleId::Submodule(*id)));
1975+
}
1976+
if let Ok(macro_calls) = db.module_macro_calls_ids(module_id) {
1977+
result.extend(macro_calls.iter().flat_map(|id| db.macro_call_module_id(*id)));
1978+
}
1979+
}
1980+
result
1981+
}

0 commit comments

Comments
 (0)