span: move MultiSpan
`MultiSpan` contains labels, which are more complicated with the introduction of diagnostic translation and will use types from `rustc_errors` - however, `rustc_errors` depends on `rustc_span` so `rustc_span` cannot use types like `DiagnosticMessage` without dependency cycles. Introduce a new `rustc_error_messages` crate that can contain `DiagnosticMessage` and `MultiSpan`. Signed-off-by: David Wood <david.wood@huawei.com>
This commit is contained in:
parent
8c684563a5
commit
c45f29595d
66 changed files with 354 additions and 293 deletions
12
Cargo.lock
12
Cargo.lock
|
@ -3645,6 +3645,15 @@ dependencies = [
|
||||||
name = "rustc_error_codes"
|
name = "rustc_error_codes"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc_error_messages"
|
||||||
|
version = "0.0.0"
|
||||||
|
dependencies = [
|
||||||
|
"rustc_macros",
|
||||||
|
"rustc_serialize",
|
||||||
|
"rustc_span",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustc_errors"
|
name = "rustc_errors"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
|
@ -3652,6 +3661,7 @@ dependencies = [
|
||||||
"annotate-snippets",
|
"annotate-snippets",
|
||||||
"atty",
|
"atty",
|
||||||
"rustc_data_structures",
|
"rustc_data_structures",
|
||||||
|
"rustc_error_messages",
|
||||||
"rustc_lint_defs",
|
"rustc_lint_defs",
|
||||||
"rustc_macros",
|
"rustc_macros",
|
||||||
"rustc_serialize",
|
"rustc_serialize",
|
||||||
|
@ -3708,6 +3718,7 @@ dependencies = [
|
||||||
"odht",
|
"odht",
|
||||||
"rustc_ast",
|
"rustc_ast",
|
||||||
"rustc_data_structures",
|
"rustc_data_structures",
|
||||||
|
"rustc_error_messages",
|
||||||
"rustc_feature",
|
"rustc_feature",
|
||||||
"rustc_index",
|
"rustc_index",
|
||||||
"rustc_macros",
|
"rustc_macros",
|
||||||
|
@ -3864,6 +3875,7 @@ version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rustc_ast",
|
"rustc_ast",
|
||||||
"rustc_data_structures",
|
"rustc_data_structures",
|
||||||
|
"rustc_error_messages",
|
||||||
"rustc_hir",
|
"rustc_hir",
|
||||||
"rustc_macros",
|
"rustc_macros",
|
||||||
"rustc_serialize",
|
"rustc_serialize",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use rustc_errors::{struct_span_err, DiagnosticBuilder, DiagnosticId, ErrorGuaranteed};
|
use rustc_errors::{struct_span_err, DiagnosticBuilder, DiagnosticId, ErrorGuaranteed, MultiSpan};
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
use rustc_span::{MultiSpan, Span};
|
use rustc_span::Span;
|
||||||
|
|
||||||
impl<'cx, 'tcx> crate::MirBorrowckCtxt<'cx, 'tcx> {
|
impl<'cx, 'tcx> crate::MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
crate fn cannot_move_when_borrowed(
|
crate fn cannot_move_when_borrowed(
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use either::Either;
|
use either::Either;
|
||||||
use rustc_const_eval::util::CallKind;
|
use rustc_const_eval::util::CallKind;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed};
|
use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::{AsyncGeneratorKind, GeneratorKind};
|
use rustc_hir::{AsyncGeneratorKind, GeneratorKind};
|
||||||
|
@ -15,7 +15,7 @@ use rustc_middle::mir::{
|
||||||
use rustc_middle::ty::{self, subst::Subst, suggest_constraining_type_params, PredicateKind, Ty};
|
use rustc_middle::ty::{self, subst::Subst, suggest_constraining_type_params, PredicateKind, Ty};
|
||||||
use rustc_mir_dataflow::move_paths::{InitKind, MoveOutIndex, MovePathIndex};
|
use rustc_mir_dataflow::move_paths::{InitKind, MoveOutIndex, MovePathIndex};
|
||||||
use rustc_span::symbol::sym;
|
use rustc_span::symbol::sym;
|
||||||
use rustc_span::{BytePos, MultiSpan, Span};
|
use rustc_span::{BytePos, Span};
|
||||||
use rustc_trait_selection::infer::InferCtxtExt;
|
use rustc_trait_selection::infer::InferCtxtExt;
|
||||||
use rustc_trait_selection::traits::TraitEngineExt as _;
|
use rustc_trait_selection::traits::TraitEngineExt as _;
|
||||||
|
|
||||||
|
|
|
@ -7,11 +7,11 @@ use rustc_ast::tokenstream::TokenStream;
|
||||||
use rustc_ast::visit::{self, Visitor};
|
use rustc_ast::visit::{self, Visitor};
|
||||||
use rustc_ast::{token, BlockCheckMode, UnsafeSource};
|
use rustc_ast::{token, BlockCheckMode, UnsafeSource};
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_errors::{pluralize, Applicability, PResult};
|
use rustc_errors::{pluralize, Applicability, MultiSpan, PResult};
|
||||||
use rustc_expand::base::{self, *};
|
use rustc_expand::base::{self, *};
|
||||||
use rustc_parse_format as parse;
|
use rustc_parse_format as parse;
|
||||||
use rustc_span::symbol::{sym, Ident, Symbol};
|
use rustc_span::symbol::{sym, Ident, Symbol};
|
||||||
use rustc_span::{InnerSpan, MultiSpan, Span};
|
use rustc_span::{InnerSpan, Span};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
@ -446,7 +446,9 @@ impl<'a, 'b> Context<'a, 'b> {
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|fmt| fmt.precision_span.is_some())
|
.filter(|fmt| fmt.precision_span.is_some())
|
||||||
.count();
|
.count();
|
||||||
e.span_label(span, &format!(
|
e.span_label(
|
||||||
|
span,
|
||||||
|
&format!(
|
||||||
"this precision flag adds an extra required argument at position {}, \
|
"this precision flag adds an extra required argument at position {}, \
|
||||||
which is why there {} expected",
|
which is why there {} expected",
|
||||||
pos,
|
pos,
|
||||||
|
@ -455,7 +457,8 @@ impl<'a, 'b> Context<'a, 'b> {
|
||||||
} else {
|
} else {
|
||||||
format!("are {} arguments", count)
|
format!("are {} arguments", count)
|
||||||
},
|
},
|
||||||
));
|
),
|
||||||
|
);
|
||||||
if let Some(arg) = self.args.get(pos) {
|
if let Some(arg) = self.args.get(pos) {
|
||||||
e.span_label(
|
e.span_label(
|
||||||
arg.span,
|
arg.span,
|
||||||
|
|
12
compiler/rustc_error_messages/Cargo.toml
Normal file
12
compiler/rustc_error_messages/Cargo.toml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
[package]
|
||||||
|
name = "rustc_error_messages"
|
||||||
|
version = "0.0.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
doctest = false
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
rustc_serialize = { path = "../rustc_serialize" }
|
||||||
|
rustc_span = { path = "../rustc_span" }
|
||||||
|
rustc_macros = { path = "../rustc_macros" }
|
171
compiler/rustc_error_messages/src/lib.rs
Normal file
171
compiler/rustc_error_messages/src/lib.rs
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
use rustc_macros::{Decodable, Encodable};
|
||||||
|
use rustc_span::Span;
|
||||||
|
|
||||||
|
/// Abstraction over a message in a diagnostic to support both translatable and non-translatable
|
||||||
|
/// diagnostic messages.
|
||||||
|
#[derive(Clone, Debug, PartialEq, Eq, Hash, Encodable, Decodable)]
|
||||||
|
pub enum DiagnosticMessage {
|
||||||
|
/// Non-translatable diagnostic message.
|
||||||
|
Str(String),
|
||||||
|
/// Identifier for a Fluent message corresponding to the diagnostic message.
|
||||||
|
FluentIdentifier(String),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DiagnosticMessage {
|
||||||
|
/// Convert `DiagnosticMessage` to a `&str`.
|
||||||
|
pub fn as_str(&self) -> &str {
|
||||||
|
match self {
|
||||||
|
DiagnosticMessage::Str(msg) => msg,
|
||||||
|
DiagnosticMessage::FluentIdentifier(..) => unimplemented!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Convert `DiagnosticMessage` to an owned `String`.
|
||||||
|
pub fn to_string(self) -> String {
|
||||||
|
match self {
|
||||||
|
DiagnosticMessage::Str(msg) => msg,
|
||||||
|
DiagnosticMessage::FluentIdentifier(..) => unimplemented!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A span together with some additional data.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct SpanLabel {
|
||||||
|
/// The span we are going to include in the final snippet.
|
||||||
|
pub span: Span,
|
||||||
|
|
||||||
|
/// Is this a primary span? This is the "locus" of the message,
|
||||||
|
/// and is indicated with a `^^^^` underline, versus `----`.
|
||||||
|
pub is_primary: bool,
|
||||||
|
|
||||||
|
/// What label should we attach to this span (if any)?
|
||||||
|
pub label: Option<DiagnosticMessage>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A collection of `Span`s.
|
||||||
|
///
|
||||||
|
/// Spans have two orthogonal attributes:
|
||||||
|
///
|
||||||
|
/// - They can be *primary spans*. In this case they are the locus of
|
||||||
|
/// the error, and would be rendered with `^^^`.
|
||||||
|
/// - They can have a *label*. In this case, the label is written next
|
||||||
|
/// to the mark in the snippet when we render.
|
||||||
|
#[derive(Clone, Debug, Hash, PartialEq, Eq, Encodable, Decodable)]
|
||||||
|
pub struct MultiSpan {
|
||||||
|
primary_spans: Vec<Span>,
|
||||||
|
span_labels: Vec<(Span, DiagnosticMessage)>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MultiSpan {
|
||||||
|
#[inline]
|
||||||
|
pub fn new() -> MultiSpan {
|
||||||
|
MultiSpan { primary_spans: vec![], span_labels: vec![] }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_span(primary_span: Span) -> MultiSpan {
|
||||||
|
MultiSpan { primary_spans: vec![primary_span], span_labels: vec![] }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_spans(mut vec: Vec<Span>) -> MultiSpan {
|
||||||
|
vec.sort();
|
||||||
|
MultiSpan { primary_spans: vec, span_labels: vec![] }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn push_span_label(&mut self, span: Span, label: String) {
|
||||||
|
self.span_labels.push((span, DiagnosticMessage::Str(label)));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn push_span_message(&mut self, span: Span, message: DiagnosticMessage) {
|
||||||
|
self.span_labels.push((span, message));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Selects the first primary span (if any).
|
||||||
|
pub fn primary_span(&self) -> Option<Span> {
|
||||||
|
self.primary_spans.first().cloned()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns all primary spans.
|
||||||
|
pub fn primary_spans(&self) -> &[Span] {
|
||||||
|
&self.primary_spans
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns `true` if any of the primary spans are displayable.
|
||||||
|
pub fn has_primary_spans(&self) -> bool {
|
||||||
|
self.primary_spans.iter().any(|sp| !sp.is_dummy())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns `true` if this contains only a dummy primary span with any hygienic context.
|
||||||
|
pub fn is_dummy(&self) -> bool {
|
||||||
|
let mut is_dummy = true;
|
||||||
|
for span in &self.primary_spans {
|
||||||
|
if !span.is_dummy() {
|
||||||
|
is_dummy = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is_dummy
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Replaces all occurrences of one Span with another. Used to move `Span`s in areas that don't
|
||||||
|
/// display well (like std macros). Returns whether replacements occurred.
|
||||||
|
pub fn replace(&mut self, before: Span, after: Span) -> bool {
|
||||||
|
let mut replacements_occurred = false;
|
||||||
|
for primary_span in &mut self.primary_spans {
|
||||||
|
if *primary_span == before {
|
||||||
|
*primary_span = after;
|
||||||
|
replacements_occurred = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for span_label in &mut self.span_labels {
|
||||||
|
if span_label.0 == before {
|
||||||
|
span_label.0 = after;
|
||||||
|
replacements_occurred = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
replacements_occurred
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the strings to highlight. We always ensure that there
|
||||||
|
/// is an entry for each of the primary spans -- for each primary
|
||||||
|
/// span `P`, if there is at least one label with span `P`, we return
|
||||||
|
/// those labels (marked as primary). But otherwise we return
|
||||||
|
/// `SpanLabel` instances with empty labels.
|
||||||
|
pub fn span_labels(&self) -> Vec<SpanLabel> {
|
||||||
|
let is_primary = |span| self.primary_spans.contains(&span);
|
||||||
|
|
||||||
|
let mut span_labels = self
|
||||||
|
.span_labels
|
||||||
|
.iter()
|
||||||
|
.map(|&(span, ref label)| SpanLabel {
|
||||||
|
span,
|
||||||
|
is_primary: is_primary(span),
|
||||||
|
label: Some(label.clone()),
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
for &span in &self.primary_spans {
|
||||||
|
if !span_labels.iter().any(|sl| sl.span == span) {
|
||||||
|
span_labels.push(SpanLabel { span, is_primary: true, label: None });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
span_labels
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns `true` if any of the span labels is displayable.
|
||||||
|
pub fn has_span_labels(&self) -> bool {
|
||||||
|
self.span_labels.iter().any(|(sp, _)| !sp.is_dummy())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Span> for MultiSpan {
|
||||||
|
fn from(span: Span) -> MultiSpan {
|
||||||
|
MultiSpan::from_span(span)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Vec<Span>> for MultiSpan {
|
||||||
|
fn from(spans: Vec<Span>) -> MultiSpan {
|
||||||
|
MultiSpan::from_spans(spans)
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,6 +8,7 @@ doctest = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tracing = "0.1"
|
tracing = "0.1"
|
||||||
|
rustc_error_messages = { path = "../rustc_error_messages" }
|
||||||
rustc_serialize = { path = "../rustc_serialize" }
|
rustc_serialize = { path = "../rustc_serialize" }
|
||||||
rustc_span = { path = "../rustc_span" }
|
rustc_span = { path = "../rustc_span" }
|
||||||
rustc_macros = { path = "../rustc_macros" }
|
rustc_macros = { path = "../rustc_macros" }
|
||||||
|
|
|
@ -7,12 +7,12 @@
|
||||||
|
|
||||||
use crate::emitter::FileWithAnnotatedLines;
|
use crate::emitter::FileWithAnnotatedLines;
|
||||||
use crate::snippet::Line;
|
use crate::snippet::Line;
|
||||||
use crate::{CodeSuggestion, Diagnostic, DiagnosticId, Emitter, Level, SubDiagnostic};
|
use crate::{CodeSuggestion, Diagnostic, DiagnosticId, Emitter, Level, MultiSpan, SubDiagnostic};
|
||||||
use annotate_snippets::display_list::{DisplayList, FormatOptions};
|
use annotate_snippets::display_list::{DisplayList, FormatOptions};
|
||||||
use annotate_snippets::snippet::*;
|
use annotate_snippets::snippet::*;
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
use rustc_span::source_map::SourceMap;
|
use rustc_span::source_map::SourceMap;
|
||||||
use rustc_span::{MultiSpan, SourceFile};
|
use rustc_span::SourceFile;
|
||||||
|
|
||||||
/// Generates diagnostics using annotate-snippet
|
/// Generates diagnostics using annotate-snippet
|
||||||
pub struct AnnotateSnippetEmitterWriter {
|
pub struct AnnotateSnippetEmitterWriter {
|
||||||
|
|
|
@ -1,15 +1,13 @@
|
||||||
use crate::snippet::Style;
|
use crate::snippet::Style;
|
||||||
use crate::CodeSuggestion;
|
use crate::{
|
||||||
use crate::Level;
|
CodeSuggestion, DiagnosticMessage, Level, MultiSpan, Substitution, SubstitutionPart,
|
||||||
use crate::Substitution;
|
SuggestionStyle, ToolMetadata,
|
||||||
use crate::SubstitutionPart;
|
};
|
||||||
use crate::SuggestionStyle;
|
|
||||||
use crate::ToolMetadata;
|
|
||||||
use rustc_data_structures::stable_map::FxHashMap;
|
use rustc_data_structures::stable_map::FxHashMap;
|
||||||
use rustc_lint_defs::{Applicability, LintExpectationId};
|
use rustc_lint_defs::{Applicability, LintExpectationId};
|
||||||
use rustc_serialize::json::Json;
|
use rustc_serialize::json::Json;
|
||||||
use rustc_span::edition::LATEST_STABLE_EDITION;
|
use rustc_span::edition::LATEST_STABLE_EDITION;
|
||||||
use rustc_span::{MultiSpan, Span, DUMMY_SP};
|
use rustc_span::{Span, DUMMY_SP};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
|
|
||||||
|
@ -18,34 +16,6 @@ use std::hash::{Hash, Hasher};
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Hash, Encodable, Decodable)]
|
#[derive(Clone, Debug, PartialEq, Eq, Hash, Encodable, Decodable)]
|
||||||
pub struct SuggestionsDisabled;
|
pub struct SuggestionsDisabled;
|
||||||
|
|
||||||
/// Abstraction over a message in a diagnostic to support both translatable and non-translatable
|
|
||||||
/// diagnostic messages.
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Hash, Encodable, Decodable)]
|
|
||||||
pub enum DiagnosticMessage {
|
|
||||||
/// Non-translatable diagnostic message.
|
|
||||||
Str(String),
|
|
||||||
/// Identifier for a Fluent message corresponding to the diagnostic message.
|
|
||||||
FluentIdentifier(String),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl DiagnosticMessage {
|
|
||||||
/// Convert `DiagnosticMessage` to a `&str`.
|
|
||||||
pub fn as_str(&self) -> &str {
|
|
||||||
match self {
|
|
||||||
DiagnosticMessage::Str(msg) => msg,
|
|
||||||
DiagnosticMessage::FluentIdentifier(..) => unimplemented!(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Convert `DiagnosticMessage` to an owned `String`.
|
|
||||||
pub fn to_string(self) -> String {
|
|
||||||
match self {
|
|
||||||
DiagnosticMessage::Str(msg) => msg,
|
|
||||||
DiagnosticMessage::FluentIdentifier(..) => unimplemented!(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
#[derive(Clone, Debug, Encodable, Decodable)]
|
#[derive(Clone, Debug, Encodable, Decodable)]
|
||||||
pub struct Diagnostic {
|
pub struct Diagnostic {
|
||||||
|
@ -262,7 +232,7 @@ impl Diagnostic {
|
||||||
self.set_span(after);
|
self.set_span(after);
|
||||||
for span_label in before.span_labels() {
|
for span_label in before.span_labels() {
|
||||||
if let Some(label) = span_label.label {
|
if let Some(label) = span_label.label {
|
||||||
self.span_label(after, label);
|
self.span.push_span_message(after, label);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self
|
self
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
use crate::{Diagnostic, DiagnosticId, DiagnosticStyledString, ErrorGuaranteed};
|
use crate::{Diagnostic, DiagnosticId, DiagnosticStyledString, ErrorGuaranteed};
|
||||||
use crate::{Handler, Level, StashKey};
|
use crate::{Handler, Level, MultiSpan, StashKey};
|
||||||
use rustc_lint_defs::Applicability;
|
use rustc_lint_defs::Applicability;
|
||||||
|
|
||||||
use rustc_span::{MultiSpan, Span};
|
use rustc_span::Span;
|
||||||
use std::fmt::{self, Debug};
|
use std::fmt::{self, Debug};
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
|
|
|
@ -10,13 +10,13 @@
|
||||||
use Destination::*;
|
use Destination::*;
|
||||||
|
|
||||||
use rustc_span::source_map::SourceMap;
|
use rustc_span::source_map::SourceMap;
|
||||||
use rustc_span::{MultiSpan, SourceFile, Span};
|
use rustc_span::{SourceFile, Span};
|
||||||
|
|
||||||
use crate::snippet::{Annotation, AnnotationType, Line, MultilineAnnotation, Style, StyledString};
|
use crate::snippet::{Annotation, AnnotationType, Line, MultilineAnnotation, Style, StyledString};
|
||||||
use crate::styled_buffer::StyledBuffer;
|
use crate::styled_buffer::StyledBuffer;
|
||||||
use crate::{
|
use crate::{
|
||||||
CodeSuggestion, Diagnostic, DiagnosticId, DiagnosticMessage, Handler, Level, SubDiagnostic,
|
CodeSuggestion, Diagnostic, DiagnosticId, DiagnosticMessage, Handler, Level, MultiSpan,
|
||||||
SubstitutionHighlight, SuggestionStyle,
|
SubDiagnostic, SubstitutionHighlight, SuggestionStyle,
|
||||||
};
|
};
|
||||||
|
|
||||||
use rustc_lint_defs::pluralize;
|
use rustc_lint_defs::pluralize;
|
||||||
|
@ -2003,7 +2003,7 @@ impl FileWithAnnotatedLines {
|
||||||
start_col: lo.col_display,
|
start_col: lo.col_display,
|
||||||
end_col: hi.col_display,
|
end_col: hi.col_display,
|
||||||
is_primary: span_label.is_primary,
|
is_primary: span_label.is_primary,
|
||||||
label: span_label.label,
|
label: span_label.label.map(|m| m.to_string()),
|
||||||
overlaps_exactly: false,
|
overlaps_exactly: false,
|
||||||
};
|
};
|
||||||
multiline_annotations.push((lo.file, ml));
|
multiline_annotations.push((lo.file, ml));
|
||||||
|
@ -2012,7 +2012,7 @@ impl FileWithAnnotatedLines {
|
||||||
start_col: lo.col_display,
|
start_col: lo.col_display,
|
||||||
end_col: hi.col_display,
|
end_col: hi.col_display,
|
||||||
is_primary: span_label.is_primary,
|
is_primary: span_label.is_primary,
|
||||||
label: span_label.label,
|
label: span_label.label.map(|m| m.to_string()),
|
||||||
annotation_type: AnnotationType::Singleline,
|
annotation_type: AnnotationType::Singleline,
|
||||||
};
|
};
|
||||||
add_annotation_to_file(&mut output, lo.file, lo.line, ann);
|
add_annotation_to_file(&mut output, lo.file, lo.line, ann);
|
||||||
|
|
|
@ -15,12 +15,12 @@ use crate::emitter::{Emitter, HumanReadableErrorType};
|
||||||
use crate::registry::Registry;
|
use crate::registry::Registry;
|
||||||
use crate::DiagnosticId;
|
use crate::DiagnosticId;
|
||||||
use crate::ToolMetadata;
|
use crate::ToolMetadata;
|
||||||
use crate::{CodeSuggestion, SubDiagnostic};
|
use crate::{CodeSuggestion, MultiSpan, SpanLabel, SubDiagnostic};
|
||||||
use rustc_lint_defs::Applicability;
|
use rustc_lint_defs::Applicability;
|
||||||
|
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
use rustc_span::hygiene::ExpnData;
|
use rustc_span::hygiene::ExpnData;
|
||||||
use rustc_span::{MultiSpan, Span, SpanLabel};
|
use rustc_span::Span;
|
||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
@ -423,7 +423,13 @@ impl DiagnosticSpan {
|
||||||
suggestion: Option<(&String, Applicability)>,
|
suggestion: Option<(&String, Applicability)>,
|
||||||
je: &JsonEmitter,
|
je: &JsonEmitter,
|
||||||
) -> DiagnosticSpan {
|
) -> DiagnosticSpan {
|
||||||
Self::from_span_etc(span.span, span.is_primary, span.label, suggestion, je)
|
Self::from_span_etc(
|
||||||
|
span.span,
|
||||||
|
span.is_primary,
|
||||||
|
span.label.map(|m| m.to_string()),
|
||||||
|
suggestion,
|
||||||
|
je,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn from_span_etc(
|
fn from_span_etc(
|
||||||
|
|
|
@ -31,11 +31,12 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap};
|
||||||
use rustc_data_structures::stable_hasher::StableHasher;
|
use rustc_data_structures::stable_hasher::StableHasher;
|
||||||
use rustc_data_structures::sync::{self, Lock, Lrc};
|
use rustc_data_structures::sync::{self, Lock, Lrc};
|
||||||
use rustc_data_structures::AtomicRef;
|
use rustc_data_structures::AtomicRef;
|
||||||
|
pub use rustc_error_messages::{DiagnosticMessage, MultiSpan, SpanLabel};
|
||||||
pub use rustc_lint_defs::{pluralize, Applicability};
|
pub use rustc_lint_defs::{pluralize, Applicability};
|
||||||
use rustc_serialize::json::Json;
|
use rustc_serialize::json::Json;
|
||||||
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
|
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
|
||||||
use rustc_span::source_map::SourceMap;
|
use rustc_span::source_map::SourceMap;
|
||||||
use rustc_span::{Loc, MultiSpan, Span};
|
use rustc_span::{Loc, Span};
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
|
@ -55,6 +56,7 @@ mod lock;
|
||||||
pub mod registry;
|
pub mod registry;
|
||||||
mod snippet;
|
mod snippet;
|
||||||
mod styled_buffer;
|
mod styled_buffer;
|
||||||
|
|
||||||
pub use snippet::Style;
|
pub use snippet::Style;
|
||||||
|
|
||||||
pub type PResult<'a, T> = Result<T, DiagnosticBuilder<'a, ErrorGuaranteed>>;
|
pub type PResult<'a, T> = Result<T, DiagnosticBuilder<'a, ErrorGuaranteed>>;
|
||||||
|
@ -400,9 +402,7 @@ impl fmt::Display for ExplicitBug {
|
||||||
|
|
||||||
impl error::Error for ExplicitBug {}
|
impl error::Error for ExplicitBug {}
|
||||||
|
|
||||||
pub use diagnostic::{
|
pub use diagnostic::{Diagnostic, DiagnosticId, DiagnosticStyledString, SubDiagnostic};
|
||||||
Diagnostic, DiagnosticId, DiagnosticMessage, DiagnosticStyledString, SubDiagnostic,
|
|
||||||
};
|
|
||||||
pub use diagnostic_builder::{DiagnosticBuilder, EmissionGuarantee};
|
pub use diagnostic_builder::{DiagnosticBuilder, EmissionGuarantee};
|
||||||
use std::backtrace::Backtrace;
|
use std::backtrace::Backtrace;
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ use rustc_ast::{self as ast, AstLike, Attribute, Item, NodeId, PatKind};
|
||||||
use rustc_attr::{self as attr, Deprecation, Stability};
|
use rustc_attr::{self as attr, Deprecation, Stability};
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_data_structures::sync::{self, Lrc};
|
use rustc_data_structures::sync::{self, Lrc};
|
||||||
use rustc_errors::{Applicability, DiagnosticBuilder, ErrorGuaranteed};
|
use rustc_errors::{Applicability, DiagnosticBuilder, ErrorGuaranteed, MultiSpan};
|
||||||
use rustc_lint_defs::builtin::PROC_MACRO_BACK_COMPAT;
|
use rustc_lint_defs::builtin::PROC_MACRO_BACK_COMPAT;
|
||||||
use rustc_lint_defs::BuiltinLintDiagnostics;
|
use rustc_lint_defs::BuiltinLintDiagnostics;
|
||||||
use rustc_parse::{self, nt_to_tokenstream, parser, MACRO_ARGUMENTS};
|
use rustc_parse::{self, nt_to_tokenstream, parser, MACRO_ARGUMENTS};
|
||||||
|
@ -20,7 +20,7 @@ use rustc_span::edition::Edition;
|
||||||
use rustc_span::hygiene::{AstPass, ExpnData, ExpnKind, LocalExpnId};
|
use rustc_span::hygiene::{AstPass, ExpnData, ExpnKind, LocalExpnId};
|
||||||
use rustc_span::source_map::SourceMap;
|
use rustc_span::source_map::SourceMap;
|
||||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||||
use rustc_span::{MultiSpan, Span, DUMMY_SP};
|
use rustc_span::{Span, DUMMY_SP};
|
||||||
use smallvec::{smallvec, SmallVec};
|
use smallvec::{smallvec, SmallVec};
|
||||||
|
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
|
|
@ -109,10 +109,11 @@ use crate::mbe::{KleeneToken, TokenTree};
|
||||||
use rustc_ast::token::{DelimToken, Token, TokenKind};
|
use rustc_ast::token::{DelimToken, Token, TokenKind};
|
||||||
use rustc_ast::{NodeId, DUMMY_NODE_ID};
|
use rustc_ast::{NodeId, DUMMY_NODE_ID};
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
|
use rustc_errors::MultiSpan;
|
||||||
use rustc_session::lint::builtin::META_VARIABLE_MISUSE;
|
use rustc_session::lint::builtin::META_VARIABLE_MISUSE;
|
||||||
use rustc_session::parse::ParseSess;
|
use rustc_session::parse::ParseSess;
|
||||||
use rustc_span::symbol::kw;
|
use rustc_span::symbol::kw;
|
||||||
use rustc_span::{symbol::MacroRulesNormalizedIdent, MultiSpan, Span};
|
use rustc_span::{symbol::MacroRulesNormalizedIdent, Span};
|
||||||
|
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
|
|
||||||
|
|
|
@ -7,13 +7,13 @@ use rustc_ast::tokenstream::{DelimSpan, Spacing::*, TokenStream, TreeAndSpacing}
|
||||||
use rustc_ast_pretty::pprust;
|
use rustc_ast_pretty::pprust;
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
use rustc_errors::{Diagnostic, PResult};
|
use rustc_errors::{Diagnostic, MultiSpan, PResult};
|
||||||
use rustc_parse::lexer::nfc_normalize;
|
use rustc_parse::lexer::nfc_normalize;
|
||||||
use rustc_parse::{nt_to_tokenstream, parse_stream_from_source_str};
|
use rustc_parse::{nt_to_tokenstream, parse_stream_from_source_str};
|
||||||
use rustc_session::parse::ParseSess;
|
use rustc_session::parse::ParseSess;
|
||||||
use rustc_span::def_id::CrateNum;
|
use rustc_span::def_id::CrateNum;
|
||||||
use rustc_span::symbol::{self, kw, sym, Symbol};
|
use rustc_span::symbol::{self, kw, sym, Symbol};
|
||||||
use rustc_span::{BytePos, FileName, MultiSpan, Pos, SourceFile, Span};
|
use rustc_span::{BytePos, FileName, Pos, SourceFile, Span};
|
||||||
|
|
||||||
use pm::bridge::{server, TokenTree};
|
use pm::bridge::{server, TokenTree};
|
||||||
use pm::{Delimiter, Level, LineColumn, Spacing};
|
use pm::{Delimiter, Level, LineColumn, Spacing};
|
||||||
|
|
|
@ -4,11 +4,11 @@ use rustc_parse::{new_parser_from_source_str, parser::Parser, source_file_to_str
|
||||||
use rustc_session::parse::ParseSess;
|
use rustc_session::parse::ParseSess;
|
||||||
use rustc_span::create_default_session_if_not_set_then;
|
use rustc_span::create_default_session_if_not_set_then;
|
||||||
use rustc_span::source_map::{FilePathMapping, SourceMap};
|
use rustc_span::source_map::{FilePathMapping, SourceMap};
|
||||||
use rustc_span::{BytePos, MultiSpan, Span};
|
use rustc_span::{BytePos, Span};
|
||||||
|
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
use rustc_errors::emitter::EmitterWriter;
|
use rustc_errors::emitter::EmitterWriter;
|
||||||
use rustc_errors::{Handler, PResult};
|
use rustc_errors::{Handler, MultiSpan, PResult};
|
||||||
|
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
|
|
|
@ -11,6 +11,7 @@ rustc_target = { path = "../rustc_target" }
|
||||||
rustc_feature = { path = "../rustc_feature" }
|
rustc_feature = { path = "../rustc_feature" }
|
||||||
rustc_macros = { path = "../rustc_macros" }
|
rustc_macros = { path = "../rustc_macros" }
|
||||||
rustc_data_structures = { path = "../rustc_data_structures" }
|
rustc_data_structures = { path = "../rustc_data_structures" }
|
||||||
|
rustc_error_messages = { path = "../rustc_error_messages" }
|
||||||
rustc_index = { path = "../rustc_index" }
|
rustc_index = { path = "../rustc_index" }
|
||||||
rustc_span = { path = "../rustc_span" }
|
rustc_span = { path = "../rustc_span" }
|
||||||
rustc_serialize = { path = "../rustc_serialize" }
|
rustc_serialize = { path = "../rustc_serialize" }
|
||||||
|
|
|
@ -13,12 +13,13 @@ use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece};
|
||||||
use rustc_data_structures::fingerprint::Fingerprint;
|
use rustc_data_structures::fingerprint::Fingerprint;
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_data_structures::sorted_map::SortedMap;
|
use rustc_data_structures::sorted_map::SortedMap;
|
||||||
|
use rustc_error_messages::MultiSpan;
|
||||||
use rustc_index::vec::IndexVec;
|
use rustc_index::vec::IndexVec;
|
||||||
use rustc_macros::HashStable_Generic;
|
use rustc_macros::HashStable_Generic;
|
||||||
use rustc_span::hygiene::MacroKind;
|
use rustc_span::hygiene::MacroKind;
|
||||||
use rustc_span::source_map::Spanned;
|
use rustc_span::source_map::Spanned;
|
||||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||||
use rustc_span::{def_id::LocalDefId, BytePos, MultiSpan, Span, DUMMY_SP};
|
use rustc_span::{def_id::LocalDefId, BytePos, Span, DUMMY_SP};
|
||||||
use rustc_target::asm::InlineAsmRegOrRegClass;
|
use rustc_target::asm::InlineAsmRegOrRegClass;
|
||||||
use rustc_target::spec::abi::Abi;
|
use rustc_target::spec::abi::Abi;
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ use crate::traits::{
|
||||||
|
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_errors::{pluralize, struct_span_err, Diagnostic, ErrorGuaranteed};
|
use rustc_errors::{pluralize, struct_span_err, Diagnostic, ErrorGuaranteed};
|
||||||
use rustc_errors::{Applicability, DiagnosticBuilder, DiagnosticStyledString};
|
use rustc_errors::{Applicability, DiagnosticBuilder, DiagnosticStyledString, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::lang_items::LangItem;
|
use rustc_hir::lang_items::LangItem;
|
||||||
|
@ -72,7 +72,7 @@ use rustc_middle::ty::{
|
||||||
subst::{GenericArgKind, Subst, SubstsRef},
|
subst::{GenericArgKind, Subst, SubstsRef},
|
||||||
Binder, List, Region, Ty, TyCtxt, TypeFoldable,
|
Binder, List, Region, Ty, TyCtxt, TypeFoldable,
|
||||||
};
|
};
|
||||||
use rustc_span::{sym, BytePos, DesugaringKind, MultiSpan, Pos, Span};
|
use rustc_span::{sym, BytePos, DesugaringKind, Pos, Span};
|
||||||
use rustc_target::spec::abi;
|
use rustc_target::spec::abi;
|
||||||
use std::ops::ControlFlow;
|
use std::ops::ControlFlow;
|
||||||
use std::{cmp, fmt, iter};
|
use std::{cmp, fmt, iter};
|
||||||
|
|
|
@ -7,11 +7,10 @@ use crate::infer::lexical_region_resolve::RegionResolutionError;
|
||||||
use crate::infer::{SubregionOrigin, TypeTrace};
|
use crate::infer::{SubregionOrigin, TypeTrace};
|
||||||
use crate::traits::ObligationCauseCode;
|
use crate::traits::ObligationCauseCode;
|
||||||
use rustc_data_structures::stable_set::FxHashSet;
|
use rustc_data_structures::stable_set::FxHashSet;
|
||||||
use rustc_errors::{Applicability, ErrorGuaranteed};
|
use rustc_errors::{Applicability, ErrorGuaranteed, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::intravisit::Visitor;
|
use rustc_hir::intravisit::Visitor;
|
||||||
use rustc_middle::ty::TypeVisitor;
|
use rustc_middle::ty::TypeVisitor;
|
||||||
use rustc_span::MultiSpan;
|
|
||||||
|
|
||||||
impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
|
impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
|
||||||
pub(super) fn try_report_mismatched_static_lifetime(&self) -> Option<ErrorGuaranteed> {
|
pub(super) fn try_report_mismatched_static_lifetime(&self) -> Option<ErrorGuaranteed> {
|
||||||
|
|
|
@ -5,7 +5,7 @@ use crate::infer::lexical_region_resolve::RegionResolutionError;
|
||||||
use crate::infer::{SubregionOrigin, TypeTrace};
|
use crate::infer::{SubregionOrigin, TypeTrace};
|
||||||
use crate::traits::{ObligationCauseCode, UnifyReceiverContext};
|
use crate::traits::{ObligationCauseCode, UnifyReceiverContext};
|
||||||
use rustc_data_structures::stable_set::FxHashSet;
|
use rustc_data_structures::stable_set::FxHashSet;
|
||||||
use rustc_errors::{struct_span_err, Applicability, Diagnostic, ErrorGuaranteed};
|
use rustc_errors::{struct_span_err, Applicability, Diagnostic, ErrorGuaranteed, MultiSpan};
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::intravisit::{walk_ty, Visitor};
|
use rustc_hir::intravisit::{walk_ty, Visitor};
|
||||||
use rustc_hir::{self as hir, GenericBound, Item, ItemKind, Lifetime, LifetimeName, Node, TyKind};
|
use rustc_hir::{self as hir, GenericBound, Item, ItemKind, Lifetime, LifetimeName, Node, TyKind};
|
||||||
|
@ -13,7 +13,7 @@ use rustc_middle::ty::{
|
||||||
self, AssocItemContainer, StaticLifetimeVisitor, Ty, TyCtxt, TypeFoldable, TypeVisitor,
|
self, AssocItemContainer, StaticLifetimeVisitor, Ty, TyCtxt, TypeFoldable, TypeVisitor,
|
||||||
};
|
};
|
||||||
use rustc_span::symbol::Ident;
|
use rustc_span::symbol::Ident;
|
||||||
use rustc_span::{MultiSpan, Span};
|
use rustc_span::Span;
|
||||||
|
|
||||||
use std::ops::ControlFlow;
|
use std::ops::ControlFlow;
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ use crate::infer::error_reporting::nice_region_error::NiceRegionError;
|
||||||
use crate::infer::lexical_region_resolve::RegionResolutionError;
|
use crate::infer::lexical_region_resolve::RegionResolutionError;
|
||||||
use crate::infer::{SubregionOrigin, Subtype};
|
use crate::infer::{SubregionOrigin, Subtype};
|
||||||
use crate::traits::ObligationCauseCode::CompareImplMethodObligation;
|
use crate::traits::ObligationCauseCode::CompareImplMethodObligation;
|
||||||
use rustc_errors::ErrorGuaranteed;
|
use rustc_errors::{ErrorGuaranteed, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::Res;
|
use rustc_hir::def::Res;
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
|
@ -12,8 +12,7 @@ use rustc_hir::intravisit::Visitor;
|
||||||
use rustc_middle::hir::nested_filter;
|
use rustc_middle::hir::nested_filter;
|
||||||
use rustc_middle::ty::print::RegionHighlightMode;
|
use rustc_middle::ty::print::RegionHighlightMode;
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable, TypeVisitor};
|
use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable, TypeVisitor};
|
||||||
|
use rustc_span::{Span, Symbol};
|
||||||
use rustc_span::{MultiSpan, Span, Symbol};
|
|
||||||
|
|
||||||
use std::ops::ControlFlow;
|
use std::ops::ControlFlow;
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,11 @@ use super::ObjectSafetyViolation;
|
||||||
|
|
||||||
use crate::infer::InferCtxt;
|
use crate::infer::InferCtxt;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::{struct_span_err, DiagnosticBuilder, ErrorGuaranteed};
|
use rustc_errors::{struct_span_err, DiagnosticBuilder, ErrorGuaranteed, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
use rustc_span::{MultiSpan, Span};
|
use rustc_span::Span;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ use rustc_codegen_ssa::traits::CodegenBackend;
|
||||||
use rustc_data_structures::parallel;
|
use rustc_data_structures::parallel;
|
||||||
use rustc_data_structures::sync::{Lrc, OnceCell, WorkerLocal};
|
use rustc_data_structures::sync::{Lrc, OnceCell, WorkerLocal};
|
||||||
use rustc_data_structures::temp_dir::MaybeTempDir;
|
use rustc_data_structures::temp_dir::MaybeTempDir;
|
||||||
use rustc_errors::{Applicability, ErrorGuaranteed, PResult};
|
use rustc_errors::{Applicability, ErrorGuaranteed, MultiSpan, PResult};
|
||||||
use rustc_expand::base::{ExtCtxt, LintStoreExpand, ResolverExpand};
|
use rustc_expand::base::{ExtCtxt, LintStoreExpand, ResolverExpand};
|
||||||
use rustc_hir::def_id::{StableCrateId, LOCAL_CRATE};
|
use rustc_hir::def_id::{StableCrateId, LOCAL_CRATE};
|
||||||
use rustc_hir::Crate;
|
use rustc_hir::Crate;
|
||||||
|
@ -35,7 +35,7 @@ use rustc_session::output::{filename_for_input, filename_for_metadata};
|
||||||
use rustc_session::search_paths::PathKind;
|
use rustc_session::search_paths::PathKind;
|
||||||
use rustc_session::{Limit, Session};
|
use rustc_session::{Limit, Session};
|
||||||
use rustc_span::symbol::{sym, Symbol};
|
use rustc_span::symbol::{sym, Symbol};
|
||||||
use rustc_span::{FileName, MultiSpan};
|
use rustc_span::FileName;
|
||||||
use rustc_trait_selection::traits;
|
use rustc_trait_selection::traits;
|
||||||
use rustc_typeck as typeck;
|
use rustc_typeck as typeck;
|
||||||
use tempfile::Builder as TempFileBuilder;
|
use tempfile::Builder as TempFileBuilder;
|
||||||
|
|
|
@ -31,7 +31,7 @@ use rustc_ast::{self as ast, *};
|
||||||
use rustc_ast_pretty::pprust::{self, expr_to_string};
|
use rustc_ast_pretty::pprust::{self, expr_to_string};
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||||
use rustc_errors::{Applicability, Diagnostic, DiagnosticStyledString};
|
use rustc_errors::{Applicability, Diagnostic, DiagnosticStyledString, MultiSpan};
|
||||||
use rustc_feature::{deprecated_attributes, AttributeGate, BuiltinAttribute, GateIssue, Stability};
|
use rustc_feature::{deprecated_attributes, AttributeGate, BuiltinAttribute, GateIssue, Stability};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{DefKind, Res};
|
use rustc_hir::def::{DefKind, Res};
|
||||||
|
@ -49,7 +49,7 @@ use rustc_session::lint::{BuiltinLintDiagnostics, FutureIncompatibilityReason};
|
||||||
use rustc_span::edition::Edition;
|
use rustc_span::edition::Edition;
|
||||||
use rustc_span::source_map::Spanned;
|
use rustc_span::source_map::Spanned;
|
||||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||||
use rustc_span::{BytePos, InnerSpan, MultiSpan, Span};
|
use rustc_span::{BytePos, InnerSpan, Span};
|
||||||
use rustc_target::abi::VariantIdx;
|
use rustc_target::abi::VariantIdx;
|
||||||
use rustc_trait_selection::traits::{self, misc::can_type_implement_copy};
|
use rustc_trait_selection::traits::{self, misc::can_type_implement_copy};
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ use crate::passes::{EarlyLintPassObject, LateLintPassObject};
|
||||||
use rustc_ast::util::unicode::TEXT_FLOW_CONTROL_CHARS;
|
use rustc_ast::util::unicode::TEXT_FLOW_CONTROL_CHARS;
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_data_structures::sync;
|
use rustc_data_structures::sync;
|
||||||
use rustc_errors::{struct_span_err, Applicability, SuggestionStyle};
|
use rustc_errors::{struct_span_err, Applicability, MultiSpan, SuggestionStyle};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::Res;
|
use rustc_hir::def::Res;
|
||||||
use rustc_hir::def_id::{CrateNum, DefId};
|
use rustc_hir::def_id::{CrateNum, DefId};
|
||||||
|
@ -38,7 +38,7 @@ use rustc_session::lint::{FutureIncompatibleInfo, Level, Lint, LintBuffer, LintI
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::lev_distance::find_best_match_for_name;
|
use rustc_span::lev_distance::find_best_match_for_name;
|
||||||
use rustc_span::symbol::{sym, Ident, Symbol};
|
use rustc_span::symbol::{sym, Ident, Symbol};
|
||||||
use rustc_span::{BytePos, MultiSpan, Span, DUMMY_SP};
|
use rustc_span::{BytePos, Span, DUMMY_SP};
|
||||||
use rustc_target::abi;
|
use rustc_target::abi;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ use crate::late::unerased_lint_store;
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_ast_pretty::pprust;
|
use rustc_ast_pretty::pprust;
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_errors::{struct_span_err, Applicability, Diagnostic};
|
use rustc_errors::{struct_span_err, Applicability, Diagnostic, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::{intravisit, HirId};
|
use rustc_hir::{intravisit, HirId};
|
||||||
use rustc_middle::hir::nested_filter;
|
use rustc_middle::hir::nested_filter;
|
||||||
|
@ -20,7 +20,7 @@ use rustc_session::lint::{
|
||||||
use rustc_session::parse::{add_feature_diagnostics, feature_err};
|
use rustc_session::parse::{add_feature_diagnostics, feature_err};
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::symbol::{sym, Symbol};
|
use rustc_span::symbol::{sym, Symbol};
|
||||||
use rustc_span::{source_map::MultiSpan, Span, DUMMY_SP};
|
use rustc_span::{Span, DUMMY_SP};
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
fn lint_levels(tcx: TyCtxt<'_>, (): ()) -> LintLevelMap {
|
fn lint_levels(tcx: TyCtxt<'_>, (): ()) -> LintLevelMap {
|
||||||
|
|
|
@ -3,7 +3,7 @@ use crate::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext}
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_ast::util::{classify, parser};
|
use rustc_ast::util::{classify, parser};
|
||||||
use rustc_ast::{ExprKind, StmtKind};
|
use rustc_ast::{ExprKind, StmtKind};
|
||||||
use rustc_errors::{pluralize, Applicability};
|
use rustc_errors::{pluralize, Applicability, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{DefKind, Res};
|
use rustc_hir::def::{DefKind, Res};
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
|
@ -11,7 +11,7 @@ use rustc_middle::ty::adjustment;
|
||||||
use rustc_middle::ty::{self, Ty};
|
use rustc_middle::ty::{self, Ty};
|
||||||
use rustc_span::symbol::Symbol;
|
use rustc_span::symbol::Symbol;
|
||||||
use rustc_span::symbol::{kw, sym};
|
use rustc_span::symbol::{kw, sym};
|
||||||
use rustc_span::{BytePos, MultiSpan, Span, DUMMY_SP};
|
use rustc_span::{BytePos, Span, DUMMY_SP};
|
||||||
|
|
||||||
declare_lint! {
|
declare_lint! {
|
||||||
/// The `unused_must_use` lint detects unused result of a type flagged as
|
/// The `unused_must_use` lint detects unused result of a type flagged as
|
||||||
|
|
|
@ -6,6 +6,7 @@ edition = "2021"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rustc_ast = { path = "../rustc_ast" }
|
rustc_ast = { path = "../rustc_ast" }
|
||||||
rustc_data_structures = { path = "../rustc_data_structures" }
|
rustc_data_structures = { path = "../rustc_data_structures" }
|
||||||
|
rustc_error_messages = { path = "../rustc_error_messages" }
|
||||||
rustc_span = { path = "../rustc_span" }
|
rustc_span = { path = "../rustc_span" }
|
||||||
rustc_serialize = { path = "../rustc_serialize" }
|
rustc_serialize = { path = "../rustc_serialize" }
|
||||||
rustc_macros = { path = "../rustc_macros" }
|
rustc_macros = { path = "../rustc_macros" }
|
||||||
|
|
|
@ -7,10 +7,11 @@ pub use self::Level::*;
|
||||||
use rustc_ast::node_id::{NodeId, NodeMap};
|
use rustc_ast::node_id::{NodeId, NodeMap};
|
||||||
use rustc_ast::{AttrId, Attribute};
|
use rustc_ast::{AttrId, Attribute};
|
||||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey};
|
use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey};
|
||||||
|
use rustc_error_messages::MultiSpan;
|
||||||
use rustc_hir::HirId;
|
use rustc_hir::HirId;
|
||||||
use rustc_serialize::json::Json;
|
use rustc_serialize::json::Json;
|
||||||
use rustc_span::edition::Edition;
|
use rustc_span::edition::Edition;
|
||||||
use rustc_span::{sym, symbol::Ident, MultiSpan, Span, Symbol};
|
use rustc_span::{sym, symbol::Ident, Span, Symbol};
|
||||||
use rustc_target::spec::abi::Abi;
|
use rustc_target::spec::abi::Abi;
|
||||||
|
|
||||||
pub mod builtin;
|
pub mod builtin;
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std::cmp;
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
Diagnostic, DiagnosticBuilder, DiagnosticId, EmissionGuarantee, ErrorGuaranteed,
|
Diagnostic, DiagnosticBuilder, DiagnosticId, EmissionGuarantee, ErrorGuaranteed, MultiSpan,
|
||||||
};
|
};
|
||||||
use rustc_hir::HirId;
|
use rustc_hir::HirId;
|
||||||
use rustc_index::vec::IndexVec;
|
use rustc_index::vec::IndexVec;
|
||||||
|
@ -14,7 +14,7 @@ use rustc_session::lint::{
|
||||||
};
|
};
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::hygiene::MacroKind;
|
use rustc_span::hygiene::MacroKind;
|
||||||
use rustc_span::source_map::{DesugaringKind, ExpnKind, MultiSpan};
|
use rustc_span::source_map::{DesugaringKind, ExpnKind};
|
||||||
use rustc_span::{symbol, Span, Symbol, DUMMY_SP};
|
use rustc_span::{symbol, Span, Symbol, DUMMY_SP};
|
||||||
|
|
||||||
/// How a lint level was set.
|
/// How a lint level was set.
|
||||||
|
|
|
@ -34,7 +34,7 @@ use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||||
use rustc_data_structures::steal::Steal;
|
use rustc_data_structures::steal::Steal;
|
||||||
use rustc_data_structures::sync::{self, Lock, Lrc, WorkerLocal};
|
use rustc_data_structures::sync::{self, Lock, Lrc, WorkerLocal};
|
||||||
use rustc_data_structures::vec_map::VecMap;
|
use rustc_data_structures::vec_map::VecMap;
|
||||||
use rustc_errors::ErrorGuaranteed;
|
use rustc_errors::{ErrorGuaranteed, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{DefKind, Res};
|
use rustc_hir::def::{DefKind, Res};
|
||||||
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LOCAL_CRATE};
|
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LOCAL_CRATE};
|
||||||
|
@ -54,7 +54,7 @@ use rustc_session::lint::{Level, Lint};
|
||||||
use rustc_session::Limit;
|
use rustc_session::Limit;
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::def_id::{DefPathHash, StableCrateId};
|
use rustc_span::def_id::{DefPathHash, StableCrateId};
|
||||||
use rustc_span::source_map::{MultiSpan, SourceMap};
|
use rustc_span::source_map::SourceMap;
|
||||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||||
use rustc_span::{Span, DUMMY_SP};
|
use rustc_span::{Span, DUMMY_SP};
|
||||||
use rustc_target::abi::{Layout, LayoutS, TargetDataLayout, VariantIdx};
|
use rustc_target::abi::{Layout, LayoutS, TargetDataLayout, VariantIdx};
|
||||||
|
|
|
@ -3,11 +3,11 @@ use crate::ty::diagnostics::suggest_constraining_type_param;
|
||||||
use crate::ty::print::{FmtPrinter, Printer};
|
use crate::ty::print::{FmtPrinter, Printer};
|
||||||
use crate::ty::{self, BoundRegionKind, Region, Ty, TyCtxt};
|
use crate::ty::{self, BoundRegionKind, Region, Ty, TyCtxt};
|
||||||
use rustc_errors::Applicability::{MachineApplicable, MaybeIncorrect};
|
use rustc_errors::Applicability::{MachineApplicable, MaybeIncorrect};
|
||||||
use rustc_errors::{pluralize, Diagnostic};
|
use rustc_errors::{pluralize, Diagnostic, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_span::symbol::{sym, Symbol};
|
use rustc_span::symbol::{sym, Symbol};
|
||||||
use rustc_span::{BytePos, MultiSpan, Span};
|
use rustc_span::{BytePos, Span};
|
||||||
use rustc_target::spec::abi;
|
use rustc_target::spec::abi;
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
// These functions are used by macro expansion for bug! and span_bug!
|
// These functions are used by macro expansion for bug! and span_bug!
|
||||||
|
|
||||||
use crate::ty::{tls, TyCtxt};
|
use crate::ty::{tls, TyCtxt};
|
||||||
use rustc_span::{MultiSpan, Span};
|
use rustc_errors::MultiSpan;
|
||||||
|
use rustc_span::Span;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::panic::{panic_any, Location};
|
use std::panic::{panic_any, Location};
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ use rustc_arena::TypedArena;
|
||||||
use rustc_ast::Mutability;
|
use rustc_ast::Mutability;
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
error_code, pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder,
|
error_code, pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder,
|
||||||
ErrorGuaranteed,
|
ErrorGuaranteed, MultiSpan,
|
||||||
};
|
};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::*;
|
use rustc_hir::def::*;
|
||||||
|
@ -21,7 +21,7 @@ use rustc_session::lint::builtin::{
|
||||||
};
|
};
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::source_map::Spanned;
|
use rustc_span::source_map::Spanned;
|
||||||
use rustc_span::{BytePos, DesugaringKind, ExpnKind, MultiSpan, Span};
|
use rustc_span::{BytePos, DesugaringKind, ExpnKind, Span};
|
||||||
|
|
||||||
crate fn check_match(tcx: TyCtxt<'_>, def_id: DefId) {
|
crate fn check_match(tcx: TyCtxt<'_>, def_id: DefId) {
|
||||||
let body_id = match def_id.as_local() {
|
let body_id = match def_id.as_local() {
|
||||||
|
|
|
@ -18,10 +18,10 @@ use rustc_ast::{
|
||||||
use rustc_ast_pretty::pprust;
|
use rustc_ast_pretty::pprust;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::{pluralize, struct_span_err, Diagnostic, EmissionGuarantee, ErrorGuaranteed};
|
use rustc_errors::{pluralize, struct_span_err, Diagnostic, EmissionGuarantee, ErrorGuaranteed};
|
||||||
use rustc_errors::{Applicability, DiagnosticBuilder, Handler, PResult};
|
use rustc_errors::{Applicability, DiagnosticBuilder, Handler, MultiSpan, PResult};
|
||||||
use rustc_span::source_map::Spanned;
|
use rustc_span::source_map::Spanned;
|
||||||
use rustc_span::symbol::{kw, Ident};
|
use rustc_span::symbol::{kw, Ident};
|
||||||
use rustc_span::{MultiSpan, Span, SpanSnippetError, DUMMY_SP};
|
use rustc_span::{Span, SpanSnippetError, DUMMY_SP};
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
|
|
||||||
use std::mem::take;
|
use std::mem::take;
|
||||||
|
@ -1752,7 +1752,7 @@ impl<'a> Parser<'a> {
|
||||||
let mut primary_span: MultiSpan = primary_span.into();
|
let mut primary_span: MultiSpan = primary_span.into();
|
||||||
for span_label in err.span.span_labels() {
|
for span_label in err.span.span_labels() {
|
||||||
if let Some(label) = span_label.label {
|
if let Some(label) = span_label.label {
|
||||||
primary_span.push_span_label(span_label.span, label);
|
primary_span.push_span_message(span_label.span, label);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err.set_span(primary_span);
|
err.set_span(primary_span);
|
||||||
|
|
|
@ -33,10 +33,10 @@ use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
use rustc_errors::PResult;
|
use rustc_errors::PResult;
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
struct_span_err, Applicability, DiagnosticBuilder, ErrorGuaranteed, FatalError,
|
struct_span_err, Applicability, DiagnosticBuilder, ErrorGuaranteed, FatalError, MultiSpan,
|
||||||
};
|
};
|
||||||
use rustc_session::parse::ParseSess;
|
use rustc_session::parse::ParseSess;
|
||||||
use rustc_span::source_map::{MultiSpan, Span, DUMMY_SP};
|
use rustc_span::source_map::{Span, DUMMY_SP};
|
||||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
use rustc_ast::{ast, AttrStyle, Attribute, Lit, LitKind, MetaItemKind, NestedMetaItem};
|
use rustc_ast::{ast, AttrStyle, Attribute, Lit, LitKind, MetaItemKind, NestedMetaItem};
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_errors::{pluralize, struct_span_err, Applicability};
|
use rustc_errors::{pluralize, struct_span_err, Applicability, MultiSpan};
|
||||||
use rustc_feature::{AttributeDuplicates, AttributeType, BuiltinAttribute, BUILTIN_ATTRIBUTE_MAP};
|
use rustc_feature::{AttributeDuplicates, AttributeType, BuiltinAttribute, BUILTIN_ATTRIBUTE_MAP};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
|
use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
|
||||||
|
@ -21,7 +21,7 @@ use rustc_session::lint::builtin::{
|
||||||
};
|
};
|
||||||
use rustc_session::parse::feature_err;
|
use rustc_session::parse::feature_err;
|
||||||
use rustc_span::symbol::{sym, Symbol};
|
use rustc_span::symbol::{sym, Symbol};
|
||||||
use rustc_span::{MultiSpan, Span, DUMMY_SP};
|
use rustc_span::{Span, DUMMY_SP};
|
||||||
use std::collections::hash_map::Entry;
|
use std::collections::hash_map::Entry;
|
||||||
|
|
||||||
pub(crate) fn target_from_impl_item<'tcx>(
|
pub(crate) fn target_from_impl_item<'tcx>(
|
||||||
|
|
|
@ -32,10 +32,10 @@ use rustc_ast::node_id::NodeMap;
|
||||||
use rustc_ast::visit::{self, Visitor};
|
use rustc_ast::visit::{self, Visitor};
|
||||||
use rustc_ast_lowering::ResolverAstLowering;
|
use rustc_ast_lowering::ResolverAstLowering;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::pluralize;
|
use rustc_errors::{pluralize, MultiSpan};
|
||||||
use rustc_session::lint::builtin::{MACRO_USE_EXTERN_CRATE, UNUSED_IMPORTS};
|
use rustc_session::lint::builtin::{MACRO_USE_EXTERN_CRATE, UNUSED_IMPORTS};
|
||||||
use rustc_session::lint::BuiltinLintDiagnostics;
|
use rustc_session::lint::BuiltinLintDiagnostics;
|
||||||
use rustc_span::{MultiSpan, Span, DUMMY_SP};
|
use rustc_span::{Span, DUMMY_SP};
|
||||||
|
|
||||||
struct UnusedImport<'a> {
|
struct UnusedImport<'a> {
|
||||||
use_tree: &'a ast::UseTree,
|
use_tree: &'a ast::UseTree,
|
||||||
|
|
|
@ -4,7 +4,7 @@ use rustc_ast::{self as ast, Path};
|
||||||
use rustc_ast_pretty::pprust;
|
use rustc_ast_pretty::pprust;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
struct_span_err, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed,
|
struct_span_err, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed, MultiSpan,
|
||||||
};
|
};
|
||||||
use rustc_feature::BUILTIN_ATTRIBUTES;
|
use rustc_feature::BUILTIN_ATTRIBUTES;
|
||||||
use rustc_hir::def::Namespace::{self, *};
|
use rustc_hir::def::Namespace::{self, *};
|
||||||
|
@ -18,7 +18,7 @@ use rustc_span::hygiene::MacroKind;
|
||||||
use rustc_span::lev_distance::find_best_match_for_name;
|
use rustc_span::lev_distance::find_best_match_for_name;
|
||||||
use rustc_span::source_map::SourceMap;
|
use rustc_span::source_map::SourceMap;
|
||||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||||
use rustc_span::{BytePos, MultiSpan, Span};
|
use rustc_span::{BytePos, Span};
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
use crate::imports::{Import, ImportKind, ImportResolver};
|
use crate::imports::{Import, ImportKind, ImportResolver};
|
||||||
|
|
|
@ -12,7 +12,7 @@ use crate::{NameBinding, NameBindingKind, PathResult, PrivacyError, ToNameBindin
|
||||||
use rustc_ast::NodeId;
|
use rustc_ast::NodeId;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_data_structures::intern::Interned;
|
use rustc_data_structures::intern::Interned;
|
||||||
use rustc_errors::{pluralize, struct_span_err, Applicability};
|
use rustc_errors::{pluralize, struct_span_err, Applicability, MultiSpan};
|
||||||
use rustc_hir::def::{self, PartialRes};
|
use rustc_hir::def::{self, PartialRes};
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_middle::metadata::ModChild;
|
use rustc_middle::metadata::ModChild;
|
||||||
|
@ -23,7 +23,7 @@ use rustc_session::lint::BuiltinLintDiagnostics;
|
||||||
use rustc_span::hygiene::LocalExpnId;
|
use rustc_span::hygiene::LocalExpnId;
|
||||||
use rustc_span::lev_distance::find_best_match_for_name;
|
use rustc_span::lev_distance::find_best_match_for_name;
|
||||||
use rustc_span::symbol::{kw, Ident, Symbol};
|
use rustc_span::symbol::{kw, Ident, Symbol};
|
||||||
use rustc_span::{MultiSpan, Span};
|
use rustc_span::Span;
|
||||||
|
|
||||||
use tracing::*;
|
use tracing::*;
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ use rustc_ast_pretty::pprust::path_segment_to_string;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed,
|
pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed,
|
||||||
|
MultiSpan,
|
||||||
};
|
};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::Namespace::{self, *};
|
use rustc_hir::def::Namespace::{self, *};
|
||||||
|
@ -25,7 +26,7 @@ use rustc_span::edition::Edition;
|
||||||
use rustc_span::hygiene::MacroKind;
|
use rustc_span::hygiene::MacroKind;
|
||||||
use rustc_span::lev_distance::find_best_match_for_name;
|
use rustc_span::lev_distance::find_best_match_for_name;
|
||||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||||
use rustc_span::{BytePos, MultiSpan, Span, DUMMY_SP};
|
use rustc_span::{BytePos, Span, DUMMY_SP};
|
||||||
|
|
||||||
use std::iter;
|
use std::iter;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
@ -1106,7 +1107,7 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
if non_visible_spans.len() > 0 {
|
if non_visible_spans.len() > 0 {
|
||||||
let mut m: rustc_span::MultiSpan = non_visible_spans.clone().into();
|
let mut m: MultiSpan = non_visible_spans.clone().into();
|
||||||
non_visible_spans
|
non_visible_spans
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.for_each(|s| m.push_span_label(s, "private field".to_string()));
|
.for_each(|s| m.push_span_label(s, "private field".to_string()));
|
||||||
|
|
|
@ -7,12 +7,14 @@ use rustc_ast::node_id::NodeId;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_data_structures::sync::{Lock, Lrc};
|
use rustc_data_structures::sync::{Lock, Lrc};
|
||||||
use rustc_errors::{emitter::SilentEmitter, ColorConfig, Handler};
|
use rustc_errors::{emitter::SilentEmitter, ColorConfig, Handler};
|
||||||
use rustc_errors::{error_code, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed};
|
use rustc_errors::{
|
||||||
|
error_code, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed, MultiSpan,
|
||||||
|
};
|
||||||
use rustc_feature::{find_feature_issue, GateIssue, UnstableFeatures};
|
use rustc_feature::{find_feature_issue, GateIssue, UnstableFeatures};
|
||||||
use rustc_span::edition::Edition;
|
use rustc_span::edition::Edition;
|
||||||
use rustc_span::hygiene::ExpnId;
|
use rustc_span::hygiene::ExpnId;
|
||||||
use rustc_span::source_map::{FilePathMapping, SourceMap};
|
use rustc_span::source_map::{FilePathMapping, SourceMap};
|
||||||
use rustc_span::{MultiSpan, Span, Symbol};
|
use rustc_span::{Span, Symbol};
|
||||||
|
|
||||||
use std::str;
|
use std::str;
|
||||||
|
|
||||||
|
|
|
@ -19,11 +19,11 @@ use rustc_errors::annotate_snippet_emitter_writer::AnnotateSnippetEmitterWriter;
|
||||||
use rustc_errors::emitter::{Emitter, EmitterWriter, HumanReadableErrorType};
|
use rustc_errors::emitter::{Emitter, EmitterWriter, HumanReadableErrorType};
|
||||||
use rustc_errors::json::JsonEmitter;
|
use rustc_errors::json::JsonEmitter;
|
||||||
use rustc_errors::registry::Registry;
|
use rustc_errors::registry::Registry;
|
||||||
use rustc_errors::{DiagnosticBuilder, DiagnosticId, ErrorGuaranteed};
|
use rustc_errors::{DiagnosticBuilder, DiagnosticId, ErrorGuaranteed, MultiSpan};
|
||||||
use rustc_macros::HashStable_Generic;
|
use rustc_macros::HashStable_Generic;
|
||||||
pub use rustc_span::def_id::StableCrateId;
|
pub use rustc_span::def_id::StableCrateId;
|
||||||
use rustc_span::edition::Edition;
|
use rustc_span::edition::Edition;
|
||||||
use rustc_span::source_map::{FileLoader, MultiSpan, RealFileLoader, SourceMap, Span};
|
use rustc_span::source_map::{FileLoader, RealFileLoader, SourceMap, Span};
|
||||||
use rustc_span::{sym, SourceFileHashAlgorithm, Symbol};
|
use rustc_span::{sym, SourceFileHashAlgorithm, Symbol};
|
||||||
use rustc_target::asm::InlineAsmArch;
|
use rustc_target::asm::InlineAsmArch;
|
||||||
use rustc_target::spec::{CodeModel, PanicStrategy, RelocModel, RelroLevel};
|
use rustc_target::spec::{CodeModel, PanicStrategy, RelocModel, RelroLevel};
|
||||||
|
|
|
@ -520,20 +520,6 @@ impl Ord for Span {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A collection of `Span`s.
|
|
||||||
///
|
|
||||||
/// Spans have two orthogonal attributes:
|
|
||||||
///
|
|
||||||
/// - They can be *primary spans*. In this case they are the locus of
|
|
||||||
/// the error, and would be rendered with `^^^`.
|
|
||||||
/// - They can have a *label*. In this case, the label is written next
|
|
||||||
/// to the mark in the snippet when we render.
|
|
||||||
#[derive(Clone, Debug, Hash, PartialEq, Eq, Encodable, Decodable)]
|
|
||||||
pub struct MultiSpan {
|
|
||||||
primary_spans: Vec<Span>,
|
|
||||||
span_labels: Vec<(Span, String)>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Span {
|
impl Span {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn lo(self) -> BytePos {
|
pub fn lo(self) -> BytePos {
|
||||||
|
@ -949,20 +935,6 @@ impl Span {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A span together with some additional data.
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
pub struct SpanLabel {
|
|
||||||
/// The span we are going to include in the final snippet.
|
|
||||||
pub span: Span,
|
|
||||||
|
|
||||||
/// Is this a primary span? This is the "locus" of the message,
|
|
||||||
/// and is indicated with a `^^^^` underline, versus `----`.
|
|
||||||
pub is_primary: bool,
|
|
||||||
|
|
||||||
/// What label should we attach to this span (if any)?
|
|
||||||
pub label: Option<String>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Span {
|
impl Default for Span {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
DUMMY_SP
|
DUMMY_SP
|
||||||
|
@ -1035,115 +1007,6 @@ impl fmt::Debug for SpanData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MultiSpan {
|
|
||||||
#[inline]
|
|
||||||
pub fn new() -> MultiSpan {
|
|
||||||
MultiSpan { primary_spans: vec![], span_labels: vec![] }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn from_span(primary_span: Span) -> MultiSpan {
|
|
||||||
MultiSpan { primary_spans: vec![primary_span], span_labels: vec![] }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn from_spans(mut vec: Vec<Span>) -> MultiSpan {
|
|
||||||
vec.sort();
|
|
||||||
MultiSpan { primary_spans: vec, span_labels: vec![] }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn push_span_label(&mut self, span: Span, label: String) {
|
|
||||||
self.span_labels.push((span, label));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Selects the first primary span (if any).
|
|
||||||
pub fn primary_span(&self) -> Option<Span> {
|
|
||||||
self.primary_spans.first().cloned()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns all primary spans.
|
|
||||||
pub fn primary_spans(&self) -> &[Span] {
|
|
||||||
&self.primary_spans
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns `true` if any of the primary spans are displayable.
|
|
||||||
pub fn has_primary_spans(&self) -> bool {
|
|
||||||
self.primary_spans.iter().any(|sp| !sp.is_dummy())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns `true` if this contains only a dummy primary span with any hygienic context.
|
|
||||||
pub fn is_dummy(&self) -> bool {
|
|
||||||
let mut is_dummy = true;
|
|
||||||
for span in &self.primary_spans {
|
|
||||||
if !span.is_dummy() {
|
|
||||||
is_dummy = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
is_dummy
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Replaces all occurrences of one Span with another. Used to move `Span`s in areas that don't
|
|
||||||
/// display well (like std macros). Returns whether replacements occurred.
|
|
||||||
pub fn replace(&mut self, before: Span, after: Span) -> bool {
|
|
||||||
let mut replacements_occurred = false;
|
|
||||||
for primary_span in &mut self.primary_spans {
|
|
||||||
if *primary_span == before {
|
|
||||||
*primary_span = after;
|
|
||||||
replacements_occurred = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for span_label in &mut self.span_labels {
|
|
||||||
if span_label.0 == before {
|
|
||||||
span_label.0 = after;
|
|
||||||
replacements_occurred = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
replacements_occurred
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the strings to highlight. We always ensure that there
|
|
||||||
/// is an entry for each of the primary spans -- for each primary
|
|
||||||
/// span `P`, if there is at least one label with span `P`, we return
|
|
||||||
/// those labels (marked as primary). But otherwise we return
|
|
||||||
/// `SpanLabel` instances with empty labels.
|
|
||||||
pub fn span_labels(&self) -> Vec<SpanLabel> {
|
|
||||||
let is_primary = |span| self.primary_spans.contains(&span);
|
|
||||||
|
|
||||||
let mut span_labels = self
|
|
||||||
.span_labels
|
|
||||||
.iter()
|
|
||||||
.map(|&(span, ref label)| SpanLabel {
|
|
||||||
span,
|
|
||||||
is_primary: is_primary(span),
|
|
||||||
label: Some(label.clone()),
|
|
||||||
})
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
|
|
||||||
for &span in &self.primary_spans {
|
|
||||||
if !span_labels.iter().any(|sl| sl.span == span) {
|
|
||||||
span_labels.push(SpanLabel { span, is_primary: true, label: None });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
span_labels
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns `true` if any of the span labels is displayable.
|
|
||||||
pub fn has_span_labels(&self) -> bool {
|
|
||||||
self.span_labels.iter().any(|(sp, _)| !sp.is_dummy())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Span> for MultiSpan {
|
|
||||||
fn from(span: Span) -> MultiSpan {
|
|
||||||
MultiSpan::from_span(span)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Vec<Span>> for MultiSpan {
|
|
||||||
fn from(spans: Vec<Span>) -> MultiSpan {
|
|
||||||
MultiSpan::from_spans(spans)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Identifies an offset of a multi-byte character in a `SourceFile`.
|
/// Identifies an offset of a multi-byte character in a `SourceFile`.
|
||||||
#[derive(Copy, Clone, Encodable, Decodable, Eq, PartialEq, Debug)]
|
#[derive(Copy, Clone, Encodable, Decodable, Eq, PartialEq, Debug)]
|
||||||
pub struct MultiByteChar {
|
pub struct MultiByteChar {
|
||||||
|
|
|
@ -15,7 +15,7 @@ use crate::infer::{self, InferCtxt, TyCtxtInferExt};
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed,
|
pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed,
|
||||||
Style,
|
MultiSpan, Style,
|
||||||
};
|
};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
|
@ -33,7 +33,7 @@ use rustc_middle::ty::{
|
||||||
self, SubtypePredicate, ToPolyTraitRef, ToPredicate, TraitRef, Ty, TyCtxt, TypeFoldable,
|
self, SubtypePredicate, ToPolyTraitRef, ToPredicate, TraitRef, Ty, TyCtxt, TypeFoldable,
|
||||||
};
|
};
|
||||||
use rustc_span::symbol::{kw, sym};
|
use rustc_span::symbol::{kw, sym};
|
||||||
use rustc_span::{ExpnKind, MultiSpan, Span, DUMMY_SP};
|
use rustc_span::{ExpnKind, Span, DUMMY_SP};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
error_code, pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder,
|
error_code, pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder,
|
||||||
ErrorGuaranteed, Style,
|
ErrorGuaranteed, MultiSpan, Style,
|
||||||
};
|
};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::DefKind;
|
use rustc_hir::def::DefKind;
|
||||||
|
@ -27,7 +27,7 @@ use rustc_middle::ty::{TypeAndMut, TypeckResults};
|
||||||
use rustc_session::Limit;
|
use rustc_session::Limit;
|
||||||
use rustc_span::def_id::LOCAL_CRATE;
|
use rustc_span::def_id::LOCAL_CRATE;
|
||||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||||
use rustc_span::{BytePos, DesugaringKind, ExpnKind, MultiSpan, Span, DUMMY_SP};
|
use rustc_span::{BytePos, DesugaringKind, ExpnKind, Span, DUMMY_SP};
|
||||||
use rustc_target::spec::abi;
|
use rustc_target::spec::abi;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ use crate::infer::TyCtxtInferExt;
|
||||||
use crate::traits::const_evaluatable::{self, AbstractConst};
|
use crate::traits::const_evaluatable::{self, AbstractConst};
|
||||||
use crate::traits::query::evaluate_obligation::InferCtxtExt;
|
use crate::traits::query::evaluate_obligation::InferCtxtExt;
|
||||||
use crate::traits::{self, Obligation, ObligationCause};
|
use crate::traits::{self, Obligation, ObligationCause};
|
||||||
use rustc_errors::FatalError;
|
use rustc_errors::{FatalError, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_middle::ty::subst::{GenericArg, InternalSubsts, Subst};
|
use rustc_middle::ty::subst::{GenericArg, InternalSubsts, Subst};
|
||||||
|
@ -22,7 +22,7 @@ use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable, TypeVisitor};
|
||||||
use rustc_middle::ty::{Predicate, ToPredicate};
|
use rustc_middle::ty::{Predicate, ToPredicate};
|
||||||
use rustc_session::lint::builtin::WHERE_CLAUSES_OBJECT_SAFETY;
|
use rustc_session::lint::builtin::WHERE_CLAUSES_OBJECT_SAFETY;
|
||||||
use rustc_span::symbol::Symbol;
|
use rustc_span::symbol::Symbol;
|
||||||
use rustc_span::{MultiSpan, Span};
|
use rustc_span::Span;
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
|
|
||||||
use std::iter;
|
use std::iter;
|
||||||
|
|
|
@ -6,7 +6,7 @@ use crate::astconv::{
|
||||||
use crate::errors::AssocTypeBindingNotAllowed;
|
use crate::errors::AssocTypeBindingNotAllowed;
|
||||||
use crate::structured_errors::{GenericArgsInfo, StructuredDiagnostic, WrongNumberOfGenericArgs};
|
use crate::structured_errors::{GenericArgsInfo, StructuredDiagnostic, WrongNumberOfGenericArgs};
|
||||||
use rustc_ast::ast::ParamKindOrd;
|
use rustc_ast::ast::ParamKindOrd;
|
||||||
use rustc_errors::{struct_span_err, Applicability, Diagnostic};
|
use rustc_errors::{struct_span_err, Applicability, Diagnostic, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{DefKind, Res};
|
use rustc_hir::def::{DefKind, Res};
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
|
@ -16,7 +16,7 @@ use rustc_middle::ty::{
|
||||||
self, subst, subst::SubstsRef, GenericParamDef, GenericParamDefKind, Ty, TyCtxt,
|
self, subst, subst::SubstsRef, GenericParamDef, GenericParamDefKind, Ty, TyCtxt,
|
||||||
};
|
};
|
||||||
use rustc_session::lint::builtin::LATE_BOUND_LIFETIME_ARGUMENTS;
|
use rustc_session::lint::builtin::LATE_BOUND_LIFETIME_ARGUMENTS;
|
||||||
use rustc_span::{symbol::kw, MultiSpan, Span};
|
use rustc_span::{symbol::kw, Span};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
|
|
||||||
impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::check::coercion::{AsCoercionSite, CoerceMany};
|
use crate::check::coercion::{AsCoercionSite, CoerceMany};
|
||||||
use crate::check::{Diverges, Expectation, FnCtxt, Needs};
|
use crate::check::{Diverges, Expectation, FnCtxt, Needs};
|
||||||
use rustc_errors::{Applicability, Diagnostic};
|
use rustc_errors::{Applicability, Diagnostic, MultiSpan};
|
||||||
use rustc_hir::{self as hir, ExprKind};
|
use rustc_hir::{self as hir, ExprKind};
|
||||||
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
||||||
use rustc_infer::traits::Obligation;
|
use rustc_infer::traits::Obligation;
|
||||||
use rustc_middle::ty::{self, ToPredicate, Ty, TypeFoldable};
|
use rustc_middle::ty::{self, ToPredicate, Ty, TypeFoldable};
|
||||||
use rustc_span::{MultiSpan, Span};
|
use rustc_span::Span;
|
||||||
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt;
|
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt;
|
||||||
use rustc_trait_selection::traits::{
|
use rustc_trait_selection::traits::{
|
||||||
IfExpressionCause, MatchExpressionArmCause, ObligationCause, ObligationCauseCode,
|
IfExpressionCause, MatchExpressionArmCause, ObligationCause, ObligationCauseCode,
|
||||||
|
|
|
@ -4,7 +4,7 @@ use super::compare_method::{compare_const_impl, compare_impl_method, compare_ty_
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
use rustc_attr as attr;
|
use rustc_attr as attr;
|
||||||
use rustc_errors::{Applicability, ErrorGuaranteed};
|
use rustc_errors::{Applicability, ErrorGuaranteed, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
use rustc_hir::intravisit::Visitor;
|
use rustc_hir::intravisit::Visitor;
|
||||||
|
@ -20,7 +20,7 @@ use rustc_middle::ty::util::{Discr, IntTypeExt};
|
||||||
use rustc_middle::ty::{self, ParamEnv, Ty, TyCtxt};
|
use rustc_middle::ty::{self, ParamEnv, Ty, TyCtxt};
|
||||||
use rustc_session::lint::builtin::{UNINHABITED_STATIC, UNSUPPORTED_CALLING_CONVENTIONS};
|
use rustc_session::lint::builtin::{UNINHABITED_STATIC, UNSUPPORTED_CALLING_CONVENTIONS};
|
||||||
use rustc_span::symbol::sym;
|
use rustc_span::symbol::sym;
|
||||||
use rustc_span::{self, MultiSpan, Span};
|
use rustc_span::{self, Span};
|
||||||
use rustc_target::spec::abi::Abi;
|
use rustc_target::spec::abi::Abi;
|
||||||
use rustc_trait_selection::traits;
|
use rustc_trait_selection::traits;
|
||||||
use rustc_trait_selection::traits::error_reporting::InferCtxtExt as _;
|
use rustc_trait_selection::traits::error_reporting::InferCtxtExt as _;
|
||||||
|
|
|
@ -8,7 +8,7 @@ use crate::check::{BreakableCtxt, Diverges, Expectation, FnCtxt, LocalTy};
|
||||||
|
|
||||||
use rustc_data_structures::captures::Captures;
|
use rustc_data_structures::captures::Captures;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::{Applicability, Diagnostic, ErrorGuaranteed};
|
use rustc_errors::{Applicability, Diagnostic, ErrorGuaranteed, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{CtorOf, DefKind, Res};
|
use rustc_hir::def::{CtorOf, DefKind, Res};
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
|
@ -30,7 +30,7 @@ use rustc_session::lint;
|
||||||
use rustc_span::hygiene::DesugaringKind;
|
use rustc_span::hygiene::DesugaringKind;
|
||||||
use rustc_span::source_map::{original_sp, DUMMY_SP};
|
use rustc_span::source_map::{original_sp, DUMMY_SP};
|
||||||
use rustc_span::symbol::{kw, sym, Ident};
|
use rustc_span::symbol::{kw, sym, Ident};
|
||||||
use rustc_span::{self, BytePos, MultiSpan, Span};
|
use rustc_span::{self, BytePos, Span};
|
||||||
use rustc_trait_selection::infer::InferCtxtExt as _;
|
use rustc_trait_selection::infer::InferCtxtExt as _;
|
||||||
use rustc_trait_selection::traits::error_reporting::InferCtxtExt as _;
|
use rustc_trait_selection::traits::error_reporting::InferCtxtExt as _;
|
||||||
use rustc_trait_selection::traits::{
|
use rustc_trait_selection::traits::{
|
||||||
|
|
|
@ -11,7 +11,7 @@ use crate::check::{
|
||||||
|
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
use rustc_errors::{Applicability, Diagnostic, DiagnosticId};
|
use rustc_errors::{Applicability, Diagnostic, DiagnosticId, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{CtorOf, DefKind, Res};
|
use rustc_hir::def::{CtorOf, DefKind, Res};
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
|
@ -21,7 +21,7 @@ use rustc_middle::ty::fold::TypeFoldable;
|
||||||
use rustc_middle::ty::{self, Ty};
|
use rustc_middle::ty::{self, Ty};
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::symbol::Ident;
|
use rustc_span::symbol::Ident;
|
||||||
use rustc_span::{self, MultiSpan, Span};
|
use rustc_span::{self, Span};
|
||||||
use rustc_trait_selection::traits::{self, ObligationCauseCode, StatementAsExpression};
|
use rustc_trait_selection::traits::{self, ObligationCauseCode, StatementAsExpression};
|
||||||
|
|
||||||
use crate::structured_errors::StructuredDiagnostic;
|
use crate::structured_errors::StructuredDiagnostic;
|
||||||
|
|
|
@ -2,9 +2,9 @@ use super::FnCtxt;
|
||||||
use crate::astconv::AstConv;
|
use crate::astconv::AstConv;
|
||||||
|
|
||||||
use rustc_ast::util::parser::ExprPrecedence;
|
use rustc_ast::util::parser::ExprPrecedence;
|
||||||
use rustc_span::{self, MultiSpan, Span};
|
use rustc_span::{self, Span};
|
||||||
|
|
||||||
use rustc_errors::{Applicability, Diagnostic};
|
use rustc_errors::{Applicability, Diagnostic, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{CtorOf, DefKind};
|
use rustc_hir::def::{CtorOf, DefKind};
|
||||||
use rustc_hir::lang_items::LangItem;
|
use rustc_hir::lang_items::LangItem;
|
||||||
|
|
|
@ -5,6 +5,7 @@ use crate::check::FnCtxt;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed,
|
pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed,
|
||||||
|
MultiSpan,
|
||||||
};
|
};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
|
@ -17,7 +18,7 @@ use rustc_middle::ty::print::with_crate_prefix;
|
||||||
use rustc_middle::ty::ToPolyTraitRef;
|
use rustc_middle::ty::ToPolyTraitRef;
|
||||||
use rustc_middle::ty::{self, DefIdTree, ToPredicate, Ty, TyCtxt, TypeFoldable};
|
use rustc_middle::ty::{self, DefIdTree, ToPredicate, Ty, TyCtxt, TypeFoldable};
|
||||||
use rustc_span::symbol::{kw, sym, Ident};
|
use rustc_span::symbol::{kw, sym, Ident};
|
||||||
use rustc_span::{lev_distance, source_map, ExpnKind, FileName, MacroKind, MultiSpan, Span};
|
use rustc_span::{lev_distance, source_map, ExpnKind, FileName, MacroKind, Span};
|
||||||
use rustc_trait_selection::traits::error_reporting::on_unimplemented::InferCtxtExt as _;
|
use rustc_trait_selection::traits::error_reporting::on_unimplemented::InferCtxtExt as _;
|
||||||
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt as _;
|
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt as _;
|
||||||
use rustc_trait_selection::traits::{
|
use rustc_trait_selection::traits::{
|
||||||
|
|
|
@ -103,7 +103,7 @@ pub use inherited::{Inherited, InheritedBuilder};
|
||||||
use crate::astconv::AstConv;
|
use crate::astconv::AstConv;
|
||||||
use crate::check::gather_locals::GatherLocalsVisitor;
|
use crate::check::gather_locals::GatherLocalsVisitor;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_errors::{pluralize, struct_span_err, Applicability};
|
use rustc_errors::{pluralize, struct_span_err, Applicability, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::Res;
|
use rustc_hir::def::Res;
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
|
@ -121,7 +121,7 @@ use rustc_session::parse::feature_err;
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::source_map::DUMMY_SP;
|
use rustc_span::source_map::DUMMY_SP;
|
||||||
use rustc_span::symbol::{kw, Ident};
|
use rustc_span::symbol::{kw, Ident};
|
||||||
use rustc_span::{self, BytePos, MultiSpan, Span};
|
use rustc_span::{self, BytePos, Span};
|
||||||
use rustc_target::abi::VariantIdx;
|
use rustc_target::abi::VariantIdx;
|
||||||
use rustc_target::spec::abi::Abi;
|
use rustc_target::spec::abi::Abi;
|
||||||
use rustc_trait_selection::traits;
|
use rustc_trait_selection::traits;
|
||||||
|
|
|
@ -4,6 +4,7 @@ use rustc_ast as ast;
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed,
|
pluralize, struct_span_err, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed,
|
||||||
|
MultiSpan,
|
||||||
};
|
};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{CtorKind, DefKind, Res};
|
use rustc_hir::def::{CtorKind, DefKind, Res};
|
||||||
|
@ -18,7 +19,7 @@ use rustc_span::hygiene::DesugaringKind;
|
||||||
use rustc_span::lev_distance::find_best_match_for_name;
|
use rustc_span::lev_distance::find_best_match_for_name;
|
||||||
use rustc_span::source_map::{Span, Spanned};
|
use rustc_span::source_map::{Span, Spanned};
|
||||||
use rustc_span::symbol::{kw, sym, Ident};
|
use rustc_span::symbol::{kw, sym, Ident};
|
||||||
use rustc_span::{BytePos, MultiSpan, DUMMY_SP};
|
use rustc_span::{BytePos, DUMMY_SP};
|
||||||
use rustc_trait_selection::autoderef::Autoderef;
|
use rustc_trait_selection::autoderef::Autoderef;
|
||||||
use rustc_trait_selection::traits::{ObligationCause, Pattern};
|
use rustc_trait_selection::traits::{ObligationCause, Pattern};
|
||||||
use ty::VariantDef;
|
use ty::VariantDef;
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
use super::FnCtxt;
|
use super::FnCtxt;
|
||||||
|
|
||||||
use crate::expr_use_visitor as euv;
|
use crate::expr_use_visitor as euv;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::{Applicability, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::def_id::LocalDefId;
|
use rustc_hir::def_id::LocalDefId;
|
||||||
|
@ -46,7 +46,7 @@ use rustc_middle::ty::{
|
||||||
};
|
};
|
||||||
use rustc_session::lint;
|
use rustc_session::lint;
|
||||||
use rustc_span::sym;
|
use rustc_span::sym;
|
||||||
use rustc_span::{BytePos, MultiSpan, Pos, Span, Symbol};
|
use rustc_span::{BytePos, Pos, Span, Symbol};
|
||||||
use rustc_trait_selection::infer::InferCtxtExt;
|
use rustc_trait_selection::infer::InferCtxtExt;
|
||||||
|
|
||||||
use rustc_data_structures::stable_map::FxHashMap;
|
use rustc_data_structures::stable_map::FxHashMap;
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
use crate::structured_errors::StructuredDiagnostic;
|
use crate::structured_errors::StructuredDiagnostic;
|
||||||
use rustc_errors::{
|
use rustc_errors::{
|
||||||
pluralize, Applicability, Diagnostic, DiagnosticBuilder, DiagnosticId, ErrorGuaranteed,
|
pluralize, Applicability, Diagnostic, DiagnosticBuilder, DiagnosticId, ErrorGuaranteed,
|
||||||
|
MultiSpan,
|
||||||
};
|
};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_middle::hir::map::fn_sig;
|
use rustc_middle::hir::map::fn_sig;
|
||||||
use rustc_middle::middle::resolve_lifetime::LifetimeScopeForPath;
|
use rustc_middle::middle::resolve_lifetime::LifetimeScopeForPath;
|
||||||
use rustc_middle::ty::{self as ty, TyCtxt};
|
use rustc_middle::ty::{self as ty, TyCtxt};
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::{def_id::DefId, MultiSpan};
|
use rustc_span::def_id::DefId;
|
||||||
|
|
||||||
use GenericArgsInfo::*;
|
use GenericArgsInfo::*;
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,12 @@ use clippy_utils::higher::IfLetOrMatch;
|
||||||
use clippy_utils::visitors::is_local_used;
|
use clippy_utils::visitors::is_local_used;
|
||||||
use clippy_utils::{is_lang_ctor, is_unit_expr, path_to_local, peel_blocks_with_stmt, peel_ref_operators, SpanlessEq};
|
use clippy_utils::{is_lang_ctor, is_unit_expr, path_to_local, peel_blocks_with_stmt, peel_ref_operators, SpanlessEq};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
|
use rustc_errors::MultiSpan;
|
||||||
use rustc_hir::LangItem::OptionNone;
|
use rustc_hir::LangItem::OptionNone;
|
||||||
use rustc_hir::{Arm, Expr, Guard, HirId, Pat, PatKind};
|
use rustc_hir::{Arm, Expr, Guard, HirId, Pat, PatKind};
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
||||||
use rustc_span::{MultiSpan, Span};
|
use rustc_span::Span;
|
||||||
|
|
||||||
declare_clippy_lint! {
|
declare_clippy_lint! {
|
||||||
/// ### What it does
|
/// ### What it does
|
||||||
|
|
|
@ -11,7 +11,7 @@ use rustc_ast::token::CommentKind;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
use rustc_errors::emitter::EmitterWriter;
|
use rustc_errors::emitter::EmitterWriter;
|
||||||
use rustc_errors::{Applicability, Handler, SuggestionStyle};
|
use rustc_errors::{Applicability, Handler, MultiSpan, SuggestionStyle};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::intravisit::{self, Visitor};
|
use rustc_hir::intravisit::{self, Visitor};
|
||||||
use rustc_hir::{AnonConst, Expr};
|
use rustc_hir::{AnonConst, Expr};
|
||||||
|
@ -25,7 +25,7 @@ use rustc_session::parse::ParseSess;
|
||||||
use rustc_session::{declare_tool_lint, impl_lint_pass};
|
use rustc_session::{declare_tool_lint, impl_lint_pass};
|
||||||
use rustc_span::def_id::LocalDefId;
|
use rustc_span::def_id::LocalDefId;
|
||||||
use rustc_span::edition::Edition;
|
use rustc_span::edition::Edition;
|
||||||
use rustc_span::source_map::{BytePos, FilePathMapping, MultiSpan, SourceMap, Span};
|
use rustc_span::source_map::{BytePos, FilePathMapping, SourceMap, Span};
|
||||||
use rustc_span::{sym, FileName, Pos};
|
use rustc_span::{sym, FileName, Pos};
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
|
|
|
@ -6,7 +6,7 @@ use clippy_utils::ty::is_type_diagnostic_item;
|
||||||
use clippy_utils::{can_move_expr_to_closure, is_trait_method, path_to_local, path_to_local_id, CaptureKind};
|
use clippy_utils::{can_move_expr_to_closure, is_trait_method, path_to_local, path_to_local_id, CaptureKind};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::{Applicability, MultiSpan};
|
||||||
use rustc_hir::intravisit::{walk_block, walk_expr, Visitor};
|
use rustc_hir::intravisit::{walk_block, walk_expr, Visitor};
|
||||||
use rustc_hir::{Block, Expr, ExprKind, HirId, HirIdSet, Local, Mutability, Node, PatKind, Stmt, StmtKind};
|
use rustc_hir::{Block, Expr, ExprKind, HirId, HirIdSet, Local, Mutability, Node, PatKind, Stmt, StmtKind};
|
||||||
use rustc_lint::LateContext;
|
use rustc_lint::LateContext;
|
||||||
|
@ -14,7 +14,7 @@ use rustc_middle::hir::nested_filter;
|
||||||
use rustc_middle::ty::subst::GenericArgKind;
|
use rustc_middle::ty::subst::GenericArgKind;
|
||||||
use rustc_middle::ty::{self, Ty};
|
use rustc_middle::ty::{self, Ty};
|
||||||
use rustc_span::sym;
|
use rustc_span::sym;
|
||||||
use rustc_span::{MultiSpan, Span};
|
use rustc_span::Span;
|
||||||
|
|
||||||
const NEEDLESS_COLLECT_MSG: &str = "avoid using `collect()` when not needed";
|
const NEEDLESS_COLLECT_MSG: &str = "avoid using `collect()` when not needed";
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ use clippy_utils::source::snippet_opt;
|
||||||
use clippy_utils::ty::expr_sig;
|
use clippy_utils::ty::expr_sig;
|
||||||
use clippy_utils::{get_expr_use_or_unification_node, is_lint_allowed, path_def_id, path_to_local, paths};
|
use clippy_utils::{get_expr_use_or_unification_node, is_lint_allowed, path_def_id, path_to_local, paths};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::{Applicability, MultiSpan};
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::hir_id::HirIdMap;
|
use rustc_hir::hir_id::HirIdMap;
|
||||||
use rustc_hir::intravisit::{walk_expr, Visitor};
|
use rustc_hir::intravisit::{walk_expr, Visitor};
|
||||||
|
@ -19,8 +19,8 @@ use rustc_middle::hir::nested_filter;
|
||||||
use rustc_middle::ty::{self, Ty};
|
use rustc_middle::ty::{self, Ty};
|
||||||
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
||||||
use rustc_span::source_map::Span;
|
use rustc_span::source_map::Span;
|
||||||
|
use rustc_span::sym;
|
||||||
use rustc_span::symbol::Symbol;
|
use rustc_span::symbol::Symbol;
|
||||||
use rustc_span::{sym, MultiSpan};
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
|
|
||||||
|
|
|
@ -8,10 +8,10 @@
|
||||||
//! Thank you!
|
//! Thank you!
|
||||||
//! ~The `INTERNAL_METADATA_COLLECTOR` lint
|
//! ~The `INTERNAL_METADATA_COLLECTOR` lint
|
||||||
|
|
||||||
use rustc_errors::{emitter::MAX_SUGGESTION_HIGHLIGHT_LINES, Applicability, Diagnostic};
|
use rustc_errors::{emitter::MAX_SUGGESTION_HIGHLIGHT_LINES, Applicability, Diagnostic, MultiSpan};
|
||||||
use rustc_hir::HirId;
|
use rustc_hir::HirId;
|
||||||
use rustc_lint::{LateContext, Lint, LintContext};
|
use rustc_lint::{LateContext, Lint, LintContext};
|
||||||
use rustc_span::source_map::{MultiSpan, Span};
|
use rustc_span::source_map::Span;
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
fn docs_link(diag: &mut Diagnostic, lint: &'static Lint) {
|
fn docs_link(diag: &mut Diagnostic, lint: &'static Lint) {
|
||||||
|
@ -155,7 +155,13 @@ where
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn span_lint_hir(cx: &LateContext<'_>, lint: &'static Lint, hir_id: HirId, sp: Span, msg: &str) {
|
pub fn span_lint_hir(
|
||||||
|
cx: &LateContext<'_>,
|
||||||
|
lint: &'static Lint,
|
||||||
|
hir_id: HirId,
|
||||||
|
sp: Span,
|
||||||
|
msg: &str,
|
||||||
|
) {
|
||||||
cx.tcx.struct_span_lint_hir(lint, hir_id, sp, |diag| {
|
cx.tcx.struct_span_lint_hir(lint, hir_id, sp, |diag| {
|
||||||
let mut diag = diag.build(msg);
|
let mut diag = diag.build(msg);
|
||||||
docs_link(&mut diag, lint);
|
docs_link(&mut diag, lint);
|
||||||
|
@ -272,9 +278,14 @@ pub fn span_lint_and_sugg_for_edges(
|
||||||
let sugg_lines_count = sugg.lines().count();
|
let sugg_lines_count = sugg.lines().count();
|
||||||
if sugg_lines_count > MAX_SUGGESTION_HIGHLIGHT_LINES {
|
if sugg_lines_count > MAX_SUGGESTION_HIGHLIGHT_LINES {
|
||||||
let sm = cx.sess().source_map();
|
let sm = cx.sess().source_map();
|
||||||
if let (Ok(line_upper), Ok(line_bottom)) = (sm.lookup_line(sp.lo()), sm.lookup_line(sp.hi())) {
|
if let (Ok(line_upper), Ok(line_bottom)) =
|
||||||
|
(sm.lookup_line(sp.lo()), sm.lookup_line(sp.hi()))
|
||||||
|
{
|
||||||
let split_idx = MAX_SUGGESTION_HIGHLIGHT_LINES / 2;
|
let split_idx = MAX_SUGGESTION_HIGHLIGHT_LINES / 2;
|
||||||
let span_upper = sm.span_until_char(sp.with_hi(line_upper.sf.lines[line_upper.line + split_idx]), '\n');
|
let span_upper = sm.span_until_char(
|
||||||
|
sp.with_hi(line_upper.sf.lines[line_upper.line + split_idx]),
|
||||||
|
'\n',
|
||||||
|
);
|
||||||
let span_bottom = sp.with_lo(line_bottom.sf.lines[line_bottom.line - split_idx]);
|
let span_bottom = sp.with_lo(line_bottom.sf.lines[line_bottom.line - split_idx]);
|
||||||
|
|
||||||
let sugg_lines_vec = sugg.lines().collect::<Vec<&str>>();
|
let sugg_lines_vec = sugg.lines().collect::<Vec<&str>>();
|
||||||
|
|
|
@ -313,7 +313,8 @@ mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::config::IgnoreList;
|
use crate::config::IgnoreList;
|
||||||
use crate::utils::mk_sp;
|
use crate::utils::mk_sp;
|
||||||
use rustc_span::{FileName as SourceMapFileName, MultiSpan, RealFileName};
|
use rustc_errors::MultiSpan;
|
||||||
|
use rustc_span::{FileName as SourceMapFileName, RealFileName};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::atomic::AtomicU32;
|
use std::sync::atomic::AtomicU32;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue