pub struct ImplicitPrecedence(_);
Expand description

Extra information about sorting of implicit arguments of the function.

In most of the user written code, the implicits are not stated explicitly, but instead are inferred by the compiler. The order on how these implicit arguments are laid out on Sierra level is unspecified though for the users. Currently, the compiler sorts them alphabetically by name for reproducibility, but it can equally just randomize the order on each compilation.

Some compilation targets tend to expect that particular functions accept particular implicit arguments at fixed positions. For example, the Starknet OS has such assumptions. By reading the implicit precedence information attached to functions, the compiler can now reliably generate compatible code.

To set, add the #[implicit_precedence(...)] attribute to function declaration. Only free or impl functions can have this information defined. For extern functions, the compiler raises an error. It is recommended to always create this attribute from compiler plugins, and not force users to write it manually.

Use ImplicitPrecedence::UNSPECIFIED to represent lack of information.

Implementations§

source§

impl ImplicitPrecedence

source

pub const UNSPECIFIED: Self = _

A precedence that does not actually prefer any implicit.

When applied to a sequence of implicits, they will just be reordered alphabetically.

source

pub fn apply(&self, implicits: &mut [TypeId], db: &dyn SemanticGroup)

Sort implicits according to this precedence: first the ones with precedence (according to it), then the others by their name.

Trait Implementations§

source§

impl Clone for ImplicitPrecedence

source§

fn clone(&self) -> ImplicitPrecedence

Returns a copy of the value. Read more
1.0.0 · source§

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

Performs copy-assignment from source. Read more
source§

impl Debug for ImplicitPrecedence

source§

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

Formats the value using the given formatter. Read more
source§

impl Default for ImplicitPrecedence

source§

fn default() -> ImplicitPrecedence

Returns the “default value” for a type. Read more
source§

impl FromIterator<TypeId> for ImplicitPrecedence

source§

fn from_iter<T: IntoIterator<Item = TypeId>>(iter: T) -> Self

Creates a value from an iterator. Read more
source§

impl PartialEq<ImplicitPrecedence> for ImplicitPrecedence

source§

fn eq(&self, other: &ImplicitPrecedence) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Eq for ImplicitPrecedence

source§

impl StructuralEq for ImplicitPrecedence

source§

impl StructuralPartialEq for ImplicitPrecedence

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<Q, K> Equivalent<K> for Qwhere Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere 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<T0, T1, E, TRewriter> SemanticRewriter<(T0, T1), E> for TRewriterwhere TRewriter: SemanticRewriter<T0, E> + SemanticRewriter<T1, E>,

source§

fn rewrite(&mut self, value: (T0, T1)) -> Result<(T0, T1), E>

source§

impl<T, E, TRewriter> SemanticRewriter<Box<T, Global>, E> for TRewriterwhere T: Clone, TRewriter: SemanticRewriter<T, E>,

source§

fn rewrite(&mut self, value: Box<T, Global>) -> Result<Box<T, Global>, E>

source§

impl<T, E, TRewriter> SemanticRewriter<Option<T>, E> for TRewriterwhere TRewriter: SemanticRewriter<T, E>,

source§

fn rewrite(&mut self, value: Option<T>) -> Result<Option<T>, E>

source§

impl<T, E, TRewriter, E2> SemanticRewriter<Result<T, E2>, E> for TRewriterwhere TRewriter: SemanticRewriter<T, E>,

source§

fn rewrite(&mut self, value: Result<T, E2>) -> Result<Result<T, E2>, E>

source§

impl<T, E, TRewriter> SemanticRewriter<Vec<T, Global>, E> for TRewriterwhere TRewriter: SemanticRewriter<T, E>,

source§

fn rewrite(&mut self, value: Vec<T, Global>) -> Result<Vec<T, Global>, E>

source§

impl<T> ToOwned for Twhere T: Clone,

§

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 Twhere U: Into<T>,

§

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 Twhere U: TryFrom<T>,

§

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<T> Upcast<T> for Twhere T: ?Sized,

source§

fn upcast(&self) -> &T

source§

impl<T> UpcastMut<T> for Twhere T: ?Sized,

source§

fn upcast_mut(&mut self) -> &mut T