Struct rusttyc::TypeChecker [−][src]
Expand description
The TypeChecker is the main interaction point for the type checking procedure.
The TypeChecker is the main interaction point for the type checking procedure. It provides functionality to obtain TcKeys, manage variables, impose constraints, and generate a type table.
Related Data Structures
- TcKey represent different entities during the type checking procedure such as variables or terms.
- TcVar represent variables in the external structure, e.g. in the AST that is type checked. A variable has exactly one associated key, even if it occurs several times in the external data structure. The type checker manages keys for variables.
Constraint
s represent dependencies between keys and types. They can only be created using TcKeys.- Variant is an external data type that constitutes a potentially unresolved type.
- TcErr is a wrapper for Variant::Err that contains additional information on what went wrong.
- TypeTable maps keys to Constructable::Type if Variant implements Constructable.
- PreliminaryTypeTable maps keys to Preliminary. This is only useful if Variant does not implement Constructable
Process
In the first step after creation, the TypeChecker generates keys and collects information. It may already resolve some constraints and reveal contradictions. This prompts it to return a negative result with a TcErr. When all information is collected, it resolves them and generates a type table that contains the least restrictive Variant type for each registered key.
Note:
The absence of errors does not entail that a constraint can be satisfied. Only the successful generation of a type table indicates that all constraints can be satisfied.
Example
See crate documentation
.
Implementations
impl<V: Variant> TypeChecker<V, NoVars>
[src]
impl<V: Variant> TypeChecker<V, NoVars>
[src]pub fn without_vars() -> VarlessTypeChecker<V>
[src]
pub fn without_vars() -> VarlessTypeChecker<V>
[src]Instantiates a new, empty type checker that does not require variables.
impl<V: Variant, Var: TcVar> TypeChecker<V, Var>
[src]
impl<V: Variant, Var: TcVar> TypeChecker<V, Var>
[src]pub fn new_term_key(&mut self) -> TcKey
[src]
pub fn new_term_key(&mut self) -> TcKey
[src]Generates a new key representing a term.
pub fn get_var_key(&mut self, var: &Var) -> TcKey
[src]
pub fn get_var_key(&mut self, var: &Var) -> TcKey
[src]Manages keys for variables. It checks if var
already has an associated key.
If so, it returns the key. Otherwise, it generates a new one.
pub fn get_child_key(
&mut self,
parent: TcKey,
nth: usize
) -> Result<TcKey, TcErr<V>>
[src]
pub fn get_child_key(
&mut self,
parent: TcKey,
nth: usize
) -> Result<TcKey, TcErr<V>>
[src]Provides a key to the nth
child of the type behind parent
.
This imposes the restriction that parent
resolves to a type that has at least an arity of nth
.
If this imposition immediately leads to a contradiction, a TcErr is returned.
Contradictions due to this constraint may only occur later when resolving further constraints.
Calling this function several times on a parent with the same nth
results in the same key.
pub fn lift_into(&mut self, variant: V, sub_types: Vec<TcKey>) -> TcKey
[src]
pub fn lift_into(&mut self, variant: V, sub_types: Vec<TcKey>) -> TcKey
[src]Lifts a collection of keys as children into a certain recursive variant.
pub fn lift_partially(
&mut self,
variant: V,
sub_types: Vec<Option<TcKey>>
) -> TcKey
[src]
pub fn lift_partially(
&mut self,
variant: V,
sub_types: Vec<Option<TcKey>>
) -> TcKey
[src]Lifts a collection of keys as subset of children into a certain recursive variant.
pub fn all_keys(&self) -> impl Iterator<Item = TcKey> + '_
[src]
pub fn all_keys(&self) -> impl Iterator<Item = TcKey> + '_
[src]Returns an iterator over all keys currently present in the type checking procedure.
pub fn type_check_preliminary(self) -> Result<PreliminaryTypeTable<V>, TcErr<V>>
[src]
pub fn type_check_preliminary(self) -> Result<PreliminaryTypeTable<V>, TcErr<V>>
[src]Finalizes the type check procedure without constructing a full type table. Refer to TypeChecker::type_check if Variant implements Constructable. Calling this function indicates that all relevant information was passed on to the type checker. It will attempt to resolve all constraints and return a type table mapping each registered key to its minimally constrained Variants. For recursive types, the respective Preliminary provides access to crate::TcKeys refering to their children. If any constrained caused a contradiction, it will return a TcErr containing information about it.
impl<V, Var: TcVar> TypeChecker<V, Var> where
V: Constructable,
[src]
impl<V, Var: TcVar> TypeChecker<V, Var> where
V: Constructable,
[src]pub fn type_check(self) -> Result<TypeTable<V>, TcErr<V>>
[src]
pub fn type_check(self) -> Result<TypeTable<V>, TcErr<V>>
[src]Finalizes the type check procedure. Calling this function indicates that all relevant information was passed on to the type checker. It will attempt to resolve all constraints and return a type table mapping each registered key to its minimally constrained, constructed type, i.e. Constructable::Type. Refer to TypeChecker::type_check_preliminary() if Variant does not implement Constructable. If any constrained caused a contradiction, it will return a TcErr containing information about it.
Trait Implementations
impl<V: Clone + Variant, Var: Clone + TcVar> Clone for TypeChecker<V, Var>
[src]
impl<V: Clone + Variant, Var: Clone + TcVar> Clone for TypeChecker<V, Var>
[src]fn clone(&self) -> TypeChecker<V, Var>
[src]
fn clone(&self) -> TypeChecker<V, Var>
[src]Returns a copy of the value. Read more
fn clone_from(&mut self, source: &Self)
1.0.0[src]
fn clone_from(&mut self, source: &Self)
1.0.0[src]Performs copy-assignment from source
. Read more
Auto Trait Implementations
impl<V, Var> RefUnwindSafe for TypeChecker<V, Var> where
V: RefUnwindSafe,
Var: RefUnwindSafe,
V: RefUnwindSafe,
Var: RefUnwindSafe,
impl<V, Var> Send for TypeChecker<V, Var> where
V: Send,
Var: Send,
V: Send,
Var: Send,
impl<V, Var> Sync for TypeChecker<V, Var> where
V: Sync,
Var: Sync,
V: Sync,
Var: Sync,
impl<V, Var> Unpin for TypeChecker<V, Var> where
V: Unpin,
Var: Unpin,
V: Unpin,
Var: Unpin,
impl<V, Var> UnwindSafe for TypeChecker<V, Var> where
V: UnwindSafe,
Var: UnwindSafe,
V: UnwindSafe,
Var: UnwindSafe,
Blanket Implementations
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]pub fn borrow_mut(&mut self) -> &mut T
[src]
pub fn borrow_mut(&mut self) -> &mut T
[src]Mutably borrows from an owned value. Read more
impl<T> ToOwned for T where
T: Clone,
[src]
impl<T> ToOwned for T where
T: Clone,
[src]type Owned = T
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn to_owned(&self) -> T
[src]Creates owned data from borrowed data, usually by cloning. Read more
pub fn clone_into(&self, target: &mut T)
[src]
pub fn clone_into(&self, target: &mut T)
[src]🔬 This is a nightly-only experimental API. (toowned_clone_into
)
recently added
Uses borrowed data to replace owned data, usually by cloning. Read more