diff --git a/crates/cairo-lang-defs/src/patcher.rs b/crates/cairo-lang-defs/src/patcher.rs index 6aaf2d39cdc..d578993733a 100644 --- a/crates/cairo-lang-defs/src/patcher.rs +++ b/crates/cairo-lang-defs/src/patcher.rs @@ -38,8 +38,12 @@ impl RewriteNode { Self::Text(text.to_string()) } - pub fn mapped_text(text: &str, db: &dyn SyntaxGroup, origin: &impl TypedSyntaxNode) -> Self { - RewriteNode::Text(text.to_string()).mapped(db, origin) + pub fn mapped_text( + text: impl Into, + db: &dyn SyntaxGroup, + origin: &impl TypedSyntaxNode, + ) -> Self { + RewriteNode::Text(text.into()).mapped(db, origin) } pub fn empty() -> Self { @@ -241,13 +245,18 @@ pub struct PatchBuilder<'a> { origin: CodeOrigin, } impl<'a> PatchBuilder<'a> { - /// Creates a new patch builder, originating from `origin` node. + /// Creates a new patch builder, originating from `origin` typed node. pub fn new(db: &'a dyn SyntaxGroup, origin: &impl TypedSyntaxNode) -> Self { + Self::new_ex(db, &origin.as_syntax_node()) + } + + /// Creates a new patch builder, originating from `origin` node. + pub fn new_ex(db: &'a dyn SyntaxGroup, origin: &SyntaxNode) -> Self { Self { db, code: String::default(), code_mappings: vec![], - origin: CodeOrigin::Span(origin.as_syntax_node().span_without_trivia(db)), + origin: CodeOrigin::Span(origin.span_without_trivia(db)), } } diff --git a/crates/cairo-lang-lowering/src/optimizations/const_folding.rs b/crates/cairo-lang-lowering/src/optimizations/const_folding.rs index 078fc64bdae..713720439e4 100644 --- a/crates/cairo-lang-lowering/src/optimizations/const_folding.rs +++ b/crates/cairo-lang-lowering/src/optimizations/const_folding.rs @@ -36,7 +36,8 @@ enum VarInfo { /// The variable is a snapshot of another variable. Snapshot(Box), /// The variable is a struct of other variables. - Struct(Vec), + /// `None` values represent variables that are not tracked. + Struct(Vec>), } /// Performs constant folding on the lowered program. @@ -101,14 +102,19 @@ pub fn const_folding(db: &dyn LoweringGroup, lowered: &mut FlatLowered) { let mut contains_info = false; for input in inputs.iter() { let Some(info) = ctx.var_info.get(&input.var_id) else { - all_args.push(VarInfo::Var(*input)); + all_args.push( + lowered.variables[input.var_id] + .copyable + .is_ok() + .then(|| VarInfo::Var(*input)), + ); continue; }; contains_info = true; if let VarInfo::Const(value) = info { const_args.push(value.clone()); } - all_args.push(info.clone()); + all_args.push(Some(info.clone())); } if const_args.len() == inputs.len() { let value = ConstValue::Struct(const_args, lowered.variables[*output].ty); @@ -141,7 +147,9 @@ pub fn const_folding(db: &dyn LoweringGroup, lowered: &mut FlatLowered) { } VarInfo::Struct(members) => { for (output, member) in zip_eq(outputs, members.clone()) { - ctx.var_info.insert(*output, wrap_with_snapshots(member)); + if let Some(member) = member { + ctx.var_info.insert(*output, wrap_with_snapshots(member)); + } } } _ => {} diff --git a/crates/cairo-lang-lowering/src/optimizations/test_data/const_folding b/crates/cairo-lang-lowering/src/optimizations/test_data/const_folding index 0039ccc92a5..ccbaf894a09 100644 --- a/crates/cairo-lang-lowering/src/optimizations/test_data/const_folding +++ b/crates/cairo-lang-lowering/src/optimizations/test_data/const_folding @@ -2946,3 +2946,101 @@ End: Return(v6) //! > lowering_diagnostics + +//! > ========================================================================== + +//! > Construct with undroppable. + +//! > test_runner_name +test_match_optimizer + +//! > function +fn foo() -> bool { + let x: (felt252, Felt252Dict) = (0, Default::::default()); + let (l, _) = @x; + *l == 0 +} + +//! > function_name +foo + +//! > module_code + +//! > semantic_diagnostics + +//! > before +Parameters: +blk0 (root): +Statements: + (v0: core::felt252) <- 0 + (v1: core::dict::Felt252Dict::) <- core::dict::felt252_dict_new::() + (v2: (core::felt252, core::dict::Felt252Dict::)) <- struct_construct(v0, v1) + (v3: (core::felt252, core::dict::Felt252Dict::), v4: @(core::felt252, core::dict::Felt252Dict::)) <- snapshot(v2) + (v5: core::felt252, v6: core::dict::Felt252Dict::) <- struct_destructure(v3) + (v7: core::dict::SquashedFelt252Dict::) <- core::dict::Felt252DictImpl::::squash(v6) + (v9: @core::felt252, v10: @core::dict::Felt252Dict::) <- struct_destructure(v4) + (v11: core::felt252) <- desnap(v9) + (v14: core::felt252) <- 0 + (v19: core::felt252) <- core::felt252_sub(v11, v14) +End: + Match(match core::felt252_is_zero(v19) { + IsZeroResult::Zero => blk1, + IsZeroResult::NonZero(v20) => blk2, + }) + +blk1: +Statements: + (v21: ()) <- struct_construct() + (v22: core::bool) <- bool::True(v21) +End: + Goto(blk3, {v22 -> v23}) + +blk2: +Statements: + (v24: ()) <- struct_construct() + (v25: core::bool) <- bool::False(v24) +End: + Goto(blk3, {v25 -> v23}) + +blk3: +Statements: +End: + Return(v23) + +//! > after +Parameters: +blk0 (root): +Statements: + (v0: core::felt252) <- 0 + (v1: core::dict::Felt252Dict::) <- core::dict::felt252_dict_new::() + (v2: (core::felt252, core::dict::Felt252Dict::)) <- struct_construct(v0, v1) + (v3: (core::felt252, core::dict::Felt252Dict::), v4: @(core::felt252, core::dict::Felt252Dict::)) <- snapshot(v2) + (v5: core::felt252, v6: core::dict::Felt252Dict::) <- struct_destructure(v3) + (v7: core::dict::SquashedFelt252Dict::) <- core::dict::Felt252DictImpl::::squash(v6) + (v9: @core::felt252, v10: @core::dict::Felt252Dict::) <- struct_destructure(v4) + (v11: core::felt252) <- desnap(v9) + (v14: core::felt252) <- 0 + (v19: core::felt252) <- core::felt252_sub(v11, v14) +End: + Goto(blk1, {}) + +blk1: +Statements: + (v21: ()) <- struct_construct() + (v22: core::bool) <- bool::True(v21) +End: + Goto(blk3, {v22 -> v23}) + +blk2: +Statements: + (v24: ()) <- struct_construct() + (v25: core::bool) <- bool::False(v24) +End: + Goto(blk3, {v25 -> v23}) + +blk3: +Statements: +End: + Return(v23) + +//! > lowering_diagnostics diff --git a/crates/cairo-lang-plugins/src/plugins/derive/clone.rs b/crates/cairo-lang-plugins/src/plugins/derive/clone.rs index 76cd36af627..3777b4d8718 100644 --- a/crates/cairo-lang-plugins/src/plugins/derive/clone.rs +++ b/crates/cairo-lang-plugins/src/plugins/derive/clone.rs @@ -1,13 +1,18 @@ -use cairo_lang_syntax::node::ids::SyntaxStablePtrId; +use cairo_lang_defs::plugin::PluginDiagnostic; +use cairo_lang_syntax::node::ast; use indent::indent_by; use indoc::formatdoc; use itertools::Itertools; -use super::{unsupported_for_extern_diagnostic, DeriveInfo, DeriveResult}; +use super::{unsupported_for_extern_diagnostic, DeriveInfo}; use crate::plugins::derive::TypeVariantInfo; /// Adds derive result for the `Clone` trait. -pub fn handle_clone(info: &DeriveInfo, stable_ptr: SyntaxStablePtrId, result: &mut DeriveResult) { +pub fn handle_clone( + info: &DeriveInfo, + derived: &ast::ExprPath, + diagnostics: &mut Vec, +) -> Option { let header = info.format_impl_header("core::clone", "Clone", &["core::clone::Clone", "Destruct"]); let full_typename = info.full_typename(); @@ -41,16 +46,16 @@ pub fn handle_clone(info: &DeriveInfo, stable_ptr: SyntaxStablePtrId, result: &m } } TypeVariantInfo::Extern => { - result.diagnostics.push(unsupported_for_extern_diagnostic(stable_ptr)); - return; + diagnostics.push(unsupported_for_extern_diagnostic(derived)); + return None; } }, ); - result.impls.push(formatdoc! {" + Some(formatdoc! {" {header} {{ fn clone(self: @{full_typename}) -> {full_typename} {{ {body} }} }} - "}); + "}) } diff --git a/crates/cairo-lang-plugins/src/plugins/derive/debug.rs b/crates/cairo-lang-plugins/src/plugins/derive/debug.rs index 02fa72744ed..5cda5d8a214 100644 --- a/crates/cairo-lang-plugins/src/plugins/derive/debug.rs +++ b/crates/cairo-lang-plugins/src/plugins/derive/debug.rs @@ -1,13 +1,18 @@ -use cairo_lang_syntax::node::ids::SyntaxStablePtrId; +use cairo_lang_defs::plugin::PluginDiagnostic; +use cairo_lang_syntax::node::ast; use indent::indent_by; use indoc::formatdoc; use itertools::Itertools; -use super::{unsupported_for_extern_diagnostic, DeriveInfo, DeriveResult}; +use super::{unsupported_for_extern_diagnostic, DeriveInfo}; use crate::plugins::derive::TypeVariantInfo; /// Adds derive result for the `Debug` trait. -pub fn handle_debug(info: &DeriveInfo, stable_ptr: SyntaxStablePtrId, result: &mut DeriveResult) { +pub fn handle_debug( + info: &DeriveInfo, + derived: &ast::ExprPath, + diagnostics: &mut Vec, +) -> Option { let header = info.format_impl_header("core::fmt", "Debug", &["core::fmt::Debug"]); let full_typename = info.full_typename(); let name = &info.name; @@ -51,16 +56,17 @@ pub fn handle_debug(info: &DeriveInfo, stable_ptr: SyntaxStablePtrId, result: &m ) } TypeVariantInfo::Extern => { - result.diagnostics.push(unsupported_for_extern_diagnostic(stable_ptr)); - return; + diagnostics.push(unsupported_for_extern_diagnostic(derived)); + return None; } }, ); - result.impls.push(formatdoc! {" + + Some(formatdoc! {" {header} {{ fn fmt(self: @{full_typename}, ref f: core::fmt::Formatter) -> core::result::Result::<(), core::fmt::Error> {{ {body} }} }} - "}); + "}) } diff --git a/crates/cairo-lang-plugins/src/plugins/derive/default.rs b/crates/cairo-lang-plugins/src/plugins/derive/default.rs index 966c710c3f2..ce5407ec3a7 100644 --- a/crates/cairo-lang-plugins/src/plugins/derive/default.rs +++ b/crates/cairo-lang-plugins/src/plugins/derive/default.rs @@ -1,13 +1,12 @@ use cairo_lang_defs::plugin::PluginDiagnostic; +use cairo_lang_syntax::node::ast; use cairo_lang_syntax::node::db::SyntaxGroup; use cairo_lang_syntax::node::helpers::QueryAttrs; -use cairo_lang_syntax::node::ids::SyntaxStablePtrId; -use cairo_lang_syntax::node::TypedSyntaxNode; use indent::indent_by; use indoc::formatdoc; use itertools::Itertools; -use super::{unsupported_for_extern_diagnostic, DeriveInfo, DeriveResult}; +use super::{unsupported_for_extern_diagnostic, DeriveInfo}; use crate::plugins::derive::TypeVariantInfo; pub const DEFAULT_ATTR: &str = "default"; @@ -16,9 +15,9 @@ pub const DEFAULT_ATTR: &str = "default"; pub fn handle_default( db: &dyn SyntaxGroup, info: &DeriveInfo, - stable_ptr: SyntaxStablePtrId, - result: &mut DeriveResult, -) { + derived: &ast::ExprPath, + diagnostics: &mut Vec, +) -> Option { let header = info.format_impl_header( "core::traits", "Default", @@ -34,15 +33,15 @@ pub fn handle_default( Some((variant, variant.attributes.find_attr(db, DEFAULT_ATTR)?)) }); let Some((default_variant, _)) = default_variants.next() else { - result.diagnostics.push(PluginDiagnostic::error( - stable_ptr, + diagnostics.push(PluginDiagnostic::error( + derived, "derive `Default` for enum only supported with a default variant.".into(), )); - return; + return None; }; for (_, extra_default_attr) in default_variants { - result.diagnostics.push(PluginDiagnostic::error( - extra_default_attr.as_syntax_node().stable_ptr(), + diagnostics.push(PluginDiagnostic::error( + &extra_default_attr, "Multiple variants annotated with `#[default]`".into(), )); } @@ -63,16 +62,16 @@ pub fn handle_default( } } TypeVariantInfo::Extern => { - result.diagnostics.push(unsupported_for_extern_diagnostic(stable_ptr)); - return; + diagnostics.push(unsupported_for_extern_diagnostic(derived)); + return None; } }, ); - result.impls.push(formatdoc! {" + Some(formatdoc! {" {header} {{ fn default() -> {full_typename} {{ {body} }} }} - "}); + "}) } diff --git a/crates/cairo-lang-plugins/src/plugins/derive/destruct.rs b/crates/cairo-lang-plugins/src/plugins/derive/destruct.rs index a49f92d44f2..e4e69de8116 100644 --- a/crates/cairo-lang-plugins/src/plugins/derive/destruct.rs +++ b/crates/cairo-lang-plugins/src/plugins/derive/destruct.rs @@ -1,17 +1,18 @@ -use cairo_lang_syntax::node::ids::SyntaxStablePtrId; +use cairo_lang_defs::plugin::PluginDiagnostic; +use cairo_lang_syntax::node::ast; use indent::indent_by; use indoc::formatdoc; use itertools::Itertools; -use super::{unsupported_for_extern_diagnostic, DeriveInfo, DeriveResult}; +use super::{unsupported_for_extern_diagnostic, DeriveInfo}; use crate::plugins::derive::TypeVariantInfo; /// Adds derive result for the `Destruct` trait. pub fn handle_destruct( info: &DeriveInfo, - stable_ptr: SyntaxStablePtrId, - result: &mut DeriveResult, -) { + derived: &ast::ExprPath, + diagnostics: &mut Vec, +) -> Option { let full_typename = info.full_typename(); let ty = &info.name; let header = info.format_impl_header("core::traits", "Destruct", &["core::traits::Destruct"]); @@ -45,16 +46,17 @@ pub fn handle_destruct( ) } TypeVariantInfo::Extern => { - result.diagnostics.push(unsupported_for_extern_diagnostic(stable_ptr)); - return; + diagnostics.push(unsupported_for_extern_diagnostic(derived)); + return None; } }, ); - result.impls.push(formatdoc! {" + + Some(formatdoc! {" {header} {{ fn destruct(self: {full_typename}) nopanic {{ {body} }} }} - "}); + "}) } diff --git a/crates/cairo-lang-plugins/src/plugins/derive/hash.rs b/crates/cairo-lang-plugins/src/plugins/derive/hash.rs index 7e23c7ba570..b0ca960fb39 100644 --- a/crates/cairo-lang-plugins/src/plugins/derive/hash.rs +++ b/crates/cairo-lang-plugins/src/plugins/derive/hash.rs @@ -1,13 +1,18 @@ -use cairo_lang_syntax::node::ids::SyntaxStablePtrId; +use cairo_lang_defs::plugin::PluginDiagnostic; +use cairo_lang_syntax::node::ast; use indent::indent_by; use indoc::formatdoc; use itertools::Itertools; -use super::{unsupported_for_extern_diagnostic, DeriveInfo, DeriveResult}; +use super::{unsupported_for_extern_diagnostic, DeriveInfo}; use crate::plugins::derive::TypeVariantInfo; /// Adds derive result for the `Hash` trait. -pub fn handle_hash(info: &DeriveInfo, stable_ptr: SyntaxStablePtrId, result: &mut DeriveResult) { +pub fn handle_hash( + info: &DeriveInfo, + derived: &ast::ExprPath, + diagnostics: &mut Vec, +) -> Option { let full_typename = info.full_typename(); let ty = &info.name; let body = indent_by( @@ -42,7 +47,8 @@ pub fn handle_hash(info: &DeriveInfo, stable_ptr: SyntaxStablePtrId, result: &mu .join("\n") ), TypeVariantInfo::Extern => { - return result.diagnostics.push(unsupported_for_extern_diagnostic(stable_ptr)); + diagnostics.push(unsupported_for_extern_diagnostic(derived)); + return None; } }, ); @@ -50,7 +56,7 @@ pub fn handle_hash(info: &DeriveInfo, stable_ptr: SyntaxStablePtrId, result: &mu vec![format!("+core::hash::Hash<{t}, __State, __SHashState>"), format!("+Drop<{t}>")] }); let extra_comma = if impl_additional_generics.is_empty() { "" } else { ",\n " }; - result.impls.push(formatdoc! {" + Some(formatdoc! {" impl {ty}Hash< __State, impl __SHashState: core::hash::HashStateTrait<__State>, @@ -61,5 +67,5 @@ pub fn handle_hash(info: &DeriveInfo, stable_ptr: SyntaxStablePtrId, result: &mu {body} }} }} - "}); + "}) } diff --git a/crates/cairo-lang-plugins/src/plugins/derive/mod.rs b/crates/cairo-lang-plugins/src/plugins/derive/mod.rs index 1fb965e9083..8bff575ab94 100644 --- a/crates/cairo-lang-plugins/src/plugins/derive/mod.rs +++ b/crates/cairo-lang-plugins/src/plugins/derive/mod.rs @@ -1,8 +1,7 @@ +use cairo_lang_defs::patcher::{PatchBuilder, RewriteNode}; use cairo_lang_defs::plugin::{ MacroPlugin, MacroPluginMetadata, PluginDiagnostic, PluginGeneratedFile, PluginResult, }; -use cairo_lang_filesystem::ids::{CodeMapping, CodeOrigin}; -use cairo_lang_filesystem::span::{TextOffset, TextSpan, TextWidth}; use cairo_lang_syntax::attribute::structured::{ AttributeArg, AttributeArgVariant, AttributeStructurize, }; @@ -11,7 +10,6 @@ use cairo_lang_syntax::node::ast::{ }; use cairo_lang_syntax::node::db::SyntaxGroup; use cairo_lang_syntax::node::helpers::{GenericParamEx, QueryAttrs}; -use cairo_lang_syntax::node::ids::SyntaxStablePtrId; use cairo_lang_syntax::node::{ast, Terminal, TypedStablePtr, TypedSyntaxNode}; use itertools::{chain, Itertools}; use smol_str::SmolStr; @@ -48,7 +46,6 @@ impl MacroPlugin for DerivePlugin { struct_ast.attributes(db), struct_ast.generic_params(db), TypeVariantInfo::Struct(extract_members(db, struct_ast.members(db))), - struct_ast.as_syntax_node().span(db), ), ast::ModuleItem::Enum(enum_ast) => DeriveInfo::new( db, @@ -56,7 +53,6 @@ impl MacroPlugin for DerivePlugin { enum_ast.attributes(db), enum_ast.generic_params(db), TypeVariantInfo::Enum(extract_variants(db, enum_ast.variants(db))), - enum_ast.as_syntax_node().span(db), ), ast::ModuleItem::ExternType(extern_type_ast) => DeriveInfo::new( db, @@ -64,7 +60,6 @@ impl MacroPlugin for DerivePlugin { extern_type_ast.attributes(db), extern_type_ast.generic_params(db), TypeVariantInfo::Extern, - extern_type_ast.as_syntax_node().span(db), ), _ => return PluginResult::default(), }, @@ -162,7 +157,6 @@ pub struct DeriveInfo { attributes: AttributeList, generics: GenericParamsInfo, specific_info: TypeVariantInfo, - span: TextSpan, } impl DeriveInfo { /// Extracts the information on the type being derived. @@ -172,14 +166,12 @@ impl DeriveInfo { attributes: AttributeList, generic_args: OptionWrappedGenericParamList, specific_info: TypeVariantInfo, - span: TextSpan, ) -> Self { Self { name: ident.text(db), attributes, generics: GenericParamsInfo::new(db, generic_args), specific_info, - span, } } @@ -239,24 +231,19 @@ fn extract_variants(db: &dyn SyntaxGroup, variants: VariantList) -> Vec, - diagnostics: Vec, -} - /// Adds an implementation for all requested derives for the type. fn generate_derive_code_for_type( db: &dyn SyntaxGroup, metadata: &MacroPluginMetadata<'_>, info: DeriveInfo, ) -> PluginResult { - let mut result = DeriveResult::default(); + let mut diagnostics = vec![]; + let mut builder = PatchBuilder::new(db, &info.attributes); for attr in info.attributes.query_attr(db, DERIVE_ATTR) { let attr = attr.structurize(db); if attr.args.is_empty() { - result.diagnostics.push(PluginDiagnostic::error( + diagnostics.push(PluginDiagnostic::error( attr.args_stable_ptr.untyped(), "Expected args.".into(), )); @@ -265,57 +252,52 @@ fn generate_derive_code_for_type( for arg in attr.args { let AttributeArg { - variant: AttributeArgVariant::Unnamed(ast::Expr::Path(path)), .. + variant: AttributeArgVariant::Unnamed(ast::Expr::Path(derived_path)), + .. } = arg else { - result.diagnostics.push(PluginDiagnostic::error(&arg.arg, "Expected path.".into())); + diagnostics.push(PluginDiagnostic::error(&arg.arg, "Expected path.".into())); continue; }; - let derived = path.as_syntax_node().get_text_without_trivia(db); - let stable_ptr = path.stable_ptr().untyped(); - match derived.as_str() { - "Copy" | "Drop" => result.impls.push(get_empty_impl(&derived, &info)), - "Clone" => clone::handle_clone(&info, stable_ptr, &mut result), - "Debug" => debug::handle_debug(&info, stable_ptr, &mut result), - "Default" => default::handle_default(db, &info, stable_ptr, &mut result), - "Destruct" => destruct::handle_destruct(&info, stable_ptr, &mut result), - "Hash" => hash::handle_hash(&info, stable_ptr, &mut result), + let derived = derived_path.as_syntax_node().get_text_without_trivia(db); + if let Some(code) = match derived.as_str() { + "Copy" | "Drop" => Some(get_empty_impl(&derived, &info)), + "Clone" => clone::handle_clone(&info, &derived_path, &mut diagnostics), + "Debug" => debug::handle_debug(&info, &derived_path, &mut diagnostics), + "Default" => default::handle_default(db, &info, &derived_path, &mut diagnostics), + "Destruct" => destruct::handle_destruct(&info, &derived_path, &mut diagnostics), + "Hash" => hash::handle_hash(&info, &derived_path, &mut diagnostics), "PanicDestruct" => { - panic_destruct::handle_panic_destruct(&info, stable_ptr, &mut result) + panic_destruct::handle_panic_destruct(&info, &derived_path, &mut diagnostics) } - "PartialEq" => partial_eq::handle_partial_eq(&info, stable_ptr, &mut result), - "Serde" => serde::handle_serde(&info, stable_ptr, &mut result), + "PartialEq" => { + partial_eq::handle_partial_eq(&info, &derived_path, &mut diagnostics) + } + "Serde" => serde::handle_serde(&info, &derived_path, &mut diagnostics), _ => { if !metadata.declared_derives.contains(&derived) { - result.diagnostics.push(PluginDiagnostic::error( - stable_ptr, + diagnostics.push(PluginDiagnostic::error( + &derived_path, format!("Unknown derive `{derived}` - a plugin might be missing."), )); } + None } + } { + builder.add_modified(RewriteNode::mapped_text(code, db, &derived_path)); } } } + let (content, code_mappings) = builder.build(); PluginResult { - code: if result.impls.is_empty() { - None - } else { - let content = result.impls.join(""); - Some(PluginGeneratedFile { - name: "impls".into(), - code_mappings: vec![CodeMapping { - origin: CodeOrigin::Span(info.span), - span: TextSpan { - start: TextOffset::default(), - end: TextOffset::default().add_width(TextWidth::from_str(&content)), - }, - }], - content, - aux_data: None, - }) - }, - diagnostics: result.diagnostics, + code: (!content.is_empty()).then(|| PluginGeneratedFile { + name: "impls".into(), + code_mappings, + content, + aux_data: None, + }), + diagnostics, remove_original_item: false, } } @@ -332,6 +314,6 @@ fn get_empty_impl(derived_trait: &str, info: &DeriveInfo) -> String { } /// Returns a diagnostic for when a derive is not supported for extern types. -fn unsupported_for_extern_diagnostic(stable_ptr: SyntaxStablePtrId) -> PluginDiagnostic { - PluginDiagnostic::error(stable_ptr, "Unsupported trait for derive for extern types.".into()) +fn unsupported_for_extern_diagnostic(path: &ast::ExprPath) -> PluginDiagnostic { + PluginDiagnostic::error(path, "Unsupported trait for derive for extern types.".into()) } diff --git a/crates/cairo-lang-plugins/src/plugins/derive/panic_destruct.rs b/crates/cairo-lang-plugins/src/plugins/derive/panic_destruct.rs index 0edb95fab36..0148b4880e1 100644 --- a/crates/cairo-lang-plugins/src/plugins/derive/panic_destruct.rs +++ b/crates/cairo-lang-plugins/src/plugins/derive/panic_destruct.rs @@ -1,17 +1,18 @@ -use cairo_lang_syntax::node::ids::SyntaxStablePtrId; +use cairo_lang_defs::plugin::PluginDiagnostic; +use cairo_lang_syntax::node::ast; use indent::indent_by; use indoc::formatdoc; use itertools::Itertools; -use super::{unsupported_for_extern_diagnostic, DeriveInfo, DeriveResult}; +use super::{unsupported_for_extern_diagnostic, DeriveInfo}; use crate::plugins::derive::TypeVariantInfo; /// Adds derive result for the `PanicDestruct` trait. pub fn handle_panic_destruct( info: &DeriveInfo, - stable_ptr: SyntaxStablePtrId, - result: &mut DeriveResult, -) { + derived: &ast::ExprPath, + diagnostics: &mut Vec, +) -> Option { let header = info.format_impl_header("core::traits", "PanicDestruct", &["core::traits::PanicDestruct"]); let full_typename = info.full_typename(); @@ -46,16 +47,16 @@ pub fn handle_panic_destruct( ) } TypeVariantInfo::Extern => { - result.diagnostics.push(unsupported_for_extern_diagnostic(stable_ptr)); - return; + diagnostics.push(unsupported_for_extern_diagnostic(derived)); + return None; } }, ); - result.impls.push(formatdoc! {" + Some(formatdoc! {" {header} {{ fn panic_destruct(self: {full_typename}, ref panic: Panic) nopanic {{ {body} }} }} - "}); + "}) } diff --git a/crates/cairo-lang-plugins/src/plugins/derive/partial_eq.rs b/crates/cairo-lang-plugins/src/plugins/derive/partial_eq.rs index 24b8f1a04e9..1e6e2e1c0b2 100644 --- a/crates/cairo-lang-plugins/src/plugins/derive/partial_eq.rs +++ b/crates/cairo-lang-plugins/src/plugins/derive/partial_eq.rs @@ -1,17 +1,18 @@ -use cairo_lang_syntax::node::ids::SyntaxStablePtrId; +use cairo_lang_defs::plugin::PluginDiagnostic; +use cairo_lang_syntax::node::ast; use indent::indent_by; use indoc::formatdoc; use itertools::Itertools; -use super::{unsupported_for_extern_diagnostic, DeriveInfo, DeriveResult}; +use super::{unsupported_for_extern_diagnostic, DeriveInfo}; use crate::plugins::derive::TypeVariantInfo; /// Adds derive result for the `PartialEq` trait. pub fn handle_partial_eq( info: &DeriveInfo, - stable_ptr: SyntaxStablePtrId, - result: &mut DeriveResult, -) { + derived: &ast::ExprPath, + diagnostics: &mut Vec, +) -> Option { let header = info.format_impl_header("core::traits", "PartialEq", &["core::traits::PartialEq"]); let full_typename = info.full_typename(); let body = indent_by( @@ -50,16 +51,16 @@ pub fn handle_partial_eq( } } TypeVariantInfo::Extern => { - result.diagnostics.push(unsupported_for_extern_diagnostic(stable_ptr)); - return; + diagnostics.push(unsupported_for_extern_diagnostic(derived)); + return None; } }, ); - result.impls.push(formatdoc! {" + Some(formatdoc! {" {header} {{ fn eq(lhs: @{full_typename}, rhs: @{full_typename}) -> bool {{ {body} }} }} - "}); + "}) } diff --git a/crates/cairo-lang-plugins/src/plugins/derive/serde.rs b/crates/cairo-lang-plugins/src/plugins/derive/serde.rs index c6c8a26964a..ede9af1adb7 100644 --- a/crates/cairo-lang-plugins/src/plugins/derive/serde.rs +++ b/crates/cairo-lang-plugins/src/plugins/derive/serde.rs @@ -1,13 +1,18 @@ -use cairo_lang_syntax::node::ids::SyntaxStablePtrId; +use cairo_lang_defs::plugin::PluginDiagnostic; +use cairo_lang_syntax::node::ast; use indent::indent_by; use indoc::formatdoc; use itertools::Itertools; -use super::{unsupported_for_extern_diagnostic, DeriveInfo, DeriveResult}; +use super::{unsupported_for_extern_diagnostic, DeriveInfo}; use crate::plugins::derive::TypeVariantInfo; /// Adds derive result for the `Serde` trait. -pub fn handle_serde(info: &DeriveInfo, stable_ptr: SyntaxStablePtrId, result: &mut DeriveResult) { +pub fn handle_serde( + info: &DeriveInfo, + derived: &ast::ExprPath, + diagnostics: &mut Vec, +) -> Option { let header = info.format_impl_header( "core::serde", "Serde", @@ -41,8 +46,8 @@ pub fn handle_serde(info: &DeriveInfo, stable_ptr: SyntaxStablePtrId, result: &m }) .join(";\n"), TypeVariantInfo::Extern => { - result.diagnostics.push(unsupported_for_extern_diagnostic(stable_ptr)); - return; + diagnostics.push(unsupported_for_extern_diagnostic(derived)); + return None; } }, ); @@ -79,12 +84,12 @@ pub fn handle_serde(info: &DeriveInfo, stable_ptr: SyntaxStablePtrId, result: &m } } TypeVariantInfo::Extern => { - result.diagnostics.push(unsupported_for_extern_diagnostic(stable_ptr)); - return; + diagnostics.push(unsupported_for_extern_diagnostic(derived)); + return None; } }, ); - result.impls.push(formatdoc! {" + Some(formatdoc! {" {header} {{ fn serialize(self: @{full_typename}, ref output: core::array::Array) {{ {serialize_body} @@ -93,5 +98,5 @@ pub fn handle_serde(info: &DeriveInfo, stable_ptr: SyntaxStablePtrId, result: &m {deserialize_body} }} }} - "}); + "}) } diff --git a/crates/cairo-lang-semantic/src/inline_macros/write.rs b/crates/cairo-lang-semantic/src/inline_macros/write.rs index 0b0c49a2c14..a827abc02ba 100644 --- a/crates/cairo-lang-semantic/src/inline_macros/write.rs +++ b/crates/cairo-lang-semantic/src/inline_macros/write.rs @@ -282,7 +282,7 @@ impl FormattingInfo { &mut ident_count, &mut pending_chars, RewriteNode::mapped_text( - &format!("__write_macro_arg{positional}__"), + format!("__write_macro_arg{positional}__"), builder.db, arg, ), @@ -297,7 +297,7 @@ impl FormattingInfo { &mut ident_count, &mut pending_chars, RewriteNode::mapped_text( - &format!("__write_macro_arg{i}__"), + format!("__write_macro_arg{i}__"), builder.db, &self.args[i], ), diff --git a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/components/component b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/components/component index 9b0027c3e98..b27d7e20055 100644 --- a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/components/component +++ b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/components/component @@ -99,9 +99,9 @@ trait MyTrait { fn set(ref self: T, addr: ContractAddress, value: u32); } -lib.cairo:1:1 +lib.cairo:1:10 #[derive(Drop, starknet::Store)] -^******************************^ + ^**^ impls: impl MyTypeDrop of core::traits::Drop::; @@ -362,9 +362,9 @@ impl MyTypeSubPointersDrop of core::traits::Drop::; impl MyTypeSubPointersCopy of core::traits::Copy::; -lib.cairo:1:1 +lib.cairo:1:16 #[derive(Drop, starknet::Store)] -^******************************^ + ^*************^ impls: impl MyTypeSubPointersMutDrop of core::traits::Drop::; @@ -932,9 +932,9 @@ pub impl MyImpl< } } -lib.cairo:17:1 - -^ +lib.cairo:19:14 + #[derive(Drop, starknet::Event)] + ^**^ impls: impl EventDrop of core::traits::Drop::; @@ -979,9 +979,9 @@ impl EventLogIntoEvent of Into { -lib.cairo:23:1 +lib.cairo:23:14 #[derive(Drop, starknet::Event)] -^**********************************^ + ^**^ impls: impl LogDrop of core::traits::Drop::; diff --git a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/contract b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/contract index 8622391e796..0ad0790dfc5 100644 --- a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/contract +++ b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/contract @@ -319,9 +319,9 @@ pub mod __constructor { -lib.cairo:27:1 - -^ +lib.cairo:29:14 + #[derive(Drop, starknet::Event)] + ^**^ impls: impl EventDrop of core::traits::Drop::; @@ -383,9 +383,9 @@ impl EventBestEventEverIntoEvent of Into { -lib.cairo:34:1 +lib.cairo:34:14 #[derive(Drop, starknet::Event)] -^**********************************^ + ^**^ impls: impl AwesomeEventDrop of core::traits::Drop::; @@ -417,9 +417,9 @@ impl AwesomeEventIsEvent of starknet::Event { } -lib.cairo:39:1 +lib.cairo:39:14 #[derive(Drop, starknet::Event)] -^**********************************^ + ^**^ impls: impl BestEventEverDrop of core::traits::Drop::; diff --git a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/diagnostics b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/diagnostics index 3bb9742d10e..2ead4ffdb1e 100644 --- a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/diagnostics +++ b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/diagnostics @@ -685,9 +685,9 @@ mod test_contract { #[derive(Drop)] struct MyType {} -lib.cairo:8:1 +lib.cairo:8:10 #[derive(Drop)] -^*************^ + ^**^ impls: impl MyTypeDrop of core::traits::Drop::; @@ -3707,9 +3707,9 @@ pub mod __constructor { -lib.cairo:5:1 - -^ +lib.cairo:6:14 + #[derive(Drop, starknet::Event)] + ^**^ impls: impl EventDrop of core::traits::Drop::; @@ -3891,9 +3891,9 @@ pub mod __constructor { -lib.cairo:5:1 - -^ +lib.cairo:7:14 + #[derive(Drop, starknet::Event)] + ^**^ impls: impl MyEventDrop of core::traits::Drop::; @@ -8081,9 +8081,9 @@ impl HasComponentImpl_component of super::component::HasComponent } -lib.cairo:32:1 - -^ +lib.cairo:34:14 + #[derive(Drop, starknet::Event)] + ^**^ impls: impl EventDrop of core::traits::Drop::; @@ -12543,9 +12543,9 @@ impl HasComponentImpl_test_component of super::test_component::HasComponent; @@ -14439,9 +14439,9 @@ impl HasComponentImpl_component of super::component::HasComponent } -lib.cairo:26:1 - -^ +lib.cairo:28:14 + #[derive(Drop, starknet::Event)] + ^**^ impls: impl EventDrop of core::traits::Drop::; diff --git a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/events b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/events index 7bb406667fe..cad781abe2e 100644 --- a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/events +++ b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/events @@ -209,9 +209,9 @@ impl ASubPointersMutImpl of starknet::storage::SubPointersMut { } -lib.cairo:7:1 - -^ +lib.cairo:8:1 +#[derive(starknet::Event, PartialEq, Drop, Serde)] +^************************************************^ impls: impl BPartialEq of core::traits::PartialEq:: { @@ -254,9 +254,9 @@ impl BIsEvent of starknet::Event { } -lib.cairo:12:1 - -^ +lib.cairo:14:1 +#[derive(starknet::Event, PartialEq, Drop)] +^*****************************************^ impls: impl NestedEventEnumPartialEq of core::traits::PartialEq:: { @@ -310,9 +310,9 @@ impl NestedEventEnumBIntoEvent of Into { -lib.cairo:18:1 - -^ +lib.cairo:20:1 +#[derive(starknet::Event, PartialEq, Drop)] +^*****************************************^ impls: impl MyEventEnumPartialEq of core::traits::PartialEq:: { @@ -453,9 +453,9 @@ impl ASubPointersDrop of core::traits::Drop::; impl ASubPointersCopy of core::traits::Copy::; -lib.cairo:1:1 +lib.cairo:1:27 #[derive(starknet::Event, starknet::Store, PartialEq, Drop, Serde)] -^*****************************************************************^ + ^*************^ impls: impl ASubPointersMutDrop of core::traits::Drop::; diff --git a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/external_event b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/external_event index e4d44e53cce..6b1c2af2845 100644 --- a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/external_event +++ b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/external_event @@ -53,9 +53,9 @@ mod test_contract { } } -lib.cairo:1:1 +lib.cairo:1:10 #[derive(Drop, starknet::Event)] -^******************************^ + ^**^ impls: impl EventDrop of core::traits::Drop::; @@ -117,9 +117,9 @@ impl EventBestEventEverIntoEvent of Into { -lib.cairo:6:1 +lib.cairo:6:10 #[derive(Drop, starknet::Event)] -^******************************^ + ^**^ impls: impl AwesomeEventDrop of core::traits::Drop::; @@ -143,9 +143,9 @@ impl AwesomeEventIsEvent of starknet::Event { } -lib.cairo:8:1 +lib.cairo:8:10 #[derive(Drop, starknet::Event)] -^******************************^ + ^**^ impls: impl BestEventEverDrop of core::traits::Drop::; diff --git a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/interfaces b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/interfaces index 4aa2b82332a..b7a67908e84 100644 --- a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/interfaces +++ b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/interfaces @@ -1612,9 +1612,9 @@ impl HasComponentImpl_comp of super::comp::HasComponent { } -lib.cairo:47:1 - -^ +lib.cairo:49:14 + #[derive(Drop, starknet::Event)] + ^**^ impls: impl EventDrop of core::traits::Drop::; diff --git a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/new_storage_interface b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/new_storage_interface index 73db1098540..6f6544931db 100644 --- a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/new_storage_interface +++ b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/new_storage_interface @@ -1421,9 +1421,9 @@ impl BalancePairStorageNodeMutImpl of starknet::storage::StorageNodeMut; @@ -1529,9 +1529,9 @@ impl SlicedBalanceTrioSubPointersMutImpl of starknet::storage::SubPointersMut; @@ -1720,9 +1720,9 @@ impl LinkedListStorageNodeMutImpl of starknet::storage::StorageNodeMut; @@ -2294,9 +2294,9 @@ impl SlicedBalanceTrioSubPointersDrop of core::traits::Drop::; -lib.cairo:34:1 +lib.cairo:34:16 #[derive(Drop, starknet::Store)] -^******************************^ + ^*************^ impls: impl SlicedBalanceTrioSubPointersMutDrop of core::traits::Drop::; @@ -2312,9 +2312,9 @@ impl SlicedBalancePairSubPointersDrop of core::traits::Drop::; -lib.cairo:40:1 +lib.cairo:40:16 #[derive(Drop, starknet::Store)] -^******************************^ + ^*************^ impls: impl SlicedBalancePairSubPointersMutDrop of core::traits::Drop::; diff --git a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/storage b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/storage index b02fd1eb18e..9be04eaea90 100644 --- a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/storage +++ b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/storage @@ -178,9 +178,9 @@ impl OuterTypeSubPointersDrop of core::traits::Drop::; impl OuterTypeSubPointersCopy of core::traits::Copy::; -lib.cairo:1:1 +lib.cairo:1:16 #[derive(Drop, starknet::Store, Hash)] -^************************************^ + ^*************^ impls: impl OuterTypeSubPointersMutDrop of core::traits::Drop::; diff --git a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/user_defined_types b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/user_defined_types index 930edbb1f7a..741195d6a30 100644 --- a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/user_defined_types +++ b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/user_defined_types @@ -221,9 +221,9 @@ pub mod __constructor { -lib.cairo:13:1 +lib.cairo:13:5 #[derive(Drop, Hash, starknet::Store)] -^****************************************^ + ^************************************^ impls: impl WrappedFelt252Drop of core::traits::Drop::; @@ -315,9 +315,9 @@ impl WrappedFelt252SubPointersMutImpl of starknet::storage::SubPointersMut; @@ -383,9 +383,9 @@ impl StoreZeroSize of starknet::Store:: { -lib.cairo:19:1 - -^ +lib.cairo:20:5 + #[derive(Drop, Serde, starknet::Store)] + ^*************************************^ impls: impl SimpleEnumDrop of core::traits::Drop::; @@ -493,9 +493,9 @@ impl StoreSimpleEnum of starknet::Store:: { } -lib.cairo:25:1 - -^ +lib.cairo:26:5 + #[derive(Drop, Serde, starknet::Store)] + ^*************************************^ impls: impl EnumWithDefaultDrop of core::traits::Drop::; @@ -627,9 +627,9 @@ impl StoreEnumWithDefault of starknet::Store:: { } -lib.cairo:33:1 - -^ +lib.cairo:34:5 + #[derive(Drop, Serde, starknet::Store)] + ^*************************************^ impls: impl BadEnumWithDefaultDrop of core::traits::Drop::; @@ -712,9 +712,9 @@ impl WrappedFelt252SubPointersDrop of core::traits::Drop::; -lib.cairo:13:5 +lib.cairo:13:26 #[derive(Drop, Hash, starknet::Store)] - ^************************************^ + ^*************^ impls: impl WrappedFelt252SubPointersMutDrop of core::traits::Drop::; diff --git a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/with_component b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/with_component index 97894453d2a..9c5a5911fef 100644 --- a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/with_component +++ b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/with_component @@ -364,9 +364,9 @@ impl HasComponentImpl_test_component of super::test_component::HasComponent; @@ -968,9 +968,9 @@ impl HasComponentImpl_component2 of super::component2::HasComponent; @@ -1599,9 +1599,9 @@ impl HasComponentImpl_component2 of super::component2::HasComponent; diff --git a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/with_component_diagnostics b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/with_component_diagnostics index ba5c194f10d..3c0cd7a3cf4 100644 --- a/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/with_component_diagnostics +++ b/crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/with_component_diagnostics @@ -287,9 +287,9 @@ pub mod __constructor { -lib.cairo:13:1 - -^ +lib.cairo:15:14 + #[derive(Drop, starknet::Event)] + ^**^ impls: impl EventDrop of core::traits::Drop::; @@ -669,9 +669,9 @@ pub mod __constructor { -lib.cairo:13:1 - -^ +lib.cairo:15:14 + #[derive(Drop, starknet::Event)] + ^**^ impls: impl EventDrop of core::traits::Drop::; @@ -1039,9 +1039,9 @@ pub mod __constructor { -lib.cairo:13:1 - -^ +lib.cairo:15:14 + #[derive(Drop, starknet::Event)] + ^**^ impls: impl EventDrop of core::traits::Drop::; @@ -1422,9 +1422,9 @@ pub mod __constructor { -lib.cairo:13:1 - -^ +lib.cairo:15:14 + #[derive(Drop, starknet::Event)] + ^**^ impls: impl EventDrop of core::traits::Drop::; @@ -1854,9 +1854,9 @@ impl HasComponentImpl_test_component of super::test_component::HasComponent; @@ -2225,9 +2225,9 @@ pub mod __constructor { -lib.cairo:14:1 - -^ +lib.cairo:16:14 + #[derive(Drop, starknet::Event)] + ^**^ impls: impl EventDrop of core::traits::Drop::; @@ -2596,9 +2596,9 @@ pub mod __constructor { -lib.cairo:16:1 - -^ +lib.cairo:18:14 + #[derive(Drop, starknet::Event)] + ^**^ impls: impl EventDrop of core::traits::Drop::; @@ -3124,9 +3124,9 @@ mod test_contract { } } -lib.cairo:8:1 - -^ +lib.cairo:9:10 +#[derive(Drop, starknet::Event)] + ^**^ impls: impl EventDrop of core::traits::Drop::; @@ -3987,9 +3987,9 @@ impl HasComponentImpl_component1 of super::component1::HasComponent; diff --git a/crates/cairo-lang-starknet/src/plugin/storage_interfaces.rs b/crates/cairo-lang-starknet/src/plugin/storage_interfaces.rs index 9c5f28183fc..59e9f59a205 100644 --- a/crates/cairo-lang-starknet/src/plugin/storage_interfaces.rs +++ b/crates/cairo-lang-starknet/src/plugin/storage_interfaces.rs @@ -453,17 +453,21 @@ pub fn handle_storage_interface_struct<'a>( struct_ast: &ast::ItemStruct, metadata: &MacroPluginMetadata<'_>, ) -> PatchBuilder<'a> { - let mut builder = PatchBuilder::new(db, struct_ast); // Run for both StorageNode and StorageTrait - let storage_interface_types = if struct_ast.has_attr(db, STORAGE_NODE_ATTR) { - vec![StorageInterfaceType::StorageTrait, StorageInterfaceType::StorageNode] - } else if struct_ast.has_attr(db, STORAGE_ATTR) { - vec![StorageInterfaceType::StorageTrait] - } else if has_derive(struct_ast, db, STORE_TRAIT).is_some() { - vec![StorageInterfaceType::StructSubPointers] - } else { - panic!("Invalid storage interface type."); - }; + let (origin, storage_interface_types) = + if let Some(attr) = struct_ast.find_attr(db, STORAGE_NODE_ATTR) { + ( + attr.as_syntax_node(), + vec![StorageInterfaceType::StorageTrait, StorageInterfaceType::StorageNode], + ) + } else if let Some(attr) = struct_ast.find_attr(db, STORAGE_ATTR) { + (attr.as_syntax_node(), vec![StorageInterfaceType::StorageTrait]) + } else if let Some(arg) = has_derive(struct_ast, db, STORE_TRAIT) { + (arg.as_syntax_node(), vec![StorageInterfaceType::StructSubPointers]) + } else { + panic!("Invalid storage interface type."); + }; + let mut builder = PatchBuilder::new_ex(db, &origin); for interface_type in storage_interface_types { handle_storage_interface_for_interface_type( db, diff --git a/crates/cairo-lang-test-plugin/src/inline_macros/assert.rs b/crates/cairo-lang-test-plugin/src/inline_macros/assert.rs index bdf41602414..3741c8ac012 100644 --- a/crates/cairo-lang-test-plugin/src/inline_macros/assert.rs +++ b/crates/cairo-lang-test-plugin/src/inline_macros/assert.rs @@ -66,7 +66,7 @@ trait CompareAssertionPlugin: NamedPlugin { } else { ( RewriteNode::mapped_text( - &format!("__lhs_value_for_{}_macro__", Self::NAME), + format!("__lhs_value_for_{}_macro__", Self::NAME), db, &lhs, ), @@ -78,7 +78,7 @@ trait CompareAssertionPlugin: NamedPlugin { } else { ( RewriteNode::mapped_text( - &format!("__rhs_value_for_{}_macro__", Self::NAME), + format!("__rhs_value_for_{}_macro__", Self::NAME), db, &rhs, ),