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

State of inference.

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 new_type_var(&mut self, stable_ptr: SyntaxStablePtrId) -> TypeId

Allocated a new TypeVar for an unknown type that needs to be inferred,

source

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

Allocated a new ImplVar for an unknown type that needs to be inferred,

source

pub fn get_candidates(&self, var: &ImplVar) -> Option<Vec<UninferredImpl>>

Returns the candidates for the given ImplVar.

source

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

Relaxes all the constraints until stable. Retrieves the first variable that is still not inferred, or None, if everything is inferred.

source

pub fn n_variables(&self) -> usize

Returns the number of variables allocated for current inference. Useful for deciding if new variables were introduced.

source

pub 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

pub 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

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

Conforms a generics arg. See conform_ty().

source

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

Conforms an impl. See conform_ty().

source

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

Conforms generics traits. See conform_ty().

source

pub 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

pub fn can_infer_generics( &self, generic_params: &[GenericParam], generic_args: &[GenericArgumentId], expected_generic_args: &[GenericArgumentId], lookup_context: &ImplLookupContext, stable_ptr: SyntaxStablePtrId ) -> bool

Determines if an assignment to generic_params can be chosen s.t. generic_args will be substituted to expected_generic_args.

source

pub fn can_infer_impl( &self, uninferred_impl: UninferredImpl, concrete_trait_id: ConcreteTraitId, lookup_context: &ImplLookupContext, stable_ptr: SyntaxStablePtrId ) -> Maybe<bool>

Check if it possible to infer an impl to provide a concrete trait. See infer_impl.

source

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

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

source

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

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

source

pub fn infer_generic_assignment( &mut self, generic_params: &[GenericParam], generic_args: &[GenericArgumentId], expected_generic_args: &[GenericArgumentId], lookup_context: &ImplLookupContext, stable_ptr: 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

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

Infers all generic_arguments given the parameters.

source

pub fn infer_concrete_trait_by_self( &mut self, trait_function: TraitFunctionId, self_ty: TypeId, lookup_context: &ImplLookupContext, stable_ptr: 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

pub fn infer_generic_arg( &mut self, param: &GenericParam, lookup_context: ImplLookupContext, stable_ptr: 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

pub fn infer_trait_function( &mut self, concrete_trait_function: ConcreteTraitGenericFunctionId, lookup_context: &ImplLookupContext, stable_ptr: 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

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

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

source

pub fn infer_trait_generic_function( &mut self, trait_function: ConcreteTraitGenericFunctionId, lookup_context: &ImplLookupContext, stable_ptr: 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

pub fn try_to_resume_impl_var(&mut self, var: ImplVar) -> InferenceResult<()>

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 + 'a)> for Inference<'a>

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

source§

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

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, 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, 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