From 61d79d04f4affff24a0d94a5168bae63834a1a24 Mon Sep 17 00:00:00 2001 From: Marek Kaput Date: Mon, 10 Feb 2025 15:42:57 +0100 Subject: [PATCH 1/4] Add `name_stable_ptr` methods and `GetName` trait for AST objects CairoLS needs to check whether an arbitrary `TerminalIdentifier` is a name of a given `NamedLanguageElementId`. This would be pretty tedious to implement downstream, while it is trivial to embed in the `define_*` macros we have here. --- crates/cairo-lang-defs/src/ids.rs | 21 +++++++++- crates/cairo-lang-syntax/src/node/helpers.rs | 43 ++++++++++++++++---- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/crates/cairo-lang-defs/src/ids.rs b/crates/cairo-lang-defs/src/ids.rs index a13545d0619..88b837b6350 100644 --- a/crates/cairo-lang-defs/src/ids.rs +++ b/crates/cairo-lang-defs/src/ids.rs @@ -25,9 +25,9 @@ use cairo_lang_debug::debug::DebugWithDb; use cairo_lang_diagnostics::Maybe; pub use cairo_lang_filesystem::ids::UnstableSalsaId; use cairo_lang_filesystem::ids::{CrateId, FileId}; -use cairo_lang_syntax::node::ast::TerminalIdentifierGreen; +use cairo_lang_syntax::node::ast::{TerminalIdentifierGreen, TerminalIdentifierPtr}; use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::helpers::{GetIdentifier, NameGreen}; +use cairo_lang_syntax::node::helpers::{GetIdentifier, GetName, NameGreen}; use cairo_lang_syntax::node::ids::SyntaxStablePtrId; use cairo_lang_syntax::node::kind::SyntaxKind; use cairo_lang_syntax::node::stable_ptr::SyntaxStablePtr; @@ -55,9 +55,11 @@ pub trait LanguageElementId { pub trait NamedLanguageElementLongId { fn name(&self, db: &dyn DefsGroup) -> SmolStr; + fn name_stable_ptr(&self, db: &dyn DefsGroup) -> TerminalIdentifierPtr; } pub trait NamedLanguageElementId: LanguageElementId { fn name(&self, db: &dyn DefsGroup) -> SmolStr; + fn name_stable_ptr(&self, db: &dyn DefsGroup) -> TerminalIdentifierPtr; } pub trait TopLevelLanguageElementId: NamedLanguageElementId { fn full_path(&self, db: &dyn DefsGroup) -> String { @@ -109,11 +111,18 @@ macro_rules! define_named_language_element_id { let terminal_green = self.1.name_green(syntax_db); terminal_green.identifier(syntax_db) } + fn name_stable_ptr(&self, db: &dyn DefsGroup) -> TerminalIdentifierPtr { + let syntax_db = db.upcast(); + self.1.lookup(syntax_db).name(syntax_db).stable_ptr() + } } impl NamedLanguageElementId for $short_id { fn name(&self, db: &dyn DefsGroup) -> SmolStr { db.$lookup(*self).name(db) } + fn name_stable_ptr(&self, db: &dyn DefsGroup) -> TerminalIdentifierPtr { + db.$lookup(*self).name_stable_ptr(db) + } } }; } @@ -254,6 +263,13 @@ macro_rules! toplevel_enum { )* } } + fn name_stable_ptr(&self, db: &dyn DefsGroup) -> TerminalIdentifierPtr { + match self { + $( + $enum_name::$variant(id) => id.name_stable_ptr(db), + )* + } + } } impl TopLevelLanguageElementId for $enum_name {} } @@ -1192,6 +1208,7 @@ impl ImplItemId { } define_language_element_id_as_enum! { + #[toplevel] /// Items for resolver lookups. /// These are top items that hold semantic information. /// Semantic info lookups should be performed against these items. diff --git a/crates/cairo-lang-syntax/src/node/helpers.rs b/crates/cairo-lang-syntax/src/node/helpers.rs index 712077c4e2b..9af91f2df20 100644 --- a/crates/cairo-lang-syntax/src/node/helpers.rs +++ b/crates/cairo-lang-syntax/src/node/helpers.rs @@ -1,15 +1,7 @@ use cairo_lang_utils::LookupIntern; use smol_str::SmolStr; -use super::ast::{ - self, FunctionDeclaration, FunctionDeclarationGreen, FunctionWithBody, FunctionWithBodyPtr, - ImplItem, ItemConstant, ItemEnum, ItemExternFunction, ItemExternFunctionPtr, ItemExternType, - ItemImpl, ItemImplAlias, ItemInlineMacro, ItemModule, ItemStruct, ItemTrait, ItemTypeAlias, - ItemUse, Member, Modifier, ModuleItem, OptionArgListParenthesized, Statement, StatementBreak, - StatementContinue, StatementExpr, StatementLet, StatementReturn, TerminalIdentifierGreen, - TokenIdentifierGreen, TraitItem, TraitItemConstant, TraitItemFunction, TraitItemFunctionPtr, - TraitItemImpl, TraitItemType, UsePathLeaf, Variant, WrappedArgList, -}; +use super::ast::{self, FunctionDeclaration, FunctionDeclarationGreen, FunctionWithBody, FunctionWithBodyPtr, ImplItem, ItemConstant, ItemEnum, ItemExternFunction, ItemExternFunctionPtr, ItemExternType, ItemImpl, ItemImplAlias, ItemInlineMacro, ItemModule, ItemStruct, ItemTrait, ItemTypeAlias, ItemUse, Member, Modifier, ModuleItem, OptionArgListParenthesized, Statement, StatementBreak, StatementContinue, StatementExpr, StatementLet, StatementReturn, TerminalIdentifier, TerminalIdentifierGreen, TokenIdentifierGreen, TraitItem, TraitItemConstant, TraitItemFunction, TraitItemFunctionPtr, TraitItemImpl, TraitItemType, UsePathLeaf, Variant, WrappedArgList}; use super::db::SyntaxGroup; use super::ids::SyntaxStablePtrId; use super::kind::SyntaxKind; @@ -156,6 +148,39 @@ impl NameGreen for TraitItemFunctionPtr { } } +/// Provides methods to extract a _name_ of AST objects. +pub trait GetName { + /// Gets a [`TerminalIdentifier`] that represents a _name_ of this AST object. + fn name(&self, db: &dyn SyntaxGroup) -> ast::TerminalIdentifier; +} + +impl GetName for FunctionWithBody { + fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier { + self.declaration(db).name(db) + } +} + +impl GetName for ItemExternFunction { + fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier { + self.declaration(db).name(db) + } +} + +impl GetName for TraitItemFunction { + fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier { + self.declaration(db).name(db) + } +} + +impl GetName for UsePathLeaf { + fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier { + match self.alias_clause(db) { + ast::OptionAliasClause::Empty(_) => self.ident(db).identifier_ast(db), + ast::OptionAliasClause::AliasClause(alias) => alias.alias(db), + } + } +} + pub trait GenericParamEx { /// Returns the name of a generic param if one exists. fn name(&self, db: &dyn SyntaxGroup) -> Option; From 9841545d1b1d2cd453c511b087283dffadf8a436 Mon Sep 17 00:00:00 2001 From: Marek Kaput Date: Mon, 10 Feb 2025 15:45:43 +0100 Subject: [PATCH 2/4] fixup! Add `name_stable_ptr` methods and `GetName` trait for AST objects --- crates/cairo-lang-syntax/src/node/helpers.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/crates/cairo-lang-syntax/src/node/helpers.rs b/crates/cairo-lang-syntax/src/node/helpers.rs index 9af91f2df20..703d0f4cf9d 100644 --- a/crates/cairo-lang-syntax/src/node/helpers.rs +++ b/crates/cairo-lang-syntax/src/node/helpers.rs @@ -1,7 +1,15 @@ use cairo_lang_utils::LookupIntern; use smol_str::SmolStr; -use super::ast::{self, FunctionDeclaration, FunctionDeclarationGreen, FunctionWithBody, FunctionWithBodyPtr, ImplItem, ItemConstant, ItemEnum, ItemExternFunction, ItemExternFunctionPtr, ItemExternType, ItemImpl, ItemImplAlias, ItemInlineMacro, ItemModule, ItemStruct, ItemTrait, ItemTypeAlias, ItemUse, Member, Modifier, ModuleItem, OptionArgListParenthesized, Statement, StatementBreak, StatementContinue, StatementExpr, StatementLet, StatementReturn, TerminalIdentifier, TerminalIdentifierGreen, TokenIdentifierGreen, TraitItem, TraitItemConstant, TraitItemFunction, TraitItemFunctionPtr, TraitItemImpl, TraitItemType, UsePathLeaf, Variant, WrappedArgList}; +use super::ast::{ + self, FunctionDeclaration, FunctionDeclarationGreen, FunctionWithBody, FunctionWithBodyPtr, + ImplItem, ItemConstant, ItemEnum, ItemExternFunction, ItemExternFunctionPtr, ItemExternType, + ItemImpl, ItemImplAlias, ItemInlineMacro, ItemModule, ItemStruct, ItemTrait, ItemTypeAlias, + ItemUse, Member, Modifier, ModuleItem, OptionArgListParenthesized, Statement, StatementBreak, + StatementContinue, StatementExpr, StatementLet, StatementReturn, TerminalIdentifier, + TerminalIdentifierGreen, TokenIdentifierGreen, TraitItem, TraitItemConstant, TraitItemFunction, + TraitItemFunctionPtr, TraitItemImpl, TraitItemType, UsePathLeaf, Variant, WrappedArgList, +}; use super::db::SyntaxGroup; use super::ids::SyntaxStablePtrId; use super::kind::SyntaxKind; From 5f6b295e99e250572b8fc4266f7dfd9f7f3dd82c Mon Sep 17 00:00:00 2001 From: Marek Kaput Date: Tue, 11 Feb 2025 08:35:36 +0100 Subject: [PATCH 3/4] Rename `GetName` trait to `HasName` --- crates/cairo-lang-defs/src/ids.rs | 2 +- crates/cairo-lang-syntax/src/node/helpers.rs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/cairo-lang-defs/src/ids.rs b/crates/cairo-lang-defs/src/ids.rs index 88b837b6350..4cf06dd9146 100644 --- a/crates/cairo-lang-defs/src/ids.rs +++ b/crates/cairo-lang-defs/src/ids.rs @@ -27,7 +27,7 @@ pub use cairo_lang_filesystem::ids::UnstableSalsaId; use cairo_lang_filesystem::ids::{CrateId, FileId}; use cairo_lang_syntax::node::ast::{TerminalIdentifierGreen, TerminalIdentifierPtr}; use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_syntax::node::helpers::{GetIdentifier, GetName, NameGreen}; +use cairo_lang_syntax::node::helpers::{GetIdentifier, HasName, NameGreen}; use cairo_lang_syntax::node::ids::SyntaxStablePtrId; use cairo_lang_syntax::node::kind::SyntaxKind; use cairo_lang_syntax::node::stable_ptr::SyntaxStablePtr; diff --git a/crates/cairo-lang-syntax/src/node/helpers.rs b/crates/cairo-lang-syntax/src/node/helpers.rs index 703d0f4cf9d..0ac3d3ea761 100644 --- a/crates/cairo-lang-syntax/src/node/helpers.rs +++ b/crates/cairo-lang-syntax/src/node/helpers.rs @@ -157,30 +157,30 @@ impl NameGreen for TraitItemFunctionPtr { } /// Provides methods to extract a _name_ of AST objects. -pub trait GetName { +pub trait HasName { /// Gets a [`TerminalIdentifier`] that represents a _name_ of this AST object. fn name(&self, db: &dyn SyntaxGroup) -> ast::TerminalIdentifier; } -impl GetName for FunctionWithBody { +impl HasName for FunctionWithBody { fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier { self.declaration(db).name(db) } } -impl GetName for ItemExternFunction { +impl HasName for ItemExternFunction { fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier { self.declaration(db).name(db) } } -impl GetName for TraitItemFunction { +impl HasName for TraitItemFunction { fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier { self.declaration(db).name(db) } } -impl GetName for UsePathLeaf { +impl HasName for UsePathLeaf { fn name(&self, db: &dyn SyntaxGroup) -> TerminalIdentifier { match self.alias_clause(db) { ast::OptionAliasClause::Empty(_) => self.ident(db).identifier_ast(db), From c8573e946fec8e9ab1f05350df0ee86fccfb228e Mon Sep 17 00:00:00 2001 From: Marek Kaput Date: Tue, 11 Feb 2025 08:44:01 +0100 Subject: [PATCH 4/4] Replace `name_stable_ptr` with `name_identifier` --- crates/cairo-lang-defs/src/ids.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/cairo-lang-defs/src/ids.rs b/crates/cairo-lang-defs/src/ids.rs index 4cf06dd9146..eff5fec64a3 100644 --- a/crates/cairo-lang-defs/src/ids.rs +++ b/crates/cairo-lang-defs/src/ids.rs @@ -25,7 +25,7 @@ use cairo_lang_debug::debug::DebugWithDb; use cairo_lang_diagnostics::Maybe; pub use cairo_lang_filesystem::ids::UnstableSalsaId; use cairo_lang_filesystem::ids::{CrateId, FileId}; -use cairo_lang_syntax::node::ast::{TerminalIdentifierGreen, TerminalIdentifierPtr}; +use cairo_lang_syntax::node::ast::TerminalIdentifierGreen; use cairo_lang_syntax::node::db::SyntaxGroup; use cairo_lang_syntax::node::helpers::{GetIdentifier, HasName, NameGreen}; use cairo_lang_syntax::node::ids::SyntaxStablePtrId; @@ -55,11 +55,11 @@ pub trait LanguageElementId { pub trait NamedLanguageElementLongId { fn name(&self, db: &dyn DefsGroup) -> SmolStr; - fn name_stable_ptr(&self, db: &dyn DefsGroup) -> TerminalIdentifierPtr; + fn name_identifier(&self, db: &dyn DefsGroup) -> ast::TerminalIdentifier; } pub trait NamedLanguageElementId: LanguageElementId { fn name(&self, db: &dyn DefsGroup) -> SmolStr; - fn name_stable_ptr(&self, db: &dyn DefsGroup) -> TerminalIdentifierPtr; + fn name_identifier(&self, db: &dyn DefsGroup) -> ast::TerminalIdentifier; } pub trait TopLevelLanguageElementId: NamedLanguageElementId { fn full_path(&self, db: &dyn DefsGroup) -> String { @@ -111,17 +111,17 @@ macro_rules! define_named_language_element_id { let terminal_green = self.1.name_green(syntax_db); terminal_green.identifier(syntax_db) } - fn name_stable_ptr(&self, db: &dyn DefsGroup) -> TerminalIdentifierPtr { + fn name_identifier(&self, db: &dyn DefsGroup) -> ast::TerminalIdentifier { let syntax_db = db.upcast(); - self.1.lookup(syntax_db).name(syntax_db).stable_ptr() + self.1.lookup(syntax_db).name(syntax_db) } } impl NamedLanguageElementId for $short_id { fn name(&self, db: &dyn DefsGroup) -> SmolStr { db.$lookup(*self).name(db) } - fn name_stable_ptr(&self, db: &dyn DefsGroup) -> TerminalIdentifierPtr { - db.$lookup(*self).name_stable_ptr(db) + fn name_identifier(&self, db: &dyn DefsGroup) -> ast::TerminalIdentifier { + db.$lookup(*self).name_identifier(db) } } }; @@ -263,10 +263,10 @@ macro_rules! toplevel_enum { )* } } - fn name_stable_ptr(&self, db: &dyn DefsGroup) -> TerminalIdentifierPtr { + fn name_identifier(&self, db: &dyn DefsGroup) -> ast::TerminalIdentifier { match self { $( - $enum_name::$variant(id) => id.name_stable_ptr(db), + $enum_name::$variant(id) => id.name_identifier(db), )* } }