Rollup merge of #129170 - artemagvanian:span-to-location, r=celinval

Add an ability to convert between `Span` and `visit::Location`

AFAIK, there is no way to create a `Location` from a `Span` because its only field is private. This makes it impossible to use visitor methods like `visit_statement` or `visit_terminator`.

This PR adds an implementation for`From<Span>` for `Location` to fix this.

r? ```@celinval```
This commit is contained in:
Jubilee 2024-08-28 19:12:50 -07:00 committed by GitHub
commit 2572e0e8c9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -465,6 +465,22 @@ pub fn span(&self) -> Span {
} }
} }
/// Location of the statement at the given index for a given basic block. Assumes that `stmt_idx`
/// and `bb_idx` are valid for a given body.
pub fn statement_location(body: &Body, bb_idx: &BasicBlockIdx, stmt_idx: usize) -> Location {
let bb = &body.blocks[*bb_idx];
let stmt = &bb.statements[stmt_idx];
Location(stmt.span)
}
/// Location of the terminator for a given basic block. Assumes that `bb_idx` is valid for a given
/// body.
pub fn terminator_location(body: &Body, bb_idx: &BasicBlockIdx) -> Location {
let bb = &body.blocks[*bb_idx];
let terminator = &bb.terminator;
Location(terminator.span)
}
/// Reference to a place used to represent a partial projection. /// Reference to a place used to represent a partial projection.
pub struct PlaceRef<'a> { pub struct PlaceRef<'a> {
pub local: Local, pub local: Local,