Skip to main content

L2Context

Struct L2Context 

Source
pub struct L2Context {
    pub project: PathBuf,
    pub language: Language,
    pub changed_files: Vec<PathBuf>,
    pub function_diff: FunctionDiff,
    pub baseline_contents: HashMap<PathBuf, String>,
    pub current_contents: HashMap<PathBuf, String>,
    pub ast_changes: HashMap<PathBuf, Vec<ASTChange>>,
    pub is_first_run: bool,
    pub base_ref: String,
    /* private fields */
}
Expand description

Shared context for all L2 analysis engines.

Carries the project root, detected language, lists of changed/inserted/deleted functions, and the full file contents for both revisions. Includes lazy-initialized DashMap caches for per-function CFG, DFG, SSA, and contracts data, plus OnceLock-backed project-level call graph and change impact report.

The daemon client routes IR queries through the daemon’s QueryCache when available, falling back to on-the-fly construction via the local caches.

Fields§

§project: PathBuf

Absolute path to the project root.

§language: Language

Detected (or user-specified) programming language.

§changed_files: Vec<PathBuf>

Files that have changes between baseline and current.

§function_diff: FunctionDiff

Function-level diff between baseline and current revisions.

§baseline_contents: HashMap<PathBuf, String>

Full file contents for the baseline revision, keyed by path.

§current_contents: HashMap<PathBuf, String>

Full file contents for the current revision, keyed by path.

§ast_changes: HashMap<PathBuf, Vec<ASTChange>>

AST-level changes per file from the diff phase.

Maps each changed file to its list of ASTChange entries (Insert, Update, Delete). Used by DeltaEngine for finding extractors that need node-level diff data (e.g., param-renamed, signature-regression).

§is_first_run: bool

Whether this is the first run (no prior .bugbot/state.db).

When true, delta engines that require prior state (guard-removed, contract-regression) should suppress their findings because there is no baseline to compare against (PM-34 baseline policy).

§base_ref: String

Git base reference for baseline comparison (e.g. “HEAD”, “main”). Used by flow engines to create baseline worktrees for project-wide diffing.

Implementations§

Source§

impl L2Context

Source

pub fn new( project: PathBuf, language: Language, changed_files: Vec<PathBuf>, function_diff: FunctionDiff, baseline_contents: HashMap<PathBuf, String>, current_contents: HashMap<PathBuf, String>, ast_changes: HashMap<PathBuf, Vec<ASTChange>>, ) -> Self

Create a new L2Context with the provided data.

All cache fields (CFG, DFG, SSA, contracts, call graph, change impact) are initialized empty and populated lazily on first access. The daemon client defaults to NoDaemon (local-only computation).

Source

pub fn with_first_run(self, is_first_run: bool) -> Self

Set whether this context represents a first-run analysis.

When is_first_run is true, delta engines that require prior state (guard-removed, contract-regression) suppress their findings because there is no baseline to compare against (PM-34 baseline policy).

Source

pub fn with_base_ref(self, base_ref: String) -> Self

Set the git base reference for baseline comparison.

Used by flow engines (e.g. TldrDifferentialEngine) to create baseline worktrees for project-wide diffing of call graphs, dependencies, coupling, and cohesion.

Source

pub fn with_daemon(self, daemon: Box<dyn DaemonClient>) -> Self

Attach a daemon client to this context.

When the daemon client reports is_available() == true, IR cache methods (cfg_for, dfg_for, ssa_for, call_graph) will check the daemon first before falling back to local computation. The daemon is also notified of changed_files for cache invalidation.

Source

pub fn daemon_available(&self) -> bool

Check whether a daemon is available for this context.

Source

pub fn daemon(&self) -> &dyn DaemonClient

Get a reference to the daemon client.

Source

pub fn changed_functions(&self) -> &[FunctionChange]

Convenience accessor: functions whose bodies changed between revisions.

Source

pub fn inserted_functions(&self) -> &[InsertedFunction]

Convenience accessor: functions present in current but not in baseline.

Source

pub fn deleted_functions(&self) -> &[DeletedFunction]

Convenience accessor: functions present in baseline but not in current.

Source

pub fn cfg_for( &self, file_contents: &str, function_id: &FunctionId, language: Language, ) -> Result<Ref<'_, FunctionId, CfgInfo>>

Get or build the CFG for a function.

Checks the local cache first, then queries the daemon if available. On miss, builds via ir::build_cfg_for_function() and stores the result.

Source

pub fn dfg_for( &self, file_contents: &str, function_id: &FunctionId, language: Language, ) -> Result<Ref<'_, FunctionId, DfgInfo>>

Get or build the DFG for a function.

Checks the local cache first, then queries the daemon if available. On miss, builds via ir::build_dfg_for_function() and stores the result.

Source

pub fn ssa_for( &self, file_contents: &str, function_id: &FunctionId, language: Language, ) -> Result<Ref<'_, FunctionId, SsaFunction>>

Get or build the SSA for a function.

Checks the local cache first, then queries the daemon if available. On miss, builds via ir::build_ssa_for_function() and stores the result.

Source

pub fn contracts_for( &self, function_id: &FunctionId, version: ContractVersion, build_fn: impl FnOnce() -> Result<ContractsReport>, ) -> Result<Ref<'_, (FunctionId, ContractVersion), ContractsReport>>

Get or insert a contracts report for a (function, version) pair.

Checks the cache first; on miss, calls build_fn to produce the report and stores it.

Source

pub fn call_graph(&self) -> Option<&ProjectCallGraph>

Get the cached call graph, if available.

Checks the local OnceLock cache first. If empty and a daemon is available, queries the daemon for a cached call graph and stores it locally for subsequent accesses.

Source

pub fn set_call_graph( &self, cg: ProjectCallGraph, ) -> Result<(), ProjectCallGraph>

Set the call graph (can only be set once).

Source

pub fn change_impact(&self) -> Option<&ChangeImpactReport>

Get the cached change impact report, if available.

Source

pub fn set_change_impact( &self, report: ChangeImpactReport, ) -> Result<(), Box<ChangeImpactReport>>

Set the change impact report (can only be set once).

Returns Err with the boxed report if the value was already set.

Auto Trait Implementations§

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> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. 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> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. 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.