Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
105 changes: 71 additions & 34 deletions crates/cairo-lang-defs/src/ids.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<SmolStrId<'db>> {
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::<Vec<_>>().join("::")
}
}

Expand Down Expand Up @@ -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> {
Expand Down Expand Up @@ -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<SmolStrId<'db>> {
match self {
$(
$enum_name::$variant(id) => id.path_segments(db),
)*
}
}
}
}
}

Expand All @@ -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<SmolStrId<'db>> {
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::<Vec<_>>().join("::")
}
pub fn name(&self, db: &'db dyn Database) -> SmolStrId<'db> {
match self {
ModuleId::CrateRoot(id) => id.long(db).name(),
Expand Down Expand Up @@ -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<SmolStrId<'db>> {
let mut segments = self.impl_def_id(db).path_segments(db);
segments.push(self.name(db));
segments
}
}

Expand All @@ -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<SmolStrId<'db>> {
let mut segments = self.impl_def_id(db).path_segments(db);
segments.push(self.name(db));
segments
}
}

Expand All @@ -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<SmolStrId<'db>> {
let mut segments = self.impl_def_id(db).path_segments(db);
segments.push(self.name(db));
segments
}
}

Expand All @@ -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<SmolStrId<'db>> {
let mut segments = self.impl_def_id(db).path_segments(db);
segments.push(self.name(db));
segments
}
}

Expand Down Expand Up @@ -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<SmolStrId<'db>> {
let mut segments = self.trait_id(db).path_segments(db);
segments.push(self.name(db));
segments
}
}
impl<'db> UnstableSalsaId for TraitTypeId<'db> {
Expand All @@ -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<SmolStrId<'db>> {
let mut segments = self.trait_id(db).path_segments(db);
segments.push(self.name(db));
segments
}
}

Expand All @@ -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<SmolStrId<'db>> {
let mut segments = self.trait_id(db).path_segments(db);
segments.push(self.name(db));
segments
}
}
impl<'db> UnstableSalsaId for TraitImplId<'db> {
Expand All @@ -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<SmolStrId<'db>> {
let mut segments = self.trait_id(db).path_segments(db);
segments.push(self.name(db));
segments
}
}

Expand All @@ -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<SmolStrId<'db>> {
let mut segments = self.struct_id(db).path_segments(db);
segments.push(self.name(db));
segments
}
}

Expand All @@ -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<SmolStrId<'db>> {
let mut segments = self.enum_id(db).path_segments(db);
segments.push(self.name(db));
segments
}
}

Expand Down
4 changes: 2 additions & 2 deletions crates/cairo-lang-defs/src/test_data/generic_item_id
Original file line number Diff line number Diff line change
Expand Up @@ -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)
18 changes: 9 additions & 9 deletions crates/cairo-lang-semantic/src/expr/semantic_test_data/match
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ Match(
x,
),
Member {
id: MemberId(test::x),
id: MemberId(test::P::x),
ty: core::integer::u8,
visibility: Private,
},
Expand All @@ -331,7 +331,7 @@ Match(
},
),
Member {
id: MemberId(test::y),
id: MemberId(test::P::y),
ty: core::integer::u8,
visibility: Private,
},
Expand All @@ -341,7 +341,7 @@ Match(
t,
),
Member {
id: MemberId(test::z),
id: MemberId(test::P::z),
ty: core::integer::u8,
visibility: Private,
},
Expand Down Expand Up @@ -703,7 +703,7 @@ Match(
x,
),
Member {
id: MemberId(test::x),
id: MemberId(test::P::x),
ty: core::integer::u8,
visibility: Private,
},
Expand All @@ -715,7 +715,7 @@ Match(
},
),
Member {
id: MemberId(test::y),
id: MemberId(test::P::y),
ty: core::integer::u8,
visibility: Private,
},
Expand All @@ -725,7 +725,7 @@ Match(
t,
),
Member {
id: MemberId(test::z),
id: MemberId(test::P::z),
ty: core::integer::u8,
visibility: Private,
},
Expand Down Expand Up @@ -901,7 +901,7 @@ Match(
x,
),
Member {
id: MemberId(test::x),
id: MemberId(test::P::x),
ty: core::integer::u8,
visibility: Private,
},
Expand All @@ -913,7 +913,7 @@ Match(
},
),
Member {
id: MemberId(test::y),
id: MemberId(test::P::y),
ty: core::integer::u8,
visibility: Private,
},
Expand All @@ -925,7 +925,7 @@ Match(
},
),
Member {
id: MemberId(test::z),
id: MemberId(test::P::z),
ty: core::integer::u8,
visibility: Private,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
},
),
Expand Down
14 changes: 7 additions & 7 deletions crates/cairo-lang-semantic/src/expr/semantic_test_data/structure
Original file line number Diff line number Diff line change
Expand Up @@ -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,),
},
),
Expand All @@ -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,
},
),
Expand All @@ -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,
},
),
Expand All @@ -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,
},
),
Expand Down Expand Up @@ -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,
Expand Down
Loading