diff --git a/crates/cairo-lang-doc/src/documentable_formatter.rs b/crates/cairo-lang-doc/src/documentable_formatter.rs index f41bbfd60ac..6a0b8e53b58 100644 --- a/crates/cairo-lang-doc/src/documentable_formatter.rs +++ b/crates/cairo-lang-doc/src/documentable_formatter.rs @@ -34,16 +34,7 @@ use salsa::Database; use crate::documentable_item::DocumentableItemId; use crate::location_links::{LocationLink, format_signature}; -use crate::signature_data::{ - DocumentableItemSignatureData, get_constant_signature_data, get_enum_signature_data, - get_extern_function_full_signature, get_extern_type_full_signature, - get_free_function_signature_data, get_impl_alias_signature_data, - get_impl_constant_signature_data, get_impl_def_signature_data, - get_impl_function_signature_data, get_impl_type_def_full_signature, get_member_signature_data, - get_module_type_alias_full_signature, get_struct_signature_data, - get_trait_const_signature_data, get_trait_function_signature_data, get_trait_signature_data, - get_trait_type_full_signature, -}; +use crate::signature_data::{DocumentableItemSignatureData, SignatureDataRetriever}; use crate::signature_errors::SignatureError; /// Used for indenting children items of complex data type signature, e.g., struct members. @@ -242,7 +233,7 @@ impl<'db> HirDisplay<'db> for VariantId<'db> { impl<'db> HirDisplay<'db> for EnumId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let enum_full_signature = get_enum_signature_data(f.db, *self)?; + let enum_full_signature = Self::retrieve_signature_data(f.db, *self)?; write!( f, "{}enum {} {{", @@ -284,7 +275,7 @@ impl<'db> HirDisplay<'db> for EnumId<'db> { impl<'db> HirDisplay<'db> for MemberId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let member_full_signature = get_member_signature_data(f.db, *self)?; + let member_full_signature = Self::retrieve_signature_data(f.db, *self)?; if let Some(return_type) = member_full_signature.return_type { if return_type.is_unit(f.db) { write!( @@ -314,7 +305,7 @@ impl<'db> HirDisplay<'db> for MemberId<'db> { impl<'db> HirDisplay<'db> for StructId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let struct_full_signature = get_struct_signature_data(f.db, *self)?; + let struct_full_signature = Self::retrieve_signature_data(f.db, *self)?; if let Some(attributes) = struct_full_signature.attributes { write_struct_attributes_syntax(attributes, f).map_err(|_| { SignatureError::FailedWritingSignature(struct_full_signature.full_path.clone()) @@ -367,7 +358,7 @@ impl<'db> HirDisplay<'db> for StructId<'db> { impl<'db> HirDisplay<'db> for FreeFunctionId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let free_function_full_signature = get_free_function_signature_data(f.db, *self)?; + let free_function_full_signature = Self::retrieve_signature_data(f.db, *self)?; write_function_signature(f, free_function_full_signature, "".to_string()) .map_err(|_| SignatureError::FailedWritingSignature(self.full_path(f.db)))?; f.format(); @@ -377,7 +368,7 @@ impl<'db> HirDisplay<'db> for FreeFunctionId<'db> { impl<'db> HirDisplay<'db> for ConstantId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let constant_full_signature = get_constant_signature_data(f.db, *self)?; + let constant_full_signature = Self::retrieve_signature_data(f.db, *self)?; write!( f, "{}const {}: ", @@ -441,7 +432,7 @@ impl<'db> HirDisplay<'db> for ConstantId<'db> { impl<'db> HirDisplay<'db> for ImplConstantDefId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let constant_full_signature = get_impl_constant_signature_data(f.db, *self)?; + let constant_full_signature = Self::retrieve_signature_data(f.db, *self)?; if let Some(return_type) = constant_full_signature.return_type { f.write_type( Some(&format!("const {}: ", constant_full_signature.name.long(f.db))), @@ -463,7 +454,7 @@ impl<'db> HirDisplay<'db> for ImplConstantDefId<'db> { impl<'db> HirDisplay<'db> for TraitFunctionId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let trait_function_full_signature = get_trait_function_signature_data(f.db, *self)?; + let trait_function_full_signature = Self::retrieve_signature_data(f.db, *self)?; write_function_signature(f, trait_function_full_signature, "".to_string()) .map_err(|_| SignatureError::FailedWritingSignature(self.full_path(f.db)))?; f.format(); @@ -473,7 +464,7 @@ impl<'db> HirDisplay<'db> for TraitFunctionId<'db> { impl<'db> HirDisplay<'db> for ImplFunctionId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let impl_function_full_signature = get_impl_function_signature_data(f.db, *self)?; + let impl_function_full_signature = Self::retrieve_signature_data(f.db, *self)?; write_function_signature(f, impl_function_full_signature, "".to_string()) .map_err(|_| SignatureError::FailedWritingSignature(self.full_path(f.db)))?; f.format(); @@ -483,7 +474,7 @@ impl<'db> HirDisplay<'db> for ImplFunctionId<'db> { impl<'db> HirDisplay<'db> for TraitId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let trait_full_signature = get_trait_signature_data(f.db, *self)?; + let trait_full_signature = Self::retrieve_signature_data(f.db, *self)?; write!( f, "{}trait {}", @@ -505,7 +496,7 @@ impl<'db> HirDisplay<'db> for TraitId<'db> { impl<'db> HirDisplay<'db> for TraitConstantId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let trait_const_full_signature = get_trait_const_signature_data(f.db, *self)?; + let trait_const_full_signature = Self::retrieve_signature_data(f.db, *self)?; if let Some(return_type) = trait_const_full_signature.return_type { write!( f, @@ -526,7 +517,7 @@ impl<'db> HirDisplay<'db> for TraitConstantId<'db> { impl<'db> HirDisplay<'db> for ImplDefId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let impl_def_full_signature = get_impl_def_signature_data(f.db, *self)?; + let impl_def_full_signature = Self::retrieve_signature_data(f.db, *self)?; let trait_id = f.db.impl_def_trait(*self).map_err(|_| { SignatureError::FailedRetrievingSemanticData(impl_def_full_signature.full_path.clone()) })?; @@ -560,7 +551,7 @@ impl<'db> HirDisplay<'db> for ImplDefId<'db> { impl<'db> HirDisplay<'db> for ImplAliasId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let impl_alias_full_signature = get_impl_alias_signature_data(f.db, *self)?; + let impl_alias_full_signature = Self::retrieve_signature_data(f.db, *self)?; write!( f, "{}impl {} = ", @@ -580,7 +571,7 @@ impl<'db> HirDisplay<'db> for ImplAliasId<'db> { impl<'db> HirDisplay<'db> for ModuleTypeAliasId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let module_type_alias_full_signature = get_module_type_alias_full_signature(f.db, *self)?; + let module_type_alias_full_signature = Self::retrieve_signature_data(f.db, *self)?; write_type_signature(f, module_type_alias_full_signature, false) .map_err(|_| SignatureError::FailedWritingSignature(self.full_path(f.db)))?; f.format(); @@ -590,7 +581,7 @@ impl<'db> HirDisplay<'db> for ModuleTypeAliasId<'db> { impl<'db> HirDisplay<'db> for TraitTypeId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let trait_type_full_signature = get_trait_type_full_signature(f.db, *self)?; + let trait_type_full_signature = Self::retrieve_signature_data(f.db, *self)?; write_type_signature(f, trait_type_full_signature, false) .map_err(|_| SignatureError::FailedWritingSignature(self.full_path(f.db)))?; f.format(); @@ -600,7 +591,7 @@ impl<'db> HirDisplay<'db> for TraitTypeId<'db> { impl<'db> HirDisplay<'db> for ImplTypeDefId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let impl_type_def_full_signature = get_impl_type_def_full_signature(f.db, *self)?; + let impl_type_def_full_signature = Self::retrieve_signature_data(f.db, *self)?; write_type_signature(f, impl_type_def_full_signature, false) .map_err(|_| SignatureError::FailedWritingSignature(self.full_path(f.db)))?; f.format(); @@ -610,7 +601,7 @@ impl<'db> HirDisplay<'db> for ImplTypeDefId<'db> { impl<'db> HirDisplay<'db> for ExternTypeId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let extern_type_full_signature = get_extern_type_full_signature(f.db, *self)?; + let extern_type_full_signature = Self::retrieve_signature_data(f.db, *self)?; write_type_signature(f, extern_type_full_signature, true) .map_err(|_| SignatureError::FailedWritingSignature(self.full_path(f.db)))?; f.format(); @@ -620,7 +611,7 @@ impl<'db> HirDisplay<'db> for ExternTypeId<'db> { impl<'db> HirDisplay<'db> for ExternFunctionId<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'db>) -> Result<(), SignatureError> { - let extern_function_full_signature = get_extern_function_full_signature(f.db, *self)?; + let extern_function_full_signature = Self::retrieve_signature_data(f.db, *self)?; let signature = match f.db.extern_function_signature(*self) { Ok(signature) => signature, _ => { diff --git a/crates/cairo-lang-doc/src/signature_data.rs b/crates/cairo-lang-doc/src/signature_data.rs index bf1a5f149dd..c4eff4befde 100644 --- a/crates/cairo-lang-doc/src/signature_data.rs +++ b/crates/cairo-lang-doc/src/signature_data.rs @@ -31,23 +31,75 @@ use crate::documentable_item::DocumentableItemId::Member; use crate::signature_errors::SignatureError; /// A helper struct gathering documentable item's signature data. -pub(crate) struct DocumentableItemSignatureData<'db> { - pub(crate) item_id: DocumentableItemId<'db>, - pub(crate) name: SmolStrId<'db>, - pub(crate) visibility: Visibility, - pub(crate) generic_args: Option>>, - pub(crate) generic_params: Option>>, - pub(crate) variants: Option, TypeId<'db>)>>, - pub(crate) members: Option, TypeId<'db>, Visibility)>>, - pub(crate) return_type: Option>, - pub(crate) attributes: Option>>, - pub(crate) params: Option>>, - pub(crate) resolver_generic_params: Option>>, - pub(crate) return_value_expr: Option>, - pub(crate) full_path: String, +pub struct DocumentableItemSignatureData<'db> { + /// The item's identifier. + pub item_id: DocumentableItemId<'db>, + /// The item's simple name (last segment of its full path). + pub name: SmolStrId<'db>, + /// Visibility qualifier. + pub visibility: Visibility, + /// Concrete generic arguments applied to the item. + pub generic_args: Option>>, + /// Generic parameters declared by the item. + pub generic_params: Option>>, + /// Enum variants for enum items: a list of pairs `(variant_name, variant_type)`. + pub variants: Option, TypeId<'db>)>>, + /// Struct members for struct items: a list of triples `(member_name, member_type, + /// visibility)`. + pub members: Option, TypeId<'db>, Visibility)>>, + /// Return type for function-like items. + pub return_type: Option>, + /// Attributes attached to the item. + pub attributes: Option>>, + /// Parameters for function-like items. + pub params: Option>>, + /// Generic parameters coming from the resolver context. + pub resolver_generic_params: Option>>, + /// The value expression for constant-like items. + pub return_value_expr: Option>, + /// Fully qualified path to the item. + pub full_path: String, } -/// A utility function, retrieves [`ModuleItemInfo`] for [`ModuleItemId`]. +pub trait SignatureDataRetriever<'db, T> { + fn retrieve_signature_data( + db: &'db dyn Database, + item_id: T, + ) -> Result, SignatureError>; +} + +macro_rules! implement_signature_data_retriever { + ($t:ty, $function:expr) => { + impl<'db> SignatureDataRetriever<'db, $t> for $t { + fn retrieve_signature_data( + db: &'db dyn Database, + item_id: $t, + ) -> Result, SignatureError> { + $function(db, item_id) + } + } + }; +} + +implement_signature_data_retriever!(ExternTypeId<'db>, get_extern_type_full_signature); +implement_signature_data_retriever!(ConstantId<'db>, get_constant_signature_data); +implement_signature_data_retriever!(EnumId<'db>, get_enum_signature_data); +implement_signature_data_retriever!(FreeFunctionId<'db>, get_free_function_signature_data); +implement_signature_data_retriever!(ImplFunctionId<'db>, get_impl_function_signature_data); +implement_signature_data_retriever!(MemberId<'db>, get_member_signature_data); +implement_signature_data_retriever!(StructId<'db>, get_struct_signature_data); +implement_signature_data_retriever!(TraitFunctionId<'db>, get_trait_function_signature_data); +implement_signature_data_retriever!(TraitId<'db>, get_trait_signature_data); +implement_signature_data_retriever!(ImplTypeDefId<'db>, get_impl_type_def_full_signature); +implement_signature_data_retriever!(ModuleTypeAliasId<'db>, get_module_type_alias_full_signature); +implement_signature_data_retriever!(TraitConstantId<'db>, get_trait_const_signature_data); +implement_signature_data_retriever!(TraitTypeId<'db>, get_trait_type_full_signature); +implement_signature_data_retriever!(ImplDefId<'db>, get_impl_def_signature_data); +implement_signature_data_retriever!(ImplAliasId<'db>, get_impl_alias_signature_data); +implement_signature_data_retriever!(ExternFunctionId<'db>, get_extern_function_full_signature); +implement_signature_data_retriever!(ImplConstantDefId<'db>, get_impl_constant_signature_data); + +/// A utility function that retrieves [`ModuleItemInfo`] for [`ModuleItemId`]. fn get_module_item_info<'db>( db: &'db dyn Database, module_item_id: ModuleItemId<'db>, @@ -66,7 +118,7 @@ fn get_module_item_info<'db>( /// Retrieves data for enum signature formatting. Returns [`SignatureError`] if any relevant data /// could not be retrieved from db. -pub(crate) fn get_enum_signature_data<'db>( +fn get_enum_signature_data<'db>( db: &'db dyn Database, item_id: EnumId<'db>, ) -> Result, SignatureError> { @@ -102,7 +154,7 @@ pub(crate) fn get_enum_signature_data<'db>( } /// Retrieves data for struct signature formatting. -pub(crate) fn get_struct_signature_data<'db>( +fn get_struct_signature_data<'db>( db: &'db dyn Database, item_id: StructId<'db>, ) -> Result, SignatureError> { @@ -142,7 +194,7 @@ pub(crate) fn get_struct_signature_data<'db>( } /// Retrieves data for member signature formatting. -pub(crate) fn get_member_signature_data<'db>( +fn get_member_signature_data<'db>( db: &'db dyn Database, item_id: MemberId<'db>, ) -> Result, SignatureError> { @@ -175,7 +227,7 @@ pub(crate) fn get_member_signature_data<'db>( } /// Retrieves data for free function signature formatting. -pub(crate) fn get_free_function_signature_data<'db>( +fn get_free_function_signature_data<'db>( db: &'db dyn Database, item_id: FreeFunctionId<'db>, ) -> Result, SignatureError> { @@ -214,7 +266,7 @@ pub(crate) fn get_free_function_signature_data<'db>( } /// Retrieves data for trait function signature formatting. -pub(crate) fn get_trait_function_signature_data<'db>( +fn get_trait_function_signature_data<'db>( db: &'db dyn Database, item_id: TraitFunctionId<'db>, ) -> Result, SignatureError> { @@ -263,7 +315,7 @@ pub(crate) fn get_trait_function_signature_data<'db>( } /// Retrieves data for impl function signature formatting. -pub(crate) fn get_impl_function_signature_data<'db>( +fn get_impl_function_signature_data<'db>( db: &'db dyn Database, item_id: ImplFunctionId<'db>, ) -> Result, SignatureError> { @@ -293,7 +345,7 @@ pub(crate) fn get_impl_function_signature_data<'db>( } /// Retrieves data for constant signature formatting. -pub(crate) fn get_constant_signature_data<'db>( +fn get_constant_signature_data<'db>( db: &'db dyn Database, item_id: ConstantId<'db>, ) -> Result, SignatureError> { @@ -324,7 +376,7 @@ pub(crate) fn get_constant_signature_data<'db>( } /// Retrieves data for impl constant signature formatting. -pub(crate) fn get_impl_constant_signature_data<'db>( +fn get_impl_constant_signature_data<'db>( db: &'db dyn Database, item_id: ImplConstantDefId<'db>, ) -> Result, SignatureError> { @@ -352,7 +404,7 @@ pub(crate) fn get_impl_constant_signature_data<'db>( } /// Retrieves data for trait signature formatting. -pub(crate) fn get_trait_signature_data<'db>( +fn get_trait_signature_data<'db>( db: &'db dyn Database, item_id: TraitId<'db>, ) -> Result, SignatureError> { @@ -381,7 +433,7 @@ pub(crate) fn get_trait_signature_data<'db>( } /// Retrieves data for trait const signature formatting. -pub(crate) fn get_trait_const_signature_data<'db>( +fn get_trait_const_signature_data<'db>( db: &'db dyn Database, item_id: TraitConstantId<'db>, ) -> Result, SignatureError> { @@ -411,7 +463,7 @@ pub(crate) fn get_trait_const_signature_data<'db>( } /// Retrieves data for implementation signature formatting. -pub(crate) fn get_impl_def_signature_data<'db>( +fn get_impl_def_signature_data<'db>( db: &'db dyn Database, item_id: ImplDefId<'db>, ) -> Result, SignatureError> { @@ -445,7 +497,7 @@ pub(crate) fn get_impl_def_signature_data<'db>( } /// Retrieves data for alias signature formatting. -pub(crate) fn get_impl_alias_signature_data<'db>( +fn get_impl_alias_signature_data<'db>( db: &'db dyn Database, item_id: ImplAliasId<'db>, ) -> Result, SignatureError> { @@ -472,7 +524,7 @@ pub(crate) fn get_impl_alias_signature_data<'db>( } /// Retrieves data for type alias signature formatting. -pub(crate) fn get_module_type_alias_full_signature<'db>( +fn get_module_type_alias_full_signature<'db>( db: &'db dyn Database, item_id: ModuleTypeAliasId<'db>, ) -> Result, SignatureError> { @@ -507,7 +559,7 @@ pub(crate) fn get_module_type_alias_full_signature<'db>( } /// Retrieves data for trait type signature formatting. -pub(crate) fn get_trait_type_full_signature<'db>( +fn get_trait_type_full_signature<'db>( db: &'db dyn Database, item_id: TraitTypeId<'db>, ) -> Result, SignatureError> { @@ -533,7 +585,7 @@ pub(crate) fn get_trait_type_full_signature<'db>( } /// Retrieves data for type signature formatting. -pub(crate) fn get_impl_type_def_full_signature<'db>( +fn get_impl_type_def_full_signature<'db>( db: &'db dyn Database, item_id: ImplTypeDefId<'db>, ) -> Result, SignatureError> { @@ -563,7 +615,7 @@ pub(crate) fn get_impl_type_def_full_signature<'db>( } /// Retrieves data for extern type signature formatting. -pub(crate) fn get_extern_type_full_signature<'db>( +fn get_extern_type_full_signature<'db>( db: &'db dyn Database, item_id: ExternTypeId<'db>, ) -> Result, SignatureError> { @@ -594,7 +646,7 @@ pub(crate) fn get_extern_type_full_signature<'db>( } /// Retrieves data for extern function signature formatting. -pub(crate) fn get_extern_function_full_signature<'db>( +fn get_extern_function_full_signature<'db>( db: &'db dyn Database, item_id: ExternFunctionId<'db>, ) -> Result, SignatureError> {