pub struct WasmContextState {
pub cache: PerBufferCache<ContextScopeCache>,
pub registry: Option<ContextSourceRegistryHandle>,
pub generation: Arc<AtomicU64>,
pub options: ContextOptions,
pub line_numbers: bool,
pub separator: Option<char>,
pub anchor_topline: bool,
pub enabled: bool,
/* private fields */
}Expand description
The Editor’s cohesive WASM-context wiring. Bundled into one field so the
boot struct literal grows by a single line. Every field defaults, so
Editor::default() test fixtures get an inert context seam.
Fields§
§cache: PerBufferCache<ContextScopeCache>Per-buffer scope cache the producer tasks write and the host reads.
registry: Option<ContextSourceRegistryHandle>The registered async context producers — a clone of the boot
ContextSourceRegistryHandle service the loader RCU-registers into.
None in Editor::default(); the refresh then no-ops.
generation: Arc<AtomicU64>Off-keystroke paint gate. A producer task bumps this on every cache write so a scope arrival with no keystroke in flight still repaints.
options: ContextOptionsTC.8a: the plugin’s context.* options, resolved once per refresh pump
rather than per pane per publish.
resolve_sticky_context_lines runs at cursor rate, once for every pane,
and ConfigRegistry reads take a Mutex — so reading six options there
would put six uncontended lock acquisitions on the keystroke path for
values that change only when the user runs :set or a plugin loads.
Both of those already wake this pump, so caching here costs nothing in
freshness.
The viewport fields are NOT cached: they are per-pane, and the resolver overwrites them from the pane it is resolving for.
line_numbers: boolTC.8: context.line-numbers — a PAINT option, not a resolution one, so
it rides beside Self::options rather than inside it
(resolve_context has no business knowing about gutters).
separator: Option<char>TC.12: context.separator — the glyph repeated as a rule beneath the
strip. None (the default) is no rule.
anchor_topline: boolTC.12: context.anchor == "topline".
The resolver anchors on the CURSOR by default. topline resolves
against the topline as of before this frame’s reservation, which is
what breaks the reserve→shrink→retop→reserve cycle the design fragment
describes; here that falls out for free, because the host passes the
scroll value it already holds and reservation happens later.
enabled: boolTC.5: context.enabled — the master switch :context-toggle flips.
Consulted on the RESOLVE path so turning the feature off empties the published list rather than skipping the publish: the reservation is computed from that length, so a skipped publish would leave the rows reserved and the text pushed down with nothing in the gap.
Implementations§
Source§impl WasmContextState
impl WasmContextState
Sourcepub fn with_registry(registry: ContextSourceRegistryHandle) -> Self
pub fn with_registry(registry: ContextSourceRegistryHandle) -> Self
Construct the context state wired to the boot producer registry — the
boot path. Editor::default() uses the Default impl (no registry).
Sourcepub fn scopes_for(&self, buffer: BufferId) -> Arc<ContextScopeCache> ⓘ
pub fn scopes_for(&self, buffer: BufferId) -> Arc<ContextScopeCache> ⓘ
The cached scopes for buffer, or an empty slice when none have landed.
The read the per-pane resolution does every publish.
Trait Implementations§
Source§impl Debug for WasmContextState
impl Debug for WasmContextState
Auto Trait Implementations§
impl !RefUnwindSafe for WasmContextState
impl !UnwindSafe for WasmContextState
impl Freeze for WasmContextState
impl Send for WasmContextState
impl Sync for WasmContextState
impl Unpin for WasmContextState
impl UnsafeUnpin for WasmContextState
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
§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.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> 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 more