pub struct RefinementContext<'a> { /* private fields */ }Expand description
Tracks refinement type constraints across scopes for mutation enforcement.
When a variable with a refinement type is defined, its constraint is registered
in the current scope. When that variable is mutated via Set, the assertion is
re-emitted to ensure the invariant is preserved.
§Scope Management
The context maintains a stack of scopes to handle nested blocks:
┌─────────────────────────────┐
│ Global Scope │ ← x: { it > 0 }
│ ┌──────────────────────┐ │
│ │ Zone Scope │ │ ← y: { it < 100 }
│ │ ┌────────────────┐ │ │
│ │ │ If Block Scope │ │ │ ← z: { it != 0 }
│ │ └────────────────┘ │ │
│ └──────────────────────┘ │
└─────────────────────────────┘§Variable Type Tracking
The context also tracks variable types for capability resolution. This allows
statements like Check that user can publish the document to resolve “the document”
to a variable named doc of type Document.
Implementations§
Source§impl<'a> RefinementContext<'a>
impl<'a> RefinementContext<'a>
pub fn new() -> Self
Sourcepub fn from_type_env(type_env: &TypeEnv) -> Self
pub fn from_type_env(type_env: &TypeEnv) -> Self
Create a RefinementContext seeded from a TypeEnv.
Sourcepub fn set_oracle(&mut self, oracle: Rc<OracleFacts>)
pub fn set_oracle(&mut self, oracle: Rc<OracleFacts>)
Attach the oracle fact table for borrow-hoist distinctness queries.
Sourcepub fn oracle(&self) -> Option<&OracleFacts>
pub fn oracle(&self) -> Option<&OracleFacts>
The attached oracle facts, if any.
Sourcepub fn set_de_rc_vars(&mut self, vars: HashSet<Symbol>)
pub fn set_de_rc_vars(&mut self, vars: HashSet<Symbol>)
Set the de-Rc’d Seq variables (emitted as plain Vec<T>).
Sourcepub fn set_returns_vec(&mut self, v: bool)
pub fn set_returns_vec(&mut self, v: bool)
Phase 4: mark that the current function returns an owned Vec<T>.
Sourcepub fn set_escaping_vars(&mut self, vars: HashSet<Symbol>)
pub fn set_escaping_vars(&mut self, vars: HashSet<Symbol>)
Set the escaping vars for local Vec optimization.
Sourcepub fn var_escapes(&self, sym: &Symbol) -> bool
pub fn var_escapes(&self, sym: &Symbol) -> bool
Check if a variable escapes (and thus must remain LogosSeq).
Sourcepub fn register_fn_return(&mut self, fn_sym: Symbol, return_type: String)
pub fn register_fn_return(&mut self, fn_sym: Symbol, return_type: String)
Register a function’s return type.
Sourcepub fn get_fn_return(&self, fn_sym: &Symbol) -> Option<&String>
pub fn get_fn_return(&self, fn_sym: &Symbol) -> Option<&String>
Get a function’s return type.
Sourcepub fn set_live_vars_after(&mut self, live: HashSet<Symbol>)
pub fn set_live_vars_after(&mut self, live: HashSet<Symbol>)
Set the live-after set for the next statement about to be generated.
Must be called before each top-level codegen_stmt call in a function body.
codegen_stmt will consume this (clearing it to None) so recursive nested calls
conservatively clone.
Sourcepub fn take_live_vars_after(&mut self) -> Option<HashSet<Symbol>>
pub fn take_live_vars_after(&mut self) -> Option<HashSet<Symbol>>
Take (and clear) the live-after set. Called once at the start of codegen_stmt.
Returns None when no liveness information was provided (conservative path).
Auto Trait Implementations§
impl<'a> Freeze for RefinementContext<'a>
impl<'a> RefUnwindSafe for RefinementContext<'a>
impl<'a> !Send for RefinementContext<'a>
impl<'a> !Sync for RefinementContext<'a>
impl<'a> Unpin for RefinementContext<'a>
impl<'a> UnsafeUnpin for RefinementContext<'a>
impl<'a> UnwindSafe for RefinementContext<'a>
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<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.