From bb1a627757a70ad6d0cbe0bd2c17f0ad1230ad75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaya=20G=C3=B6kalp?= Date: Fri, 5 Jan 2024 01:53:15 +0300 Subject: [PATCH] ci: use rust 1.75 in CI (#5435) ## Description Bumps CI rust version to 1.75 and fixes new warnings popped up during the process. unblocks #5433 --- .github/workflows/ci.yml | 4 +- forc/src/cli/plugin.rs | 2 +- sway-ast/src/priv_prelude.rs | 15 +- sway-core/src/asm_lang/mod.rs | 12 +- sway-core/src/control_flow_analysis/mod.rs | 3 +- sway-core/src/decl_engine/mapping.rs | 2 +- .../ty/expression/expression_variant.rs | 2 +- .../ast_node/declaration/function.rs | 1 - .../ast_node/declaration/mod.rs | 10 - .../ast_node/expression/intrinsic_function.rs | 6 +- .../ast_node/expression/mod.rs | 1 - .../ast_node/expression/typed_expression.rs | 298 +++++++++--------- .../typed_expression/method_application.rs | 12 +- .../semantic_analysis/type_check_context.rs | 6 +- sway-ir/src/optimize/sroa.rs | 4 +- sway-lsp/src/core/token.rs | 2 +- sway-parse/src/parser.rs | 10 +- sway-parse/src/priv_prelude.rs | 19 +- sway-parse/src/token.rs | 3 +- .../src/sdk-harness/test_projects/auth/mod.rs | 75 +++-- .../test_projects/low_level_call/mod.rs | 3 +- .../test_projects/low_level_call_bytes/mod.rs | 3 +- .../test_projects/storage_access/mod.rs | 10 +- .../test_projects/tx_fields/mod.rs | 5 +- 24 files changed, 252 insertions(+), 256 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c6deb102a0..4904f4a84b8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,8 +15,8 @@ concurrency: env: CARGO_TERM_COLOR: always REGISTRY: ghcr.io - RUST_VERSION: 1.73.0 - NIGHTLY_RUST_VERSION: nightly-2023-08-27 + RUST_VERSION: 1.75.0 + NIGHTLY_RUST_VERSION: nightly-2023-12-27 jobs: build-sway-lib-core: diff --git a/forc/src/cli/plugin.rs b/forc/src/cli/plugin.rs index 47d234df4b9..63a661b9725 100644 --- a/forc/src/cli/plugin.rs +++ b/forc/src/cli/plugin.rs @@ -19,7 +19,7 @@ pub(crate) fn execute_external_subcommand( args: Vec, silent: bool, ) -> Result { - let cmd = args.get(0).expect("`args` must not be empty"); + let cmd = args.first().expect("`args` must not be empty"); let args = &args[1..]; let path = find_external_subcommand(cmd); let command = match path { diff --git a/sway-ast/src/priv_prelude.rs b/sway-ast/src/priv_prelude.rs index e02c404f6f2..b799d69f37d 100644 --- a/sway-ast/src/priv_prelude.rs +++ b/sway-ast/src/priv_prelude.rs @@ -1,7 +1,7 @@ pub use { crate::{ assignable::Assignable, - attribute::{Annotated, Attribute, AttributeDecl}, + attribute::Annotated, brackets::{AngleBrackets, Braces, Parens, SquareBrackets}, expr::{ asm::{AsmBlock, AsmImmediate}, @@ -9,7 +9,6 @@ pub use { CodeBlockContents, Expr, }, generics::{GenericArgs, GenericParams}, - intrinsics::*, item::{ item_abi::ItemAbi, item_configurable::ItemConfigurable, @@ -25,22 +24,18 @@ pub use { FnSignature, Item, ItemKind, TraitType, TypeField, }, keywords::*, - literal::{LitBool, LitBoolType, LitChar, LitInt, LitIntType, LitString, Literal}, + literal::Literal, path::{PathExpr, PathType}, pattern::Pattern, punctuated::Punctuated, - statement::{Statement, StatementLet}, + statement::Statement, submodule::Submodule, - token::{Group, Punct, Spacing, TokenStream, TokenTree}, ty::Ty, - where_clause::{WhereBound, WhereClause}, + where_clause::WhereClause, }, extension_trait::extension_trait, num_bigint::BigUint, - serde::{Serialize, Serializer}, - std::{ - fmt, marker::PhantomData, mem, ops::ControlFlow, path::PathBuf, str::FromStr, sync::Arc, - }, + serde::Serialize, sway_types::{ ast::{Delimiter, PunctKind}, Ident, Span, Spanned, diff --git a/sway-core/src/asm_lang/mod.rs b/sway-core/src/asm_lang/mod.rs index 86a2f185a74..19a51d68d07 100644 --- a/sway-core/src/asm_lang/mod.rs +++ b/sway-core/src/asm_lang/mod.rs @@ -675,7 +675,7 @@ fn single_reg( }); } - let reg = match args.get(0) { + let reg = match args.first() { Some(reg) => reg, _ => { return Err( @@ -711,7 +711,7 @@ fn two_regs( }); } - let (reg, reg2) = match (args.get(0), args.get(1)) { + let (reg, reg2) = match (args.first(), args.get(1)) { (Some(reg), Some(reg2)) => (reg, reg2), _ => { return Err( @@ -755,7 +755,7 @@ fn four_regs( }); } - let (reg, reg2, reg3, reg4) = match (args.get(0), args.get(1), args.get(2), args.get(3)) { + let (reg, reg2, reg3, reg4) = match (args.first(), args.get(1), args.get(2), args.get(3)) { (Some(reg), Some(reg2), Some(reg3), Some(reg4)) => (reg, reg2, reg3, reg4), _ => { return Err( @@ -820,7 +820,7 @@ fn three_regs( }); } - let (reg, reg2, reg3) = match (args.get(0), args.get(1), args.get(2)) { + let (reg, reg2, reg3) = match (args.first(), args.get(1), args.get(2)) { (Some(reg), Some(reg2), Some(reg3)) => (reg, reg2, reg3), _ => { return Err( @@ -892,7 +892,7 @@ fn single_reg_imm_18( received: args.len(), }); } - let reg = match args.get(0) { + let reg = match args.first() { Some(reg) => reg, _ => { return Err( @@ -942,7 +942,7 @@ fn two_regs_imm_12( received: args.len(), }); } - let (reg, reg2) = match (args.get(0), args.get(1)) { + let (reg, reg2) = match (args.first(), args.get(1)) { (Some(reg), Some(reg2)) => (reg, reg2), _ => { return Err( diff --git a/sway-core/src/control_flow_analysis/mod.rs b/sway-core/src/control_flow_analysis/mod.rs index 77ecfa71e9f..fca93ce96ee 100644 --- a/sway-core/src/control_flow_analysis/mod.rs +++ b/sway-core/src/control_flow_analysis/mod.rs @@ -39,6 +39,5 @@ mod analyze_return_paths; mod dead_code_analysis; mod flow_graph; -pub use analyze_return_paths::*; -pub use dead_code_analysis::*; + pub use flow_graph::*; diff --git a/sway-core/src/decl_engine/mapping.rs b/sway-core/src/decl_engine/mapping.rs index 9105c5710e9..231a339abb5 100644 --- a/sway-core/src/decl_engine/mapping.rs +++ b/sway-core/src/decl_engine/mapping.rs @@ -132,7 +132,7 @@ impl DeclMapping { let func = engines.de().get(&func_id); let unify_check = UnifyCheck::non_dynamic_equality(engines); - if let (left, Some(right)) = (self_type, func.parameters.get(0)) { + if let (left, Some(right)) = (self_type, func.parameters.first()) { if unify_check.check(left, right.type_argument.type_id) { mapping.push((source_decl_ref, dest_decl_ref)); } diff --git a/sway-core/src/language/ty/expression/expression_variant.rs b/sway-core/src/language/ty/expression/expression_variant.rs index 18d0f550489..cc4d22432c1 100644 --- a/sway-core/src/language/ty/expression/expression_variant.rs +++ b/sway-core/src/language/ty/expression/expression_variant.rs @@ -771,7 +771,7 @@ impl ReplaceDecls for TyExpressionVariant { ref mut arguments, .. } => { - let filter_type_opt = arguments.get(0).map(|(_, arg)| arg.return_type); + let filter_type_opt = arguments.first().map(|(_, arg)| arg.return_type); if let Some(filter_type) = filter_type_opt { let filtered_decl_mapping = diff --git a/sway-core/src/semantic_analysis/ast_node/declaration/function.rs b/sway-core/src/semantic_analysis/ast_node/declaration/function.rs index 8af042894d6..ffe9338a848 100644 --- a/sway-core/src/semantic_analysis/ast_node/declaration/function.rs +++ b/sway-core/src/semantic_analysis/ast_node/declaration/function.rs @@ -1,6 +1,5 @@ mod function_parameter; -pub use function_parameter::*; use sway_error::{ error::CompileError, handler::{ErrorEmitted, Handler}, diff --git a/sway-core/src/semantic_analysis/ast_node/declaration/mod.rs b/sway-core/src/semantic_analysis/ast_node/declaration/mod.rs index 8b10e8326db..7d12bcd80cf 100644 --- a/sway-core/src/semantic_analysis/ast_node/declaration/mod.rs +++ b/sway-core/src/semantic_analysis/ast_node/declaration/mod.rs @@ -13,14 +13,4 @@ mod trait_fn; mod trait_type; mod type_alias; -pub use abi::*; -pub use function::*; -pub use impl_trait::*; -pub use r#enum::*; -pub use r#struct::*; -pub use r#trait::*; -pub use storage::*; pub(crate) use supertrait::*; -pub use trait_fn::*; -pub use trait_type::*; -pub use type_alias::*; diff --git a/sway-core/src/semantic_analysis/ast_node/expression/intrinsic_function.rs b/sway-core/src/semantic_analysis/ast_node/expression/intrinsic_function.rs index 7b709885e37..3643e05173d 100644 --- a/sway-core/src/semantic_analysis/ast_node/expression/intrinsic_function.rs +++ b/sway-core/src/semantic_analysis/ast_node/expression/intrinsic_function.rs @@ -749,7 +749,7 @@ fn type_check_state_store_word( TypeInfo::UnsignedInteger(IntegerBits::SixtyFour), None, )); - let type_argument = type_arguments.get(0).map(|targ| { + let type_argument = type_arguments.first().map(|targ| { let mut ctx = ctx.with_type_annotation(type_engine.insert(engines, TypeInfo::Unknown, None)); let initial_type_info = type_engine @@ -843,7 +843,7 @@ fn type_check_state_quad( )); let number_of_slots_exp = ty::TyExpression::type_check(handler, ctx.by_ref(), arguments[2].clone())?; - let type_argument = type_arguments.get(0).map(|targ| { + let type_argument = type_arguments.first().map(|targ| { let mut ctx = ctx.with_type_annotation(type_engine.insert(engines, TypeInfo::Unknown, None)); let initial_type_info = type_engine @@ -1298,7 +1298,7 @@ fn type_check_smo( } // Type check the type argument - let type_argument = type_arguments.get(0).map(|targ| { + let type_argument = type_arguments.first().map(|targ| { let mut ctx = ctx .by_ref() .with_help_text("") diff --git a/sway-core/src/semantic_analysis/ast_node/expression/mod.rs b/sway-core/src/semantic_analysis/ast_node/expression/mod.rs index 7b998e18105..d7755a2b6da 100644 --- a/sway-core/src/semantic_analysis/ast_node/expression/mod.rs +++ b/sway-core/src/semantic_analysis/ast_node/expression/mod.rs @@ -2,5 +2,4 @@ mod intrinsic_function; mod match_expression; pub mod typed_expression; -pub use intrinsic_function::*; pub(crate) use match_expression::*; diff --git a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs index 584df3233fd..8f0735133bc 100644 --- a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs +++ b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs @@ -2176,6 +2176,155 @@ impl ty::TyExpression { } } +fn check_asm_block_validity( + handler: &Handler, + asm: &AsmExpression, + ctx: &TypeCheckContext, +) -> Result<(), ErrorEmitted> { + // Collect all asm block instructions in the form of `VirtualOp`s + let mut opcodes = vec![]; + for op in &asm.body { + let registers = op + .op_args + .iter() + .map(|reg_name| VirtualRegister::Virtual(reg_name.to_string())) + .collect::>(); + + opcodes.push(( + crate::asm_lang::Op::parse_opcode( + handler, + &op.op_name, + ®isters, + &op.immediate, + op.span.clone(), + )?, + op.op_name.clone(), + op.span.clone(), + )); + } + + // Check #1: Disallow control flow instructions + // + for err in opcodes + .iter() + .filter(|op| { + matches!( + op.0, + VirtualOp::JMP(_) + | VirtualOp::JI(_) + | VirtualOp::JNE(..) + | VirtualOp::JNEI(..) + | VirtualOp::JNZI(..) + | VirtualOp::RET(_) + | VirtualOp::RETD(..) + | VirtualOp::RVRT(..) + ) + }) + .map(|op| CompileError::DisallowedControlFlowInstruction { + name: op.1.to_string(), + span: op.2.clone(), + }) + { + handler.emit_err(err); + } + + // Check #2: Disallow initialized registers from being reassigned in the asm block + // + // 1. Collect all registers that have initializers in the list of arguments + let initialized_registers = asm + .registers + .iter() + .filter(|reg| reg.initializer.is_some()) + .map(|reg| VirtualRegister::Virtual(reg.name.to_string())) + .collect::>(); + + // 2. From the list of `VirtualOp`s, figure out what registers are assigned + let assigned_registers: FxHashSet = + opcodes.iter().fold(FxHashSet::default(), |mut acc, op| { + for u in op.0.def_registers() { + acc.insert(u.clone()); + } + acc + }); + + // 3. Intersect the list of assigned registers with the list of initialized registers + let initialized_and_assigned_registers = assigned_registers + .intersection(&initialized_registers) + .collect::>(); + + // 4. Form all the compile errors given the violating registers above. Obtain span information + // from the original `asm.registers` vector. + for err in asm + .registers + .iter() + .filter(|reg| { + initialized_and_assigned_registers + .contains(&VirtualRegister::Virtual(reg.name.to_string())) + }) + .map(|reg| CompileError::InitializedRegisterReassignment { + name: reg.name.to_string(), + span: reg.name.span(), + }) + { + handler.emit_err(err); + } + + // Check #3: Check if there are uninitialized registers that are read before being written + let mut uninitialized_registers = asm + .registers + .iter() + .filter(|reg| reg.initializer.is_none()) + .map(|reg| { + let span = reg.name.span(); + + // Emit warning if this register shadows a variable + let temp_handler = Handler::default(); + let decl = ctx.namespace.resolve_call_path( + &temp_handler, + ctx.engines, + &CallPath { + prefixes: vec![], + suffix: sway_types::BaseIdent::new(span.clone()), + is_absolute: true, + }, + None, + ); + + if let Ok(ty::TyDecl::VariableDecl(decl)) = decl { + handler.emit_warn(CompileWarning { + span: span.clone(), + warning_content: Warning::UninitializedAsmRegShadowsVariable { + name: decl.name.clone(), + }, + }); + } + + (VirtualRegister::Virtual(reg.name.to_string()), span) + }) + .collect::>(); + + for (op, _, _) in opcodes.iter() { + for being_read in op.use_registers() { + if let Some(span) = uninitialized_registers.remove(being_read) { + handler.emit_err(CompileError::UninitRegisterInAsmBlockBeingRead { span }); + } + } + + for being_written in op.def_registers() { + uninitialized_registers.remove(being_written); + } + } + + if let Some((reg, _)) = asm.returns.as_ref() { + let reg = VirtualRegister::Virtual(reg.name.to_string()); + if let Some(span) = uninitialized_registers.remove(®) { + handler.emit_err(CompileError::UninitRegisterInAsmBlockBeingRead { span }); + } + } + + Ok(()) +} + #[cfg(test)] mod tests { use super::*; @@ -2366,152 +2515,3 @@ mod tests { assert!(warnings.is_empty() && errors.is_empty()); } } - -fn check_asm_block_validity( - handler: &Handler, - asm: &AsmExpression, - ctx: &TypeCheckContext, -) -> Result<(), ErrorEmitted> { - // Collect all asm block instructions in the form of `VirtualOp`s - let mut opcodes = vec![]; - for op in &asm.body { - let registers = op - .op_args - .iter() - .map(|reg_name| VirtualRegister::Virtual(reg_name.to_string())) - .collect::>(); - - opcodes.push(( - crate::asm_lang::Op::parse_opcode( - handler, - &op.op_name, - ®isters, - &op.immediate, - op.span.clone(), - )?, - op.op_name.clone(), - op.span.clone(), - )); - } - - // Check #1: Disallow control flow instructions - // - for err in opcodes - .iter() - .filter(|op| { - matches!( - op.0, - VirtualOp::JMP(_) - | VirtualOp::JI(_) - | VirtualOp::JNE(..) - | VirtualOp::JNEI(..) - | VirtualOp::JNZI(..) - | VirtualOp::RET(_) - | VirtualOp::RETD(..) - | VirtualOp::RVRT(..) - ) - }) - .map(|op| CompileError::DisallowedControlFlowInstruction { - name: op.1.to_string(), - span: op.2.clone(), - }) - { - handler.emit_err(err); - } - - // Check #2: Disallow initialized registers from being reassigned in the asm block - // - // 1. Collect all registers that have initializers in the list of arguments - let initialized_registers = asm - .registers - .iter() - .filter(|reg| reg.initializer.is_some()) - .map(|reg| VirtualRegister::Virtual(reg.name.to_string())) - .collect::>(); - - // 2. From the list of `VirtualOp`s, figure out what registers are assigned - let assigned_registers: FxHashSet = - opcodes.iter().fold(FxHashSet::default(), |mut acc, op| { - for u in op.0.def_registers() { - acc.insert(u.clone()); - } - acc - }); - - // 3. Intersect the list of assigned registers with the list of initialized registers - let initialized_and_assigned_registers = assigned_registers - .intersection(&initialized_registers) - .collect::>(); - - // 4. Form all the compile errors given the violating registers above. Obtain span information - // from the original `asm.registers` vector. - for err in asm - .registers - .iter() - .filter(|reg| { - initialized_and_assigned_registers - .contains(&VirtualRegister::Virtual(reg.name.to_string())) - }) - .map(|reg| CompileError::InitializedRegisterReassignment { - name: reg.name.to_string(), - span: reg.name.span(), - }) - { - handler.emit_err(err); - } - - // Check #3: Check if there are uninitialized registers that are read before being written - let mut uninitialized_registers = asm - .registers - .iter() - .filter(|reg| reg.initializer.is_none()) - .map(|reg| { - let span = reg.name.span(); - - // Emit warning if this register shadows a variable - let temp_handler = Handler::default(); - let decl = ctx.namespace.resolve_call_path( - &temp_handler, - ctx.engines, - &CallPath { - prefixes: vec![], - suffix: sway_types::BaseIdent::new(span.clone()), - is_absolute: true, - }, - None, - ); - - if let Ok(ty::TyDecl::VariableDecl(decl)) = decl { - handler.emit_warn(CompileWarning { - span: span.clone(), - warning_content: Warning::UninitializedAsmRegShadowsVariable { - name: decl.name.clone(), - }, - }); - } - - (VirtualRegister::Virtual(reg.name.to_string()), span) - }) - .collect::>(); - - for (op, _, _) in opcodes.iter() { - for being_read in op.use_registers() { - if let Some(span) = uninitialized_registers.remove(being_read) { - handler.emit_err(CompileError::UninitRegisterInAsmBlockBeingRead { span }); - } - } - - for being_written in op.def_registers() { - uninitialized_registers.remove(being_written); - } - } - - if let Some((reg, _)) = asm.returns.as_ref() { - let reg = VirtualRegister::Virtual(reg.name.to_string()); - if let Some(span) = uninitialized_registers.remove(®) { - handler.emit_err(CompileError::UninitRegisterInAsmBlockBeingRead { span }); - } - } - - Ok(()) -} diff --git a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression/method_application.rs b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression/method_application.rs index 75b27835b05..8833d61cfb0 100644 --- a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression/method_application.rs +++ b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression/method_application.rs @@ -167,7 +167,7 @@ pub(crate) fn type_check_method_application( let mut is_method_call_syntax_used = false; if !method.is_contract_call { if let MethodName::FromModule { ref method_name } = method_name_binding.inner { - if let Some(first_arg) = args_buf.get(0) { + if let Some(first_arg) = args_buf.front() { // check if the user calls an ABI supertrait's method (those are private) // as a contract method if let TypeInfo::ContractCaller { .. } = &*type_engine.get(first_arg.return_type) { @@ -182,7 +182,7 @@ pub(crate) fn type_check_method_application( is_method_call_syntax_used = true; let is_first_param_self = method .parameters - .get(0) + .first() .map(|f| f.is_self()) .unwrap_or_default(); if !is_first_param_self { @@ -244,7 +244,7 @@ pub(crate) fn type_check_method_application( expression: exp, .. }), Some(ty::TyFunctionParameter { is_mutable, .. }), - ) = (args_buf.get(0), method.parameters.get(0)) + ) = (args_buf.front(), method.parameters.first()) { if *is_mutable { mutability_check(handler, &ctx, &method_name_binding, &span, exp)?; @@ -463,7 +463,7 @@ pub(crate) fn resolve_method_name( } else { let mut module_path = call_path.prefixes.clone(); if let (Some(root_mod), Some(root_name)) = ( - module_path.get(0).cloned(), + module_path.first().cloned(), ctx.namespace.root().name.clone(), ) { if root_mod.as_str() == root_name.as_str() { @@ -475,7 +475,7 @@ pub(crate) fn resolve_method_name( // find the type of the first argument let type_id = arguments - .get(0) + .front() .map(|x| x.return_type) .unwrap_or_else(|| type_engine.insert(engines, TypeInfo::Unknown, None)); @@ -499,7 +499,7 @@ pub(crate) fn resolve_method_name( // find the type of the first argument let type_id = arguments - .get(0) + .front() .map(|x| x.return_type) .unwrap_or_else(|| type_engine.insert(engines, TypeInfo::Unknown, None)); diff --git a/sway-core/src/semantic_analysis/type_check_context.rs b/sway-core/src/semantic_analysis/type_check_context.rs index 1b1d2a858ff..a4023f83e48 100644 --- a/sway-core/src/semantic_analysis/type_check_context.rs +++ b/sway-core/src/semantic_analysis/type_check_context.rs @@ -1142,12 +1142,12 @@ impl<'a> TypeCheckContext<'a> { // When we use a qualified path the expected method should be in trait_methods. None } else { - maybe_method_decl_refs.get(0).cloned() + maybe_method_decl_refs.first().cloned() } } else { // When we can't match any method with parameter types we still return the first method found // This was the behavior before introducing the parameter type matching - matching_method_decl_refs.get(0).cloned() + matching_method_decl_refs.first().cloned() } }; @@ -1156,7 +1156,7 @@ impl<'a> TypeCheckContext<'a> { } if let Some(TypeInfo::ErrorRecovery(err)) = args_buf - .get(0) + .front() .map(|x| (*type_engine.get(x.return_type)).clone()) { Err(err) diff --git a/sway-ir/src/optimize/sroa.rs b/sway-ir/src/optimize/sroa.rs index bce2916be51..99a7d04b8f3 100644 --- a/sway-ir/src/optimize/sroa.rs +++ b/sway-ir/src/optimize/sroa.rs @@ -246,7 +246,7 @@ pub fn sroa( let elm_index_values = indices .iter() .map(|&index| { - let c = Constant::new_uint(context, 64, index.try_into().unwrap()); + let c = Constant::new_uint(context, 64, index.into()); Value::new_constant(context, c) }) .collect(); @@ -316,7 +316,7 @@ pub fn sroa( let elm_index_values = indices .iter() .map(|&index| { - let c = Constant::new_uint(context, 64, index.try_into().unwrap()); + let c = Constant::new_uint(context, 64, index.into()); Value::new_constant(context, c) }) .collect(); diff --git a/sway-lsp/src/core/token.rs b/sway-lsp/src/core/token.rs index 3de7c57cde9..abf794ad8da 100644 --- a/sway-lsp/src/core/token.rs +++ b/sway-lsp/src/core/token.rs @@ -229,7 +229,7 @@ impl std::hash::Hash for TokenIdent { /// Check if the given method is a [core::ops] application desugared from short-hand syntax like / + * - etc. pub fn desugared_op(prefixes: &[Ident]) -> bool { - let prefix0 = prefixes.get(0).map(|ident| ident.as_str()); + let prefix0 = prefixes.first().map(|ident| ident.as_str()); let prefix1 = prefixes.get(1).map(|ident| ident.as_str()); if let (Some("core"), Some("ops")) = (prefix0, prefix1) { return true; diff --git a/sway-parse/src/parser.rs b/sway-parse/src/parser.rs index 0d5a87333fb..721086b7dc4 100644 --- a/sway-parse/src/parser.rs +++ b/sway-parse/src/parser.rs @@ -288,7 +288,7 @@ impl<'a, 'e> Parser<'a, 'e> { /// To calculate lines the original source code needs to be transversed. pub fn consume_while_line_equals(&mut self, line: usize) { loop { - let Some(current_token) = self.token_trees.get(0) else { + let Some(current_token) = self.token_trees.first() else { break; }; @@ -444,7 +444,7 @@ impl<'original, 'a, 'e> ParseRecoveryStrategies<'original, 'a, 'e> { } else { self.last_consumed_token() .map(|x| x.span()) - .or_else(|| self.fork_token_trees.get(0).map(|x| x.span())) + .or_else(|| self.fork_token_trees.first().map(|x| x.span())) .map(|x| x.start_pos().line_col().0) }; @@ -483,7 +483,7 @@ impl<'original, 'a, 'e> ParseRecoveryStrategies<'original, 'a, 'e> { /// This is the last consumed token of the forked parser. This the token /// immediately before the forked parser head. pub fn last_consumed_token(&self) -> Option<&GenericTokenTree> { - let fork_head_span = self.fork_token_trees.get(0)?.span(); + let fork_head_span = self.fork_token_trees.first()?.span(); // find the last token consumed by the fork let original = self.original.borrow(); @@ -504,7 +504,7 @@ impl<'original, 'a, 'e> ParseRecoveryStrategies<'original, 'a, 'e> { let original = self.original.borrow_mut(); // collect all tokens trees that were consumed by the fork - let qty = if let Some(first_fork_tt) = p.token_trees.get(0) { + let qty = if let Some(first_fork_tt) = p.token_trees.first() { original .token_trees .iter() @@ -528,7 +528,7 @@ impl<'original, 'a, 'e> ParseRecoveryStrategies<'original, 'a, 'e> { let mut original = self.original.borrow_mut(); // collect all tokens trees that were consumed by the fork - let qty = if let Some(first_fork_tt) = p.token_trees.get(0) { + let qty = if let Some(first_fork_tt) = p.token_trees.first() { original .token_trees .iter() diff --git a/sway-parse/src/priv_prelude.rs b/sway-parse/src/priv_prelude.rs index 0fab33ecc2d..c11b6858566 100644 --- a/sway-parse/src/priv_prelude.rs +++ b/sway-parse/src/priv_prelude.rs @@ -1,16 +1,5 @@ -pub use { - crate::{ - brackets::ParseBracket, - expr::op_code::parse_instruction, - parse::{Parse, ParseToEnd, Peek}, - parser::{ParseResult, Parser, ParserConsumed, Peeker}, - }, - extension_trait::extension_trait, - num_bigint::BigUint, - std::{ - fmt, marker::PhantomData, mem, ops::ControlFlow, path::PathBuf, str::FromStr, sync::Arc, - }, - sway_types::{Ident, Span, Spanned}, - thiserror::Error, - unicode_xid::UnicodeXID, +pub use crate::{ + brackets::ParseBracket, + parse::{ParseToEnd, Peek}, + parser::{ParseResult, ParserConsumed, Peeker}, }; diff --git a/sway-parse/src/token.rs b/sway-parse/src/token.rs index 1ea53621870..bf307f328fc 100644 --- a/sway-parse/src/token.rs +++ b/sway-parse/src/token.rs @@ -840,8 +840,7 @@ fn error(handler: &Handler, error: LexError) -> ErrorEmitted { #[cfg(test)] mod tests { - use super::{lex, lex_commented}; - use crate::priv_prelude::*; + use super::*; use assert_matches::assert_matches; use std::sync::Arc; use sway_ast::{ diff --git a/test/src/sdk-harness/test_projects/auth/mod.rs b/test/src/sdk-harness/test_projects/auth/mod.rs index 0bad6d9a3ad..f12bf989383 100644 --- a/test/src/sdk-harness/test_projects/auth/mod.rs +++ b/test/src/sdk-harness/test_projects/auth/mod.rs @@ -1,5 +1,8 @@ use fuels::{ - accounts::{wallet::{Wallet, WalletUnlocked}, predicate::Predicate}, + accounts::{ + predicate::Predicate, + wallet::{Wallet, WalletUnlocked}, + }, prelude::*, types::ContractId, }; @@ -15,7 +18,7 @@ abigen!( abi = "test_artifacts/auth_caller_contract/out/debug/auth_caller_contract-abi.json" ), Predicate( - name = "AuthPredicate", + name = "AuthPredicate", abi = "test_artifacts/auth_predicate/out/debug/auth_predicate-abi.json" ), ); @@ -112,27 +115,37 @@ async fn can_get_predicate_id() { coin_amount: 1_000, }], ); - let wallets = &launch_custom_provider_and_get_wallets(wallets_config, None, None).await.unwrap(); + let wallets = &launch_custom_provider_and_get_wallets(wallets_config, None, None) + .await + .unwrap(); let first_wallet = &wallets[0]; let second_wallet = &wallets[1]; // Setup Predciate - let hex_predicate_address: &str = "0x76bae6a88c3f54a9aee40ee5390696dd9edaf1b2a16d96a75adbcaac2ec6584f"; - let predicate_address = Address::from_str(hex_predicate_address).expect("failed to create Address from string"); + let hex_predicate_address: &str = + "0x76bae6a88c3f54a9aee40ee5390696dd9edaf1b2a16d96a75adbcaac2ec6584f"; + let predicate_address = + Address::from_str(hex_predicate_address).expect("failed to create Address from string"); let predicate_bech32_address = Bech32Address::from(predicate_address); let predicate_data = AuthPredicateEncoder::encode_data(predicate_bech32_address); - let predicate: Predicate = Predicate::load_from("test_artifacts/auth_predicate/out/debug/auth_predicate.bin").unwrap() - .with_provider(first_wallet.try_provider().unwrap().clone()) - .with_data(predicate_data); + let predicate: Predicate = + Predicate::load_from("test_artifacts/auth_predicate/out/debug/auth_predicate.bin") + .unwrap() + .with_provider(first_wallet.try_provider().unwrap().clone()) + .with_data(predicate_data); // Next, we lock some assets in this predicate using the first wallet: // First wallet transfers amount to predicate. first_wallet .transfer(predicate.address(), 500, asset_id, TxPolicies::default()) - .await.unwrap(); + .await + .unwrap(); // Check predicate balance. - let balance = predicate.get_asset_balance(&AssetId::default()).await.unwrap(); + let balance = predicate + .get_asset_balance(&AssetId::default()) + .await + .unwrap(); assert_eq!(balance, 500); // Then we can transfer assets owned by the predicate via the Account trait: @@ -146,14 +159,21 @@ async fn can_get_predicate_id() { asset_id, TxPolicies::default(), ) - .await.unwrap(); + .await + .unwrap(); // Predicate balance is zero. - let balance = predicate.get_asset_balance(&AssetId::default()).await.unwrap(); + let balance = predicate + .get_asset_balance(&AssetId::default()) + .await + .unwrap(); assert_eq!(balance, 0); // Second wallet balance is updated. - let balance = second_wallet.get_asset_balance(&AssetId::default()).await.unwrap(); + let balance = second_wallet + .get_asset_balance(&AssetId::default()) + .await + .unwrap(); assert_eq!(balance, 1500); } @@ -170,26 +190,36 @@ async fn when_incorrect_predicate_address_passed() { coin_amount: 1_000, }], ); - let wallets = &launch_custom_provider_and_get_wallets(wallets_config, None, None).await.unwrap(); + let wallets = &launch_custom_provider_and_get_wallets(wallets_config, None, None) + .await + .unwrap(); let first_wallet = &wallets[0]; let second_wallet = &wallets[1]; // Setup Predciate with incorrect address - let hex_predicate_address: &str = "0x36bf4bd40f2a3b3db595ef8fd8b21dbe9e6c0dd7b419b4413ff6b584ce7da5d7"; - let predicate_address = Address::from_str(hex_predicate_address).expect("failed to create Address from string"); + let hex_predicate_address: &str = + "0x36bf4bd40f2a3b3db595ef8fd8b21dbe9e6c0dd7b419b4413ff6b584ce7da5d7"; + let predicate_address = + Address::from_str(hex_predicate_address).expect("failed to create Address from string"); let predicate_data = AuthPredicateEncoder::encode_data(Bech32Address::from(predicate_address)); - let predicate: Predicate = Predicate::load_from("test_artifacts/auth_predicate/out/debug/auth_predicate.bin").unwrap() - .with_provider(first_wallet.try_provider().unwrap().clone()) - .with_data(predicate_data); + let predicate: Predicate = + Predicate::load_from("test_artifacts/auth_predicate/out/debug/auth_predicate.bin") + .unwrap() + .with_provider(first_wallet.try_provider().unwrap().clone()) + .with_data(predicate_data); // Next, we lock some assets in this predicate using the first wallet: // First wallet transfers amount to predicate. first_wallet .transfer(predicate.address(), 500, asset_id, TxPolicies::default()) - .await.unwrap(); + .await + .unwrap(); // Check predicate balance. - let balance = predicate.get_asset_balance(&AssetId::default()).await.unwrap(); + let balance = predicate + .get_asset_balance(&AssetId::default()) + .await + .unwrap(); assert_eq!(balance, 500); // Then we can transfer assets owned by the predicate via the Account trait: @@ -203,5 +233,6 @@ async fn when_incorrect_predicate_address_passed() { asset_id, TxPolicies::default(), ) - .await.unwrap(); + .await + .unwrap(); } diff --git a/test/src/sdk-harness/test_projects/low_level_call/mod.rs b/test/src/sdk-harness/test_projects/low_level_call/mod.rs index d67ca65068a..d91cb6f8208 100644 --- a/test/src/sdk-harness/test_projects/low_level_call/mod.rs +++ b/test/src/sdk-harness/test_projects/low_level_call/mod.rs @@ -22,7 +22,8 @@ macro_rules! calldata { abigen!( Contract( name = "TestContract", - abi = "test_artifacts/low_level_callee_contract/out/debug/low_level_callee_contract-abi.json" + abi = + "test_artifacts/low_level_callee_contract/out/debug/low_level_callee_contract-abi.json" ), Script( name = "TestScript", diff --git a/test/src/sdk-harness/test_projects/low_level_call_bytes/mod.rs b/test/src/sdk-harness/test_projects/low_level_call_bytes/mod.rs index e9b1cc30489..301bb28ac2a 100644 --- a/test/src/sdk-harness/test_projects/low_level_call_bytes/mod.rs +++ b/test/src/sdk-harness/test_projects/low_level_call_bytes/mod.rs @@ -22,7 +22,8 @@ macro_rules! calldata { abigen!( Contract( name = "TestContract", - abi = "test_artifacts/low_level_callee_contract/out/debug/low_level_callee_contract-abi.json" + abi = + "test_artifacts/low_level_callee_contract/out/debug/low_level_callee_contract-abi.json" ), Script( name = "TestScript", diff --git a/test/src/sdk-harness/test_projects/storage_access/mod.rs b/test/src/sdk-harness/test_projects/storage_access/mod.rs index 0a988da76f4..4130c53fdca 100644 --- a/test/src/sdk-harness/test_projects/storage_access/mod.rs +++ b/test/src/sdk-harness/test_projects/storage_access/mod.rs @@ -168,13 +168,7 @@ async fn maps_in_struct_access() { async fn clears_storage_key() { let methods = test_storage_access_instance().await.methods(); - assert_eq!( - methods - .clears_storage_key() - .call() - .await - .unwrap() - .value, - true + assert!( + methods.clears_storage_key().call().await.unwrap().value ); } diff --git a/test/src/sdk-harness/test_projects/tx_fields/mod.rs b/test/src/sdk-harness/test_projects/tx_fields/mod.rs index c8455982e62..b60783123df 100644 --- a/test/src/sdk-harness/test_projects/tx_fields/mod.rs +++ b/test/src/sdk-harness/test_projects/tx_fields/mod.rs @@ -187,10 +187,9 @@ async fn setup_output_predicate() -> (WalletUnlocked, WalletUnlocked, Predicate, } mod tx { - use fuel_vm::fuel_tx::field::Script; - use fuels::types::coin_type::CoinType; - use super::*; + use fuel_vm::fuel_tx::field::Script; + use fuels::types::{coin_type::CoinType, transaction::Transaction}; #[tokio::test] async fn can_get_tx_type() {