struct Analyzer<'hir> {
gcx: Gcx<'hir>,
hir: &'hir Hir<'hir>,
safe_vars: HashSet<VariableId>,
self_vars: HashSet<VariableId>,
permits: HashSet<PermitRecord>,
repayments: HashMap<PendingRepayment, u32>,
aliases: HashMap<VariableId, VariableId>,
sum_of: HashMap<VariableId, (VariableId, VariableId)>,
has_solady_lib: bool,
hits: Vec<(Span, &'static SolLint)>,
written: HashSet<VariableId>,
}Fields§
§gcx: Gcx<'hir>§hir: &'hir Hir<'hir>§safe_vars: HashSet<VariableId>Variables proven safe (equal to msg.sender or address(this)) on this path.
Function-locals and immutable/constant state vars only — mutable storage may be
rewritten between the check and the sink.
self_vars: HashSet<VariableId>Locals proven equal to address(this). Subset of safe_vars, used to recognise
the permit spender arg via an alias.
permits: HashSet<PermitRecord>Permits seen earlier on this path. Killed on token/owner reassignment.
repayments: HashMap<PendingRepayment, u32>Pending flash-loan repayments, as a multiset: repeated onFlashLoan calls each
license one consumption.
aliases: HashMap<VariableId, VariableId>x = y records x -> canonical(y); killed on writes to either side.
sum_of: HashMap<VariableId, (VariableId, VariableId)>x = a + b records x -> (a, b); matches flash-repayment sums.
has_solady_lib: boolGates the using ... for address sink branch on a SafeTransferLib being present.
hits: Vec<(Span, &'static SolLint)>§written: HashSet<VariableId>Vars written by an assignment / delete. Used to drop unsound modifier-param
hoists when the modifier rewrote the param.
Implementations§
Source§impl<'hir> Analyzer<'hir>
impl<'hir> Analyzer<'hir>
fn new(gcx: Gcx<'hir>, hir: &'hir Hir<'hir>, has_solady_lib: bool) -> Self
fn snapshot(&self) -> FlowState
fn restore(&mut self, state: FlowState)
Sourcefn canonical(&self, v: VariableId) -> VariableId
fn canonical(&self, v: VariableId) -> VariableId
Follows the alias chain to its root. Bounded to guard against cycles.
fn is_safe(&self, expr: &Expr<'_>) -> bool
fn is_safe_inner(&self, expr: &Expr<'_>, depth: u8) -> bool
fn callee_returns_safe(&self, callee: &Expr<'_>, depth: u8) -> bool
Sourcefn assign(&mut self, target: VariableId, rhs: &Expr<'_>)
fn assign(&mut self, target: VariableId, rhs: &Expr<'_>)
Variant of assign_one_flags for declarations: skips permit/repayment kills
since a freshly declared variable has no prior facts.
Sourcefn is_self_expr(&self, expr: &Expr<'_>) -> bool
fn is_self_expr(&self, expr: &Expr<'_>) -> bool
true when expr resolves to address(this): bare form, a local alias,
payable(...)/cast wraps, a ternary whose both branches are self, or a no-arg
helper returning a statically-self expression.
fn is_self_expr_inner(&self, expr: &Expr<'_>, depth: u8) -> bool
fn callee_returns_self(&self, callee: &Expr<'_>, depth: u8) -> bool
Sourcefn match_permit_call(&self, expr: &'hir Expr<'hir>) -> Option<PermitRecord>
fn match_permit_call(&self, expr: &'hir Expr<'hir>) -> Option<PermitRecord>
Matches EIP-2612 token.permit(owner, <self>, value, deadline, v, r, s), plus
the library form Lib.safePermit(token, owner, <self>, value, deadline, v, r, s)
(OpenZeppelin-style wrapper that delegates to token.permit).
Sourcefn kill_permits_for(&mut self, target: VariableId)
fn kill_permits_for(&mut self, target: VariableId)
Drops permits referencing target by raw id. Permits are stored at the
canonical chain root, so reassigning an alias var leaves the root’s permit
intact — only reassigning the root itself kills it.
Sourcefn canonical_key(&self, k: TokenKey) -> TokenKey
fn canonical_key(&self, k: TokenKey) -> TokenKey
Canonicalizes a TokenKey: Var chases the alias chain; Field’s base
var is canonicalized so aCfg = cfg; aCfg.token aliases to cfg.token.
Sourcefn invalidate(&mut self, v: VariableId)
fn invalidate(&mut self, v: VariableId)
Drops all facts about v (treats it as freshly assigned an unknown value).
Sourcefn call_state_writes(&self, callee: &Expr<'_>) -> Option<HashSet<VariableId>>
fn call_state_writes(&self, callee: &Expr<'_>) -> Option<HashSet<VariableId>>
Returns state vars written by callee if it resolves to a function in the
current contract; walks one level of nested internal calls. Resolution is
conservative: any unresolved or non-local call returns None.
fn permit_covers(&self, token: Option<TokenKey>, from: &Expr<'_>) -> bool
Sourcefn amount_matches(
&self,
amount_arg: &Expr<'_>,
amount: VariableId,
fee: VariableId,
) -> bool
fn amount_matches( &self, amount_arg: &Expr<'_>, amount: VariableId, fee: VariableId, ) -> bool
amount_arg is amount + fee syntactically, or a local var bound to that sum.
Sourcefn kill_repayments_for(&mut self, target: VariableId)
fn kill_repayments_for(&mut self, target: VariableId)
Drops pending repayments referencing target.
Sourcefn consume_repayment(
&mut self,
call_expr: &Expr<'_>,
from: &Expr<'_>,
token: Option<TokenKey>,
) -> bool
fn consume_repayment( &mut self, call_expr: &Expr<'_>, from: &Expr<'_>, token: Option<TokenKey>, ) -> bool
Matches from/token plus a sink call with to == address(this) and amount
amount + fee against a pending repayment, consuming one occurrence on hit.
Sourcefn add_facts(&mut self, pred: &Expr<'_>, negate: bool)
fn add_facts(&mut self, pred: &Expr<'_>, negate: bool)
Records vars proven safe by pred. Handles ==/!=, &&/|| and ! via
De Morgan; disjunctions keep only facts true on both sides.
fn is_safe_target(&self, v: VariableId) -> bool
Sourcefn kill_field_permits(&mut self, lhs: &Expr<'_>)
fn kill_field_permits(&mut self, lhs: &Expr<'_>)
Drops permits whose token is Field(base, name) when the LHS is the
corresponding <base>.<name> (assignment or delete).
Sourcefn handle_assign(&mut self, lhs: &Expr<'_>, rhs: &Expr<'_>)
fn handle_assign(&mut self, lhs: &Expr<'_>, rhs: &Expr<'_>)
Handles single-var and tuple LHS; tuple slots align with a tuple-literal RHS.
Sourcefn assign_one(&mut self, lhs: &Expr<'_>, rhs: Option<&Expr<'_>>)
fn assign_one(&mut self, lhs: &Expr<'_>, rhs: Option<&Expr<'_>>)
rhs == None (unknown slot) drops the target’s safe-fact.
Sourcefn eval_rhs(&self, rhs: Option<&Expr<'_>>) -> AssignRhs
fn eval_rhs(&self, rhs: Option<&Expr<'_>>) -> AssignRhs
Pre-evaluates RHS facts; the resulting AssignRhs is independent of later
state changes (needed for tuple-swap assignments).
Sourcefn assign_one_flags(&mut self, lhs: &Expr<'_>, eval: AssignRhs)
fn assign_one_flags(&mut self, lhs: &Expr<'_>, eval: AssignRhs)
Applies a pre-evaluated RHS to the LHS variable.
Sourcefn visit_isolated(&mut self, stmts: &'hir [Stmt<'hir>])
fn visit_isolated(&mut self, stmts: &'hir [Stmt<'hir>])
Visits a body that may execute zero times or out-of-line (loops, try clauses): in-body kills survive, in-body additions don’t.
fn visit_stmts_until_loop_exit( &mut self, stmts: &'hir [Stmt<'hir>], exits: &mut Vec<FlowState>, ) -> Option<FlowState>
fn visit_stmt_until_loop_exit( &mut self, stmt: &'hir Stmt<'hir>, exits: &mut Vec<FlowState>, ) -> Option<()>
Trait Implementations§
Source§impl<'hir> Visit<'hir> for Analyzer<'hir>
impl<'hir> Visit<'hir> for Analyzer<'hir>
Source§type BreakValue = <fn() -> ! as GetReturnType>::ReturnType
type BreakValue = <fn() -> ! as GetReturnType>::ReturnType
fn visit_stmt( &mut self, stmt: &'hir Stmt<'hir>, ) -> ControlFlow<Self::BreakValue>
fn visit_expr( &mut self, expr: &'hir Expr<'hir>, ) -> ControlFlow<Self::BreakValue>
fn visit_nested_source(&mut self, id: SourceId) -> ControlFlow<Self::BreakValue>
fn visit_nested_item(&mut self, id: ItemId) -> ControlFlow<Self::BreakValue>
fn visit_item( &mut self, item: Item<'hir, 'hir>, ) -> ControlFlow<Self::BreakValue>
fn visit_nested_contract( &mut self, id: ContractId, ) -> ControlFlow<Self::BreakValue>
fn visit_contract( &mut self, contract: &'hir Contract<'hir>, ) -> ControlFlow<Self::BreakValue>
fn visit_nested_function( &mut self, id: FunctionId, ) -> ControlFlow<Self::BreakValue>
fn visit_function( &mut self, func: &'hir Function<'hir>, ) -> ControlFlow<Self::BreakValue>
fn visit_modifier( &mut self, modifier: &'hir Modifier<'hir>, ) -> ControlFlow<Self::BreakValue>
fn visit_nested_struct(&mut self, id: StructId) -> ControlFlow<Self::BreakValue>
fn visit_struct( &mut self, strukt: &'hir Struct<'hir>, ) -> ControlFlow<Self::BreakValue>
fn visit_nested_enum(&mut self, id: EnumId) -> ControlFlow<Self::BreakValue>
fn visit_enum( &mut self, _enumm: &'hir Enum<'hir>, ) -> ControlFlow<Self::BreakValue>
fn visit_nested_udvt(&mut self, id: UdvtId) -> ControlFlow<Self::BreakValue>
fn visit_udvt( &mut self, udvt: &'hir Udvt<'hir>, ) -> ControlFlow<Self::BreakValue>
fn visit_nested_error(&mut self, id: ErrorId) -> ControlFlow<Self::BreakValue>
fn visit_error( &mut self, error: &'hir Error<'hir>, ) -> ControlFlow<Self::BreakValue>
fn visit_nested_event(&mut self, id: EventId) -> ControlFlow<Self::BreakValue>
fn visit_event( &mut self, event: &'hir Event<'hir>, ) -> ControlFlow<Self::BreakValue>
fn visit_nested_var(&mut self, id: VariableId) -> ControlFlow<Self::BreakValue>
fn visit_var( &mut self, var: &'hir Variable<'hir>, ) -> ControlFlow<Self::BreakValue>
fn visit_call_args( &mut self, args: &'hir CallArgs<'hir>, ) -> ControlFlow<Self::BreakValue>
fn visit_ty(&mut self, ty: &'hir Type<'hir>) -> ControlFlow<Self::BreakValue>
fn walk_nested_source(&mut self, id: SourceId) -> ControlFlow<Self::BreakValue>
fn walk_nested_item(&mut self, id: ItemId) -> ControlFlow<Self::BreakValue>
fn walk_item(&mut self, item: Item<'hir, 'hir>) -> ControlFlow<Self::BreakValue>
fn walk_nested_contract( &mut self, id: ContractId, ) -> ControlFlow<Self::BreakValue>
fn walk_contract( &mut self, contract: &'hir Contract<'hir>, ) -> ControlFlow<Self::BreakValue>
fn walk_nested_function( &mut self, id: FunctionId, ) -> ControlFlow<Self::BreakValue>
fn walk_function( &mut self, func: &'hir Function<'hir>, ) -> ControlFlow<Self::BreakValue>
fn walk_modifier( &mut self, modifier: &'hir Modifier<'hir>, ) -> ControlFlow<Self::BreakValue>
fn walk_nested_struct(&mut self, id: StructId) -> ControlFlow<Self::BreakValue>
fn walk_struct( &mut self, strukt: &'hir Struct<'hir>, ) -> ControlFlow<Self::BreakValue>
fn walk_nested_enum(&mut self, id: EnumId) -> ControlFlow<Self::BreakValue>
fn walk_enum( &mut self, _enumm: &'hir Enum<'hir>, ) -> ControlFlow<Self::BreakValue>
fn walk_nested_udvt(&mut self, id: UdvtId) -> ControlFlow<Self::BreakValue>
fn walk_udvt(&mut self, udvt: &'hir Udvt<'hir>) -> ControlFlow<Self::BreakValue>
fn walk_nested_error(&mut self, id: ErrorId) -> ControlFlow<Self::BreakValue>
fn walk_error( &mut self, error: &'hir Error<'hir>, ) -> ControlFlow<Self::BreakValue>
fn walk_nested_event(&mut self, id: EventId) -> ControlFlow<Self::BreakValue>
fn walk_event( &mut self, event: &'hir Event<'hir>, ) -> ControlFlow<Self::BreakValue>
fn walk_nested_var(&mut self, id: VariableId) -> ControlFlow<Self::BreakValue>
fn walk_var( &mut self, var: &'hir Variable<'hir>, ) -> ControlFlow<Self::BreakValue>
fn walk_expr(&mut self, expr: &'hir Expr<'hir>) -> ControlFlow<Self::BreakValue>
fn walk_call_args( &mut self, args: &'hir CallArgs<'hir>, ) -> ControlFlow<Self::BreakValue>
fn walk_stmt(&mut self, stmt: &'hir Stmt<'hir>) -> ControlFlow<Self::BreakValue>
fn walk_ty(&mut self, ty: &'hir Type<'hir>) -> ControlFlow<Self::BreakValue>
Auto Trait Implementations§
impl<'hir> !RefUnwindSafe for Analyzer<'hir>
impl<'hir> !UnwindSafe for Analyzer<'hir>
impl<'hir> Freeze for Analyzer<'hir>
impl<'hir> Send for Analyzer<'hir>
impl<'hir> Sync for Analyzer<'hir>
impl<'hir> Unpin for Analyzer<'hir>
impl<'hir> UnsafeUnpin for Analyzer<'hir>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
§fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
TxEnv] from a transaction and a sender address.§impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
§fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
TxEnv] from a transaction, its sender, and encoded transaction bytes.§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling [Attribute] value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi [Quirk] value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the [Condition] value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.§impl<T> TryConv for T
impl<T> TryConv for T
§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 384 bytes