Struct VarTable

Source
pub struct VarTable<'a> { /* private fields */ }
Expand description

Table for keeping track of node parameters.

Variables refer to the parameters of a node which introduces a symbol. Variables have an associated name and are scoped via nodes. The types of parameters of a node may only refer to earlier parameters in the same node in the order they are defined. A variable name must be unique within a single node. Each node that introduces a symbol introduces a new isolated scope for variables.

§Examples

let mut vars = VarTable::new();
vars.enter(NodeId(0));
vars.insert("foo").unwrap();
assert_eq!(vars.resolve("foo").unwrap(), VarId(NodeId(0), 0));
assert!(!vars.is_visible(VarId(NodeId(0), 1)));
vars.insert("bar").unwrap();
assert!(vars.is_visible(VarId(NodeId(0), 1)));
assert_eq!(vars.resolve("bar").unwrap(), VarId(NodeId(0), 1));
vars.enter(NodeId(1));
assert!(vars.resolve("foo").is_err());
assert!(!vars.is_visible(VarId(NodeId(0), 0)));
vars.exit();
assert_eq!(vars.resolve("foo").unwrap(), VarId(NodeId(0), 0));
assert!(vars.is_visible(VarId(NodeId(0), 0)));

Implementations§

Source§

impl<'a> VarTable<'a>

Source

pub fn new() -> Self

Create a new empty variable table.

Source

pub fn enter(&mut self, node: NodeId)

Enter a new scope for the given node.

Source

pub fn exit(&mut self)

Exit a previously entered scope.

§Panics

Panics if there are no open scopes.

Source

pub fn resolve(&self, name: &'a str) -> Result<VarId, UnknownVarError<'a>>

Resolve a variable name to a node and variable index.

§Errors

Returns an error if the variable is not defined in the current scope.

§Panics

Panics if there are no open scopes.

Source

pub fn is_visible(&self, var: VarId) -> bool

Check if a variable is visible in the current scope.

§Panics

Panics if there are no open scopes.

Source

pub fn insert(&mut self, name: &'a str) -> Result<VarId, DuplicateVarError<'a>>

Insert a new variable into the current scope.

§Errors

Returns an error if the variable is already defined in the current scope.

§Panics

Panics if there are no open scopes.

Source

pub fn clear(&mut self)

Reset the variable table to an empty state while preserving the allocations.

Trait Implementations§

Source§

impl<'a> Clone for VarTable<'a>

Source§

fn clone(&self) -> VarTable<'a>

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Debug for VarTable<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'a> Default for VarTable<'a>

Source§

fn default() -> VarTable<'a>

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for VarTable<'a>

§

impl<'a> RefUnwindSafe for VarTable<'a>

§

impl<'a> Send for VarTable<'a>

§

impl<'a> Sync for VarTable<'a>

§

impl<'a> Unpin for VarTable<'a>

§

impl<'a> UnwindSafe for VarTable<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<'a, S, T> View<'a, &S> for T
where T: View<'a, S>, S: Copy,

Source§

fn view(module: &'a Module<'a>, id: &S) -> Option<T>

Attempt to interpret a subpart of a module as this type.