]> git.proxmox.com Git - rustc.git/blame - vendor/chalk-solve/src/lib.rs
New upstream version 1.48.0~beta.8+dfsg1
[rustc.git] / vendor / chalk-solve / src / lib.rs
CommitLineData
f9f354fc
XL
1#![deny(rust_2018_idioms)]
2
3dfed10e 3use crate::display::sanitize_debug_name;
f035d41b 4use crate::rust_ir::*;
f9f354fc 5use chalk_ir::interner::Interner;
f035d41b 6
f9f354fc 7use chalk_ir::*;
f9f354fc
XL
8use std::fmt::Debug;
9use std::sync::Arc;
10
f9f354fc
XL
11pub mod clauses;
12pub mod coherence;
3dfed10e
XL
13pub mod coinductive_goal;
14pub mod display;
f9f354fc
XL
15pub mod ext;
16pub mod goal_builder;
3dfed10e 17pub mod infer;
f035d41b 18pub mod logging;
3dfed10e 19pub mod logging_db;
f035d41b 20pub mod rust_ir;
3dfed10e 21pub mod solve;
f9f354fc
XL
22pub mod split;
23pub mod wf;
24
3dfed10e
XL
25/// Trait representing access to a database of rust types.
26///
27/// # `*_name` methods
28///
29/// This trait has a number of `*_name` methods with default implementations.
30/// These are used in the implementation for [`LoggingRustIrDatabase`], so that
31/// when printing `.chalk` files equivalent to the data used, we can use real
32/// names.
33///
34/// The default implementations simply fall back to calling [`Interner`] debug
35/// methods, and printing `"UnknownN"` (where `N` is the demultiplexing integer)
36/// if those methods return `None`.
37///
38/// The [`display::sanitize_debug_name`] utility is used in the default
39/// implementations, and might be useful when providing custom implementations.
40///
41/// [`LoggingRustIrDatabase`]: crate::logging_db::LoggingRustIrDatabase
42/// [`display::sanitize_debug_name`]: crate::display::sanitize_debug_name
43/// [`Interner`]: Interner
f9f354fc
XL
44pub trait RustIrDatabase<I: Interner>: Debug {
45 /// Returns any "custom program clauses" that do not derive from
46 /// Rust IR. Used only in testing the underlying solver.
47 fn custom_clauses(&self) -> Vec<ProgramClause<I>>;
48
49 /// Returns the datum for the associated type with the given id.
50 fn associated_ty_data(&self, ty: AssocTypeId<I>) -> Arc<AssociatedTyDatum<I>>;
51
52 /// Returns the datum for the definition with the given id.
53 fn trait_datum(&self, trait_id: TraitId<I>) -> Arc<TraitDatum<I>>;
54
3dfed10e 55 /// Returns the datum for the ADT with the given id.
f035d41b
XL
56 fn adt_datum(&self, adt_id: AdtId<I>) -> Arc<AdtDatum<I>>;
57
58 /// Returns the representation for the ADT definition with the given id.
59 fn adt_repr(&self, id: AdtId<I>) -> AdtRepr;
60
3dfed10e 61 /// Returns the datum for the fn definition with the given id.
f035d41b 62 fn fn_def_datum(&self, fn_def_id: FnDefId<I>) -> Arc<FnDefDatum<I>>;
f9f354fc
XL
63
64 /// Returns the datum for the impl with the given id.
65 fn impl_datum(&self, impl_id: ImplId<I>) -> Arc<ImplDatum<I>>;
66
67 /// Returns the `AssociatedTyValue` with the given id.
68 fn associated_ty_value(&self, id: AssociatedTyValueId<I>) -> Arc<AssociatedTyValue<I>>;
69
70 /// Returns the `OpaqueTyDatum` with the given id.
71 fn opaque_ty_data(&self, id: OpaqueTyId<I>) -> Arc<OpaqueTyDatum<I>>;
72
f035d41b
XL
73 /// Returns the "hidden type" corresponding with the opaque type.
74 fn hidden_opaque_type(&self, id: OpaqueTyId<I>) -> Ty<I>;
75
f9f354fc
XL
76 /// Returns a list of potentially relevant impls for a given
77 /// trait-id; we also supply the type parameters that we are
78 /// trying to match (if known: these parameters may contain
79 /// inference variables, for example). The implementor is
80 /// permitted to return any superset of the applicable impls;
81 /// chalk will narrow down the list to only those that truly
82 /// apply. The parameters are provided as a "hint" to help the
83 /// implementor do less work, but can be completely ignored if
84 /// desired.
3dfed10e
XL
85 ///
86 /// The `binders` are for the `parameters`; if the recursive solver is used,
87 /// the parameters can contain bound variables referring to these binders.
88 fn impls_for_trait(
89 &self,
90 trait_id: TraitId<I>,
91 parameters: &[GenericArg<I>],
92 binders: &CanonicalVarKinds<I>,
93 ) -> Vec<ImplId<I>>;
f9f354fc
XL
94
95 /// Returns the impls that require coherence checking. This is not the
96 /// full set of impls that exist:
97 ///
98 /// - It can exclude impls not defined in the current crate.
99 /// - It can exclude "built-in" impls, like those for closures; only the
100 /// impls actually written by users need to be checked.
101 fn local_impls_to_coherence_check(&self, trait_id: TraitId<I>) -> Vec<ImplId<I>>;
102
103 /// Returns true if there is an explicit impl of the auto trait
1b1a35ee 104 /// `auto_trait_id` for the type `app_ty`. This is part of
f9f354fc 105 /// the auto trait handling -- if there is no explicit impl given
1b1a35ee
XL
106 /// by the user for `app_ty`, then we provide default impls
107 /// (otherwise, we rely on the impls the user gave).
108 fn impl_provided_for(&self, auto_trait_id: TraitId<I>, app_ty: &ApplicationTy<I>) -> bool;
f9f354fc 109
f9f354fc
XL
110 /// Returns id of a trait lang item, if found
111 fn well_known_trait_id(&self, well_known_trait: WellKnownTrait) -> Option<TraitId<I>>;
112
113 /// Calculates program clauses from an env. This is intended to call the
114 /// `program_clauses_for_env` function and then possibly cache the clauses.
115 fn program_clauses_for_env(&self, environment: &Environment<I>) -> ProgramClauses<I>;
116
117 fn interner(&self) -> &I;
f035d41b
XL
118
119 /// Check if a trait is object safe
120 fn is_object_safe(&self, trait_id: TraitId<I>) -> bool;
121
122 /// Gets the `ClosureKind` for a given closure and substitution.
123 fn closure_kind(&self, closure_id: ClosureId<I>, substs: &Substitution<I>) -> ClosureKind;
124
125 /// Gets the inputs and output for a given closure id and substitution. We
126 /// pass both the `ClosureId` and it's `Substituion` to give implementors
127 /// the freedom to store associated data in the substitution (like rustc) or
128 /// separately (like chalk-integration).
129 fn closure_inputs_and_output(
130 &self,
131 closure_id: ClosureId<I>,
132 substs: &Substitution<I>,
133 ) -> Binders<FnDefInputsAndOutputDatum<I>>;
134
135 /// Gets the upvars as a `Ty` for a given closure id and substitution. There
136 /// are no restrictions on the type of upvars.
137 fn closure_upvars(&self, closure_id: ClosureId<I>, substs: &Substitution<I>) -> Binders<Ty<I>>;
138
139 /// Gets the substitution for the closure when used as a function.
140 /// For example, for the following (not-quite-)rust code:
141 /// ```ignore
142 /// let foo = |a: &mut u32| { a += 1; };
143 /// let c: &'a u32 = &0;
144 /// foo(c);
145 /// ```
146 ///
147 /// This would return a `Substitution` of `[&'a]`. This could either be
148 /// substituted into the inputs and output, or into the upvars.
149 fn closure_fn_substitution(
150 &self,
151 closure_id: ClosureId<I>,
152 substs: &Substitution<I>,
153 ) -> Substitution<I>;
3dfed10e
XL
154
155 /// Retrieves a trait's original name. No uniqueness guarantees, but must
156 /// a valid Rust identifier.
157 fn trait_name(&self, trait_id: TraitId<I>) -> String {
158 sanitize_debug_name(|f| I::debug_trait_id(trait_id, f))
159 }
160
161 /// Retrieves a struct's original name. No uniqueness guarantees, but must
162 /// a valid Rust identifier.
163 fn adt_name(&self, adt_id: AdtId<I>) -> String {
164 sanitize_debug_name(|f| I::debug_adt_id(adt_id, f))
165 }
166
167 /// Retrieves the name of an associated type. No uniqueness guarantees, but must
168 /// a valid Rust identifier.
169 fn assoc_type_name(&self, assoc_ty_id: AssocTypeId<I>) -> String {
170 sanitize_debug_name(|f| I::debug_assoc_type_id(assoc_ty_id, f))
171 }
172
173 /// Retrieves the name of an opaque type. No uniqueness guarantees, but must
174 /// a valid Rust identifier.
175 fn opaque_type_name(&self, opaque_ty_id: OpaqueTyId<I>) -> String {
176 sanitize_debug_name(|f| I::debug_opaque_ty_id(opaque_ty_id, f))
177 }
178
179 /// Retrieves the name of a function definition. No uniqueness guarantees, but must
180 /// a valid Rust identifier.
181 fn fn_def_name(&self, fn_def_id: FnDefId<I>) -> String {
182 sanitize_debug_name(|f| I::debug_fn_def_id(fn_def_id, f))
183 }
f9f354fc
XL
184}
185
186pub use clauses::program_clauses_for_env;
187
188pub use solve::Guidance;
189pub use solve::Solution;
190pub use solve::Solver;
f035d41b
XL
191pub use solve::SubstitutionResult;
192
193#[macro_use]
194mod debug_macros {
195 #[macro_export]
196 macro_rules! debug_span {
197 ($($t: tt)*) => {
198 let __span = tracing::debug_span!($($t)*);
199 let __span = __span.enter();
200 };
201 }
202}