Refactor lint buffering to avoid requiring a giant enum
Lint buffering currently relies on a giant enum `BuiltinLintDiag` containing all the lints that might potentially get buffered. In addition to being an unwieldy enum in a central crate, this also makes `rustc_lint_defs` a build bottleneck: it depends on various types from various crates (with a steady pressure to add more), and many crates depend on it. Having all of these variants in a separate crate also prevents detecting when a variant becomes unused, which we can do with a dedicated type defined and used in the same crate. Refactor this to use a dyn trait, to allow using `LintDiagnostic` types directly. This requires boxing, but all of this is already on the slow path (emitting an error). Because the existing `BuiltinLintDiag` requires some additional types in order to decorate some variants, which are only available later in `rustc_lint`, use an enum `DecorateDiagCompat` to handle both the `dyn LintDiagnostic` case and the `BuiltinLintDiag` case.
This commit is contained in:
parent
6ba0ce4094
commit
c99320156d
18 changed files with 137 additions and 83 deletions
|
|
@ -3798,6 +3798,7 @@ dependencies = [
|
|||
"annotate-snippets 0.11.5",
|
||||
"derive_setters",
|
||||
"rustc_abi",
|
||||
"rustc_ast",
|
||||
"rustc_data_structures",
|
||||
"rustc_error_codes",
|
||||
"rustc_error_messages",
|
||||
|
|
|
|||
|
|
@ -26,15 +26,15 @@ use rustc_ast::visit::{AssocCtxt, BoundKind, FnCtxt, FnKind, Visitor, walk_list}
|
|||
use rustc_ast::*;
|
||||
use rustc_ast_pretty::pprust::{self, State};
|
||||
use rustc_data_structures::fx::FxIndexMap;
|
||||
use rustc_errors::DiagCtxtHandle;
|
||||
use rustc_errors::{DiagCtxtHandle, LintBuffer};
|
||||
use rustc_feature::Features;
|
||||
use rustc_parse::validate_attr;
|
||||
use rustc_session::Session;
|
||||
use rustc_session::lint::BuiltinLintDiag;
|
||||
use rustc_session::lint::builtin::{
|
||||
DEPRECATED_WHERE_CLAUSE_LOCATION, MISSING_ABI, MISSING_UNSAFE_ON_EXTERN,
|
||||
PATTERNS_IN_FNS_WITHOUT_BODY,
|
||||
};
|
||||
use rustc_session::lint::{BuiltinLintDiag, LintBuffer};
|
||||
use rustc_span::{Ident, Span, kw, sym};
|
||||
use rustc_target::spec::{AbiMap, AbiMapping};
|
||||
use thin_vec::thin_vec;
|
||||
|
|
|
|||
|
|
@ -10,11 +10,12 @@ use rustc_ast::{
|
|||
};
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_errors::{
|
||||
Applicability, Diag, MultiSpan, PResult, SingleLabelManySpans, listify, pluralize,
|
||||
Applicability, BufferedEarlyLint, Diag, MultiSpan, PResult, SingleLabelManySpans, listify,
|
||||
pluralize,
|
||||
};
|
||||
use rustc_expand::base::*;
|
||||
use rustc_lint_defs::builtin::NAMED_ARGUMENTS_USED_POSITIONALLY;
|
||||
use rustc_lint_defs::{BufferedEarlyLint, BuiltinLintDiag, LintId};
|
||||
use rustc_lint_defs::{BuiltinLintDiag, LintId};
|
||||
use rustc_parse::exp;
|
||||
use rustc_parse_format as parse;
|
||||
use rustc_span::{BytePos, ErrorGuaranteed, Ident, InnerSpan, Span, Symbol};
|
||||
|
|
@ -595,7 +596,8 @@ fn make_format_args(
|
|||
named_arg_sp: arg_name.span,
|
||||
named_arg_name: arg_name.name.to_string(),
|
||||
is_formatting_arg: matches!(used_as, Width | Precision),
|
||||
},
|
||||
}
|
||||
.into(),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ edition = "2024"
|
|||
annotate-snippets = "0.11"
|
||||
derive_setters = "0.1.6"
|
||||
rustc_abi = { path = "../rustc_abi" }
|
||||
rustc_ast = { path = "../rustc_ast" }
|
||||
rustc_data_structures = { path = "../rustc_data_structures" }
|
||||
rustc_error_codes = { path = "../rustc_error_codes" }
|
||||
rustc_error_messages = { path = "../rustc_error_messages" }
|
||||
|
|
|
|||
85
compiler/rustc_errors/src/decorate_diag.rs
Normal file
85
compiler/rustc_errors/src/decorate_diag.rs
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
/// This module provides types and traits for buffering lints until later in compilation.
|
||||
use rustc_ast::node_id::NodeId;
|
||||
use rustc_data_structures::fx::FxIndexMap;
|
||||
use rustc_error_messages::MultiSpan;
|
||||
use rustc_lint_defs::{BuiltinLintDiag, Lint, LintId};
|
||||
|
||||
use crate::{DynSend, LintDiagnostic, LintDiagnosticBox};
|
||||
|
||||
/// We can't implement `LintDiagnostic` for `BuiltinLintDiag`, because decorating some of its
|
||||
/// variants requires types we don't have yet. So, handle that case separately.
|
||||
pub enum DecorateDiagCompat {
|
||||
Dynamic(Box<dyn for<'a> LintDiagnosticBox<'a, ()> + DynSend + 'static>),
|
||||
Builtin(BuiltinLintDiag),
|
||||
}
|
||||
|
||||
impl std::fmt::Debug for DecorateDiagCompat {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
f.debug_struct("DecorateDiagCompat").finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl !LintDiagnostic<'_, ()> for BuiltinLintDiag {}
|
||||
|
||||
impl<D: for<'a> LintDiagnostic<'a, ()> + DynSend + 'static> From<D> for DecorateDiagCompat {
|
||||
#[inline]
|
||||
fn from(d: D) -> Self {
|
||||
Self::Dynamic(Box::new(d))
|
||||
}
|
||||
}
|
||||
|
||||
impl From<BuiltinLintDiag> for DecorateDiagCompat {
|
||||
#[inline]
|
||||
fn from(b: BuiltinLintDiag) -> Self {
|
||||
Self::Builtin(b)
|
||||
}
|
||||
}
|
||||
|
||||
/// Lints that are buffered up early on in the `Session` before the
|
||||
/// `LintLevels` is calculated.
|
||||
#[derive(Debug)]
|
||||
pub struct BufferedEarlyLint {
|
||||
/// The span of code that we are linting on.
|
||||
pub span: Option<MultiSpan>,
|
||||
|
||||
/// The `NodeId` of the AST node that generated the lint.
|
||||
pub node_id: NodeId,
|
||||
|
||||
/// A lint Id that can be passed to
|
||||
/// `rustc_lint::early::EarlyContextAndPass::check_id`.
|
||||
pub lint_id: LintId,
|
||||
|
||||
/// Customization of the `Diag<'_>` for the lint.
|
||||
pub diagnostic: DecorateDiagCompat,
|
||||
}
|
||||
|
||||
#[derive(Default, Debug)]
|
||||
pub struct LintBuffer {
|
||||
pub map: FxIndexMap<NodeId, Vec<BufferedEarlyLint>>,
|
||||
}
|
||||
|
||||
impl LintBuffer {
|
||||
pub fn add_early_lint(&mut self, early_lint: BufferedEarlyLint) {
|
||||
self.map.entry(early_lint.node_id).or_default().push(early_lint);
|
||||
}
|
||||
|
||||
pub fn take(&mut self, id: NodeId) -> Vec<BufferedEarlyLint> {
|
||||
// FIXME(#120456) - is `swap_remove` correct?
|
||||
self.map.swap_remove(&id).unwrap_or_default()
|
||||
}
|
||||
|
||||
pub fn buffer_lint(
|
||||
&mut self,
|
||||
lint: &'static Lint,
|
||||
node_id: NodeId,
|
||||
span: impl Into<MultiSpan>,
|
||||
decorate: impl Into<DecorateDiagCompat>,
|
||||
) {
|
||||
self.add_early_lint(BufferedEarlyLint {
|
||||
lint_id: LintId::of(lint),
|
||||
node_id,
|
||||
span: Some(span.into()),
|
||||
diagnostic: decorate.into(),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -138,10 +138,20 @@ where
|
|||
/// `#[derive(LintDiagnostic)]` -- see [rustc_macros::LintDiagnostic].
|
||||
#[rustc_diagnostic_item = "LintDiagnostic"]
|
||||
pub trait LintDiagnostic<'a, G: EmissionGuarantee> {
|
||||
/// Decorate and emit a lint.
|
||||
/// Decorate a lint with the information from this type.
|
||||
fn decorate_lint<'b>(self, diag: &'b mut Diag<'a, G>);
|
||||
}
|
||||
|
||||
pub trait LintDiagnosticBox<'a, G: EmissionGuarantee> {
|
||||
fn decorate_lint_box<'b>(self: Box<Self>, diag: &'b mut Diag<'a, G>);
|
||||
}
|
||||
|
||||
impl<'a, G: EmissionGuarantee, D: LintDiagnostic<'a, G>> LintDiagnosticBox<'a, G> for D {
|
||||
fn decorate_lint_box<'b>(self: Box<Self>, diag: &'b mut Diag<'a, G>) {
|
||||
self.decorate_lint(diag);
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Encodable, Decodable)]
|
||||
pub(crate) struct DiagLocation {
|
||||
file: Cow<'static, str>,
|
||||
|
|
|
|||
|
|
@ -40,9 +40,10 @@ use std::{fmt, panic};
|
|||
|
||||
use Level::*;
|
||||
pub use codes::*;
|
||||
pub use decorate_diag::{BufferedEarlyLint, DecorateDiagCompat, LintBuffer};
|
||||
pub use diagnostic::{
|
||||
BugAbort, Diag, DiagArgMap, DiagInner, DiagStyledString, Diagnostic, EmissionGuarantee,
|
||||
FatalAbort, LintDiagnostic, StringPart, Subdiag, Subdiagnostic,
|
||||
FatalAbort, LintDiagnostic, LintDiagnosticBox, StringPart, Subdiag, Subdiagnostic,
|
||||
};
|
||||
pub use diagnostic_impls::{
|
||||
DiagSymbolList, ElidedLifetimeInPathSubdiag, ExpectedLifetimeParameter,
|
||||
|
|
@ -80,6 +81,7 @@ use crate::timings::TimingRecord;
|
|||
|
||||
pub mod annotate_snippet_emitter_writer;
|
||||
pub mod codes;
|
||||
mod decorate_diag;
|
||||
mod diagnostic;
|
||||
mod diagnostic_impls;
|
||||
pub mod emitter;
|
||||
|
|
|
|||
|
|
@ -13,13 +13,13 @@ use rustc_ast::visit::{AssocCtxt, Visitor};
|
|||
use rustc_ast::{self as ast, AttrVec, Attribute, HasAttrs, Item, NodeId, PatKind};
|
||||
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
|
||||
use rustc_data_structures::sync;
|
||||
use rustc_errors::{DiagCtxtHandle, ErrorGuaranteed, PResult};
|
||||
use rustc_errors::{BufferedEarlyLint, DiagCtxtHandle, ErrorGuaranteed, PResult};
|
||||
use rustc_feature::Features;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::attrs::{AttributeKind, CfgEntry, Deprecation};
|
||||
use rustc_hir::def::MacroKinds;
|
||||
use rustc_hir::{Stability, find_attr};
|
||||
use rustc_lint_defs::{BufferedEarlyLint, RegisteredTools};
|
||||
use rustc_lint_defs::RegisteredTools;
|
||||
use rustc_parse::MACRO_ARGUMENTS;
|
||||
use rustc_parse::parser::{ForceCollect, Parser};
|
||||
use rustc_session::config::CollapseMacroDebuginfo;
|
||||
|
|
|
|||
|
|
@ -8,11 +8,12 @@ use rustc_ast as ast;
|
|||
use rustc_codegen_ssa::traits::CodegenBackend;
|
||||
use rustc_data_structures::jobserver::Proxy;
|
||||
use rustc_data_structures::sync;
|
||||
use rustc_errors::LintBuffer;
|
||||
use rustc_metadata::{DylibError, load_symbol_from_dylib};
|
||||
use rustc_middle::ty::CurrentGcx;
|
||||
use rustc_parse::validate_attr;
|
||||
use rustc_session::config::{Cfg, OutFileName, OutputFilenames, OutputTypes, Sysroot, host_tuple};
|
||||
use rustc_session::lint::{self, BuiltinLintDiag, LintBuffer};
|
||||
use rustc_session::lint::{self, BuiltinLintDiag};
|
||||
use rustc_session::output::{CRATE_TYPES, categorize_crate_type};
|
||||
use rustc_session::{EarlyDiagCtxt, Session, filesearch};
|
||||
use rustc_span::edit_distance::find_best_match_for_name;
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ use rustc_ast::util::parser::ExprPrecedence;
|
|||
use rustc_data_structures::fx::FxIndexMap;
|
||||
use rustc_data_structures::sync;
|
||||
use rustc_data_structures::unord::UnordMap;
|
||||
use rustc_errors::{Diag, LintDiagnostic, MultiSpan};
|
||||
use rustc_errors::{Diag, LintBuffer, LintDiagnostic, MultiSpan};
|
||||
use rustc_feature::Features;
|
||||
use rustc_hir::def::Res;
|
||||
use rustc_hir::def_id::{CrateNum, DefId};
|
||||
|
|
@ -23,7 +23,7 @@ use rustc_middle::middle::privacy::EffectiveVisibilities;
|
|||
use rustc_middle::ty::layout::{LayoutError, LayoutOfHelpers, TyAndLayout};
|
||||
use rustc_middle::ty::print::{PrintError, PrintTraitRefExt as _, Printer, with_no_trimmed_paths};
|
||||
use rustc_middle::ty::{self, GenericArg, RegisteredTools, Ty, TyCtxt, TypingEnv, TypingMode};
|
||||
use rustc_session::lint::{FutureIncompatibleInfo, Lint, LintBuffer, LintExpectationId, LintId};
|
||||
use rustc_session::lint::{FutureIncompatibleInfo, Lint, LintExpectationId, LintId};
|
||||
use rustc_session::{DynLintStore, Session};
|
||||
use rustc_span::edit_distance::find_best_match_for_names;
|
||||
use rustc_span::{Ident, Span, Symbol, sym};
|
||||
|
|
|
|||
|
|
@ -7,10 +7,11 @@
|
|||
use rustc_ast::visit::{self as ast_visit, Visitor, walk_list};
|
||||
use rustc_ast::{self as ast, HasAttrs};
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
use rustc_errors::{BufferedEarlyLint, DecorateDiagCompat, LintBuffer};
|
||||
use rustc_feature::Features;
|
||||
use rustc_middle::ty::{RegisteredTools, TyCtxt};
|
||||
use rustc_session::Session;
|
||||
use rustc_session::lint::{BufferedEarlyLint, LintBuffer, LintPass};
|
||||
use rustc_session::lint::LintPass;
|
||||
use rustc_span::{Ident, Span};
|
||||
use tracing::debug;
|
||||
|
||||
|
|
@ -36,8 +37,11 @@ impl<'ecx, 'tcx, T: EarlyLintPass> EarlyContextAndPass<'ecx, 'tcx, T> {
|
|||
fn check_id(&mut self, id: ast::NodeId) {
|
||||
for early_lint in self.context.buffered.take(id) {
|
||||
let BufferedEarlyLint { span, node_id: _, lint_id, diagnostic } = early_lint;
|
||||
self.context.opt_span_lint(lint_id.lint, span, |diag| {
|
||||
diagnostics::decorate_builtin_lint(self.context.sess(), self.tcx, diagnostic, diag);
|
||||
self.context.opt_span_lint(lint_id.lint, span, |diag| match diagnostic {
|
||||
DecorateDiagCompat::Builtin(b) => {
|
||||
diagnostics::decorate_builtin_lint(self.context.sess(), self.tcx, b, diag);
|
||||
}
|
||||
DecorateDiagCompat::Dynamic(d) => d.decorate_lint_box(diag),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -133,10 +133,9 @@ pub use early::{EarlyCheckNode, check_ast_node};
|
|||
pub use late::{check_crate, late_lint_mod, unerased_lint_store};
|
||||
pub use levels::LintLevelsBuilder;
|
||||
pub use passes::{EarlyLintPass, LateLintPass};
|
||||
pub use rustc_errors::BufferedEarlyLint;
|
||||
pub use rustc_session::lint::Level::{self, *};
|
||||
pub use rustc_session::lint::{
|
||||
BufferedEarlyLint, FutureIncompatibleInfo, Lint, LintId, LintPass, LintVec,
|
||||
};
|
||||
pub use rustc_session::lint::{FutureIncompatibleInfo, Lint, LintId, LintPass, LintVec};
|
||||
|
||||
rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
|
||||
|
||||
|
|
|
|||
|
|
@ -3,8 +3,7 @@ use std::borrow::Cow;
|
|||
use rustc_abi::ExternAbi;
|
||||
use rustc_ast::AttrId;
|
||||
use rustc_ast::attr::AttributeExt;
|
||||
use rustc_ast::node_id::NodeId;
|
||||
use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
|
||||
use rustc_data_structures::fx::FxIndexSet;
|
||||
use rustc_data_structures::stable_hasher::{
|
||||
HashStable, StableCompare, StableHasher, ToStableHashKey,
|
||||
};
|
||||
|
|
@ -818,55 +817,6 @@ pub enum BuiltinLintDiag {
|
|||
},
|
||||
}
|
||||
|
||||
/// Lints that are buffered up early on in the `Session` before the
|
||||
/// `LintLevels` is calculated.
|
||||
#[derive(Debug)]
|
||||
pub struct BufferedEarlyLint {
|
||||
/// The span of code that we are linting on.
|
||||
pub span: Option<MultiSpan>,
|
||||
|
||||
/// The `NodeId` of the AST node that generated the lint.
|
||||
pub node_id: NodeId,
|
||||
|
||||
/// A lint Id that can be passed to
|
||||
/// `rustc_lint::early::EarlyContextAndPass::check_id`.
|
||||
pub lint_id: LintId,
|
||||
|
||||
/// Customization of the `Diag<'_>` for the lint.
|
||||
pub diagnostic: BuiltinLintDiag,
|
||||
}
|
||||
|
||||
#[derive(Default, Debug)]
|
||||
pub struct LintBuffer {
|
||||
pub map: FxIndexMap<NodeId, Vec<BufferedEarlyLint>>,
|
||||
}
|
||||
|
||||
impl LintBuffer {
|
||||
pub fn add_early_lint(&mut self, early_lint: BufferedEarlyLint) {
|
||||
self.map.entry(early_lint.node_id).or_default().push(early_lint);
|
||||
}
|
||||
|
||||
pub fn take(&mut self, id: NodeId) -> Vec<BufferedEarlyLint> {
|
||||
// FIXME(#120456) - is `swap_remove` correct?
|
||||
self.map.swap_remove(&id).unwrap_or_default()
|
||||
}
|
||||
|
||||
pub fn buffer_lint(
|
||||
&mut self,
|
||||
lint: &'static Lint,
|
||||
node_id: NodeId,
|
||||
span: impl Into<MultiSpan>,
|
||||
diagnostic: BuiltinLintDiag,
|
||||
) {
|
||||
self.add_early_lint(BufferedEarlyLint {
|
||||
lint_id: LintId::of(lint),
|
||||
node_id,
|
||||
span: Some(span.into()),
|
||||
diagnostic,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
pub type RegisteredTools = FxIndexSet<Ident>;
|
||||
|
||||
/// Declares a static item of type `&'static Lint`.
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
use std::num::NonZero;
|
||||
|
||||
use rustc_ast::NodeId;
|
||||
use rustc_errors::{Applicability, Diag, EmissionGuarantee};
|
||||
use rustc_errors::{Applicability, Diag, EmissionGuarantee, LintBuffer};
|
||||
use rustc_feature::GateIssue;
|
||||
use rustc_hir::attrs::{DeprecatedSince, Deprecation};
|
||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
|
|
@ -12,7 +12,7 @@ use rustc_hir::{self as hir, ConstStability, DefaultBodyStability, HirId, Stabil
|
|||
use rustc_macros::{Decodable, Encodable, HashStable, Subdiagnostic};
|
||||
use rustc_session::Session;
|
||||
use rustc_session::lint::builtin::{DEPRECATED, DEPRECATED_IN_FUTURE, SOFT_UNSTABLE};
|
||||
use rustc_session::lint::{BuiltinLintDiag, DeprecatedSinceKind, Level, Lint, LintBuffer};
|
||||
use rustc_session::lint::{BuiltinLintDiag, DeprecatedSinceKind, Level, Lint};
|
||||
use rustc_session::parse::feature_err_issue;
|
||||
use rustc_span::{Span, Symbol, sym};
|
||||
use tracing::debug;
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ use rustc_data_structures::intern::Interned;
|
|||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
use rustc_data_structures::steal::Steal;
|
||||
use rustc_data_structures::unord::{UnordMap, UnordSet};
|
||||
use rustc_errors::{Diag, ErrorGuaranteed};
|
||||
use rustc_errors::{Diag, ErrorGuaranteed, LintBuffer};
|
||||
use rustc_hir::attrs::{AttributeKind, StrippedCfgItem};
|
||||
use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
|
||||
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LocalDefIdMap};
|
||||
|
|
@ -46,7 +46,6 @@ use rustc_macros::{
|
|||
};
|
||||
use rustc_query_system::ich::StableHashingContext;
|
||||
use rustc_serialize::{Decodable, Encodable};
|
||||
use rustc_session::lint::LintBuffer;
|
||||
pub use rustc_session::lint::RegisteredTools;
|
||||
use rustc_span::hygiene::MacroKind;
|
||||
use rustc_span::{DUMMY_SP, ExpnId, ExpnKind, Ident, Span, Symbol, sym};
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ use rustc_data_structures::intern::Interned;
|
|||
use rustc_data_structures::steal::Steal;
|
||||
use rustc_data_structures::sync::{FreezeReadGuard, FreezeWriteGuard};
|
||||
use rustc_data_structures::unord::{UnordMap, UnordSet};
|
||||
use rustc_errors::{Applicability, Diag, ErrCode, ErrorGuaranteed};
|
||||
use rustc_errors::{Applicability, Diag, ErrCode, ErrorGuaranteed, LintBuffer};
|
||||
use rustc_expand::base::{DeriveResolution, SyntaxExtension, SyntaxExtensionKind};
|
||||
use rustc_feature::BUILTIN_ATTRIBUTES;
|
||||
use rustc_hir::attrs::StrippedCfgItem;
|
||||
|
|
@ -72,8 +72,8 @@ use rustc_middle::ty::{
|
|||
ResolverGlobalCtxt, TyCtxt, TyCtxtFeed, Visibility,
|
||||
};
|
||||
use rustc_query_system::ich::StableHashingContext;
|
||||
use rustc_session::lint::BuiltinLintDiag;
|
||||
use rustc_session::lint::builtin::PRIVATE_MACRO_USE;
|
||||
use rustc_session::lint::{BuiltinLintDiag, LintBuffer};
|
||||
use rustc_span::hygiene::{ExpnId, LocalExpnId, MacroKind, SyntaxContext, Transparency};
|
||||
use rustc_span::{DUMMY_SP, Ident, Macros20NormalizedIdent, Span, Symbol, kw, sym};
|
||||
use smallvec::{SmallVec, smallvec};
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ pub(crate) fn disallow_cfgs(sess: &Session, user_cfgs: &Cfg) {
|
|||
EXPLICIT_BUILTIN_CFGS_IN_FLAGS,
|
||||
None,
|
||||
ast::CRATE_NODE_ID,
|
||||
BuiltinLintDiag::UnexpectedBuiltinCfg { cfg, cfg_name, controlled_by },
|
||||
BuiltinLintDiag::UnexpectedBuiltinCfg { cfg, cfg_name, controlled_by }.into(),
|
||||
)
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ use rustc_data_structures::sync::{AppendOnlyVec, Lock};
|
|||
use rustc_errors::emitter::{FatalOnlyEmitter, HumanEmitter, stderr_destination};
|
||||
use rustc_errors::translation::Translator;
|
||||
use rustc_errors::{
|
||||
ColorConfig, Diag, DiagCtxt, DiagCtxtHandle, DiagMessage, EmissionGuarantee, MultiSpan,
|
||||
StashKey,
|
||||
BufferedEarlyLint, ColorConfig, DecorateDiagCompat, Diag, DiagCtxt, DiagCtxtHandle,
|
||||
DiagMessage, EmissionGuarantee, MultiSpan, StashKey,
|
||||
};
|
||||
use rustc_feature::{GateIssue, UnstableFeatures, find_feature_issue};
|
||||
use rustc_span::edition::Edition;
|
||||
|
|
@ -27,7 +27,7 @@ use crate::errors::{
|
|||
FeatureDiagnosticSuggestion, FeatureGateError, SuggestUpgradeCompiler,
|
||||
};
|
||||
use crate::lint::builtin::UNSTABLE_SYNTAX_PRE_EXPANSION;
|
||||
use crate::lint::{BufferedEarlyLint, BuiltinLintDiag, Lint, LintId};
|
||||
use crate::lint::{Lint, LintId};
|
||||
|
||||
/// Collected spans during parsing for places where a certain feature was
|
||||
/// used and should be feature gated accordingly in `check_crate`.
|
||||
|
|
@ -342,17 +342,17 @@ impl ParseSess {
|
|||
lint: &'static Lint,
|
||||
span: impl Into<MultiSpan>,
|
||||
node_id: NodeId,
|
||||
diagnostic: BuiltinLintDiag,
|
||||
diagnostic: impl Into<DecorateDiagCompat>,
|
||||
) {
|
||||
self.opt_span_buffer_lint(lint, Some(span.into()), node_id, diagnostic)
|
||||
self.opt_span_buffer_lint(lint, Some(span.into()), node_id, diagnostic.into())
|
||||
}
|
||||
|
||||
pub fn opt_span_buffer_lint(
|
||||
pub(crate) fn opt_span_buffer_lint(
|
||||
&self,
|
||||
lint: &'static Lint,
|
||||
span: Option<MultiSpan>,
|
||||
node_id: NodeId,
|
||||
diagnostic: BuiltinLintDiag,
|
||||
diagnostic: DecorateDiagCompat,
|
||||
) {
|
||||
self.buffered_lints.with_lock(|buffered_lints| {
|
||||
buffered_lints.push(BufferedEarlyLint {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue