pub struct LinearState {
trees: HashMap<ItemReference, Rc<RefCell<LinearTree>>>,
}
Fields§
§trees: HashMap<ItemReference, Rc<RefCell<LinearTree>>>
The trees visible via references, either names or expression IDs. Multiple references can refer to the same tree
Implementations§
Source§impl LinearState
impl LinearState
pub fn new() -> Self
Sourcepub fn check_unused(&self) -> Result<(), (Loc<ItemReference>, MutWireWitness)>
pub fn check_unused(&self) -> Result<(), (Loc<ItemReference>, MutWireWitness)>
If there is an linear tree which has a leaf node that is unused, reports it as an item reference and a witness for something that needs to be used.
The item reference is chosen to be as useful to the user as possible. If there is a name alias for this item, it is used, if not, an expression reference is used
pub fn push_type(&mut self, reference: Loc<ItemReference>, ty: &ConcreteType)
pub fn push_new_expression( &mut self, expr_id: &Loc<ExprID>, ctx: &LinearCtx<'_>, )
pub fn push_new_name(&mut self, name: &Loc<NameID>, ctx: &LinearCtx<'_>)
Sourcepub fn merge(
&mut self,
lhs: Loc<ItemReference>,
rhs: Loc<ItemReference>,
) -> Result<(), Diagnostic>
pub fn merge( &mut self, lhs: Loc<ItemReference>, rhs: Loc<ItemReference>, ) -> Result<(), Diagnostic>
Merges two ItemReferences into a single tree. Exactly one of the items must have a pre-existing tree, or the pre-existing trees must be the same trees, otherwise it panics
pub fn add_alias_name( &mut self, from: Loc<ExprID>, to: &Loc<NameID>, ) -> Result<(), Diagnostic>
fn alias_subtree<F>( &mut self, to: Loc<ExprID>, base_expr: ExprID, idx: F, ) -> Result<(), Diagnostic>
Sourcepub fn alias_tuple_member(
&mut self,
to: Loc<ExprID>,
base_expr: ExprID,
idx: &Loc<u128>,
) -> Result<(), Diagnostic>
pub fn alias_tuple_member( &mut self, to: Loc<ExprID>, base_expr: ExprID, idx: &Loc<u128>, ) -> Result<(), Diagnostic>
Adds from
as an alias to the tree at base_expr#tuple_member
. Panics if base_expr is not
a tuple with at least idx elements
Sourcepub fn alias_array_member(
&mut self,
to: Loc<ExprID>,
base_expr: ExprID,
idx: &Loc<u128>,
) -> Result<(), Diagnostic>
pub fn alias_array_member( &mut self, to: Loc<ExprID>, base_expr: ExprID, idx: &Loc<u128>, ) -> Result<(), Diagnostic>
Adds from
as an alias to the tree at base_expr[idx]
. Panics if base_expr is not
a tuple with at least idx elements
Sourcepub fn alias_struct_member(
&mut self,
to: Loc<ExprID>,
base_expr: ExprID,
field: &Loc<Identifier>,
) -> Result<(), Diagnostic>
pub fn alias_struct_member( &mut self, to: Loc<ExprID>, base_expr: ExprID, field: &Loc<Identifier>, ) -> Result<(), Diagnostic>
Adds from
as an alias to the tree at base_expr#tuple_member
. Panics if base_expr is not
a tuple with at least idx elements
pub fn push_pattern( &mut self, pat: &Pattern, ctx: &LinearCtx<'_>, ) -> Result<(), Diagnostic>
pub fn consume_expression(&mut self, expr: &Loc<Expression>) -> Result<()>
pub fn consume_id(&mut self, id: Loc<ExprID>) -> Result<()>
Auto Trait Implementations§
impl Freeze for LinearState
impl !RefUnwindSafe for LinearState
impl !Send for LinearState
impl !Sync for LinearState
impl Unpin for LinearState
impl !UnwindSafe for LinearState
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> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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 moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§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 moreSource§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 moreSource§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
Source§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
Source§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.Source§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.Source§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.Source§impl<T> Tap for T
impl<T> Tap for T
Source§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.