Red-knot: Track scopes per expression (#11754)

This commit is contained in:
Micha Reiser 2024-06-05 17:53:26 +02:00 committed by GitHub
parent a8cf7096ff
commit b0b4706e2d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 118 additions and 26 deletions

View file

@ -2,7 +2,7 @@ use crate::vec::IndexVec;
use crate::Idx;
use std::fmt::{Debug, Formatter};
use std::marker::PhantomData;
use std::ops::{Index, IndexMut};
use std::ops::{Index, IndexMut, Range};
/// A view into contiguous `T`s, indexed by `I` rather than by `usize`.
#[derive(PartialEq, Eq, Hash)]
@ -131,6 +131,15 @@ impl<I: Idx, T> Index<I> for IndexSlice<I, T> {
}
}
impl<I: Idx, T> Index<Range<I>> for IndexSlice<I, T> {
type Output = [T];
#[inline]
fn index(&self, range: Range<I>) -> &[T] {
&self.raw[range.start.index()..range.end.index()]
}
}
impl<I: Idx, T> IndexMut<I> for IndexSlice<I, T> {
#[inline]
fn index_mut(&mut self, index: I) -> &mut T {
@ -138,6 +147,13 @@ impl<I: Idx, T> IndexMut<I> for IndexSlice<I, T> {
}
}
impl<I: Idx, T> IndexMut<Range<I>> for IndexSlice<I, T> {
#[inline]
fn index_mut(&mut self, range: Range<I>) -> &mut [T] {
&mut self.raw[range.start.index()..range.end.index()]
}
}
impl<'a, I: Idx, T> IntoIterator for &'a IndexSlice<I, T> {
type IntoIter = std::slice::Iter<'a, T>;
type Item = &'a T;

View file

@ -69,6 +69,11 @@ impl<I: Idx, T> IndexVec<I, T> {
pub fn next_index(&self) -> I {
I::new(self.raw.len())
}
#[inline]
pub fn shrink_to_fit(&mut self) {
self.raw.shrink_to_fit();
}
}
impl<I, T> Debug for IndexVec<I, T>