#[repr(C)]pub struct PartialPath {
pub start_node: Handle<Node>,
pub end_node: Handle<Node>,
pub symbol_stack_precondition: PartialSymbolStack,
pub symbol_stack_postcondition: PartialSymbolStack,
pub scope_stack_precondition: PartialScopeStack,
pub scope_stack_postcondition: PartialScopeStack,
pub edges: PartialPathEdgeList,
}
Expand description
A portion of a name-binding path.
Partial paths can be computed incrementally, in which case all of the edges in the partial path belong to a single file. At query time, we can efficiently concatenate partial paths to yield a name-binding path.
Paths describe the contents of the symbol stack and scope stack at the end of the path. Partial paths, on the other hand, have preconditions and postconditions for each stack. The precondition describes what the stack must look like for us to be able to concatenate this partial path onto the end of a path. The postcondition describes what the resulting stack looks like after doing so.
The preconditions can contain scope stack variables, which describe parts of the scope stack (or parts of a scope symbol’s attached scope list) whose contents we don’t care about. The postconditions can also refer to those variables, and describe how those variable parts of the input scope stacks are carried through unmodified into the resulting scope stack.
Fields§
§start_node: Handle<Node>
§end_node: Handle<Node>
§symbol_stack_precondition: PartialSymbolStack
§symbol_stack_postcondition: PartialSymbolStack
§scope_stack_precondition: PartialScopeStack
§scope_stack_postcondition: PartialScopeStack
§edges: PartialPathEdgeList
Implementations§
Source§impl PartialPath
impl PartialPath
Sourcepub fn from_node(
graph: &StackGraph,
partials: &mut PartialPaths,
node: Handle<Node>,
) -> PartialPath
pub fn from_node( graph: &StackGraph, partials: &mut PartialPaths, node: Handle<Node>, ) -> PartialPath
Creates a new empty partial path starting at a stack graph node.
Sourcepub fn shadows(&self, partials: &mut PartialPaths, other: &PartialPath) -> bool
pub fn shadows(&self, partials: &mut PartialPaths, other: &PartialPath) -> bool
Returns whether one path shadows another. Note that shadowing is not commutative — if path A shadows path B, the reverse is not true.
pub fn equals(&self, partials: &mut PartialPaths, other: &PartialPath) -> bool
pub fn cmp( &self, graph: &StackGraph, partials: &mut PartialPaths, other: &PartialPath, ) -> Ordering
Sourcepub fn starts_at_reference(&self, graph: &StackGraph) -> bool
pub fn starts_at_reference(&self, graph: &StackGraph) -> bool
Returns whether a partial path represents the start of a name binding from a reference to a definition.
Sourcepub fn ends_at_definition(&self, graph: &StackGraph) -> bool
pub fn ends_at_definition(&self, graph: &StackGraph) -> bool
Returns whether a partial path represents the end of a name binding from a reference to a definition.
Sourcepub fn is_complete(&self, graph: &StackGraph) -> bool
pub fn is_complete(&self, graph: &StackGraph) -> bool
A complete partial path represents a full name binding that resolves a reference to a definition.
pub fn starts_at_endpoint(&self, graph: &StackGraph) -> bool
pub fn ends_at_endpoint(&self, graph: &StackGraph) -> bool
pub fn ends_in_jump(&self, graph: &StackGraph) -> bool
Sourcepub fn is_cyclic(
&self,
graph: &StackGraph,
partials: &mut PartialPaths,
) -> Option<Cyclicity>
pub fn is_cyclic( &self, graph: &StackGraph, partials: &mut PartialPaths, ) -> Option<Cyclicity>
Returns whether a partial path is cyclic—that is, it starts and ends at the same node, and its postcondition is compatible with its precondition. If the path is cyclic, a tuple is returned indicating whether cycle requires strengthening the pre- or postcondition.
Sourcepub fn ensure_both_directions(&mut self, partials: &mut PartialPaths)
pub fn ensure_both_directions(&mut self, partials: &mut PartialPaths)
Ensures that the content of this partial path is available in both forwards and backwards directions.
Sourcepub fn ensure_forwards(&mut self, partials: &mut PartialPaths)
pub fn ensure_forwards(&mut self, partials: &mut PartialPaths)
Ensures that the content of this partial path is in forwards direction.
Sourcepub fn largest_symbol_stack_variable(&self) -> u32
pub fn largest_symbol_stack_variable(&self) -> u32
Returns the largest value of any symbol stack variable in this partial path.
Sourcepub fn largest_scope_stack_variable(&self, partials: &PartialPaths) -> u32
pub fn largest_scope_stack_variable(&self, partials: &PartialPaths) -> u32
Returns the largest value of any scope stack variable in this partial path.
Sourcepub fn fresh_scope_stack_variable(
&self,
partials: &PartialPaths,
) -> ScopeStackVariable
pub fn fresh_scope_stack_variable( &self, partials: &PartialPaths, ) -> ScopeStackVariable
Returns a fresh scope stack variable that is not already used anywhere in this partial path.
pub fn display<'a>( &'a self, graph: &'a StackGraph, partials: &'a mut PartialPaths, ) -> impl Display + 'a
Source§impl PartialPath
impl PartialPath
Sourcepub fn ensure_no_overlapping_variables(
&mut self,
partials: &mut PartialPaths,
other: &PartialPath,
)
pub fn ensure_no_overlapping_variables( &mut self, partials: &mut PartialPaths, other: &PartialPath, )
Modifies this partial path so that it has no symbol or scope stack variables in common with another partial path.
Sourcepub fn eliminate_precondition_stack_variables(
&mut self,
partials: &mut PartialPaths,
)
pub fn eliminate_precondition_stack_variables( &mut self, partials: &mut PartialPaths, )
Replaces stack variables in the precondition with empty stacks.
Sourcepub fn append(
&mut self,
graph: &StackGraph,
partials: &mut PartialPaths,
edge: Edge,
) -> Result<(), PathResolutionError>
pub fn append( &mut self, graph: &StackGraph, partials: &mut PartialPaths, edge: Edge, ) -> Result<(), PathResolutionError>
Attempts to append an edge to the end of a partial path. If the edge is not a valid extension of this partial path, we return an error describing why.
Sourcepub fn resolve_from_postcondition(
&mut self,
graph: &StackGraph,
partials: &mut PartialPaths,
) -> Result<(), PathResolutionError>
pub fn resolve_from_postcondition( &mut self, graph: &StackGraph, partials: &mut PartialPaths, ) -> Result<(), PathResolutionError>
Attempts to resolve any jump to scope node at the end of a partial path from the postcondition scope stack. If the partial path does not end in a jump to scope node, we do nothing. If it does, and we cannot resolve it, then we return an error describing why.
Sourcepub fn resolve_to_node(
&mut self,
graph: &StackGraph,
partials: &mut PartialPaths,
node: Handle<Node>,
) -> Result<(), PathResolutionError>
pub fn resolve_to_node( &mut self, graph: &StackGraph, partials: &mut PartialPaths, node: Handle<Node>, ) -> Result<(), PathResolutionError>
Resolve any jump to scope node at the end of a partial path to the given node, updating the precondition to include the given node. If the partial path does not end in a jump to scope node, we do nothing. If it does, and we cannot resolve it, then we return an error describing why.
Source§impl PartialPath
impl PartialPath
Sourcepub fn concatenate(
&mut self,
graph: &StackGraph,
partials: &mut PartialPaths,
rhs: &PartialPath,
) -> Result<(), PathResolutionError>
pub fn concatenate( &mut self, graph: &StackGraph, partials: &mut PartialPaths, rhs: &PartialPath, ) -> Result<(), PathResolutionError>
Attempts to append a partial path to this one. If the postcondition of the “left” partial path is not compatible with the precondition of the “right” path, we return an error describing why.
If the left- and right-hand partial paths have any symbol or scope stack variables in common, then we ensure that the variables bind to the same values on both sides. It’s your responsibility to update the two partial paths so that they have no variables in common, if that’s needed for your use case.
Trait Implementations§
Source§impl Appendable for PartialPath
impl Appendable for PartialPath
Source§fn append_to(
&self,
graph: &StackGraph,
partials: &mut PartialPaths,
path: &mut PartialPath,
) -> Result<(), PathResolutionError>
fn append_to( &self, graph: &StackGraph, partials: &mut PartialPaths, path: &mut PartialPath, ) -> Result<(), PathResolutionError>
Source§fn start_node(&self) -> Handle<Node>
fn start_node(&self) -> Handle<Node>
Source§fn display<'a>(
&'a self,
graph: &'a StackGraph,
partials: &'a mut PartialPaths,
) -> Box<dyn Display + 'a>
fn display<'a>( &'a self, graph: &'a StackGraph, partials: &'a mut PartialPaths, ) -> Box<dyn Display + 'a>
Source§impl Clone for PartialPath
impl Clone for PartialPath
Source§fn clone(&self) -> PartialPath
fn clone(&self) -> PartialPath
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl ForwardCandidates<Handle<PartialPath>, PartialPath, Database, CancellationError> for DatabaseCandidates<'_>
impl ForwardCandidates<Handle<PartialPath>, PartialPath, Database, CancellationError> for DatabaseCandidates<'_>
Source§fn get_forward_candidates<R>(&mut self, path: &PartialPath, result: &mut R)
fn get_forward_candidates<R>(&mut self, path: &PartialPath, result: &mut R)
Source§fn get_joining_candidate_degree(&self, path: &PartialPath) -> Degree
fn get_joining_candidate_degree(&self, path: &PartialPath) -> Degree
Source§fn get_graph_partials_and_db(
&mut self,
) -> (&StackGraph, &mut PartialPaths, &Database)
fn get_graph_partials_and_db( &mut self, ) -> (&StackGraph, &mut PartialPaths, &Database)
Source§fn load_forward_candidates(
&mut self,
_path: &PartialPath,
_cancellation_flag: &dyn CancellationFlag,
) -> Result<(), Err>
fn load_forward_candidates( &mut self, _path: &PartialPath, _cancellation_flag: &dyn CancellationFlag, ) -> Result<(), Err>
get_forward_candidates
] to allow lazy-loading implementations.Source§impl ForwardCandidates<Handle<PartialPath>, PartialPath, Database, StorageError> for SQLiteReader
impl ForwardCandidates<Handle<PartialPath>, PartialPath, Database, StorageError> for SQLiteReader
Source§fn load_forward_candidates(
&mut self,
path: &PartialPath,
cancellation_flag: &dyn CancellationFlag,
) -> Result<(), StorageError>
fn load_forward_candidates( &mut self, path: &PartialPath, cancellation_flag: &dyn CancellationFlag, ) -> Result<(), StorageError>
get_forward_candidates
] to allow lazy-loading implementations.Source§fn get_forward_candidates<R>(&mut self, path: &PartialPath, result: &mut R)
fn get_forward_candidates<R>(&mut self, path: &PartialPath, result: &mut R)
Source§fn get_joining_candidate_degree(&self, path: &PartialPath) -> Degree
fn get_joining_candidate_degree(&self, path: &PartialPath) -> Degree
Source§fn get_graph_partials_and_db(
&mut self,
) -> (&StackGraph, &mut PartialPaths, &Database)
fn get_graph_partials_and_db( &mut self, ) -> (&StackGraph, &mut PartialPaths, &Database)
Source§impl Into<PartialPath> for sg_partial_path
impl Into<PartialPath> for sg_partial_path
Source§fn into(self) -> PartialPath
fn into(self) -> PartialPath
Source§impl ToAppendable<Handle<PartialPath>, PartialPath> for Database
impl ToAppendable<Handle<PartialPath>, PartialPath> for Database
fn get_appendable<'a>( &'a self, handle: &'a Handle<PartialPath>, ) -> &'a PartialPath
Auto Trait Implementations§
impl Freeze for PartialPath
impl !RefUnwindSafe for PartialPath
impl Send for PartialPath
impl Sync for PartialPath
impl Unpin for PartialPath
impl UnwindSafe for PartialPath
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.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.