pub struct Inference<'db> {
    pub data: &'db mut InferenceData,
    /* private fields */
}
Expand description

State of inference. A system of inference constraints.

Fields§

§data: &'db mut InferenceData

Implementations§

source§

impl<'db> Inference<'db>

source

pub fn with_data( db: &'db dyn SemanticGroup, data: &'db mut InferenceData ) -> Self

Creates a new Inference instance with the given InferenceData.

source

pub fn clone_data(&self) -> InferenceData

source

pub fn impl_assignment(&self, var_id: LocalImplVarId) -> Option<ImplId>

Getter for an impl var assignment.

source

pub fn new_type_var(&mut self, stable_ptr: Option<SyntaxStablePtrId>) -> TypeId

Allocates a new TypeVar for an unknown type that needs to be inferred. Returns a wrapping TypeId.

source

pub fn new_type_var_raw( &mut self, stable_ptr: Option<SyntaxStablePtrId> ) -> TypeVar

Allocates a new TypeVar for an unknown type that needs to be inferred. Returns the variable id.

source

pub fn new_impl_var( &mut self, concrete_trait_id: ConcreteTraitId, stable_ptr: Option<SyntaxStablePtrId>, lookup_context: ImplLookupContext ) -> InferenceResult<ImplId>

Allocates a new ImplVar for an unknown type that needs to be inferred. Returns a wrapping ImplId.

source

pub fn solve(&mut self) -> InferenceResult<()>

Solves the inference system. After a successful solve, there are no more pending impl inferences.

source

pub fn solution_set(&mut self) -> InferenceResult<SolutionSet<()>>

Returns the solution set status for the inference: Whether there is a unique solution, multiple solutions, no solutions or an error.

source

pub fn finalize( &mut self ) -> Option<(Option<SyntaxStablePtrId>, InferenceError)>

Finalizes an inference by inferring uninferred numeric literals as felt252.

source

pub fn first_undetermined_variable( &mut self ) -> Option<(InferenceVar, InferenceError)>

Retrieves the first variable that is still not inferred, or None, if everything is inferred.

source

pub fn trait_solution_set( &mut self, concrete_trait_id: ConcreteTraitId, lookup_context: ImplLookupContext ) -> InferenceResult<SolutionSet<(CanonicalImpl, CanonicalMapping)>>

Computes the solution set for an trait with a recursive query.

Methods from Deref<Target = InferenceData>§

source

pub fn inference<'db, 'b: 'db>( &'db mut self, db: &'b dyn SemanticGroup ) -> Inference<'db>

Trait Implementations§

source§

impl<'db> Debug for Inference<'db>

source§

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

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

impl Deref for Inference<'_>

§

type Target = InferenceData

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl DerefMut for Inference<'_>

source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
source§

impl<'a> HasDb<&'a dyn SemanticGroup> for Inference<'a>

source§

fn get_db(&self) -> &'a dyn SemanticGroup

source§

impl<'db> InferenceConform for Inference<'db>

source§

fn conform_ty( &mut self, ty0: TypeId, ty1: TypeId ) -> Result<TypeId, InferenceError>

Conforms ty0 to ty1. Should be called when ty0 should be coerced to ty1. Not symmetric. Returns the reduced type for ty0, or an error if the type is no coercible.

source§

fn conform_ty_ex( &mut self, ty0: TypeId, ty1: TypeId, ty0_is_self: bool ) -> Result<(TypeId, usize), InferenceError>

Same as conform_ty but supports adding snapshots to ty0 if ty0_is_self is true. Returns the reduced type for ty0 and the number of snapshots that needs to be added for the types to conform.

source§

fn conform_generic_args( &mut self, gargs0: &[GenericArgumentId], gargs1: &[GenericArgumentId] ) -> Result<Vec<GenericArgumentId>, InferenceError>

Conforms generics args. See conform_ty().

source§

fn conform_generic_arg( &mut self, garg0: GenericArgumentId, garg1: GenericArgumentId ) -> Result<GenericArgumentId, InferenceError>

Conforms a generics arg. See conform_ty().

source§

fn conform_impl( &mut self, impl0: ImplId, impl1: ImplId ) -> InferenceResult<ImplId>

Conforms an impl. See conform_ty().

source§

fn conform_traits( &mut self, trt0: ConcreteTraitId, trt1: ConcreteTraitId ) -> Result<ConcreteTraitId, InferenceError>

Conforms generics traits. See conform_ty().

source§

fn ty_contains_var( &mut self, ty: TypeId, var: InferenceVar ) -> InferenceResult<bool>

Checks if a type tree contains a certain InferenceVar somewhere. Used to avoid inference cycles.

source§

fn generic_args_contain_var( &mut self, generic_args: &[GenericArgumentId], var: InferenceVar ) -> InferenceResult<bool>

Checks if a slice of generics arguments contain a certain InferenceVar somewhere. Used to avoid inference cycles.

source§

fn impl_contains_var( &mut self, impl_id: &ImplId, var: InferenceVar ) -> Result<bool, InferenceError>

Checks if an impl contains a certain InferenceVar somewhere. Used to avoid inference cycles.

source§

fn maybe_peel_snapshots( &mut self, ty0_is_self: bool, ty1: TypeId ) -> (usize, TypeLongId)

source§

impl<'db> InferenceEmbeddings for Inference<'db>

source§

fn infer_impl( &mut self, uninferred_impl: UninferredImpl, concrete_trait_id: ConcreteTraitId, lookup_context: &ImplLookupContext, stable_ptr: Option<SyntaxStablePtrId> ) -> InferenceResult<ImplId>

Infers all the variables required to make an uninferred impl provide a concrete trait.

source§

fn infer_impl_def( &mut self, impl_def_id: ImplDefId, concrete_trait_id: ConcreteTraitId, lookup_context: &ImplLookupContext, stable_ptr: Option<SyntaxStablePtrId> ) -> InferenceResult<ImplId>

Infers all the variables required to make an impl (possibly with free generic params) provide a concrete trait.

source§

fn infer_impl_alias( &mut self, impl_alias_id: ImplAliasId, concrete_trait_id: ConcreteTraitId, lookup_context: &ImplLookupContext, stable_ptr: Option<SyntaxStablePtrId> ) -> InferenceResult<ImplId>

Infers all the variables required to make an impl alias (possibly with free generic params) provide a concrete trait.

source§

fn infer_generic_assignment( &mut self, generic_params: &[GenericParam], generic_args: &[GenericArgumentId], expected_generic_args: &[GenericArgumentId], lookup_context: &ImplLookupContext, stable_ptr: Option<SyntaxStablePtrId> ) -> InferenceResult<Vec<GenericArgumentId>>

Chooses and assignment to generic_params s.t. generic_args will be substituted to expected_generic_args. Returns the generic_params assignment.

source§

fn infer_generic_args( &mut self, generic_params: &[GenericParam], lookup_context: &ImplLookupContext, stable_ptr: Option<SyntaxStablePtrId> ) -> InferenceResult<Vec<GenericArgumentId>>

Infers all generic_arguments given the parameters.

source§

fn infer_concrete_trait_by_self( &mut self, trait_function: TraitFunctionId, self_ty: TypeId, lookup_context: &ImplLookupContext, stable_ptr: Option<SyntaxStablePtrId> ) -> Option<(ConcreteTraitId, usize)>

Tries to infer a trait function as a method for self_ty. Supports snapshot snapshot coercions.

Returns the deduced type and the number of snapshots that need to be added to it.

source§

fn infer_generic_arg( &mut self, param: &GenericParam, lookup_context: ImplLookupContext, stable_ptr: Option<SyntaxStablePtrId> ) -> InferenceResult<GenericArgumentId>

Infers a generic argument to be passed as a generic paramter. Allocates a new inference variable of the correct kind, and wraps in a generic argument.

source§

fn infer_trait_function( &mut self, concrete_trait_function: ConcreteTraitGenericFunctionId, lookup_context: &ImplLookupContext, stable_ptr: Option<SyntaxStablePtrId> ) -> InferenceResult<FunctionId>

Infers the impl to be substituted instead of a trait for a given trait function, and the generic arguments to be passed to the function. Returns the resulting impl function.

source§

fn infer_generic_function( &mut self, generic_function: GenericFunctionId, lookup_context: &ImplLookupContext, stable_ptr: Option<SyntaxStablePtrId> ) -> InferenceResult<FunctionId>

Infers generic arguments to be passed to a generic function. Returns the resulting specialized function.

source§

fn infer_trait_generic_function( &mut self, trait_function: ConcreteTraitGenericFunctionId, lookup_context: &ImplLookupContext, stable_ptr: Option<SyntaxStablePtrId> ) -> InferenceResult<GenericFunctionId>

Infers the impl to be substituted instead of a trait for a given trait function. Returns the resulting impl generic function.

source§

impl<'a> SemanticRewriter<Ambiguity, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: Ambiguity) -> Result<Ambiguity, NoError>

source§

impl<'a> SemanticRewriter<ConcreteEnumId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteEnumLongId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteExternTypeId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteExternTypeLongId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteFunction, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteFunctionWithBody, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteFunctionWithBodyId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteImplId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteImplLongId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteStructId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteStructLongId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteTraitGenericFunctionId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteTraitGenericFunctionLongId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteTraitId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteTraitLongId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteTypeId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ConcreteVariant, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<Constant, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: Constant) -> Result<Constant, NoError>

source§

impl<'a> SemanticRewriter<ConstantId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<EnumId, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: EnumId) -> Result<EnumId, NoError>

source§

impl<'a> SemanticRewriter<Expr, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: Expr) -> Result<Expr, NoError>

source§

impl<'a> SemanticRewriter<ExprAssignment, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExprBlock, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: ExprBlock) -> Result<ExprBlock, NoError>

source§

impl<'a> SemanticRewriter<ExprConstant, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExprDesnap, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExprEnumVariantCtor, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExprFunctionCall, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExprFunctionCallArg, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExprIf, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: ExprIf) -> Result<ExprIf, NoError>

source§

impl<'a> SemanticRewriter<ExprLiteral, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExprLogicalOperator, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExprLoop, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: ExprLoop) -> Result<ExprLoop, NoError>

source§

impl<'a> SemanticRewriter<ExprMatch, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: ExprMatch) -> Result<ExprMatch, NoError>

source§

impl<'a> SemanticRewriter<ExprMemberAccess, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExprMissing, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExprPropagateError, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExprSnapshot, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExprStructCtor, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExprTuple, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: ExprTuple) -> Result<ExprTuple, NoError>

source§

impl<'a> SemanticRewriter<ExprVar, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: ExprVar) -> Result<ExprVar, NoError>

source§

impl<'a> SemanticRewriter<ExprVarMemberPath, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExternFunctionId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ExternTypeId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<FreeFunctionId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<FunctionId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<FunctionLongId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<GenericArgumentId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<GenericFunctionId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<GenericFunctionWithBodyId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<GenericParam, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<GenericParamConst, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<GenericParamId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<GenericParamImpl, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<GenericParamType, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<Id<Expr>, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: ExprId) -> Result<ExprId, NoError>

source§

impl<'a> SemanticRewriter<Id<Statement>, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ImplAliasId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ImplDefId, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: ImplDefId) -> Result<ImplDefId, NoError>

source§

impl<'a> SemanticRewriter<ImplFunctionId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ImplGenericFunctionId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ImplGenericFunctionWithBodyId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<ImplId, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: ImplId) -> Result<ImplId, NoError>

source§

impl<'a> SemanticRewriter<ImplVar, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: ImplVar) -> Result<ImplVar, NoError>

source§

impl<'a> SemanticRewriter<ImplVarId, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: ImplVarId) -> Result<ImplVarId, NoError>

source§

impl<'a> SemanticRewriter<LiteralId, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: LiteralId) -> Result<LiteralId, NoError>

source§

impl<'a> SemanticRewriter<LocalVarId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<LocalVariable, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<MatchArm, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: MatchArm) -> Result<MatchArm, NoError>

source§

impl<'a> SemanticRewriter<Member, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: Member) -> Result<Member, NoError>

source§

impl<'a> SemanticRewriter<MemberId, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: MemberId) -> Result<MemberId, NoError>

source§

impl<'a> SemanticRewriter<ParamId, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: ParamId) -> Result<ParamId, NoError>

source§

impl<'a> SemanticRewriter<Parameter, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: Parameter) -> Result<Parameter, NoError>

source§

impl<'a> SemanticRewriter<Pattern, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: Pattern) -> Result<Pattern, NoError>

source§

impl<'a> SemanticRewriter<PatternEnumVariant, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<PatternLiteral, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<PatternOtherwise, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<PatternStruct, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<PatternTuple, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<PatternVariable, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<Signature, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: Signature) -> Result<Signature, NoError>

source§

impl<'a> SemanticRewriter<Statement, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: Statement) -> Result<Statement, NoError>

source§

impl<'a> SemanticRewriter<StatementBreak, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<StatementContinue, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<StatementExpr, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<StatementLet, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<StatementReturn, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<StructId, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: StructId) -> Result<StructId, NoError>

source§

impl<'a> SemanticRewriter<TraitFunctionId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<TraitId, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: TraitId) -> Result<TraitId, NoError>

source§

impl<'a> SemanticRewriter<TypeId, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: TypeId) -> Result<TypeId, NoError>

source§

impl<'a> SemanticRewriter<TypeLongId, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<TypeVar, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: TypeVar) -> Result<TypeVar, NoError>

source§

impl<'a> SemanticRewriter<UninferredImpl, NoError> for Inference<'a>

source§

impl<'a> SemanticRewriter<VarId, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: VarId) -> Result<VarId, NoError>

source§

impl<'a> SemanticRewriter<VariantId, NoError> for Inference<'a>

source§

fn rewrite(&mut self, value: VariantId) -> Result<VariantId, NoError>

Auto Trait Implementations§

§

impl<'db> !RefUnwindSafe for Inference<'db>

§

impl<'db> !Send for Inference<'db>

§

impl<'db> !Sync for Inference<'db>

§

impl<'db> Unpin for Inference<'db>

§

impl<'db> !UnwindSafe for Inference<'db>

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<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>, E> for TRewriterwhere T: Clone, TRewriter: SemanticRewriter<T, E>,

source§

fn rewrite(&mut self, value: Box<T>) -> Result<Box<T>, 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>, E> for TRewriterwhere TRewriter: SemanticRewriter<T, E>,

source§

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

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