@@ -167,50 +167,45 @@ Well, defining a query takes place in two steps:
167167
168168To specify the query name and arguments, you simply add an entry to
169169the big macro invocation in
170- [ ` src/librustc/ty/ query/mod.rs ` ] [ query-mod ] , which looks something like:
170+ [ ` src/librustc/query/mod.rs ` ] [ query-mod ] , which looks something like:
171171
172- [ query-mod ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ty/ query/index.html
172+ [ query-mod ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc/query/index.html
173173
174174``` rust,ignore
175- define_queries! { <'tcx>
176- /// Records the type of every item.
177- [] fn type_of: TypeOfItem(DefId) -> Ty<'tcx>,
175+ rustc_queries! {
176+ Other {
177+ /// Records the type of every item.
178+ query type_of(key: DefId) -> Ty<'tcx> {
179+ cache { key.is_local() }
180+ }
181+ }
178182
179183 ...
180184}
181185```
182186
183- Each line of the macro defines one query. The name is broken up like this:
187+ Queries are grouped into categories (` Other ` , ` Codegen ` , ` TypeChecking ` , etc.).
188+ Each group contains one or more queries. Each query definition is broken up like
189+ this:
184190
185191``` rust,ignore
186- [] fn type_of: TypeOfItem( DefId) -> Ty<'tcx>,
187- ^^ ^^^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^
188- | | | | |
189- | | | | result type of query
190- | | | query key type
191- | | dep-node constructor
192+ query type_of(key: DefId) -> Ty<'tcx> { ... }
193+ ^^ ^^^^^^^ ^^^^^ ^^^^^^^^ ^^^
194+ | | | | |
195+ | | | | query modifiers
196+ | | | result type of query
197+ | | query key type
192198| name of query
193- query flags
199+ query keyword
194200```
195201
196202Let's go over them one by one:
197203
198- - ** Query flags:** these are largely unused right now, but the intention
199- is that we'll be able to customize various aspects of how the query is
200- processed.
204+ - ** Query keyword:** indicates a start of a query definition.
201205- ** Name of query:** the name of the query method
202206 (` tcx.type_of(..) ` ). Also used as the name of a struct
203207 (` ty::queries::type_of ` ) that will be generated to represent
204208 this query.
205- - ** Dep-node constructor:** indicates the constructor function that
206- connects this query to incremental compilation. Typically, this is a
207- ` DepNode ` variant, which can be added by modifying the
208- ` define_dep_nodes! ` macro invocation in
209- [ ` librustc/dep_graph/dep_node.rs ` ] [ dep-node ] .
210- - However, sometimes we use a custom function, in which case the
211- name will be in snake case and the function will be defined at the
212- bottom of the file. This is typically used when the query key is
213- not a def-id, or just not the type that the dep-node expects.
214209- ** Query key type:** the type of the argument to this query.
215210 This type must implement the ` ty::query::keys::Key ` trait, which
216211 defines (for example) how to map it to a crate, and so forth.
@@ -222,19 +217,18 @@ Let's go over them one by one:
222217 which is used to cheaply modify MIR in place. See the definition
223218 of ` Steal ` for more details. New uses of ` Steal ` should ** not** be
224219 added without alerting ` @rust-lang/compiler ` .
225-
226- [ dep-node ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc/dep_graph/struct.DepNode.html
220+ - ** Query modifiers: ** various flags and options that customize how the
221+ query is processed.
227222
228223So, to add a query:
229224
230- - Add an entry to ` define_queries! ` using the format above.
231- - Possibly add a corresponding entry to the dep-node macro.
225+ - Add an entry to ` rustc_queries! ` using the format above.
232226- Link the provider by modifying the appropriate ` provide ` method;
233227 or add a new one if needed and ensure that ` rustc_driver ` is invoking it.
234228
235229#### Query structs and descriptions
236230
237- For each kind, the ` define_queries ` macro will generate a "query struct"
231+ For each kind, the ` rustc_queries ` macro will generate a "query struct"
238232named after the query. This struct is a kind of a place-holder
239233describing the query. Each such struct implements the
240234` self::config::QueryConfig ` trait, which has associated types for the
@@ -243,11 +237,14 @@ like this:
243237
244238``` rust,ignore
245239// Dummy struct representing a particular kind of query:
246- pub struct type_of<'tcx> { phantom : PhantomData<&'tcx ()> }
240+ pub struct type_of<'tcx> { data : PhantomData<&'tcx ()> }
247241
248242impl<'tcx> QueryConfig for type_of<'tcx> {
249243 type Key = DefId;
250244 type Value = Ty<'tcx>;
245+
246+ const NAME: QueryName = QueryName::type_of;
247+ const CATEGORY: ProfileCategory = ProfileCategory::Other;
251248}
252249```
253250
@@ -262,9 +259,24 @@ You can put new impls into the `config` module. They look something like this:
262259``` rust,ignore
263260impl<'tcx> QueryDescription for queries::type_of<'tcx> {
264261 fn describe(tcx: TyCtxt, key: DefId) -> String {
265- format!("computing the type of `{}`", tcx.item_path_str(key))
262+ format!("computing the type of `{}`", tcx.def_path_str(key))
263+ }
264+ }
265+ ```
266+
267+ Another option is to add ` desc ` modifier:
268+
269+ ``` rust,ignore
270+ rustc_queries! {
271+ Other {
272+ /// Records the type of every item.
273+ query type_of(key: DefId) -> Ty<'tcx> {
274+ desc { |tcx| "computing the type of `{}`", tcx.def_path_str(key) }
275+ }
266276 }
267277}
268278```
269279
280+ ` rustc_queries ` macro will generate an appropriate ` impl ` automatically.
281+
270282[ query-model ] : queries/query-evaluation-model-in-detail.html
0 commit comments