diff --git a/crates/noirc_driver/src/lib.rs b/crates/noirc_driver/src/lib.rs index e0314eb50a3..a4f5839dd05 100644 --- a/crates/noirc_driver/src/lib.rs +++ b/crates/noirc_driver/src/lib.rs @@ -205,8 +205,10 @@ impl Driver { /// will return all functions marked with #[test]. pub fn get_all_test_functions_in_crate_matching(&self, pattern: &str) -> Vec { let interner = &self.context.def_interner; - interner - .get_all_test_functions() + self.context + .def_map(LOCAL_CRATE) + .expect("The local crate should be analyzed already") + .get_all_test_functions(interner) .filter_map(|id| interner.function_name(&id).contains(pattern).then_some(id)) .collect() } diff --git a/crates/noirc_frontend/src/hir/def_map/mod.rs b/crates/noirc_frontend/src/hir/def_map/mod.rs index 4d6eb00b2eb..0d183bc1890 100644 --- a/crates/noirc_frontend/src/hir/def_map/mod.rs +++ b/crates/noirc_frontend/src/hir/def_map/mod.rs @@ -1,8 +1,9 @@ use crate::graph::CrateId; use crate::hir::def_collector::dc_crate::DefCollector; use crate::hir::Context; -use crate::node_interner::FuncId; +use crate::node_interner::{FuncId, NodeInterner}; use crate::parser::{parse_program, ParsedModule}; +use crate::token::Attribute; use arena::{Arena, Index}; use fm::{FileId, FileManager}; use noirc_errors::FileDiagnostic; @@ -112,6 +113,18 @@ impl CrateDefMap { pub fn module_file_id(&self, module_id: LocalModuleId) -> FileId { self.modules[module_id.0].origin.file_id() } + + /// Go through all modules in this crate, and find all functions in + /// each module with the #[test] attribute + pub fn get_all_test_functions<'a>( + &'a self, + interner: &'a NodeInterner, + ) -> impl Iterator + 'a { + self.modules.iter().flat_map(|(_, module)| { + let functions = module.scope.values().values().filter_map(|(id, _)| id.as_function()); + functions.filter(|id| interner.function_meta(id).attributes == Some(Attribute::Test)) + }) + } } /// Given a FileId, fetch the File, from the FileManager and parse it's content diff --git a/crates/noirc_frontend/src/node_interner.rs b/crates/noirc_frontend/src/node_interner.rs index b1287034246..35b3a7e7a52 100644 --- a/crates/noirc_frontend/src/node_interner.rs +++ b/crates/noirc_frontend/src/node_interner.rs @@ -18,7 +18,6 @@ use crate::hir_def::{ function::{FuncMeta, HirFunction}, stmt::HirStatement, }; -use crate::token::Attribute; use crate::{Shared, TypeBinding, TypeBindings, TypeVariableId}; #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] @@ -576,13 +575,6 @@ impl NodeInterner { std::mem::take(&mut self.delayed_type_checks) } - pub fn get_all_test_functions(&self) -> impl Iterator + '_ { - self.func_meta.iter().filter_map(|(id, meta)| { - let is_test = meta.attributes.as_ref()? == &Attribute::Test; - is_test.then_some(*id) - }) - } - /// Add a method to a type. /// This will panic for non-struct types currently as we do not support methods /// for primitives. We could allow this in the future however.