pub struct BoilerplateCounts {
pub control: usize,
pub calls: usize,
pub macros: usize,
pub statements: usize,
pub work: usize,
pub branches: usize,
pub declarations: usize,
pub returns: usize,
}Expand description
What a unit’s body contains, counted over its whole subtree.
Calls are counted apart from statements because the IR models a call as an
expression: f(); is one call node, not a statement wrapping one.
Fields§
§control: usizeBranches, loops, multi-way conditionals and error handling.
calls: usizeCall expressions that are not themselves an argument to a call.
Nesting is what separates delegation from work. f(g(x), h(y)) is one
delegation whose arguments happen to be computed by call: counting
three calls there would say a wrapper does three things, when what it
does is call f. Sibling calls are counted apart, because two calls in
a row are two things done.
macros: usizeMacro invocations that are not themselves an argument to a call.
Counted the way calls are, and for the same reason. f(tri!(g(x))) is
one delegation whose argument happens to be spelled with a macro;
counting the macro would say the body does something besides call f,
when handing the argument over is all it does. A macro standing on its
own is still counted: nothing here can see what it expands to, so a
statement that is one is a statement whose contents are unknown.
statements: usizeStatements other than macro invocations and control flow.
work: usizeStatements that do more than name a value or hand one back.
A return around a delegation is punctuation. So is a local declared
to receive what the delegation writes: a callee that answers through a
pointer leaves its caller no other way to spell the call. An assignment
or a bare expression statement is work.
Nothing here can see what an initialiser computes — the IR models a declaration as one node whether it names a place or fills it with arithmetic. That is why declarations are punctuation only beside a delegation, never on their own.
branches: usizeTwo-way conditionals, counted apart from the rest of the control flow.
One of them is a guard. Several are a decision table, which is something a reader can act on: two copies of one table differing in their constants is exactly the duplication worth reporting.
declarations: usizeLocal declarations, counted apart so a body can be required to have
none. See work for why an initialiser cannot be inspected.
returns: usizereturn statements.
Trait Implementations§
Source§impl Clone for BoilerplateCounts
impl Clone for BoilerplateCounts
Source§fn clone(&self) -> BoilerplateCounts
fn clone(&self) -> BoilerplateCounts
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for BoilerplateCounts
Source§impl Debug for BoilerplateCounts
impl Debug for BoilerplateCounts
Source§impl Default for BoilerplateCounts
impl Default for BoilerplateCounts
Source§fn default() -> BoilerplateCounts
fn default() -> BoilerplateCounts
impl Eq for BoilerplateCounts
Source§impl PartialEq for BoilerplateCounts
impl PartialEq for BoilerplateCounts
impl StructuralPartialEq for BoilerplateCounts
Auto Trait Implementations§
impl Freeze for BoilerplateCounts
impl RefUnwindSafe for BoilerplateCounts
impl Send for BoilerplateCounts
impl Sync for BoilerplateCounts
impl Unpin for BoilerplateCounts
impl UnsafeUnpin for BoilerplateCounts
impl UnwindSafe for BoilerplateCounts
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.