Skip to main content

Session

Struct Session 

Source
pub struct Session {
    pub name: String,
    pub options: Box<Options>,
    pub source_manager: Arc<dyn SourceManager>,
    pub diagnostics: Arc<DiagnosticsHandler>,
    pub input: Option<InputFile>,
    pub output_files: OutputFiles,
    pub statistics: Statistics,
    /* private fields */
}
Expand description

This struct provides access to all of the metadata and configuration needed during a single compilation session.

Fields§

§name: String

The name of this session

§options: Box<Options>

Configuration for the current compiler session

§source_manager: Arc<dyn SourceManager>

The current source manager

§diagnostics: Arc<DiagnosticsHandler>

The current diagnostics handler

§input: Option<InputFile>

The inputs being compiled

§output_files: OutputFiles

The outputs to be produced by the compiler during compilation

§statistics: Statistics

Statistics gathered from the current compiler session

Implementations§

Source§

impl Session

Source

pub fn new( input: InputFile, options: Box<Options>, emitter: Option<Arc<dyn Emitter>>, source_manager: Arc<dyn SourceManager + Send + Sync>, ) -> Result<Self, Report>

Open a session compiling input under options.

§A project locator is read for its facts, not loaded as a project

A .toml input is a locator: it names the project to build rather than being something the compiler compiles. Three facts about that project are needed before this session exists, because this constructor is downstream of none of them:

All three come from ProjectManifest, which parses the manifest’s AST and reads exactly those three things out of it with miden_project’s own extractors. What it deliberately does not do is build a miden_project::Project: loading the project is prepare_project’s, in midenc-compile, and the package it loads is the one that gets assembled. A session that loaded its own would be loading the same manifest twice to produce a package nothing compiles.

Failing to read the manifest is not an error here. Which project a locator names, and whether it names one at all, is decided and reported downstream — where the locator is normalized anyway, and where a Cargo workspace root gets the diagnostic that belongs to it rather than a “no such file” for the miden-project.toml a workspace root does not have. So an unreadable manifest falls back to the same name derivation a source-file input uses, and leaves target_type and entrypoint alone.

Source

pub fn new_project( name: String, input: Option<InputFile>, options: Box<Options>, emitter: Option<Arc<dyn Emitter>>, source_manager: Arc<dyn SourceManager>, ) -> Self

Open a session named name, for a caller that already knows what it is building.

Session::new derives name from its input; this takes it. Both then do the same thing, and neither knows anything about the project being built beyond its name.

Source

pub fn get_flag(&self, name: &str) -> bool

Get the value of a custom flag with action FlagAction::SetTrue or FlagAction::SetFalse

Source

pub fn get_flag_count(&self, name: &str) -> usize

Get the count of a specific custom flag with action FlagAction::Count

Source

pub fn matches(&self) -> &ArgMatches

Get the remaining ArgMatches left after parsing the base session configuration

Source

pub fn name(&self) -> &str

The name of this session (used as the name of the project, output file, etc.)

Source

pub fn package_registry(&self) -> Result<Box<HybridPackageRegistry>, Report>

Get a new package registry instance for this session

Source

pub fn filesystem_package_cache_dir(&self) -> Result<Option<PathBuf>, Report>

Where compiled dependency packages of this build are published and looked for.

Ok(None) unless this session’s input is a project locator: a session compiling a standalone source file has no project to exchange packages for. When the calling process already exported MIDENC_PACKAGE_CACHE, that directory is adopted as-is and left in place — the caller owns its location and lifetime (this is how a contract build.rs keeps the packages readable after the compiler exits). Otherwise the directory is a per-build lease with a globally unique name under the session’s configured target directory (<target-dir>/packages), created on first access and deleted when the last clone of this session drops; see the package_lease module for both lifecycles. Anchoring at the target directory honors a caller-supplied --target-dir — a writable location for a read-only checkout, for example.

Both readers — this session’s package registry and the nested cargo builds a Rust project’s dependencies run through — must agree on the answer, which is why there is one derivation of it. Only the root compilation session derives the path. Nested dependency sessions receive the root value threaded through their build environment, rather than deriving paths from their own locators: a dependency with a private directory could not see its already-assembled transitive dependencies.

Session is Clone, and clones share the lease cell, so every clone observes the same directory and no clone can mint a second one. Errors when the directory cannot be created — fail closed, so the build stops here instead of failing later inside a macro expansion with a confusing missing-package diagnostic; the failure is memoized and re-reported on every access.

Derived from the input locator rather than from a loaded manifest, which is what Session::new no longer has. That is also a repair: the manifest path was previously taken from a package that fixup_cargo_target had rebuilt for every executable Cargo.toml input, and a rebuilt package has no manifest path — so an executable project silently got no filesystem cache at all, while a library project of the same shape got one.

Source

pub fn out_file(&self) -> OutputFile

Get the OutputFile to write the assembled MAST output to

Source

pub fn parse_only(&self) -> bool

Returns true if the compiler should exit after parsing the input

Source

pub fn analyze_only(&self) -> bool

Returns true if the compiler should exit after performing semantic analysis

Source

pub fn rewrite_only(&self) -> bool

Returns true if the compiler should exit after applying rewrites to the IR

Returns true if an OutputType that requires linking + assembly was requested

Source

pub fn should_codegen(&self) -> bool

Returns true if an OutputType that requires generating Miden Assembly was requested

Source

pub fn should_assemble(&self) -> bool

Returns true if an OutputType that requires assembling MAST was requested

Source

pub fn should_emit(&self, ty: OutputType) -> bool

Returns true if the given OutputType should be emitted as an output

Source

pub fn should_print_ir(&self, pass: &str) -> bool

Returns true if IR should be printed to stdout, after executing a pass named pass

Source

pub fn should_print_ir_before_stage(&self, stage: &str) -> bool

Returns true if IR should be printed to stdout, at the start of stage

Source

pub fn should_print_cfg(&self, pass: &str) -> bool

Returns true if CFG should be printed to stdout, after executing a pass named pass

Source

pub fn print(&self, ir: impl Emit, pass: &str) -> Result<()>

Print the given emittable IR to stdout, as produced by a pass with name pass

Source

pub fn emit_to(&self, ty: OutputType, name: Option<Symbol>) -> Option<PathBuf>

Get the path to emit the given OutputType to

Source

pub fn emit<E: Emit>(&self, mode: OutputMode, item: &E) -> Result<()>

Emit an item to stdout/file system depending on the current configuration

Source

pub fn output_path_for( &self, output_type: OutputType, name: Option<&str>, ) -> Option<OutputFile>

Given an OutputType and an optional name, return the output file path that would be written to.

Returns Some if the specified output type should be emitted, and None if it should not.

Trait Implementations§

Source§

impl Clone for Session

Source§

fn clone(&self) -> Session

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Session

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more