use rustc_middle::lint::LevelAndSource;
use rustc_middle::lint::LintDiagnosticBuilder;
use rustc_middle::lint::{
- struct_lint_level, LintLevelMap, LintLevelSets, LintLevelSource, LintSet,
+ struct_lint_level, LintLevelMap, LintLevelSets, LintLevelSource, LintSet, LintStackIndex,
+ COMMAND_LINE,
};
use rustc_middle::ty::query::Providers;
use rustc_middle::ty::TyCtxt;
pub struct LintLevelsBuilder<'s> {
sess: &'s Session,
sets: LintLevelSets,
- id_to_set: FxHashMap<HirId, u32>,
- cur: u32,
+ id_to_set: FxHashMap<HirId, LintStackIndex>,
+ cur: LintStackIndex,
warn_about_weird_lints: bool,
store: &'s LintStore,
crate_attrs: &'s [ast::Attribute],
}
pub struct BuilderPush {
- prev: u32,
+ prev: LintStackIndex,
pub changed: bool,
}
let mut builder = LintLevelsBuilder {
sess,
sets: LintLevelSets::new(),
- cur: 0,
+ cur: COMMAND_LINE,
id_to_set: Default::default(),
warn_about_weird_lints,
store,
}
}
- self.sets.list.push(LintSet::CommandLine { specs });
+ self.cur = self.sets.list.push(LintSet::CommandLine { specs });
}
/// Attempts to insert the `id` to `level_src` map entry. If unsuccessful
let prev = self.cur;
if !specs.is_empty() {
- self.cur = self.sets.list.len() as u32;
- self.sets.list.push(LintSet::Node { specs, parent: prev });
+ self.cur = self.sets.list.push(LintSet::Node { specs, parent: prev });
}
BuilderPush { prev, changed: prev != self.cur }
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
use rustc_errors::{DiagnosticBuilder, DiagnosticId};
use rustc_hir::HirId;
+use rustc_index::vec::IndexVec;
use rustc_session::lint::{
builtin::{self, FORBIDDEN_LINT_GROUPS},
FutureIncompatibilityReason, Level, Lint, LintId,
#[derive(Debug, HashStable)]
pub struct LintLevelSets {
- pub list: Vec<LintSet>,
+ pub list: IndexVec<LintStackIndex, LintSet>,
pub lint_cap: Level,
}
+rustc_index::newtype_index! {
+ #[derive(HashStable)]
+ pub struct LintStackIndex {
+ const COMMAND_LINE = 0,
+ }
+}
+
#[derive(Debug, HashStable)]
pub enum LintSet {
CommandLine {
Node {
specs: FxHashMap<LintId, LevelAndSource>,
- parent: u32,
+ parent: LintStackIndex,
},
}
impl LintLevelSets {
pub fn new() -> Self {
- LintLevelSets { list: Vec::new(), lint_cap: Level::Forbid }
+ LintLevelSets { list: IndexVec::new(), lint_cap: Level::Forbid }
}
pub fn get_lint_level(
&self,
lint: &'static Lint,
- idx: u32,
+ idx: LintStackIndex,
aux: Option<&FxHashMap<LintId, LevelAndSource>>,
sess: &Session,
) -> LevelAndSource {
pub fn get_lint_id_level(
&self,
id: LintId,
- mut idx: u32,
+ mut idx: LintStackIndex,
aux: Option<&FxHashMap<LintId, LevelAndSource>>,
) -> (Option<Level>, LintLevelSource) {
if let Some(specs) = aux {
}
}
loop {
- match self.list[idx as usize] {
+ match self.list[idx] {
LintSet::CommandLine { ref specs } => {
if let Some(&(level, src)) = specs.get(&id) {
return (Some(level), src);
#[derive(Debug)]
pub struct LintLevelMap {
pub sets: LintLevelSets,
- pub id_to_set: FxHashMap<HirId, u32>,
+ pub id_to_set: FxHashMap<HirId, LintStackIndex>,
}
impl LintLevelMap {