]> git.lizzy.rs Git - rust.git/commit - src/tools/miri
Auto merge of #84373 - cjgillot:resolve-span, r=michaelwoerister,petrochenkov
authorbors <bors@rust-lang.org>
Sat, 11 Sep 2021 23:35:28 +0000 (23:35 +0000)
committerbors <bors@rust-lang.org>
Sat, 11 Sep 2021 23:35:28 +0000 (23:35 +0000)
commit547d9374d26f203ab963b3ffe1ed36bd70f16633
treef104eb31a70bdab19db7cf39db1fa19ec129fe07
parent8c2b6ea37d7719a0370bd404030eef9702c1752c
parent7842b80478ae92e2b7956f61bb14b76d17f57140
Auto merge of #84373 - cjgillot:resolve-span, r=michaelwoerister,petrochenkov

Encode spans relative to the enclosing item

The aim of this PR is to avoid recomputing queries when code is moved without modification.

MCP at https://github.com/rust-lang/compiler-team/issues/443

This is achieved by :
1. storing the HIR owner LocalDefId information inside the span;
2. encoding and decoding spans relative to the enclosing item in the incremental on-disk cache;
3. marking a dependency to the `source_span(LocalDefId)` query when we translate a span from the short (`Span`) representation to its explicit (`SpanData`) representation.

Since all client code uses `Span`, step 3 ensures that all manipulations
of span byte positions actually create the dependency edge between
the caller and the `source_span(LocalDefId)`.
This query return the actual absolute span of the parent item.
As a consequence, any source code motion that changes the absolute byte position of a node will either:
- modify the distance to the parent's beginning, so change the relative span's hash;
- dirty `source_span`, and trigger the incremental recomputation of all code that
  depends on the span's absolute byte position.

With this scheme, I believe the dependency tracking to be accurate.

For the moment, the spans are marked during lowering.
I'd rather do this during def-collection,
but the AST MutVisitor is not practical enough just yet.
The only difference is that we attach macro-expanded spans
to their expansion point instead of the macro itself.
compiler/rustc_ast_lowering/src/expr.rs
compiler/rustc_expand/src/base.rs
compiler/rustc_expand/src/proc_macro_server.rs
compiler/rustc_middle/src/ich/hcx.rs
compiler/rustc_resolve/src/lib.rs
src/tools/clippy/clippy_lints/src/regex.rs
src/tools/rustfmt/src/macros.rs