diff --git a/crates/cairo-lang-defs/src/ids.rs b/crates/cairo-lang-defs/src/ids.rs index ca44adaff74..fb652ae6c3e 100644 --- a/crates/cairo-lang-defs/src/ids.rs +++ b/crates/cairo-lang-defs/src/ids.rs @@ -62,8 +62,15 @@ pub trait NamedLanguageElementId<'db>: LanguageElementId<'db> { fn name_identifier(&'db self, db: &'db dyn Database) -> ast::TerminalIdentifier<'db>; } pub trait TopLevelLanguageElementId<'db>: NamedLanguageElementId<'db> { + /// Returns the path segments from the crate root to this item. + fn path_segments(&self, db: &'db dyn Database) -> Vec> { + let mut segments = self.parent_module(db).path_segments(db); + segments.push(self.name(db)); + segments + } + fn full_path(&self, db: &'db dyn Database) -> String { - format!("{}::{}", self.parent_module(db).full_path(db), self.name(db).long(db)) + self.path_segments(db).iter().map(|s| s.long(db).as_str()).collect::>().join("::") } } @@ -98,14 +105,7 @@ macro_rules! define_named_language_element_id { f: &mut std::fmt::Formatter<'_>, db: &'db dyn Database, ) -> std::fmt::Result { - let $long_id(module_id, _stable_ptr) = self; - write!( - f, - "{}({}::{})", - stringify!($short_id), - module_id.full_path(db), - self.name(db).long(db) - ) + write!(f, "{}({})", stringify!($short_id), self.clone().intern(db).full_path(db)) } } impl<'db> NamedLanguageElementLongId<'db> for $long_id<'db> { @@ -277,7 +277,15 @@ macro_rules! toplevel_enum { } } } - impl<'db> TopLevelLanguageElementId<'db> for $enum_name<'db> {} + impl<'db> TopLevelLanguageElementId<'db> for $enum_name<'db> { + fn path_segments(&self, db: &'db dyn Database) -> Vec> { + match self { + $( + $enum_name::$variant(id) => id.path_segments(db), + )* + } + } + } } } @@ -299,17 +307,26 @@ pub enum ModuleId<'db> { }, } impl<'db> ModuleId<'db> { - pub fn full_path(&self, db: &dyn Database) -> String { + /// Returns the path segments from the crate root to this module. + pub fn path_segments(&self, db: &'db dyn Database) -> Vec> { match self { - ModuleId::CrateRoot(id) => id.long(db).name().to_string(db), + ModuleId::CrateRoot(id) => vec![id.long(db).name()], ModuleId::Submodule(id) => { - format!("{}::{}", id.parent_module(db).full_path(db), id.name(db).long(db)) + let mut segments = id.parent_module(db).path_segments(db); + segments.push(id.name(db)); + segments } ModuleId::MacroCall { id, .. } => { - format!("{}::{}", id.parent_module(db).full_path(db), self.name(db).long(db)) + let mut segments = id.parent_module(db).path_segments(db); + segments.push(self.name(db)); + segments } } } + + pub fn full_path(&self, db: &'db dyn Database) -> String { + self.path_segments(db).iter().map(|s| s.long(db).as_str()).collect::>().join("::") + } pub fn name(&self, db: &'db dyn Database) -> SmolStrId<'db> { match self { ModuleId::CrateRoot(id) => id.long(db).name(), @@ -547,8 +564,10 @@ impl<'db> ImplTypeDefId<'db> { } } impl<'db> TopLevelLanguageElementId<'db> for ImplTypeDefId<'db> { - fn full_path(&self, db: &dyn Database) -> String { - format!("{}::{}", self.impl_def_id(db).full_path(db), self.name(db).long(db)) + fn path_segments(&self, db: &'db dyn Database) -> Vec> { + let mut segments = self.impl_def_id(db).path_segments(db); + segments.push(self.name(db)); + segments } } @@ -564,8 +583,10 @@ impl<'db> ImplConstantDefId<'db> { } } impl<'db> TopLevelLanguageElementId<'db> for ImplConstantDefId<'db> { - fn full_path(&self, db: &dyn Database) -> String { - format!("{}::{}", self.impl_def_id(db).full_path(db), self.name(db).long(db)) + fn path_segments(&self, db: &'db dyn Database) -> Vec> { + let mut segments = self.impl_def_id(db).path_segments(db); + segments.push(self.name(db)); + segments } } @@ -581,8 +602,10 @@ impl<'db> ImplImplDefId<'db> { } } impl<'db> TopLevelLanguageElementId<'db> for ImplImplDefId<'db> { - fn full_path(&self, db: &dyn Database) -> String { - format!("{}::{}", self.impl_def_id(db).full_path(db), self.name(db).long(db)) + fn path_segments(&self, db: &'db dyn Database) -> Vec> { + let mut segments = self.impl_def_id(db).path_segments(db); + segments.push(self.name(db)); + segments } } @@ -603,8 +626,10 @@ impl<'db> UnstableSalsaId for ImplFunctionId<'db> { } } impl<'db> TopLevelLanguageElementId<'db> for ImplFunctionId<'db> { - fn full_path(&self, db: &dyn Database) -> String { - format!("{}::{}", self.impl_def_id(db).full_path(db), self.name(db).long(db)) + fn path_segments(&self, db: &'db dyn Database) -> Vec> { + let mut segments = self.impl_def_id(db).path_segments(db); + segments.push(self.name(db)); + segments } } @@ -652,8 +677,10 @@ impl<'db> TraitTypeId<'db> { } } impl<'db> TopLevelLanguageElementId<'db> for TraitTypeId<'db> { - fn full_path(&self, db: &dyn Database) -> String { - format!("{}::{}", self.trait_id(db).full_path(db), self.name(db).long(db)) + fn path_segments(&self, db: &'db dyn Database) -> Vec> { + let mut segments = self.trait_id(db).path_segments(db); + segments.push(self.name(db)); + segments } } impl<'db> UnstableSalsaId for TraitTypeId<'db> { @@ -677,8 +704,10 @@ impl<'db> TraitConstantId<'db> { } } impl<'db> TopLevelLanguageElementId<'db> for TraitConstantId<'db> { - fn full_path(&self, db: &dyn Database) -> String { - format!("{}::{}", self.trait_id(db).full_path(db), self.name(db).long(db)) + fn path_segments(&self, db: &'db dyn Database) -> Vec> { + let mut segments = self.trait_id(db).path_segments(db); + segments.push(self.name(db)); + segments } } @@ -693,8 +722,10 @@ impl<'db> TraitImplId<'db> { } } impl<'db> TopLevelLanguageElementId<'db> for TraitImplId<'db> { - fn full_path(&self, db: &dyn Database) -> String { - format!("{}::{}", self.trait_id(db).full_path(db), self.name(db).long(db)) + fn path_segments(&self, db: &'db dyn Database) -> Vec> { + let mut segments = self.trait_id(db).path_segments(db); + segments.push(self.name(db)); + segments } } impl<'db> UnstableSalsaId for TraitImplId<'db> { @@ -718,8 +749,10 @@ impl<'db> TraitFunctionId<'db> { } } impl<'db> TopLevelLanguageElementId<'db> for TraitFunctionId<'db> { - fn full_path(&self, db: &dyn Database) -> String { - format!("{}::{}", self.trait_id(db).full_path(db), self.name(db).long(db)) + fn path_segments(&self, db: &'db dyn Database) -> Vec> { + let mut segments = self.trait_id(db).path_segments(db); + segments.push(self.name(db)); + segments } } @@ -734,8 +767,10 @@ impl<'db> MemberId<'db> { } impl<'db> TopLevelLanguageElementId<'db> for MemberId<'db> { - fn full_path(&self, db: &dyn Database) -> String { - format!("{}::{}", self.struct_id(db).full_path(db), self.name(db).long(db)) + fn path_segments(&self, db: &'db dyn Database) -> Vec> { + let mut segments = self.struct_id(db).path_segments(db); + segments.push(self.name(db)); + segments } } @@ -750,8 +785,10 @@ impl<'db> VariantId<'db> { } impl<'db> TopLevelLanguageElementId<'db> for VariantId<'db> { - fn full_path(&self, db: &dyn Database) -> String { - format!("{}::{}", self.enum_id(db).full_path(db), self.name(db).long(db)) + fn path_segments(&self, db: &'db dyn Database) -> Vec> { + let mut segments = self.enum_id(db).path_segments(db); + segments.push(self.name(db)); + segments } } diff --git a/crates/cairo-lang-defs/src/test_data/generic_item_id b/crates/cairo-lang-defs/src/test_data/generic_item_id index 9a64a5a0685..6cca520670b 100644 --- a/crates/cairo-lang-defs/src/test_data/generic_item_id +++ b/crates/cairo-lang-defs/src/test_data/generic_item_id @@ -28,7 +28,7 @@ GenericParamType(test::MyStruct::A) -> StructId(test::MyStruct) GenericParamType(test::MyEnum::A) -> EnumId(test::MyEnum) GenericParamConst(test::MyType::A) -> ExternTypeId(test::MyType) GenericParamType(test::MyTrait::A) -> TraitId(test::MyTrait) -GenericParamType(test::foo::B) -> TraitFunctionId(test::foo) +GenericParamType(test::MyTrait::foo::B) -> TraitFunctionId(test::MyTrait::foo) GenericParamType(test::MyImpl::A) -> ImplDefId(test::MyImpl) -GenericParamType(test::foo::B) -> ImplFunctionId(test::foo) +GenericParamType(test::MyImpl::foo::B) -> ImplFunctionId(test::MyImpl::foo) GenericParamType(test::MyAlias::A) -> ModuleTypeAliasId(test::MyAlias) diff --git a/crates/cairo-lang-semantic/src/expr/semantic_test_data/match b/crates/cairo-lang-semantic/src/expr/semantic_test_data/match index cde1541f399..f2fe09d462a 100644 --- a/crates/cairo-lang-semantic/src/expr/semantic_test_data/match +++ b/crates/cairo-lang-semantic/src/expr/semantic_test_data/match @@ -319,7 +319,7 @@ Match( x, ), Member { - id: MemberId(test::x), + id: MemberId(test::P::x), ty: core::integer::u8, visibility: Private, }, @@ -331,7 +331,7 @@ Match( }, ), Member { - id: MemberId(test::y), + id: MemberId(test::P::y), ty: core::integer::u8, visibility: Private, }, @@ -341,7 +341,7 @@ Match( t, ), Member { - id: MemberId(test::z), + id: MemberId(test::P::z), ty: core::integer::u8, visibility: Private, }, @@ -703,7 +703,7 @@ Match( x, ), Member { - id: MemberId(test::x), + id: MemberId(test::P::x), ty: core::integer::u8, visibility: Private, }, @@ -715,7 +715,7 @@ Match( }, ), Member { - id: MemberId(test::y), + id: MemberId(test::P::y), ty: core::integer::u8, visibility: Private, }, @@ -725,7 +725,7 @@ Match( t, ), Member { - id: MemberId(test::z), + id: MemberId(test::P::z), ty: core::integer::u8, visibility: Private, }, @@ -901,7 +901,7 @@ Match( x, ), Member { - id: MemberId(test::x), + id: MemberId(test::P::x), ty: core::integer::u8, visibility: Private, }, @@ -913,7 +913,7 @@ Match( }, ), Member { - id: MemberId(test::y), + id: MemberId(test::P::y), ty: core::integer::u8, visibility: Private, }, @@ -925,7 +925,7 @@ Match( }, ), Member { - id: MemberId(test::z), + id: MemberId(test::P::z), ty: core::integer::u8, visibility: Private, }, diff --git a/crates/cairo-lang-semantic/src/expr/semantic_test_data/repr_ptr b/crates/cairo-lang-semantic/src/expr/semantic_test_data/repr_ptr index 3324d52584a..c28b0c3aae2 100644 --- a/crates/cairo-lang-semantic/src/expr/semantic_test_data/repr_ptr +++ b/crates/cairo-lang-semantic/src/expr/semantic_test_data/repr_ptr @@ -538,12 +538,12 @@ FunctionCall( LocalVarId(test::p), ), concrete_struct_id: test::PPoint, - member: MemberId(test::point), + member: MemberId(test::PPoint::point), ty: test::Point, }, ), concrete_struct_id: test::Point, - member: MemberId(test::x), + member: MemberId(test::Point::x), ty: core::integer::u32, }, ), diff --git a/crates/cairo-lang-semantic/src/expr/semantic_test_data/structure b/crates/cairo-lang-semantic/src/expr/semantic_test_data/structure index 2fab3c81853..755736b5ac4 100644 --- a/crates/cairo-lang-semantic/src/expr/semantic_test_data/structure +++ b/crates/cairo-lang-semantic/src/expr/semantic_test_data/structure @@ -40,7 +40,7 @@ Block( LocalVarId(test::a), ), concrete_struct_id: test::A, - member: MemberId(test::a), + member: MemberId(test::A::a), ty: (core::felt252,), }, ), @@ -54,7 +54,7 @@ Block( LocalVarId(test::a), ), concrete_struct_id: test::A, - member: MemberId(test::b), + member: MemberId(test::A::b), ty: core::felt252, }, ), @@ -68,7 +68,7 @@ Block( LocalVarId(test::a), ), concrete_struct_id: test::A, - member: MemberId(test::c), + member: MemberId(test::A::c), ty: test::B, }, ), @@ -84,12 +84,12 @@ Block( LocalVarId(test::a), ), concrete_struct_id: test::A, - member: MemberId(test::c), + member: MemberId(test::A::c), ty: test::B, }, ), concrete_struct_id: test::B, - member: MemberId(test::a), + member: MemberId(test::B::a), ty: core::felt252, }, ), @@ -134,13 +134,13 @@ StructCtor( ty: core::felt252, }, ), - MemberId(test::a), + MemberId(test::A::a), ), ( Var( LocalVarId(test::b), ), - MemberId(test::b), + MemberId(test::A::b), ), ], base_struct: None, diff --git a/crates/cairo-lang-semantic/src/expr/semantic_test_data/use b/crates/cairo-lang-semantic/src/expr/semantic_test_data/use index a6bd4b73a3f..1d84fc5e3e5 100644 --- a/crates/cairo-lang-semantic/src/expr/semantic_test_data/use +++ b/crates/cairo-lang-semantic/src/expr/semantic_test_data/use @@ -144,7 +144,7 @@ Block( ty: core::integer::u8, }, ), - MemberId(test::X::a), + MemberId(test::X::R::a), ), ], base_struct: None, @@ -169,7 +169,7 @@ Block( ty: core::integer::u8, }, ), - MemberId(test::X::a), + MemberId(test::X::R::a), ), ], base_struct: None, @@ -224,7 +224,7 @@ Block( ty: core::integer::u8, }, ), - MemberId(test::X::a), + MemberId(test::X::R::a), ), ], base_struct: None, @@ -249,7 +249,7 @@ Block( ty: core::integer::u8, }, ), - MemberId(test::X::a), + MemberId(test::X::R::a), ), ], base_struct: None, diff --git a/crates/cairo-lang-semantic/src/expr/test_data/constant b/crates/cairo-lang-semantic/src/expr/test_data/constant index 832b8b2e14d..d3b02e940b1 100644 --- a/crates/cairo-lang-semantic/src/expr/test_data/constant +++ b/crates/cairo-lang-semantic/src/expr/test_data/constant @@ -621,5 +621,4 @@ const OR_FT: () = assert(false || true); const AND_SHORT_CIRCUIT: () = assert(!(false && boom())); const OR_SHORT_CIRCUIT: () = assert(true || boom()); - //! > expected_diagnostics diff --git a/crates/cairo-lang-semantic/src/items/enm_test.rs b/crates/cairo-lang-semantic/src/items/enm_test.rs index 07e5903b82f..e00b22cba01 100644 --- a/crates/cairo-lang-semantic/src/items/enm_test.rs +++ b/crates/cairo-lang-semantic/src/items/enm_test.rs @@ -69,8 +69,8 @@ fn test_enum() { assert_eq!( actual, indoc! {" - a: VariantId(test::a), ty: (), - b: VariantId(test::b), ty: (core::felt252, core::felt252), - c: VariantId(test::c), ty: ()"} + a: VariantId(test::A::a), ty: (), + b: VariantId(test::A::b), ty: (core::felt252, core::felt252), + c: VariantId(test::A::c), ty: ()"} ); } diff --git a/crates/cairo-lang-semantic/src/items/structure_test.rs b/crates/cairo-lang-semantic/src/items/structure_test.rs index 1a76162e4d8..23c30084b7a 100644 --- a/crates/cairo-lang-semantic/src/items/structure_test.rs +++ b/crates/cairo-lang-semantic/src/items/structure_test.rs @@ -63,9 +63,9 @@ fn test_struct() { assert_eq!( actual, indoc! {" - a: Member { id: MemberId(test::a), ty: (), visibility: Private }, - b: Member { id: MemberId(test::b), ty: (core::felt252, core::felt252), visibility: Public }, - c: Member { id: MemberId(test::c), ty: (), visibility: PublicInCrate }"} + a: Member { id: MemberId(test::A::a), ty: (), visibility: Private }, + b: Member { id: MemberId(test::A::b), ty: (core::felt252, core::felt252), visibility: Public }, + c: Member { id: MemberId(test::A::c), ty: (), visibility: PublicInCrate }"} ); assert_eq!( diff --git a/crates/cairo-lang-semantic/src/resolve/test.rs b/crates/cairo-lang-semantic/src/resolve/test.rs index 64934be8baf..e727f0a0674 100644 --- a/crates/cairo-lang-semantic/src/resolve/test.rs +++ b/crates/cairo-lang-semantic/src/resolve/test.rs @@ -102,12 +102,13 @@ fn test_resolve_path_super() { let members = db.struct_members(struct_id).unwrap(); assert_eq!( format!("{:?}", members[&SmolStrId::from(db, "a")].debug(db)), - "Member { id: MemberId(test::inner2::a), ty: test::inner1::InnerStruct1, visibility: \ - Private }" + "Member { id: MemberId(test::inner2::InnerStruct2::a), ty: test::inner1::InnerStruct1, \ + visibility: Private }" ); assert_eq!( format!("{:?}", members[&SmolStrId::from(db, "b")].debug(db)), - "Member { id: MemberId(test::inner2::b), ty: test::OuterStruct, visibility: Private }" + "Member { id: MemberId(test::inner2::InnerStruct2::b), ty: test::OuterStruct, visibility: \ + Private }" ); }